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.Composite;
30 import com.rapiddweller.common.CompositeFormatter;
31 import com.rapiddweller.common.ConfigurationError;
32 import com.rapiddweller.common.collection.OrderedNameMap;
33 import com.rapiddweller.common.converter.AnyConverter;
34 import com.rapiddweller.platform.java.BeanDescriptorProvider;
35 import com.rapiddweller.script.PrimitiveType;
36
37
38
39
40
41
42
43
44
45 public class Entity implements Composite {
46
47
48
49
50 public final ComplexTypeDescriptor descriptor;
51 private OrderedNameMap<Object> components;
52
53
54
55
56
57
58
59
60
61 public Entity(String name, DescriptorProvider descriptorProvider) {
62 this(new ComplexTypeDescriptor(name, descriptorProvider));
63 }
64
65
66
67
68
69
70
71
72 public Entity(String name, DescriptorProvider descriptorProvider,
73 Object... componentKeyValuePairs) {
74 this(new ComplexTypeDescriptor(name, descriptorProvider),
75 componentKeyValuePairs);
76 }
77
78
79
80
81
82
83
84 public Entity(ComplexTypeDescriptor descriptor,
85 Object... componentKeyValuePairs) {
86 this.descriptor = descriptor;
87 this.components = OrderedNameMap.createCaseInsensitiveMap();
88 for (int i = 0; i < componentKeyValuePairs.length; i += 2) {
89 setComponent((String) componentKeyValuePairs[i],
90 componentKeyValuePairs[i + 1]);
91 }
92 }
93
94
95
96
97
98
99 public Entityty" href="../../../../com/rapiddweller/model/data/Entity.html#Entity">Entity(Entity prototype) {
100 this.descriptor = prototype.descriptor;
101 this.components = new OrderedNameMap<>(prototype.components);
102 }
103
104
105
106
107
108
109
110
111 public String type() {
112 return (descriptor != null ? descriptor.getName() : null);
113 }
114
115
116
117
118
119
120 public ComplexTypeDescriptor descriptor() {
121 return descriptor;
122 }
123
124
125
126
127
128
129
130
131 public Object get(String componentName) {
132 return getComponent(componentName);
133 }
134
135 @Override
136 public Object getComponent(String componentName) {
137 return components.get(componentName);
138 }
139
140
141
142
143
144
145
146 public boolean componentIsSet(String componentName) {
147 return components.containsKey(componentName);
148 }
149
150 @Override
151 public OrderedNameMap<Object> getComponents() {
152 return components;
153 }
154
155
156
157
158
159
160 public void setComponents(OrderedNameMap<Object> components) {
161 this.components = components;
162 }
163
164
165
166
167
168
169
170 public void set(String componentName, Object component) {
171 setComponent(componentName, component);
172 }
173
174 @Override
175 public void setComponent(String componentName, Object component) {
176 ComponentDescriptor componentDescriptor = null;
177 if (descriptor != null) {
178 componentDescriptor = descriptor.getComponent(componentName);
179 }
180 if (componentDescriptor != null && componentDescriptor
181 .getTypeDescriptor() instanceof SimpleTypeDescriptor) {
182 SimpleTypeDescriptor componentType =
183 (SimpleTypeDescriptor) componentDescriptor
184 .getTypeDescriptor();
185 PrimitiveType primitiveType = componentType.getPrimitiveType();
186 if (primitiveType == null) {
187 primitiveType = PrimitiveType.STRING;
188 }
189 BeanDescriptorProvider beanProvider =
190 descriptor.getDataModel().getBeanDescriptorProvider();
191 Class<?> javaType =
192 beanProvider.concreteType(primitiveType.getName());
193 component = AnyConverter.convert(component, javaType);
194 }
195 String internalComponentName =
196 componentDescriptor != null ? componentDescriptor.getName() :
197 componentName;
198 components.put(internalComponentName, component);
199 }
200
201
202
203
204
205
206 public void remove(String componentName) {
207 removeComponent(componentName);
208 }
209
210
211
212
213
214
215 public void removeComponent(String componentName) {
216 components.remove(componentName);
217 }
218
219
220
221
222
223
224 public Object idComponentValues() {
225 ComplexTypeDescriptor entityDescriptor = descriptor;
226 if (entityDescriptor == null) {
227 throw new ConfigurationError("Unknown type: " + this);
228 }
229 String[] idComponentNames = entityDescriptor.getIdComponentNames();
230 if (idComponentNames.length == 1) {
231 return get(idComponentNames[0]);
232 } else if (idComponentNames.length == 0) {
233 return null;
234 } else {
235 return componentValues(idComponentNames);
236 }
237 }
238
239
240
241
242
243
244
245 public Object componentValues(String[] idComponentNames) {
246 Object[] result = new Object[idComponentNames.length];
247 for (int i = 0; i < idComponentNames.length; i++) {
248 result[i] = get(idComponentNames[i]);
249 }
250 return result;
251 }
252
253
254
255 @Override
256 public boolean equals(Object o) {
257 if (this == o) {
258 return true;
259 }
260 if (!(o instanceof Entity)) {
261 return false;
262 }
263 final Entity="../../../../com/rapiddweller/model/data/Entity.html#Entity">Entity that = (Entity) o;
264 if (!this.descriptor.getName().equals(that.descriptor.getName())) {
265 return false;
266 }
267 return this.components.equalsIgnoreOrder(that.components);
268 }
269
270 @Override
271 public int hashCode() {
272 return descriptor.getName().hashCode() * 29 + components.hashCode();
273 }
274
275 @Override
276 public String toString() {
277 return new CompositeFormatter(true, true)
278 .render(type() + '[', this, "]");
279 }
280
281 }