/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.utils.datastructures; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.lang.reflect.Array; import java.security.InvalidParameterException; import java.util.Arrays; import java.util.Calendar; /** * Object type casting tools. * * @author Toni Kalajainen * @author Hannu Niemistö */ public class ValueUtils { /** * Convert double value to a number class. * * @param value * @param numberClass * @return * @throws ClassCastException */ public static Number doubleToNumberClass(double value, Class numberClass) throws ClassCastException { if (numberClass==Integer.class) return (int)value; if (numberClass==Byte.class) return (byte)value; if (numberClass==Float.class) return (float)value; if (numberClass==Short.class) return (short)value; if (numberClass==Long.class) return (long)value; if (numberClass==Double.class) return (double)value; throw new ClassCastException("Cannot convert to "+numberClass.getName()); } /** * Possible object types: * */ static final Boolean True = new Boolean(true); static final Boolean False = new Boolean(false); public static void serialize(DataOutput stream, Object obj) throws IOException { try { Class clazz = obj.getClass(); if(clazz.isArray()) { if(obj instanceof double[]) { double[] array = (double[])obj; stream.writeByte(16); stream.writeInt(array.length); for(double v : array) stream.writeDouble(v); } else if(obj instanceof float[]) { float[] array = (float[])obj; stream.writeByte(15); stream.writeInt(array.length); for(float v : array) stream.writeFloat(v); } else if(obj instanceof int[]) { int[] array = (int[])obj; stream.writeByte(13); stream.writeInt(array.length); for(int v : array) stream.writeInt(v); } else if(obj instanceof String[]) { String[] array = (String[])obj; stream.writeByte(17); stream.writeInt(array.length); for(String v : array) stream.writeUTF(v); } else if(obj instanceof boolean[]) { boolean[] array = (boolean[])obj; stream.writeByte(11); stream.writeInt(array.length); for(boolean v : array) stream.writeByte(v ? (byte)1 : (byte)0); } else if(obj instanceof byte[]) { byte[] array = (byte[])obj; stream.writeByte(12); stream.writeInt(array.length); for(byte v : array) stream.writeByte(v); } else if(obj instanceof long[]) { long[] array = (long[])obj; stream.writeByte(14); stream.writeInt(array.length); for(long v : array) stream.writeLong(v); } else { System.out.println("ValueUtils.serialize failed (invalid type)."); throw new InvalidParameterException(); } } else { if(clazz == Double.class) { stream.writeByte(6); stream.writeDouble((Double)obj); } else if(clazz == Float.class) { stream.writeByte(5); stream.writeDouble((Float)obj); } else if(clazz == Integer.class) { stream.writeByte(3); stream.writeInt((Integer)obj); } else if(clazz == String.class) { stream.writeByte(7); stream.writeUTF((String)obj); } else if(clazz == Boolean.class) { stream.writeByte((Boolean)obj ? 1 : 0); } else if(clazz == Byte.class) { stream.writeByte(2); stream.writeByte((Byte)obj); } else if(clazz == Long.class) { stream.writeByte(4); stream.writeLong((Long)obj); } else { System.out.println("ValueUtils.serialize failed (invalid type)."); throw new InvalidParameterException(); } } } catch(IOException e) { System.out.println("ValueUtils.serialize failed (write failure)."); e.printStackTrace(); throw e; } } public static Object deserialize(DataInput stream) throws IOException { try { byte typeCode = stream.readByte(); switch(typeCode) { case 0: return False; case 1: return True; case 2: return stream.readByte(); case 3: return stream.readInt(); case 4: return stream.readLong(); case 5: return stream.readFloat(); case 6: return stream.readDouble(); case 7: return stream.readUTF(); case 11: { int length = stream.readInt(); boolean[] value = new boolean[length]; for(int i=0;i T adaptToClass(Object obj, Class clazz) throws TypeCastException { if (clazz.equals(double[].class)) return (T) toDoubleArray(obj); if (clazz.equals(Double.class)) return (T) new Double(toDoubleScalar(obj)); if (clazz.equals(float[].class)) return (T) toFloatArray(obj); if (clazz.equals(Float.class)) return (T) new Float(toFloatScalar(obj)); if (clazz.equals(long[].class)) return (T) toLongArray(obj); if (clazz.equals(Long.class)) return (T) new Long(toLongScalar(obj)); if (clazz.equals(int[].class)) return (T) toIntegerArray(obj); if (clazz.equals(Integer.class)) return (T) new Integer(toIntegerScalar(obj)); if (clazz.equals(boolean[].class)) return (T) toBooleanArray(obj); if (clazz.equals(Boolean.class)) return (T) new Long(toLongScalar(obj)); throw new TypeCastException("Unsupported conversion type from "+obj.getClass()+" to "+clazz); } public static String toString(Object obj) { if (obj instanceof Object[]) { return Arrays.toString((Object[])obj); } if (obj instanceof double[]) return Arrays.toString((double[])obj); if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj); if (obj instanceof byte[]) return Arrays.toString((byte[])obj); if (obj instanceof char[]) return Arrays.toString((char[])obj); if (obj instanceof float[]) return Arrays.toString((float[])obj); if (obj instanceof int[]) return Arrays.toString((int[])obj); if (obj instanceof long[]) return Arrays.toString((long[])obj); if (obj instanceof short[]) return Arrays.toString((short[])obj); return obj.toString(); } }