--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.utils.datastructures;\r
+\r
+import java.io.DataInput;\r
+import java.io.DataOutput;\r
+import java.io.IOException;\r
+import java.lang.reflect.Array;\r
+import java.security.InvalidParameterException;\r
+import java.util.Arrays;\r
+import java.util.Calendar;\r
+\r
+/**\r
+ * Object type casting tools.\r
+ * \r
+ * @author Toni Kalajainen\r
+ * @author Hannu Niemistö\r
+ */\r
+public class ValueUtils {\r
+\r
+ /**\r
+ * Convert double value to a number class.\r
+ * \r
+ * @param value\r
+ * @param numberClass\r
+ * @return\r
+ * @throws ClassCastException\r
+ */\r
+ public static Number doubleToNumberClass(double value, Class<? extends Number> numberClass)\r
+ throws ClassCastException\r
+ {\r
+ if (numberClass==Integer.class)\r
+ return (int)value;\r
+ if (numberClass==Byte.class)\r
+ return (byte)value;\r
+ if (numberClass==Float.class)\r
+ return (float)value;\r
+ if (numberClass==Short.class)\r
+ return (short)value;\r
+ if (numberClass==Long.class)\r
+ return (long)value;\r
+ if (numberClass==Double.class)\r
+ return (double)value;\r
+ throw new ClassCastException("Cannot convert to "+numberClass.getName());\r
+ }\r
+\r
+ /**\r
+ * Possible object types:\r
+ * \r
+ */\r
+\r
+ static final Boolean True = new Boolean(true);\r
+ static final Boolean False = new Boolean(false);\r
+\r
+ public static void serialize(DataOutput stream, Object obj) throws IOException {\r
+ try {\r
+ Class<?> clazz = obj.getClass();\r
+ if(clazz.isArray()) {\r
+ if(obj instanceof double[]) {\r
+ double[] array = (double[])obj;\r
+ stream.writeByte(16);\r
+ stream.writeInt(array.length);\r
+ for(double v : array)\r
+ stream.writeDouble(v);\r
+ }\r
+ else if(obj instanceof float[]) {\r
+ float[] array = (float[])obj;\r
+ stream.writeByte(15);\r
+ stream.writeInt(array.length);\r
+ for(float v : array)\r
+ stream.writeFloat(v);\r
+ }\r
+ else if(obj instanceof int[]) {\r
+ int[] array = (int[])obj;\r
+ stream.writeByte(13);\r
+ stream.writeInt(array.length);\r
+ for(int v : array)\r
+ stream.writeInt(v);\r
+ }\r
+ else if(obj instanceof String[]) {\r
+ String[] array = (String[])obj;\r
+ stream.writeByte(17);\r
+ stream.writeInt(array.length);\r
+ for(String v : array)\r
+ stream.writeUTF(v);\r
+ }\r
+ else if(obj instanceof boolean[]) {\r
+ boolean[] array = (boolean[])obj;\r
+ stream.writeByte(11);\r
+ stream.writeInt(array.length);\r
+ for(boolean v : array)\r
+ stream.writeByte(v ? (byte)1 : (byte)0);\r
+ }\r
+ else if(obj instanceof byte[]) {\r
+ byte[] array = (byte[])obj;\r
+ stream.writeByte(12);\r
+ stream.writeInt(array.length);\r
+ for(byte v : array)\r
+ stream.writeByte(v);\r
+ }\r
+ else if(obj instanceof long[]) {\r
+ long[] array = (long[])obj;\r
+ stream.writeByte(14);\r
+ stream.writeInt(array.length);\r
+ for(long v : array)\r
+ stream.writeLong(v);\r
+ }\r
+ else {\r
+ System.out.println("ValueUtils.serialize failed (invalid type).");\r
+ throw new InvalidParameterException();\r
+ }\r
+ }\r
+ else {\r
+ if(clazz == Double.class) {\r
+ stream.writeByte(6);\r
+ stream.writeDouble((Double)obj);\r
+ }\r
+ else if(clazz == Float.class) {\r
+ stream.writeByte(5);\r
+ stream.writeDouble((Float)obj);\r
+ }\r
+ else if(clazz == Integer.class) {\r
+ stream.writeByte(3);\r
+ stream.writeInt((Integer)obj);\r
+ }\r
+ else if(clazz == String.class) {\r
+ stream.writeByte(7);\r
+ stream.writeUTF((String)obj);\r
+ }\r
+ else if(clazz == Boolean.class) {\r
+ stream.writeByte((Boolean)obj ? 1 : 0);\r
+ }\r
+ else if(clazz == Byte.class) {\r
+ stream.writeByte(2);\r
+ stream.writeByte((Byte)obj);\r
+ }\r
+ else if(clazz == Long.class) {\r
+ stream.writeByte(4);\r
+ stream.writeLong((Long)obj);\r
+ }\r
+ else {\r
+ System.out.println("ValueUtils.serialize failed (invalid type).");\r
+ throw new InvalidParameterException();\r
+ }\r
+ }\r
+ } catch(IOException e) {\r
+ System.out.println("ValueUtils.serialize failed (write failure).");\r
+ e.printStackTrace();\r
+ throw e;\r
+ }\r
+ }\r
+\r
+ public static Object deserialize(DataInput stream) throws IOException {\r
+ try {\r
+ byte typeCode = stream.readByte();\r
+ switch(typeCode) {\r
+ case 0: return False;\r
+ case 1: return True;\r
+ case 2: return stream.readByte();\r
+ case 3: return stream.readInt();\r
+ case 4: return stream.readLong();\r
+ case 5: return stream.readFloat();\r
+ case 6: return stream.readDouble();\r
+ case 7: return stream.readUTF();\r
+\r
+ case 11: {\r
+ int length = stream.readInt();\r
+ boolean[] value = new boolean[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readByte() != 0;\r
+ return value;\r
+ }\r
+ case 12: {\r
+ int length = stream.readInt();\r
+ byte[] value = new byte[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readByte();\r
+ return value;\r
+ }\r
+ case 13: {\r
+ int length = stream.readInt();\r
+ int[] value = new int[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readInt();\r
+ return value;\r
+ }\r
+ case 14: {\r
+ int length = stream.readInt();\r
+ long[] value = new long[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readLong();\r
+ return value;\r
+ }\r
+ case 15: {\r
+ int length = stream.readInt();\r
+ float[] value = new float[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readFloat();\r
+ return value;\r
+ }\r
+ case 16: {\r
+ int length = stream.readInt();\r
+ double[] value = new double[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readDouble();\r
+ return value;\r
+ }\r
+ case 17: {\r
+ int length = stream.readInt();\r
+ String[] value = new String[length];\r
+ for(int i=0;i<length;++i)\r
+ value[i] = stream.readUTF();\r
+ return value;\r
+ }\r
+\r
+ }\r
+\r
+ System.out.println("ValueUtils.deserialize failed (invalid type code).");\r
+ throw new IOException("Invalid value data.");\r
+ } catch(IOException e) {\r
+ System.out.println("ValueUtils.deserialize failed (reading failure).");\r
+ e.printStackTrace();\r
+ throw e;\r
+ }\r
+ }\r
+\r
+\r
+\r
+\r
+\r
+\r
+ /**\r
+ * is object an array type\r
+ * @param obj the object\r
+ * @return true if it is object array (Integer[], Short[], ect)\r
+ */\r
+ public static boolean isArray(Object obj) {\r
+ return obj.getClass().isArray();\r
+ }\r
+\r
+ /**\r
+ * Get the array length\r
+ * @param obj object\r
+ * @return the length\r
+ */\r
+ public static int getArrayLength(Object obj) {\r
+ return Array.getLength(obj);\r
+ }\r
+\r
+ /**\r
+ * Type casts an array to double.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static double[] toDoubleArray(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ double scalar = toDoubleScalar(obj);\r
+ return new double[] {scalar};\r
+ }\r
+ int len = getArrayLength(obj);\r
+ double[] result = new double[len];\r
+ // TODO add support for int[] double[] float[], ect..\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].getTimeInMillis();\r
+ return result;\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ return (double[])obj;\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].doubleValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ try {\r
+ result[i] = new Double(array[i]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i].booleanValue()?1:0);\r
+ return result;\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i]?1:0);\r
+ return result;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+ /**\r
+ * Type casts an object to long.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static double toDoubleScalar(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ if (obj instanceof Number)\r
+ return ((Number)obj).doubleValue();\r
+ if (obj instanceof Calendar)\r
+ return ((Calendar) obj).getTimeInMillis();\r
+ if (obj instanceof String)\r
+ {\r
+ String str = (String) obj;\r
+ try {\r
+ Double d = new Double(str);\r
+ return d.doubleValue();\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean) {\r
+ return (((Boolean)obj).booleanValue())?1:0;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ int len = getArrayLength(obj);\r
+ if (len!=1)\r
+ throw new TypeCastException("Expected length of array is 1");\r
+\r
+ if (obj instanceof double[])\r
+ {\r
+ return ((double[])obj)[0];\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ return array[0].getTimeInMillis();\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ return array[0].doubleValue();\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ try {\r
+ return new Double(array[0]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ return (array[0].booleanValue()?1:0);\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ return (array[0]?1:0);\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+\r
+ /**\r
+ * Type casts an array to float.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static float[] toFloatArray(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ float scalar = toFloatScalar(obj);\r
+ return new float[] {scalar};\r
+ }\r
+ int len = getArrayLength(obj);\r
+ float[] result = new float[len];\r
+ // TODO add support for int[] float[] float[], ect..\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].getTimeInMillis();\r
+ return result;\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ return (float[])obj;\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double[] array = (double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (float)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].floatValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ try {\r
+ result[i] = new Float(array[i]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i].booleanValue()?1:0);\r
+ return result;\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i]?1:0);\r
+ return result;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+ /**\r
+ * Type casts an object to float.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static float toFloatScalar(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ if (obj instanceof Number)\r
+ return ((Number)obj).floatValue();\r
+ if (obj instanceof Calendar)\r
+ return ((Calendar) obj).getTimeInMillis();\r
+ if (obj instanceof String)\r
+ {\r
+ String str = (String) obj;\r
+ try {\r
+ Float d = new Float(str);\r
+ return d.floatValue();\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean) {\r
+ return (((Boolean)obj).booleanValue())?1:0;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ int len = getArrayLength(obj);\r
+ if (len!=1)\r
+ throw new TypeCastException("Expected length of array is 1");\r
+\r
+ if (obj instanceof float[])\r
+ {\r
+ return ((float[])obj)[0];\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ return array[0].getTimeInMillis();\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double[] array = (double[]) obj;\r
+ return (float)array[0];\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ return array[0].floatValue();\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ try {\r
+ return new Float(array[0]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ return (array[0].booleanValue()?1:0);\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ return (array[0]?1:0);\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+\r
+ /**\r
+ * Type casts an object to long.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static long toLongScalar(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ if (obj instanceof Number)\r
+ return ((Number)obj).longValue();\r
+ if (obj instanceof Calendar)\r
+ return ((Calendar) obj).getTimeInMillis();\r
+ if (obj instanceof String)\r
+ {\r
+ String str = (String) obj;\r
+ try {\r
+ Long d = new Long(str);\r
+ return d.longValue();\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean) {\r
+ return (((Boolean)obj).booleanValue())?1:0;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ int len = getArrayLength(obj);\r
+ if (len!=1)\r
+ throw new TypeCastException("Expected length of array is 1");\r
+\r
+ if (obj instanceof double[])\r
+ {\r
+ return ((long[])obj)[0];\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ return array[0].getTimeInMillis();\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ return (long)array[0];\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ return array[0].longValue();\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ try {\r
+ return new Long(array[0]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ return (array[0].booleanValue()?1:0);\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ return (array[0]?1:0);\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+ /**\r
+ * Type casts an array to long.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static long[] toLongArray(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ long scalar = toLongScalar(obj);\r
+ return new long[] {scalar};\r
+ }\r
+ int len = getArrayLength(obj);\r
+ long[] result = new long[len];\r
+ // TODO add support for int[] long[] float[], ect..\r
+ if (obj instanceof Calendar[])\r
+ {\r
+ Calendar[] array = (Calendar[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].getTimeInMillis();\r
+ return result;\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ return (long[])obj;\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (long)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double[] array = (double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (long)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].longValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ try {\r
+ result[i] = new Long(array[i]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i].booleanValue()?1:0);\r
+ return result;\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i]?1:0);\r
+ return result;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+\r
+\r
+\r
+\r
+\r
+ /**\r
+ * Type casts an object to int.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static int toIntegerScalar(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ if (obj instanceof Number)\r
+ return ((Number)obj).intValue();\r
+ if (obj instanceof String)\r
+ {\r
+ String str = (String) obj;\r
+ try {\r
+ Integer d = new Integer(str);\r
+ return d.intValue();\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean) {\r
+ return (((Boolean)obj).booleanValue())?1:0;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ int len = getArrayLength(obj);\r
+ if (len!=1)\r
+ throw new TypeCastException("Expected length of array is 1");\r
+\r
+ if (obj instanceof double[])\r
+ {\r
+ return ((int[])obj)[0];\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ return (int)array[0];\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ return (int)array[0];\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ return array[0].intValue();\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ return array[0];\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ try {\r
+ return new Integer(array[0]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ return (array[0].booleanValue()?1:0);\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ return (array[0]?1:0);\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+ /**\r
+ * Type casts an array to int.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static int[] toIntegerArray(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ int scalar = toIntegerScalar(obj);\r
+ return new int[] {scalar};\r
+ }\r
+ int len = getArrayLength(obj);\r
+ int[] result = new int[len];\r
+ // TODO add support for int[] int[] float[], ect..\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (int)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ return (int[])obj;\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (int)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double[] array = (double[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (int)array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].intValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i];\r
+ return result;\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ try {\r
+ result[i] = new Integer(array[i]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i].booleanValue()?1:0);\r
+ return result;\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ boolean[] array = (boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = (array[i]?1:0);\r
+ return result;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+\r
+\r
+\r
+ /**\r
+ * Type casts an array to boolean.\r
+ *\r
+ * 0 is converted to false, 1 is converted to true, others throw TypeCastException\r
+ * \r
+ * @return type casted value\r
+ * @throws TypeCastException\r
+ */\r
+ public static boolean[] toBooleanArray(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ boolean scalar = toBooleanScalar(obj);\r
+ return new boolean[] {scalar};\r
+ }\r
+ int len = getArrayLength(obj);\r
+ boolean[] result = new boolean[len];\r
+ if (obj instanceof Integer[])\r
+ {\r
+ Integer[] array = (Integer[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ int value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int[] array = (int[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ int value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ result[i] = array[i].booleanValue();\r
+ return result;\r
+ }\r
+ if (obj instanceof boolean[])\r
+ {\r
+ return (boolean[])obj;\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ Float[] array = (Float[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ float value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float[] array = (float[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ float value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ Long[] array = (Long[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ long value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long[] array = (long[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ long value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short[] array = (Short[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ short value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short[] array = (short[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ short value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte[] array = (Byte[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ byte value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte[] array = (byte[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ byte value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ for (int i=0; i<len; i++)\r
+ try {\r
+ result[i] = new Boolean(array[i]);\r
+ } catch (NumberFormatException e) {\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ Double[] array = (Double[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ double value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double[] array = (double[]) obj;\r
+ for (int i=0; i<len; i++) {\r
+ double value = array[i];\r
+ if (value==0) result[i] = false;\r
+ else if (value==1) result[i] = true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ return result;\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+ /**\r
+ * Type casts an object to long.\r
+ * \r
+ * String types are attempted to be converted. If string\r
+ * doesn't represent numeric value, 0 will be returned\r
+ * \r
+ * boolean types return 0/1, for false/true respectively\r
+ * \r
+ * @return type casted value\r
+ */\r
+ public static boolean toBooleanScalar(Object obj)\r
+ throws TypeCastException\r
+ {\r
+ if (!isArray(obj)) {\r
+ if (obj instanceof Boolean) {\r
+ return ((Boolean)obj).booleanValue();\r
+ }\r
+ if (obj instanceof Byte) {\r
+ byte value = (Byte)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Short) {\r
+ short value = (Short)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Integer) {\r
+ int value = (Integer)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Long) {\r
+ long value = (Long)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Float) {\r
+ float value = (Float)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Double) {\r
+ double value = (Double)obj;\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof String) {\r
+ String value = (String)obj;\r
+ if (value.equals("true") || value.equals("1")) return true;\r
+ if (value.equals("false") || value.equals("0")) return false;\r
+ throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+ int len = getArrayLength(obj);\r
+ if (len!=1)\r
+ throw new TypeCastException("Expected length of array is 1");\r
+\r
+ if (obj instanceof boolean[])\r
+ {\r
+ return ((boolean[])obj)[0];\r
+ }\r
+ if (obj instanceof Boolean[])\r
+ {\r
+ Boolean[] array = (Boolean[]) obj;\r
+ return array[0].booleanValue();\r
+ }\r
+ if (obj instanceof int[])\r
+ {\r
+ int value = ((int[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Integer[])\r
+ {\r
+ int value = ((Integer[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Float[])\r
+ {\r
+ float value = ((Float[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof float[])\r
+ {\r
+ float value = ((float[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Long[])\r
+ {\r
+ long value = ((Long[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof long[])\r
+ {\r
+ long value = ((long[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Short[])\r
+ {\r
+ Short value = ((Short[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof short[])\r
+ {\r
+ short value = ((short[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Byte[])\r
+ {\r
+ Byte value = ((Byte[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof byte[])\r
+ {\r
+ byte value = ((byte[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof String[])\r
+ {\r
+ String[] array = (String[]) obj;\r
+ String value = array[0];\r
+ if (value.equals("true") || value.equals("1")) return true;\r
+ if (value.equals("false") || value.equals("0")) return false;\r
+ throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof Double[])\r
+ {\r
+ double value = ((Double[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ if (obj instanceof double[])\r
+ {\r
+ double value = ((double[])obj)[0];\r
+ if (value==0) return false;\r
+ else if (value==1) return true;\r
+ else throw new TypeCastException("Cannot convert "+value+" to boolean value - 0 or 1 is expected");\r
+ }\r
+ throw new TypeCastException(obj.getClass());\r
+ }\r
+\r
+\r
+ @SuppressWarnings("unchecked")\r
+ public static <T> T adaptToClass(Object obj, Class<T> clazz)\r
+ throws TypeCastException\r
+ {\r
+ if (clazz.equals(double[].class))\r
+ return (T) toDoubleArray(obj);\r
+ if (clazz.equals(Double.class))\r
+ return (T) new Double(toDoubleScalar(obj));\r
+\r
+ if (clazz.equals(float[].class))\r
+ return (T) toFloatArray(obj);\r
+ if (clazz.equals(Float.class))\r
+ return (T) new Float(toFloatScalar(obj));\r
+\r
+ if (clazz.equals(long[].class))\r
+ return (T) toLongArray(obj);\r
+ if (clazz.equals(Long.class))\r
+ return (T) new Long(toLongScalar(obj));\r
+\r
+ if (clazz.equals(int[].class))\r
+ return (T) toIntegerArray(obj);\r
+ if (clazz.equals(Integer.class))\r
+ return (T) new Integer(toIntegerScalar(obj));\r
+\r
+ if (clazz.equals(boolean[].class))\r
+ return (T) toBooleanArray(obj);\r
+ if (clazz.equals(Boolean.class))\r
+ return (T) new Long(toLongScalar(obj));\r
+\r
+ throw new TypeCastException("Unsupported conversion type from "+obj.getClass()+" to "+clazz);\r
+ }\r
+\r
+\r
+\r
+ public static String toString(Object obj) {\r
+ if (obj instanceof Object[]) {\r
+ return Arrays.toString((Object[])obj);\r
+ }\r
+ if (obj instanceof double[]) return Arrays.toString((double[])obj);\r
+ if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj);\r
+ if (obj instanceof byte[]) return Arrays.toString((byte[])obj);\r
+ if (obj instanceof char[]) return Arrays.toString((char[])obj);\r
+ if (obj instanceof float[]) return Arrays.toString((float[])obj);\r
+ if (obj instanceof int[]) return Arrays.toString((int[])obj);\r
+ if (obj instanceof long[]) return Arrays.toString((long[])obj);\r
+ if (obj instanceof short[]) return Arrays.toString((short[])obj);\r
+ return obj.toString();\r
+ }\r
+}\r