-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathclassloader.go
More file actions
97 lines (85 loc) · 2.1 KB
/
Copy pathclassloader.go
File metadata and controls
97 lines (85 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package behavior
import (
"fmt"
"reflect"
"github.com/alkaid/behavior/util"
"github.com/alkaid/behavior/bcore"
"github.com/alkaid/behavior/config"
"github.com/alkaid/behavior/logger"
"github.com/pkg/errors"
"go.uber.org/zap"
)
// ClassLoader 节点类加加载器
// 作用 1.缓存节点类2.使用时找到缓存类并实例化出来
type ClassLoader struct {
registry map[string]reflect.Type // 注册器
}
func NewClassLoader() *ClassLoader {
return &ClassLoader{make(map[string]reflect.Type)}
}
// New 根据 name 实例化节点
//
// @receiver l
// @param name
// @param cfg
// @return INode
// @return error
func (l *ClassLoader) New(name string, cfg *config.NodeCfg) (bcore.INode, error) {
var err error
v, ok := l.registry[name]
if !ok {
return nil, errors.WithStack(fmt.Errorf("not found struct %s", name))
}
c := reflect.New(v).Interface().(bcore.INode)
err = c.Init(cfg)
if err != nil {
return nil, err
}
err = c.InitNodeWorker(c.(bcore.INodeWorker))
if err != nil {
return nil, err
}
return c, nil
}
// Clone 克隆一个节点
//
// @receiver l
// @param node
// @return bcore.INode
// @return error
func (l *ClassLoader) Clone(node bcore.INode) (bcore.INode, error) {
cfg := *node.RawCfg()
cfg.ID = util.NanoID()
return l.New(node.Name(), &cfg)
}
// Contains 检查注册器中是否包含指定节点类
//
// @receiver l
// @param name
// @return bool
func (l *ClassLoader) Contains(name string) bool {
_, ok := l.registry[name]
return ok
}
// RegisterWithName 根据名字注册节点类
//
// @receiver rsm
// @param name 可以为空,为空时使用节点的struct名称
// @param c
func (l *ClassLoader) RegisterWithName(name string, node bcore.INode) {
elem := reflect.TypeOf(node).Elem()
if name == "" {
name = elem.Name()
}
if _, ok := l.registry[name]; ok {
logger.Log.Warn("node type has already registered,old node type would be replaced", zap.String("name", name))
}
l.registry[name] = elem
}
// Register 注册节点类,注册名为节点的struct名称
//
// @receiver l
// @param node
func (l *ClassLoader) Register(node bcore.INode) {
l.RegisterWithName("", node)
}