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.benerator.factory;
28
29 import com.rapiddweller.benerator.Generator;
30 import com.rapiddweller.benerator.engine.BeneratorContext;
31 import com.rapiddweller.benerator.primitive.ValueMapper;
32 import com.rapiddweller.benerator.wrapper.WrapperFactory;
33 import com.rapiddweller.common.BeanUtil;
34 import com.rapiddweller.common.ConfigurationError;
35 import com.rapiddweller.common.Converter;
36 import com.rapiddweller.common.TimeUtil;
37 import com.rapiddweller.common.Validator;
38 import com.rapiddweller.common.converter.AnyConverter;
39 import com.rapiddweller.common.converter.FormatFormatConverter;
40 import com.rapiddweller.common.converter.ParseFormatConverter;
41 import com.rapiddweller.common.converter.String2DateConverter;
42 import com.rapiddweller.format.util.DataFileUtil;
43 import com.rapiddweller.model.data.Format;
44 import com.rapiddweller.model.data.SimpleTypeDescriptor;
45 import com.rapiddweller.model.data.TypeDescriptor;
46 import com.rapiddweller.model.data.Uniqueness;
47 import com.rapiddweller.platform.xls.PlatformDescriptor;
48 import com.rapiddweller.script.PrimitiveType;
49 import org.apache.logging.log4j.LogManager;
50 import org.apache.logging.log4j.Logger;
51
52 import java.text.SimpleDateFormat;
53 import java.util.Date;
54
55 import static com.rapiddweller.model.data.TypeDescriptor.PATTERN;
56
57
58
59
60
61
62
63
64
65 public abstract class TypeGeneratorFactory<E extends TypeDescriptor> {
66
67
68
69
70 protected final Logger logger = LogManager.getLogger(getClass());
71
72
73
74
75
76
77
78
79
80
81
82 public Generator<?> createGenerator(E descriptor, String instanceName,
83 boolean nullable, Uniqueness uniqueness, BeneratorContext context) {
84 logger.debug("createGenerator({})", descriptor.getName());
85 Generator<?> generator = createRootGenerator(descriptor, instanceName, nullable, uniqueness, context);
86 generator = applyComponentBuilders(generator, descriptor, instanceName, uniqueness, context);
87 generator = wrapWithPostprocessors(generator, descriptor, context);
88 generator = applyOffsetAndCyclic(generator, descriptor, instanceName, uniqueness, context);
89 logger.debug("Created {}", generator);
90 return generator;
91 }
92
93
94
95
96
97
98
99
100
101
102
103 public Generator<?> createRootGenerator(E descriptor, String instanceName,
104 boolean nullable, Uniqueness uniqueness, BeneratorContext context) {
105 Generator<?> generator = createExplicitGenerator(descriptor, uniqueness, context);
106 if (generator == null) {
107 generator = createSpecificGenerator(descriptor, instanceName, nullable, uniqueness, context);
108 }
109 if (generator == null) {
110 generator = createInheritedGenerator(descriptor, uniqueness, context);
111 }
112 if (generator == null) {
113 generator = createHeuristicGenerator(descriptor, instanceName, uniqueness, context);
114 }
115 if (generator == null) {
116 throw new ConfigurationError("Failed to create root generator for descriptor: " + descriptor);
117 }
118 return generator;
119 }
120
121
122
123
124
125
126
127
128
129 protected Generator<?> createExplicitGenerator(
130 E type, Uniqueness uniqueness, BeneratorContext context) {
131 Generator<?> generator = DescriptorUtil.getGeneratorByName(type, context);
132 if (generator == null) {
133 generator = createSourceGenerator(type, uniqueness, context);
134 }
135 if (generator == null) {
136 generator = createScriptGenerator(type);
137 }
138 return generator;
139 }
140
141
142
143
144
145
146
147 protected abstract Class<?> getGeneratedType(E descriptor);
148
149
150
151
152
153
154
155
156
157 protected abstract Generator<?> createSourceGenerator(
158 E descriptor, Uniqueness uniqueness, BeneratorContext context);
159
160
161
162
163
164
165
166
167
168
169
170 protected abstract Generator<?> createSpecificGenerator(E descriptor, String instanceName,
171 boolean nullable, Uniqueness uniqueness, BeneratorContext context);
172
173
174
175
176
177
178
179
180
181 @SuppressWarnings("unchecked")
182 protected Generator<?> createInheritedGenerator(
183 E type, Uniqueness uniqueness, BeneratorContext context) {
184 while (type.getParent() != null) {
185 type = (E) type.getParent();
186 Generator<?> generator = createExplicitGenerator(type, uniqueness, context);
187 if (generator != null) {
188 return generator;
189 }
190 }
191 return null;
192 }
193
194
195
196
197
198
199
200
201
202
203 protected abstract Generator<?> createHeuristicGenerator(E descriptor, String instanceName,
204 Uniqueness uniqueness, BeneratorContext context);
205
206
207
208
209
210
211
212
213
214
215
216 protected Generator<?> applyOffsetAndCyclic(Generator<?> generator, E descriptor, String instanceName,
217 Uniqueness uniqueness, BeneratorContext context) {
218 generator = DescriptorUtil.processOffset(generator, descriptor);
219 generator = DescriptorUtil.processCyclic(generator, descriptor);
220 return generator;
221 }
222
223
224
225
226
227
228
229
230
231
232
233 protected Generator<?> applyComponentBuilders(Generator<?> generator, E descriptor, String instanceName,
234 Uniqueness uniqueness, BeneratorContext context) {
235 return generator;
236 }
237
238
239
240
241
242
243
244 protected static Generator<?> createScriptGenerator(TypeDescriptor descriptor) {
245 String scriptText = descriptor.getScript();
246 if (scriptText != null) {
247 return FactoryUtil.createScriptGenerator(scriptText);
248 }
249 return null;
250 }
251
252
253
254
255
256
257
258
259
260 @SuppressWarnings({"unchecked", "rawtypes"})
261 protected static Generator<?> createValidatingGenerator(
262 TypeDescriptor descriptor, Generator<?> generator, BeneratorContext context) {
263 Validator validator = DescriptorUtil.getValidator(descriptor.getValidator(), context);
264 if (validator != null) {
265 generator = WrapperFactory.applyValidator(validator, generator);
266 }
267 return generator;
268 }
269
270
271
272
273
274
275
276
277
278 @SuppressWarnings({"unchecked", "rawtypes"})
279 public static Generator<?> createConvertingGenerator(TypeDescriptor descriptor, Generator generator, BeneratorContext context) {
280 Converter<?, ?> converter = DescriptorUtil.getConverter(descriptor.getConverter(), context);
281 if (converter != null) {
282 if (descriptor.getPattern() != null && BeanUtil.hasProperty(converter.getClass(), PATTERN)) {
283 BeanUtil.setPropertyValue(converter, PATTERN, descriptor.getPattern(), false);
284 }
285 generator = WrapperFactory.applyConverter(generator, converter);
286 }
287 return generator;
288 }
289
290
291
292
293
294
295
296
297
298
299 @SuppressWarnings("unchecked")
300 static <E> Generator<E> wrapWithPostprocessors(Generator<E> generator, TypeDescriptor descriptor, BeneratorContext context) {
301 generator = (Generator<E>) createConvertingGenerator(descriptor, generator, context);
302 if (descriptor instanceof SimpleTypeDescriptor) {
303 SimpleTypeDescriptorpiddweller/model/data/SimpleTypeDescriptor.html#SimpleTypeDescriptor">SimpleTypeDescriptor simpleType = (SimpleTypeDescriptor) descriptor;
304 generator = (Generator<E>) createMappingGenerator(simpleType, generator);
305 generator = (Generator<E>) createTypeConvertingGenerator(simpleType, generator);
306 }
307 generator = (Generator<E>) createValidatingGenerator(descriptor, generator, context);
308 return generator;
309 }
310
311
312
313
314
315
316
317
318 static Generator<?> createMappingGenerator(
319 SimpleTypeDescriptor descriptor, Generator<?> generator) {
320 if (descriptor == null || descriptor.getMap() == null) {
321 return generator;
322 }
323 String mappingSpec = descriptor.getMap();
324 ValueMapper mapper = new ValueMapper(mappingSpec);
325 return WrapperFactory.applyConverter(generator, mapper);
326 }
327
328
329
330
331
332
333
334
335 static Generator<?> createTypeConvertingGenerator(
336 SimpleTypeDescriptor descriptor, Generator<?> generator) {
337 if (descriptor == null || descriptor.getPrimitiveType() == null) {
338 return generator;
339 }
340 Converter<?, ?> converter = createConverter(descriptor, generator.getGeneratedType());
341 return (converter != null ? WrapperFactory.applyConverter(generator, converter) : generator);
342 }
343
344
345
346
347
348
349
350
351 @SuppressWarnings({"unchecked", "rawtypes"})
352 public static Converter<?, ?> createConverter(SimpleTypeDescriptor descriptor, Class<?> sourceType) {
353 PrimitiveType primitiveType = descriptor.getPrimitiveType();
354 Class<?> targetType = primitiveType.getJavaType();
355 Converter<?, ?> converter = null;
356 if (Date.class.equals(targetType) && sourceType == String.class) {
357
358 if (descriptor.getPattern() != null) {
359
360 String pattern = descriptor.getPattern();
361 converter = new ParseFormatConverter<>(Date.class, new SimpleDateFormat(pattern), false);
362 } else {
363
364 converter = new String2DateConverter<>();
365 }
366 } else if (String.class.equals(targetType) && sourceType == Date.class) {
367
368 if (descriptor.getPattern() != null) {
369
370 String pattern = descriptor.getPattern();
371 converter = new FormatFormatConverter<>(Date.class, new SimpleDateFormat(pattern), false);
372 } else {
373
374 converter = new FormatFormatConverter<>(Date.class, TimeUtil.createDefaultDateFormat(), false);
375 }
376 } else if (targetType != sourceType) {
377 converter = new AnyConverter(targetType, descriptor.getPattern());
378 }
379 return converter;
380 }
381
382
383
384
385
386
387
388 protected boolean shouldNullifyEachNullable(BeneratorContext context) {
389 return (context.getGeneratorFactory().getDefaultsProvider().defaultNullQuota() == 1.);
390 }
391
392
393
394
395
396
397
398 protected static boolean isFormatted(TypeDescriptor type) {
399 Format format = type.getFormat();
400 if (format == Format.formatted) {
401 return true;
402 } else if (format == Format.raw) {
403 return false;
404 } else if (!DataFileUtil.isExcelDocument(type.getSource())) {
405 return false;
406 } else {
407 return PlatformDescriptor.isFormattedByDefault();
408 }
409 }
410
411 }