|
23 | 23 | */ |
24 | 24 | package org.jeasy.random.util; |
25 | 25 |
|
26 | | -import com.fasterxml.jackson.databind.ObjectMapper; |
27 | 26 | import org.jeasy.random.annotation.RandomizerArgument; |
28 | 27 | import org.jeasy.random.ObjectCreationException; |
29 | 28 | import org.jeasy.random.api.Randomizer; |
|
33 | 32 | import java.beans.PropertyDescriptor; |
34 | 33 | import java.lang.annotation.Annotation; |
35 | 34 | import java.lang.reflect.*; |
36 | | -import java.text.SimpleDateFormat; |
| 35 | +import java.math.BigDecimal; |
| 36 | +import java.math.BigInteger; |
| 37 | +import java.time.LocalDate; |
| 38 | +import java.time.LocalDateTime; |
| 39 | +import java.time.LocalTime; |
37 | 40 | import java.util.*; |
38 | 41 | import java.util.concurrent.*; |
39 | 42 | import java.util.function.Supplier; |
40 | 43 | import java.util.stream.Stream; |
41 | 44 |
|
42 | | -import static org.jeasy.random.util.DateUtils.DATE_FORMAT; |
43 | 45 | import static java.lang.String.format; |
44 | 46 | import static java.util.Arrays.asList; |
45 | 47 | import static java.util.Locale.ENGLISH; |
|
52 | 54 | */ |
53 | 55 | public final class ReflectionUtils { |
54 | 56 |
|
55 | | - private static final ObjectMapper objectMapper = new ObjectMapper(); |
56 | | - |
57 | | - static { |
58 | | - objectMapper.setDateFormat(new SimpleDateFormat(DATE_FORMAT)); |
59 | | - } |
60 | | - |
61 | 57 | private ReflectionUtils() { |
62 | 58 | } |
63 | 59 |
|
@@ -612,15 +608,45 @@ private static Object[] convertArguments(final RandomizerArgument[] declaredArgu |
612 | 608 | Object[] arguments = new Object[numberOfArguments]; |
613 | 609 | for (int i = 0; i < numberOfArguments; i++) { |
614 | 610 | Class<?> type = declaredArguments[i].type(); |
615 | | - String argument = declaredArguments[i].value(); |
616 | | - Object value = argument; |
| 611 | + String value = declaredArguments[i].value(); |
617 | 612 | // issue 299: if argument type is array, split values before conversion |
618 | 613 | if (type.isArray()) { |
619 | | - value = Stream.of(argument.split(",")).map(String::trim).toArray(); |
| 614 | + Object[] values = Stream.of(value.split(",")).map(String::trim).toArray(); |
| 615 | + arguments[i] = convertArray(values, type); |
| 616 | + } else { |
| 617 | + arguments[i] = convertValue(value, type); |
620 | 618 | } |
621 | | - arguments[i] = objectMapper.convertValue(value, type); |
622 | 619 | } |
623 | 620 | return arguments; |
624 | 621 | } |
625 | 622 |
|
| 623 | + private static Object convertValue(String value, Class<?> targetType) { |
| 624 | + if(Boolean.class.equals(targetType) || Boolean.TYPE.equals(targetType)) return Boolean.parseBoolean(value); |
| 625 | + if(Byte.class.equals(targetType) || Byte.TYPE.equals(targetType)) return Byte.parseByte(value); |
| 626 | + if(Short.class.equals(targetType) || Short.TYPE.equals(targetType)) return Short.parseShort(value); |
| 627 | + if(Integer.class.equals(targetType) || Integer.TYPE.equals(targetType)) return Integer.parseInt(value); |
| 628 | + if(Long.class.equals(targetType) || Long.TYPE.equals(targetType)) return Long.parseLong(value); |
| 629 | + if(Float.class.equals(targetType) || Float.TYPE.equals(targetType)) return Float.parseFloat(value); |
| 630 | + if(Double.class.equals(targetType) || Double.TYPE.equals(targetType)) return Double.parseDouble(value); |
| 631 | + if(BigInteger.class.equals(targetType)) return new BigInteger(value); |
| 632 | + if(BigDecimal.class.equals(targetType)) return new BigDecimal(value); |
| 633 | + if(Date.class.equals(targetType)) return DateUtils.parse(value); |
| 634 | + if(java.sql.Date.class.equals(targetType)) return java.sql.Date.valueOf(value); |
| 635 | + if(java.sql.Time.class.equals(targetType)) return java.sql.Time.valueOf(value); |
| 636 | + if(java.sql.Timestamp.class.equals(targetType)) return java.sql.Timestamp.valueOf(value); |
| 637 | + if(LocalDate.class.equals(targetType)) return LocalDate.parse(value); |
| 638 | + if(LocalTime.class.equals(targetType)) return LocalTime.parse(value); |
| 639 | + if(LocalDateTime.class.equals(targetType)) return LocalDateTime.parse(value); |
| 640 | + return value; |
| 641 | + } |
| 642 | + |
| 643 | + private static Object convertArray(Object array, Class<?> targetType) { |
| 644 | + Object[] values = (Object[]) array; |
| 645 | + Object convertedValuesArray = Array.newInstance(targetType.getComponentType(), values.length); |
| 646 | + for (int i = 0; i < values.length; i++) { |
| 647 | + Array.set(convertedValuesArray, i, convertValue((String) values[i], targetType.getComponentType())); |
| 648 | + } |
| 649 | + return convertedValuesArray; |
| 650 | + } |
| 651 | + |
626 | 652 | } |
0 commit comments