package org.quaere.alias; import java.lang.reflect.Constructor; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.WeakHashMap; public class Utils { private static final boolean MAKE_ACCESSIBLE = true; public static final boolean MAP_NON_PUBLIC_FIELDS = true; static <T> ArrayList<T> createArrayList() { return new ArrayList<T>(); } static <T> ArrayList<T> createArrayList(int size) { return new ArrayList<T>(size); } static <T, U> WeakHashMap<T, U> createWeakHashMap() { return new WeakHashMap<T, U>(); } @SuppressWarnings("unchecked") static <T> T createNew(Class<T> clazz) { if (clazz == Integer.class) { return (T) new Integer(0); } else if (clazz == Long.class) { return (T) new Long(0); } else if (clazz == Short.class) { return (T) new Short((short) 0); } else if (clazz == Byte.class) { return (T) new Byte((byte) 0); } else if (clazz == Float.class) { return (T) new Float(0); } else if (clazz == Double.class) { return (T) new Double(0); } else if (clazz == Boolean.class) { return (T) Boolean.FALSE; } else if (clazz == BigDecimal.class) { return (T) new BigDecimal(0); } else if (clazz == BigInteger.class) { return (T) new BigInteger("0"); } else if (clazz == List.class) { return (T) new ArrayList(); } try { return clazz.newInstance(); } catch (Exception e) { if (MAKE_ACCESSIBLE) { Constructor[] constructors = clazz.getDeclaredConstructors(); // try 0 length constructors for (Constructor c : constructors) { if (c.getParameterTypes().length == 0) { c.setAccessible(true); try { return clazz.newInstance(); } catch (Exception e2) { } } } // try 1 length constructors for (Constructor c : constructors) { if (c.getParameterTypes().length == 1) { c.setAccessible(true); try { return (T) c.newInstance(new Object[1]); } catch (Exception e2) { } } } } throw new Error("Exception trying to create " + clazz.getName() + ": " + e, e); } } public static Class getHigherClass(Object a, Object b) { int oa = getOrder(a), ob = getOrder(b); if (oa > ob) { return a.getClass(); } else { return b.getClass(); } } private static int getOrder(Object a) { if (a == null) { return 0; } Class clazz = a.getClass(); if (clazz == Object.class) { return 0; } else if (clazz == Boolean.class) { return 1; } else if (clazz == Byte.class) { return 2; } else if (clazz == Character.class) { return 3; } else if (clazz == Short.class) { return 4; } else if (clazz == Integer.class) { return 5; } else if (clazz == Long.class) { return 6; } else if (clazz == BigInteger.class) { return 7; } else if (clazz == Float.class) { return 8; } else if (clazz == Double.class) { return 9; } else if (clazz == BigDecimal.class) { return 10; } else if (clazz == String.class) { return 11; } else { return 12; } } public static Object convert(Object a, Class clazz) { if (a == null || a.getClass() == clazz) { return a; } if (clazz == Boolean.class) { if (a instanceof Number) { return Boolean.valueOf(((Number) a).intValue() != 0); } else { return Boolean.valueOf(a.toString()); } } else if (clazz == Byte.class) { if (a instanceof Number) { return Byte.valueOf(((Number) a).byteValue()); } else { return Byte.valueOf(a.toString()); } } else if (clazz == Character.class) { if (a instanceof Number) { return Character.valueOf((char) ((Number) a).intValue()); } else { return Character.valueOf((char) Integer.parseInt(a.toString())); } } else if (clazz == Short.class) { if (a instanceof Number) { return Short.valueOf(((Number) a).shortValue()); } else { return Short.valueOf(a.toString()); } } else if (clazz == Integer.class) { if (a instanceof Number) { return Integer.valueOf(((Number) a).intValue()); } else { return Integer.valueOf(a.toString()); } } else if (clazz == Long.class) { if (a instanceof Number) { return Long.valueOf(((Number) a).longValue()); } else { return Long.valueOf(a.toString()); } } else if (clazz == BigInteger.class) { if (a instanceof Number) { return BigInteger.valueOf(((Number) a).longValue()); } else { return new BigInteger(a.toString()); } } else if (clazz == Float.class) { if (a instanceof Number) { return Float.valueOf(((Number) a).floatValue()); } else { return Float.valueOf(a.toString()); } } else if (clazz == Double.class) { if (a instanceof Number) { return Double.valueOf(((Number) a).doubleValue()); } else { return Double.valueOf(a.toString()); } } else if (clazz == BigDecimal.class) { if (a instanceof Number) { return BigDecimal.valueOf(((Number) a).doubleValue()); } else { return new BigDecimal(a.toString()); } } else if (clazz == String.class) { return a.toString(); } else { throw new Error("Unsupported convertion from " + a.getClass() + " to " + clazz); } } public static Integer[] toIntegerArray(int[] array) { Integer[] a2 = new Integer[array.length]; for (int i = 0; i < array.length; i++) { a2[i] = array[i]; } return a2; } public static Double[] toDoubleArray(double[] array) { Double[] a2 = new Double[array.length]; for (int i = 0; i < array.length; i++) { a2[i] = array[i]; } return a2; } public static boolean isBasicClass(Class clazz) { if (clazz == Boolean.class) { return true; } else if (clazz == Byte.class) { return true; } else if (clazz == Character.class) { return true; } else if (clazz == Short.class) { return true; } else if (clazz == Integer.class) { return true; } else if (clazz == Long.class) { return true; } else if (clazz == BigInteger.class) { return true; } else if (clazz == Float.class) { return true; } else if (clazz == Double.class) { return true; } else if (clazz == BigDecimal.class) { return true; } else if (clazz == String.class) { return true; } else if (clazz == Object.class) { return true; } return false; } }