1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.codebox.bean;
16
17 import com.codebox.enums.LoadData;
18 import com.codebox.enums.LoadType;
19 import com.codebox.instance.ClassInstance;
20 import com.codebox.instance.ConstructorInstance;
21
22 import java.lang.reflect.Array;
23 import java.lang.reflect.Constructor;
24 import java.lang.reflect.Field;
25 import java.math.BigDecimal;
26 import java.time.Instant;
27 import java.time.LocalDate;
28 import java.time.LocalDateTime;
29 import java.time.LocalTime;
30 import java.time.OffsetDateTime;
31 import java.time.ZoneId;
32 import java.time.ZoneOffset;
33 import java.time.ZonedDateTime;
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.Set;
40 import java.util.TreeSet;
41 import java.util.UUID;
42 import java.util.concurrent.ConcurrentHashMap;
43 import java.util.concurrent.ConcurrentMap;
44
45 import lombok.Data;
46
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53 @Data
54 public class ValueBuilder {
55
56
57 private static final Logger logger = LoggerFactory.getLogger(ValueBuilder.class);
58
59
60 private LoadData loadData;
61
62
63
64
65
66
67
68
69
70
71
72
73
74 public <T> Object buildValue(final Class<T> clazz, final LoadType loadType) {
75
76 final Constructor<?>[] ctrs = clazz.getConstructors();
77 for (final Constructor<?> ctr : ctrs) {
78 if (ctr.getParameterTypes().length == 0 && clazz != String.class) {
79 if (this.loadData == LoadData.ON && !containsSelf(clazz)) {
80
81 final JavaBeanTesterWorker<T, Object> beanTesterWorker = new JavaBeanTesterWorker<>(clazz);
82 beanTesterWorker.setLoadData(this.loadData);
83 beanTesterWorker.getterSetterTests(new ClassInstance<T>().newInstance(clazz));
84 return null;
85 }
86
87 return ConstructorInstance.newInstance(ctr);
88 }
89 }
90
91
92 Object returnObject = null;
93 switch (loadType) {
94 case ALTERNATE_DATA:
95 returnObject = ValueBuilder.setAlternateValues(clazz);
96 break;
97 case NULL_DATA:
98 returnObject = ValueBuilder.setNullValues(clazz);
99 break;
100 case STANDARD_DATA:
101 default:
102 returnObject = ValueBuilder.setStandardValues(clazz);
103 break;
104 }
105
106 if (returnObject != null || loadType == LoadType.NULL_DATA) {
107 return returnObject;
108 }
109
110 if (clazz.isAssignableFrom(BigDecimal.class)) {
111 return BigDecimal.ONE;
112 }
113
114 if (clazz.isAssignableFrom(UUID.class)) {
115 return UUID.fromString("00000000-0000-0000-0000-000123456789");
116 }
117
118 if (clazz.isAssignableFrom(Instant.class)) {
119 return Instant.ofEpochSecond(1L);
120 }
121
122 if (clazz.isAssignableFrom(List.class)) {
123 return new ArrayList<>();
124 }
125
126 if (clazz.isAssignableFrom(Map.class)) {
127 return new HashMap<>();
128 }
129
130 if (clazz.isAssignableFrom(ConcurrentMap.class)) {
131 return new ConcurrentHashMap<>();
132 }
133
134 if (clazz.isAssignableFrom(Set.class)) {
135 return new TreeSet<>();
136 }
137
138 if (clazz.isAssignableFrom(LocalDate.class)) {
139 return LocalDate.now();
140 }
141
142 if (clazz.isAssignableFrom(LocalDateTime.class)) {
143 return LocalDateTime.of(2000, 10, 1, 0, 0);
144 }
145
146 if (clazz.isAssignableFrom(LocalTime.class)) {
147 return LocalTime.of(0, 0);
148 }
149
150 if (clazz.isAssignableFrom(OffsetDateTime.class)) {
151 return OffsetDateTime.of(2000, 10, 1, 0, 0, 0, 0, ZoneOffset.MIN);
152 }
153
154 if (clazz.isAssignableFrom(ZonedDateTime.class)) {
155 return ZonedDateTime.of(LocalDateTime.of(2020, 11, 16, 10, 26, 00, 01), ZoneId.of("UTC"));
156 }
157
158 if (clazz == Logger.class) {
159 return LoggerFactory.getLogger(clazz);
160 }
161
162 if (clazz.isEnum()) {
163 return clazz.getEnumConstants()[0];
164 }
165
166
167
168
169 ValueBuilder.logger.warn(
170 "Unable to build value for class '{}', please raise ticket with JavaBeanTester for desired support.",
171 clazz.getName());
172 return null;
173 }
174
175
176
177
178
179
180
181
182
183
184
185 private static <T> Object setAlternateValues(final Class<T> clazz) {
186 return ValueBuilder.setValues(clazz, "ALT_VALUE", 1, Boolean.FALSE, Integer.valueOf(2), Long.valueOf(2),
187 Double.valueOf(2.0), Float.valueOf(2.0F), Character.valueOf('N'), Byte.valueOf((byte) 2));
188 }
189
190
191
192
193
194
195
196
197
198
199
200 private static <T> Object setNullValues(final Class<T> clazz) {
201 return ValueBuilder.setValues(clazz, null, 0, null, null, null, null, null, null, null);
202 }
203
204
205
206
207
208
209
210
211
212
213
214 private static <T> Object setStandardValues(final Class<T> clazz) {
215 return ValueBuilder.setValues(clazz, "TEST_VALUE", 1, Boolean.TRUE, Integer.valueOf(1), Long.valueOf(1),
216 Double.valueOf(1.0), Float.valueOf(1.0F), Character.valueOf('Y'), Byte.valueOf((byte) 1));
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247 private static <T> Object setValues(final Class<T> clazz, final String string, final int arrayLength,
248 final Boolean booleanValue, final Integer integerValue, final Long longValue, final Double doubleValue,
249 final Float floatValue, final Character characterValue, final Byte byteValue) {
250 if (clazz == String.class) {
251 return string;
252 }
253 if (clazz.isArray()) {
254 return Array.newInstance(clazz.getComponentType(), arrayLength);
255 }
256 if (clazz == boolean.class || clazz == Boolean.class) {
257 return ValueBuilder.initializeBoolean(clazz, booleanValue);
258 }
259 if (clazz == int.class || clazz == Integer.class) {
260 return ValueBuilder.initializeInteger(clazz, integerValue);
261 }
262 if (clazz == long.class || clazz == Long.class) {
263 return ValueBuilder.initializeLong(clazz, longValue);
264 }
265 if (clazz == double.class || clazz == Double.class) {
266 return ValueBuilder.initializeDouble(clazz, doubleValue);
267 }
268 if (clazz == float.class || clazz == Float.class) {
269 return ValueBuilder.initializeFloat(clazz, floatValue);
270 }
271 if (clazz == char.class || clazz == Character.class) {
272 return ValueBuilder.initializeCharacter(clazz, characterValue);
273 }
274 if (clazz == byte.class || clazz == Byte.class) {
275 return ValueBuilder.initializeByte(clazz, byteValue);
276 }
277 return null;
278 }
279
280
281
282
283
284
285
286
287
288
289
290
291
292 private static <T> Object initializeBoolean(final Class<T> clazz, final Boolean booleanValue) {
293 if (clazz == boolean.class && booleanValue == null) {
294 return Boolean.FALSE;
295 }
296 return booleanValue;
297 }
298
299
300
301
302
303
304
305
306
307
308
309
310
311 private static <T> Object initializeInteger(final Class<T> clazz, final Integer integerValue) {
312 if (clazz == int.class && integerValue == null) {
313 return Integer.valueOf(-1);
314 }
315 return integerValue;
316 }
317
318
319
320
321
322
323
324
325
326
327
328
329
330 private static <T> Object initializeLong(final Class<T> clazz, final Long longValue) {
331 if (clazz == long.class && longValue == null) {
332 return Long.valueOf(-1);
333 }
334 return longValue;
335 }
336
337
338
339
340
341
342
343
344
345
346
347
348
349 private static <T> Object initializeDouble(final Class<T> clazz, final Double doubleValue) {
350 if (clazz == double.class && doubleValue == null) {
351 return Double.valueOf(-1.0);
352 }
353 return doubleValue;
354 }
355
356
357
358
359
360
361
362
363
364
365
366
367
368 private static <T> Object initializeFloat(final Class<T> clazz, final Float floatValue) {
369 if (clazz == float.class && floatValue == null) {
370 return Float.valueOf(-1.0F);
371 }
372 return floatValue;
373 }
374
375
376
377
378
379
380
381
382
383
384
385
386
387 private static <T> Object initializeCharacter(final Class<T> clazz, final Character characterValue) {
388 if (clazz == char.class && characterValue == null) {
389 return Character.valueOf('\u0000');
390 }
391 return characterValue;
392 }
393
394
395
396
397
398
399
400
401
402
403
404
405
406 private static <T> Object initializeByte(final Class<T> clazz, final Byte byteValue) {
407 if (clazz == byte.class && byteValue == null) {
408 return Byte.valueOf((byte) -1);
409 }
410 return byteValue;
411 }
412
413
414
415
416
417
418
419
420
421
422 private <T> boolean containsSelf(final Class<T> clazz) {
423 final List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
424 for (Field field : fields) {
425 if (field.getType().equals(clazz)) {
426 return true;
427 }
428 }
429 return false;
430 }
431
432 }