]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.datastructures / src / org / simantics / utils / datastructures / ValueUtils.java
diff --git a/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java b/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java
new file mode 100644 (file)
index 0000000..0c0dc0d
--- /dev/null
@@ -0,0 +1,1683 @@
+/*******************************************************************************\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