package frame.variant.translator; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Date; import java.util.HashMap; import java.util.Map; import frame.variant.ValueType; import frame.variant.Value; public abstract class Translator { private static Map, Class> classTranslatorTypeMap; private static Map> dataTypeTranslatorTypeMap; private static Map, ITranslator> classTranslatorMap; static { initClassTranslatorTypeMap(); initDataTypeTranslatorTypeMap(); intiClassTranslatorMap(); } public static ITranslator getInstance(Class type) { return getInstance(type, null); } public static ITranslator getInstance(ValueType type) { return getInstance(type, null); } public static ITranslator getInstance(Class type, String format) { ITranslator result = null; Class translatorClass = classTranslatorTypeMap.get(type); if (translatorClass == null) { return null; } try { result = translatorClass.newInstance(); result.setFormat(format); } catch (Exception e) { return null; } return result; } public static ITranslator getInstance(ValueType type, String format) { ITranslator result = null; Class translatorClass = dataTypeTranslatorTypeMap.get(type); if (translatorClass == null) { return null; } try { result = translatorClass.newInstance(); result.setFormat(format); } catch (Exception e) { return null; } return result; } public static String toString(Object value) { return toString(value, null); } public static String toString(Object value, String defaultValue) { if (value == null) { return defaultValue; } ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toString(value, defaultValue); } public static String toSqlString(Object value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toSqlString(value); } public static String toSqlString(String prefix, Object value, String suffix)throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toSqlString(prefix, value, suffix); } public static String toJSONString(Object value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toJSONString(value); } public static String toJSONString(Object value, String defaultValue) { try { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toJSONString(value); } catch (Exception e) { return defaultValue; } } public static String toSchemaString(Object value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toSchemaString(value); } public static Integer toInteger(Object value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toInteger(value); } public static Integer toInteger(Object value, Integer defaultValue) { if (value == null) { return defaultValue; } ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toInteger(value, defaultValue); } public static Double toDouble(Object value)throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toDouble(value); } public static BigDecimal toBigDecimal(Object value) throws Exception { return toBigDecimal(value, null); } public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) throws Exception { if (value == null) { return defaultValue; } ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toBigDecimal(value, defaultValue); } public static Boolean toBoolean(Object value) throws Exception { return toBoolean(value, null); } public static Boolean toBoolean(Object value, Boolean defaultValue) { if (value == null) { return defaultValue; } ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toBoolean(value, defaultValue); } public static Date toDate(Object value) throws Exception { return toDate(value, null); } public static Date toDate(Object value, Date defaultValue) throws Exception { if (value == null) { return defaultValue; } ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toDate(value, defaultValue); } public static String toSQLTypeCode(Object typeValue, Object lengthValue) { String result = toString(typeValue, null); if (result == null) { result = "varchar"; } if (result.indexOf("char") >= 0) { String length = toString(lengthValue, null); if (length == null) { length = "32"; } result = result + "(" + length + ")"; } return result; } public static String toSQLNullCode(Object object) { boolean nullable = toBoolean(object, true); if (nullable) { return "NULL"; } else { return "NOT NULL"; } } public static Object toTranslatorTypeValue(Object value, Class clazz) { ITranslator iTranslator = classTranslatorMap.get(value.getClass()); classTranslatorMap.put(Long.class, new LongTranslator()); if (String.class.equals(clazz)) { iTranslator.toString(); } else if (Integer.class.equals(clazz)) { iTranslator.toInteger(value, 0); } else if (BigInteger.class.equals(clazz)) { iTranslator.toInteger(value, 0); } else if (Double.class.equals(clazz)) { iTranslator.toDouble(value, 0.0); } else if (Float.class.equals(clazz)) { iTranslator.toDouble(value, 0.0); } else if (Long.class.equals(clazz)) { iTranslator.toInteger(value, 0); } else if (BigDecimal.class.equals(clazz)) { iTranslator.toBigDecimal(value, BigDecimal.ZERO); } else if (Date.class.equals(clazz)) { iTranslator.toDate(value, null); } else if (Boolean.class.equals(clazz)) { iTranslator.toBoolean(value, false); } else if (Object.class.equals(clazz)) { return value; } return value; } public static Object toTranslatorTypeValue(Object value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.toTranslatorTypeValue(value); } public static Object loadToObject(String value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.loadObjectFrom(value); } public static Value loadToVariant(String value) throws Exception { ITranslator simpleTranslator = getInstance(value.getClass()); return simpleTranslator.loadVariantFrom(value); } private static void initClassTranslatorTypeMap() { classTranslatorTypeMap = new HashMap, Class>(); classTranslatorTypeMap.put(String.class, StringTranslator.class); classTranslatorTypeMap.put(Integer.class, IntegerTranslator.class); classTranslatorTypeMap.put(int.class, IntegerTranslator.class); classTranslatorTypeMap.put(BigInteger.class, IntegerTranslator.class); classTranslatorTypeMap.put(Double.class, DoubleTranslator.class); classTranslatorTypeMap.put(double.class, DoubleTranslator.class); classTranslatorTypeMap.put(Float.class, DoubleTranslator.class); classTranslatorTypeMap.put(float.class, DoubleTranslator.class); classTranslatorTypeMap.put(BigDecimal.class, BigDecimalTranslator.class); classTranslatorTypeMap.put(Date.class, DateTranslator.class); classTranslatorTypeMap.put(Boolean.class, BooleanTranslator.class); classTranslatorTypeMap.put(boolean.class, BooleanTranslator.class); classTranslatorTypeMap.put(Object.class, ObjectTranslator.class); classTranslatorTypeMap.put(Long.class, LongTranslator.class); } private static void intiClassTranslatorMap() { classTranslatorMap = new HashMap, ITranslator>(); classTranslatorMap.put(String.class, new StringTranslator()); classTranslatorMap.put(Integer.class, new IntegerTranslator()); classTranslatorMap.put(int.class, new IntegerTranslator()); classTranslatorMap.put(BigInteger.class, new IntegerTranslator()); classTranslatorMap.put(Double.class, new DoubleTranslator()); classTranslatorMap.put(double.class, new DoubleTranslator()); classTranslatorMap.put(Float.class, new DoubleTranslator()); classTranslatorMap.put(float.class, new DoubleTranslator()); classTranslatorMap.put(BigDecimal.class, new BigDecimalTranslator()); classTranslatorMap.put(Date.class, new DateTranslator()); classTranslatorMap.put(Boolean.class, new BooleanTranslator()); classTranslatorMap.put(boolean.class, new BooleanTranslator()); classTranslatorMap.put(Object.class, new ObjectTranslator()); classTranslatorMap.put(Long.class, new LongTranslator()); } private static void initDataTypeTranslatorTypeMap() { dataTypeTranslatorTypeMap = new HashMap>(); dataTypeTranslatorTypeMap.put(ValueType.String, StringTranslator.class); dataTypeTranslatorTypeMap.put(ValueType.Int, IntegerTranslator.class); dataTypeTranslatorTypeMap.put(ValueType.Double, DoubleTranslator.class); dataTypeTranslatorTypeMap.put(ValueType.Decimal, BigDecimalTranslator.class); dataTypeTranslatorTypeMap.put(ValueType.Date, DateTranslator.class); dataTypeTranslatorTypeMap.put(ValueType.Boolean, BooleanTranslator.class); } public static boolean containsType(Class type) { return classTranslatorTypeMap.containsKey(type); } }