gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/schemax/configs/ConfigTree.go (about) 1 package configs 2 3 import ( 4 "gitee.com/zhongguo168a/gocodes/datax" 5 "gitee.com/zhongguo168a/gocodes/datax/listx" 6 "gitee.com/zhongguo168a/gocodes/datax/mapx" 7 "gitee.com/zhongguo168a/gocodes/datax/schemax" 8 "gitee.com/zhongguo168a/gocodes/datax/treex" 9 "strings" 10 ) 11 12 func NewConfigTree() (obj *ConfigTree) { 13 obj = &ConfigTree{} 14 obj.datas = listx.NewList() 15 return 16 } 17 18 type ConfigTree struct { 19 datas *listx.List 20 } 21 22 func (set *ConfigTree) L列表() *listx.List { 23 return set.datas 24 } 25 26 func (set *ConfigTree) ToConfigMap(existed *ConfigMap) *ConfigMap { 27 if existed == nil { 28 existed = NewConfigMap() 29 } 30 31 list := set.L列表() 32 for _, val := range list.Slice() { 33 c := val.(*ConfigTreeItem) 34 35 var 数据 map[string]interface{} 36 i数据 := c.S数据() 37 if i数据 == nil { 38 数据 = map[string]interface{}{} 39 } else { 40 数据 = mapx.CloneMap(i数据) 41 } 42 数据["_type"] = c.L类型 43 数据["_catalog"] = c.F分类 44 existed.AddConfig(c.B编号, 数据) 45 } 46 return existed 47 } 48 49 func (set *ConfigTree) Load(files map[string]datax.M) { 50 for _, fileBody := range files { 51 for key, iconf := range fileBody { 52 conf := iconf.(datax.M) 53 obj := NewTreeItemByConf(key, conf) 54 delete(conf, "_type") 55 delete(conf, "_name") 56 delete(conf, "_catalog") 57 delete(conf, "_parent") 58 delete(conf, "_prefix") 59 delete(conf, "_suffix") 60 delete(conf, "_export") 61 delete(conf, "_default") 62 delete(conf, "_file") 63 obj.原始数据 = conf 64 set.datas.Push(obj) 65 } 66 } 67 68 修正集 := set.C查找_通过分类("修正") 69 for _, ival := range 修正集.datas.Slice() { 70 修正配置 := ival.(*ConfigTreeItem) 71 修正配置编号 := mapx.String(修正配置.原始数据, "配置编号") 72 if 修正配置编号 != "" { 73 配置 := set.C查找_通过编号(修正配置编号) 74 配置.T添加修正(修正配置.B编号) 75 } 76 } 77 78 root := set.S生成类树() 79 root.Walk(func(node *treex.TreeNode) bool { 80 if node.Data == nil { 81 return true 82 } 83 node配置 := node.Data.(*ConfigTreeItem) 84 85 if node配置 == nil { 86 return true 87 } 88 data := datax.M{} 89 node配置.数据 = data 90 91 decl := node配置.GetSchema() 92 if decl != nil { 93 _ = schemax.InitObj(data, decl) 94 } 95 96 if node.Parent != nil { 97 parent := node.Parent.(*treex.TreeNode) 98 if parent.Data != nil { 99 parent配置 := parent.Data.(*ConfigTreeItem) 100 mapx.Copy(parent配置.数据, data) 101 node配置.T添加修正集(parent配置.X修正) 102 } 103 104 } 105 if node配置.L类型 == "" { 106 if node.Parent != "" { 107 parent := node.Parent.(*treex.TreeNode) 108 if parent.Data != nil { 109 parent配置 := parent.Data.(*ConfigTreeItem) 110 node配置.L类型 = parent配置.L类型 111 } 112 } 113 } 114 mapx.Copy(node配置.原始数据, data) 115 return true 116 }) 117 } 118 func (set *ConfigTree) C查找_通过文件(文件 string) (result *ConfigTree) { 119 result = NewConfigTree() 120 for _, ival := range set.datas.Slice() { 121 val := ival.(*ConfigTreeItem) 122 if val.W文件 == 文件 { 123 result.datas.Push(val) 124 } 125 } 126 return 127 } 128 129 func (set *ConfigTree) C查找_通过目录(目录 string) (result *ConfigTree) { 130 result = NewConfigTree() 131 for _, ival := range set.datas.Slice() { 132 val := ival.(*ConfigTreeItem) 133 if strings.Contains(val.W文件, 目录) { 134 result.datas.Push(val) 135 } 136 } 137 return 138 } 139 140 func (set *ConfigTree) C查找_通过分类(分类 string) (result *ConfigTree) { 141 result = NewConfigTree() 142 for _, ival := range set.datas.Slice() { 143 val := ival.(*ConfigTreeItem) 144 if val.F分类 == 分类 { 145 result.datas.Push(val) 146 } 147 } 148 return 149 } 150 func (set *ConfigTree) C查找_通过类型(类型 string) (result *ConfigTree) { 151 result = NewConfigTree() 152 for _, ival := range set.datas.Slice() { 153 val := ival.(*ConfigTreeItem) 154 if val.L类型 == 类型 { 155 result.datas.Push(val) 156 } 157 } 158 return 159 } 160 161 func (set *ConfigTree) C查找_通过编号(编号 string) *ConfigTreeItem { 162 for i := 0; i < set.datas.Length(); i++ { 163 iitem := set.datas.At(i) 164 item := iitem.(*ConfigTreeItem) 165 if item.B编号 == 编号 { 166 return item 167 } 168 } 169 170 return nil 171 } 172 173 func (set *ConfigTree) C查找_通过修正(编号 string) (result *ConfigTree) { 174 result = NewConfigTree() 175 for _, ival := range set.datas.Slice() { 176 val := ival.(*ConfigTreeItem) 177 if val.B包含修正(编号) { 178 result.datas.Push(val) 179 } 180 } 181 182 return 183 } 184 185 func (set *ConfigTree) S生成类树() *treex.TreeRoot { 186 187 var list []*treex.TreeListItem 188 list = append(list, &treex.TreeListItem{ 189 Id: "/", 190 }) 191 192 for i := 0; i < set.datas.Length(); i++ { 193 iitem := set.datas.At(i) 194 item := iitem.(*ConfigTreeItem) 195 if item.F父编号 != "" { 196 list = append(list, &treex.TreeListItem{ 197 Id: item.B编号, Parent: item.F父编号, Data: item, 198 }) 199 } else { 200 list = append(list, &treex.TreeListItem{ 201 Id: item.B编号, Parent: "/", Data: item, 202 }) 203 } 204 } 205 return treex.NewByList(list) 206 } 207 208 func (set *ConfigTree) ToSaveFileMap() datax.M { 209 result := datax.M{} 210 for _, val := range set.L列表().Slice() { 211 item := val.(*ConfigTreeItem) 212 result[item.B编号] = item.ToMap() 213 } 214 return result 215 }