View Javadoc
1   package net.technearts;
2   
3   import java.lang.reflect.InvocationTargetException;
4   import java.math.BigDecimal;
5   import java.math.RoundingMode;
6   import java.util.regex.Matcher;
7   import java.util.regex.Pattern;
8   
9   import org.apache.commons.lang3.ArrayUtils;
10  import org.apache.poi.ss.usermodel.DateUtil;
11  
12  public final class ConverterFactory {
13  
14    private static final Pattern DECIMAL = Pattern.compile("decimal\\((\\d+)\\)");
15  
16    private ConverterFactory() {}
17  
18    @SuppressWarnings("unchecked")
19    private static final <T> Converter<T> converter(Class<?> klazz) {
20      if (klazz.isEnum()) {
21        return a -> {
22          try {
23            return (T) klazz.getMethod("valueOf", String.class).invoke(klazz, a);
24          } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
25              | NoSuchMethodException | SecurityException e) {
26            throw new IllegalArgumentException("Unable to find enum " + klazz.getName());
27          }
28        };
29      } else if (ArrayUtils.contains(klazz.getInterfaces(), Converter.class)) {
30        return Converter.class.cast(klazz);
31      } else {
32        return a -> (T) a.toString();
33      }
34    }
35  
36    @SuppressWarnings("unchecked")
37    private static final <T> Converter<T> converter(String type) {
38      final String nonNullType = type == null ? "" : type;
39      Matcher m = DECIMAL.matcher(nonNullType);
40      if (m.matches()) {
41        int scale = Integer.valueOf(m.group(1));
42        return a -> (T) new BigDecimal(a).setScale(scale, RoundingMode.HALF_UP);
43      }
44      switch (nonNullType) {
45        case "byte":
46          return a -> (T) Byte.valueOf(a);
47        case "short":
48          return a -> (T) Short.valueOf(a);
49        case "integer":
50          return a -> (T) Integer.valueOf(a);
51        case "long":
52          return a -> (T) Long.valueOf(a);
53        case "boolean":
54          return a -> (T) Boolean.valueOf(a);
55        case "date":
56          return a -> (T) DateUtil.getJavaDate(Double.valueOf(a), true);
57        case "float":
58          return a -> (T) Float.valueOf(a);
59        case "double":
60          return a -> (T) Double.valueOf(a);
61        case "char":
62          return a -> (T) Character.valueOf(a.charAt(0));
63        case "string":
64        default:
65          return a -> (T) a.toString();
66      }
67    }
68  
69    public static final <T> Converter<T> converter(Member member) {
70      try {
71        return converter(Class.forName(member.getConverter()));
72      } catch (ClassNotFoundException | NullPointerException e) {
73        return converter(member.getConverter());
74      }
75    }
76  }