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 package com.rapiddweller.model.data;
28
29 import com.rapiddweller.common.ArrayBuilder;
30 import com.rapiddweller.common.CollectionUtil;
31 import com.rapiddweller.common.StringUtil;
32 import com.rapiddweller.common.collection.ListBasedSet;
33 import com.rapiddweller.common.collection.NamedValueList;
34
35 import java.util.ArrayList;
36 import java.util.Collection;
37 import java.util.List;
38 import java.util.Objects;
39 import java.util.Set;
40
41
42
43
44
45
46
47
48
49 public class ComplexTypeDescriptor extends TypeDescriptor
50 implements VariableHolder {
51
52
53
54
55 public static final String __SIMPLE_CONTENT = "__SIMPLE_CONTENT";
56
57 private NamedValueList<InstanceDescriptor> parts;
58
59
60
61
62
63
64
65
66
67 public ComplexTypeDescriptor(String name, DescriptorProvider provider) {
68 this(name, provider, (String) null);
69 }
70
71
72
73
74
75
76
77
78 public ComplexTypeDescriptor(String name, DescriptorProvider provider,
79 ComplexTypeDescriptor parent) {
80 super(name, provider, parent);
81 init();
82 }
83
84
85
86
87
88
89
90
91 public ComplexTypeDescriptor(String name, DescriptorProvider provider,
92 String parentName) {
93 super(name, provider, parentName);
94 init();
95 }
96
97
98
99
100
101
102
103
104 public void addPart(InstanceDescriptor part) {
105 if (part instanceof ComponentDescriptor) {
106 addComponent((ComponentDescriptor) part);
107 } else {
108 addVariable((VariableDescriptor) part);
109 }
110 }
111
112
113
114
115
116
117 public void addComponent(ComponentDescriptor descriptor) {
118 String componentName = descriptor.getName();
119 if (parent != null &&
120 ((ComplexTypeDescriptor) parent).getComponent(componentName) !=
121 null) {
122 descriptor.setParent(((ComplexTypeDescriptor) parent)
123 .getComponent(componentName));
124 }
125 parts.add(componentName, descriptor);
126 }
127
128
129
130
131
132
133 public void setComponent(ComponentDescriptor component) {
134 String componentName = component.getName();
135 if (parent != null &&
136 ((ComplexTypeDescriptor) parent).getComponent(componentName) !=
137 null) {
138 component.setParent(((ComplexTypeDescriptor) parent)
139 .getComponent(componentName));
140 }
141 parts.set(componentName, component);
142 }
143
144
145
146
147
148
149
150 public ComponentDescriptor getComponent(String name) {
151 for (InstanceDescriptor part : parts.values()) {
152 if (StringUtil.equalsIgnoreCase(part.getName(), name) &&
153 part instanceof ComponentDescriptor) {
154 return (ComponentDescriptor) part;
155 }
156 }
157 if (getParent() != null) {
158 return ((ComplexTypeDescriptor) getParent()).getComponent(name);
159 }
160 return null;
161 }
162
163
164
165
166
167
168 public List<InstanceDescriptor> getParts() {
169 NamedValueList<InstanceDescriptor> result =
170 NamedValueList.createCaseInsensitiveList();
171
172 for (InstanceDescriptor ccd : parts.values()) {
173 result.add(ccd.getName(), ccd);
174 }
175 if (getParent() != null) {
176 List<InstanceDescriptor> parentParts =
177 ((ComplexTypeDescriptor) getParent()).getParts();
178 for (InstanceDescriptor pcd : parentParts) {
179 String name = pcd.getName();
180 if (pcd instanceof ComponentDescriptor &&
181 !parts.containsName(name)) {
182 InstanceDescriptor ccd = parts.someValueOfName(name);
183 result.add(name, Objects.requireNonNullElse(ccd, pcd));
184 }
185 }
186 }
187 return result.values();
188 }
189
190
191
192
193
194
195 public List<ComponentDescriptor> getComponents() {
196 List<ComponentDescriptor> result = new ArrayList<>();
197 for (InstanceDescriptor instance : getParts()) {
198 if (instance instanceof ComponentDescriptor) {
199 result.add((ComponentDescriptor) instance);
200 }
201 }
202 return result;
203 }
204
205
206
207
208
209
210 public Collection<InstanceDescriptor> getDeclaredParts() {
211 Set<InstanceDescriptor> declaredDescriptors =
212 new ListBasedSet<>(parts.size());
213 declaredDescriptors.addAll(parts.values());
214 return declaredDescriptors;
215 }
216
217
218
219
220
221
222
223 public boolean isDeclaredComponent(String componentName) {
224 return parts.containsName(componentName);
225 }
226
227
228
229
230
231
232 public String[] getIdComponentNames() {
233 ArrayBuilder<String> builder = new ArrayBuilder<>(String.class);
234 for (ComponentDescriptor descriptor : getComponents()) {
235 if (descriptor instanceof IdDescriptor) {
236 builder.add(descriptor.getName());
237 }
238 }
239 return builder.toArray();
240 }
241
242
243
244
245
246
247 public List<ReferenceDescriptor> getReferenceComponents() {
248 return CollectionUtil.extractItemsOfExactType(ReferenceDescriptor.class,
249 getComponents());
250 }
251
252 @Override
253 public void addVariable(VariableDescriptor variable) {
254 parts.add(variable.getName(), variable);
255 }
256
257
258
259
260
261
262
263
264
265 public ComplexTypeDescriptor withComponent(
266 ComponentDescriptor componentDescriptor) {
267 addComponent(componentDescriptor);
268 return this;
269 }
270
271 @Override
272 protected void init() {
273 super.init();
274 this.parts = new NamedValueList<>(NamedValueList.INSENSITIVE);
275 }
276
277
278
279 @Override
280 public String toString() {
281 if (parts.size() == 0) {
282 return super.toString();
283 }
284
285 return getName() + getParts();
286 }
287
288 }