package org.quaere; import java.math.BigDecimal; import java.math.BigInteger; public class Convert { private static final String EMTPY_STRING = ""; public static byte toByte(Object obj) { return (Byte) toType(obj, Byte.class); } public static short toShort(Object obj) { return (Short) toType(obj, Short.class); } public static int toInteger(Object obj) { return (Integer) toType(obj, Integer.class); } public static long toLong(Object obj) { return (Long) toType(obj, Long.class); } public static float toFloat(Object obj) { return (Float) toType(obj, Float.class); } public static double toDouble(Object obj) { return (Double) toType(obj, Double.class); } public static boolean toBoolean(Object obj) { if (isNullOrEmptyString(obj)) { return false; } else if (isBoolean(obj)) { return (Boolean) obj; } else if (isNumber(obj)) { return ((Number) obj).intValue() != 0; } else if (isCharSequence(obj)) { return Boolean.valueOf(toString(obj)); } else { throw createConversionException(obj, Boolean.class); } } public static boolean isNumber(final Object obj) { return obj instanceof Number; } public static Object toType(Object obj, Class<?> toClass) { if (isInstance(obj, toClass)) { return obj; } if (isStringType(toClass)) { return toString(obj); } if (isNumberType(toClass)) { return toNumber(obj, (Class<? extends Number>) toClass); } if (isCharacterType(toClass)) { return toCharacter(obj); } if (isBooleanType(toClass)) { return toBoolean(obj); } throw createConversionException(obj, toClass); } public static boolean isInstance(final Object obj, final Class<?> toClass) { return toClass.isInstance(obj); } public static boolean isStringType(final Class<?> toClass) { return String.class.equals(toClass); } public static boolean isBooleanType(final Class<?> toClass) { return Boolean.class.equals(toClass); } public static boolean isCharacterType(final Class<?> toClass) { return Character.class.equals(toClass); } public static boolean isNumberType(Class clazz) { return Number.class.isAssignableFrom(clazz); } private static RuntimeException createConversionException(Object obj, Class toClass) { return new RuntimeException(String.format("Cannot convert %s to %s", obj.getClass().getName(), toClass.getName())); } public static Character toCharacter(Object obj) { if (isNullOrEmptyString(obj) || isBoolean(obj)) { // TODO why ignore boolean name? return (char) 0; } else if (isCharacter(obj)) { return (Character) obj; } if (isNumber(obj)) { return (char) ((Number) obj).shortValue(); } else if (isCharSequence(obj)) { return ((String) obj).charAt(0); } else { throw createConversionException(obj, Character.class); } } public static boolean isCharacter(final Object obj) { return obj instanceof Character; } public static boolean isCharSequence(final Object obj) { return obj instanceof CharSequence; } public static String toString(Object obj) { if (obj == null) { return EMTPY_STRING; } return obj.toString(); } private static Number toNumber(Object obj, Class<? extends Number> toClass) { if (isNullOrEmptyString(obj)) { return toNumber(0, toClass); } else if (isCharacter(obj)) { char val = (Character) obj; return toNumber(new Short((short) val), toClass); } else if (isBoolean(obj)) { return (Boolean) obj ? toNumber(1, toClass) : toNumber(0, toClass); } else if (isInstance(obj, toClass)) { return (Number) obj; } else if (isNumber(obj)) { return toNumber((Number) obj, toClass); } else if (isCharSequence(obj)) { return toNumber((String) obj, toClass); } else { throw createConversionException(obj, toClass); } } public static boolean isBoolean(final Object obj) { return obj instanceof Boolean; } public static boolean isNullOrEmptyString(final Object obj) { return obj == null || EMTPY_STRING.equals(obj); } public static Number toNumber(String val, Class<? extends Number> toClass) { if (Byte.class.equals(toClass)) { return Byte.valueOf(val); } else if (Short.class.equals(toClass)) { return Short.valueOf(val); } else if (Integer.class.equals(toClass)) { return Integer.valueOf(val); } else if (Long.class.equals(toClass)) { return Long.valueOf(val); } else if (Float.class.equals(toClass)) { return Float.valueOf(val); } else if (Double.class.equals(toClass)) { return Double.valueOf(val); } else if (BigInteger.class.equals(toClass)) { return new BigInteger(val); } else if (BigDecimal.class.equals(toClass)) { return new BigDecimal(val); } else { throw createConversionException(val, toClass); } } public static Number toNumber(Number val, Class<? extends Number> toClass) { if (isInstance(val, toClass)) { return val; } if (Byte.class.equals(toClass)) { return Primitives.getByte(val.byteValue()); } else if (Short.class.equals(toClass)) { return Primitives.getShort(val.shortValue()); } else if (Integer.class.equals(toClass)) { return Primitives.getInteger(val.intValue()); } else if (Long.class.equals(toClass)) { return Primitives.getLong(val.longValue()); } else if (Float.class.equals(toClass)) { return Primitives.getFloat(val.floatValue()); } else if (Double.class.equals(toClass)) { return Primitives.getDouble(val.doubleValue()); } else if (BigInteger.class.equals(toClass)) { if (val instanceof BigDecimal) { return ((BigDecimal) val).toBigInteger(); } else { return BigInteger.valueOf(val.longValue()); } } else if (BigDecimal.class.equals(toClass)) { if (val instanceof BigInteger) { return new BigDecimal((BigInteger) val); } else { return new BigDecimal(val.doubleValue()); } } else { throw createConversionException(val, toClass); } } public static Number toNumber(long val, Class<? extends Number> toClass) { if (Byte.class.equals(toClass)) { return Primitives.getByte((byte) val); } else if (Short.class.equals(toClass)) { return Primitives.getShort((short) val); } else if (Integer.class.equals(toClass)) { return Primitives.getInteger((int) val); } else if (Long.class.equals(toClass)) { return Primitives.getLong((val)); } else if (Float.class.equals(toClass)) { return Primitives.getFloat((float) val); } else if (Double.class.equals(toClass)) { return Primitives.getDouble((double) val); } else if (BigInteger.class.equals(toClass)) { return BigInteger.valueOf(Primitives.getLong(val)); } else if (BigDecimal.class.equals(toClass)) { return BigDecimal.valueOf(Primitives.getLong(val)); } else { throw createConversionException(val, toClass); } } }