github.com/erda-project/erda-infra@v1.0.9/providers/component-protocol/cpregister/base/comp_register.go (about) 1 // Copyright (c) 2021 Terminus, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package base 16 17 import ( 18 "reflect" 19 20 "github.com/erda-project/erda-infra/base/servicehub" 21 "github.com/erda-project/erda-infra/providers/component-protocol/components/defaults" 22 "github.com/erda-project/erda-infra/providers/component-protocol/cpregister" 23 "github.com/erda-project/erda-infra/providers/component-protocol/cptype" 24 "github.com/erda-project/erda-infra/providers/component-protocol/protocol" 25 "github.com/erda-project/erda-infra/providers/component-protocol/utils/cputil" 26 ) 27 28 type creators struct { 29 RenderCreator protocol.RenderCreator 30 ComponentCreator protocol.ComponentCreator 31 } 32 33 // InitProvider register component as provider to scenario-namespace. 34 func InitProvider(scenario, compName string) { 35 InitProviderWithCreator(scenario, compName, nil) 36 } 37 38 // InitProviderToDefaultNamespace register component as provider to default-namespace. 39 func InitProviderToDefaultNamespace(compName string, creator servicehub.Creator) { 40 initProviderToNamespace(cptype.DefaultComponentNamespace, compName, creator) 41 } 42 43 // InitProviderWithCreator register component as provider with custom providerCreator to scenario-namespace. 44 func InitProviderWithCreator(scenario, compName string, creator servicehub.Creator) { 45 initProviderToNamespace(scenario, compName, creator) 46 } 47 48 // initProviderToNamespace register component as provider to specific namespace. 49 func initProviderToNamespace(scenario, compName string, creator servicehub.Creator) { 50 // generate std providerName 51 providerName := cputil.MakeComponentProviderName(scenario, compName) 52 if creator == nil { 53 creator = func() servicehub.Provider { return &DefaultProvider{} } 54 } 55 // register to servicehub 56 servicehub.Register(providerName, &servicehub.Spec{Creator: creator}) 57 // add to explicit provider creator map for hubListener to auto register to hub.config 58 cpregister.AllExplicitProviderCreatorMap[providerName] = creator 59 60 // generate creators compatible for IComponent and old CompRender 61 creators := func() creators { 62 switch creator().(type) { 63 case cptype.IComponent: 64 return creators{ComponentCreator: func() cptype.IComponent { 65 rr := creator().(cptype.IComponent) 66 ref := reflect.ValueOf(rr) 67 ref.Elem().FieldByName("Impl").Set(ref) 68 ref.Elem().FieldByName(defaults.FieldActualImplRef).Set(ref) 69 return rr 70 }} 71 case protocol.CompRender: 72 return creators{RenderCreator: func() protocol.CompRender { return creator().(protocol.CompRender) }} 73 default: 74 return creators{RenderCreator: func() protocol.CompRender { return &DefaultProvider{} }} 75 } 76 }() 77 78 // register protocol comp 79 protocol.MustRegisterComponent(&protocol.CompRenderSpec{ 80 Scenario: scenario, 81 CompName: compName, 82 RenderC: creators.RenderCreator, 83 Creator: creators.ComponentCreator, 84 }) 85 }