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 }