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 }