package com.breeze.metadata;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
public class DataType {
private String _name;
private Class _class;
private static HashMap<String, DataType> _nameMap = new HashMap<String, DataType>();
private static HashMap<Class, DataType> _classMap = new HashMap<Class, DataType>();
public static final DataType Binary = new DataType("Binary");
public static final DataType Guid = new DataType("Guid", UUID.class);
public static final DataType String = new DataType("String", String.class);
public static final DataType DateTime = new DataType("DateTime", Date.class);
public static final DataType DateTimeOffset = new DataType("DateTimeOffset", Date.class);
public static final DataType Time = new DataType("Time");
public static final DataType Byte = new DataType("Byte", Byte.class);
public static final DataType Int16 = new DataType("Int16", Short.class );
public static final DataType Int32 = new DataType("Int32", Integer.class);
public static final DataType Int64 = new DataType("Int64", Long.class);
public static final DataType Boolean = new DataType("Boolean", Boolean.class);
public static final DataType Decimal = new DataType("Decimal", BigDecimal.class);
public static final DataType Double = new DataType("Double", Double.class);
public static final DataType Single = new DataType("Single", Float.class);
public DataType(String name) {
_name = name;
_nameMap.put(name, this);
}
public DataType(String name, Class clazz) {
_name = name;
_class = clazz;
_nameMap.put(name, this);
_classMap.put(clazz, this);
}
public String getName() {
return _name;
}
public Class getJavaClass() {
return _class;
}
public static DataType fromName(String name) {
return _nameMap.get(name);
}
public static DataType fromClass(Class clazz) {
return _classMap.get(clazz);
}
// Can't use this safely because of missing support for optional parts.
// private static DateFormat ISO8601_Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public static Object coerceData(Object value, DataType dataType) {
if (value == null || dataType == null || value.getClass() == dataType.getJavaClass()) {
return value;
} else if (value instanceof List) {
// this occurs with an 'In' clause
List<Object> newList = new ArrayList<Object>();
for (Object item: (List) value) {
newList.add(coerceData(item, dataType));
}
return newList;
} else if (dataType == DataType.Int16) {
Double dValue = (Double) coerceData(value, DataType.Double);
return dValue.shortValue();
} else if (dataType == DataType.Int32) {
Double dValue = (Double) coerceData(value, DataType.Double);
return dValue.intValue();
} else if (dataType == DataType.Int64) {
Double dValue = (Double) coerceData(value, DataType.Double);
return dValue.longValue();
} else if (dataType == DataType.Decimal) {
Double dValue = (Double) coerceData(value, DataType.Double);
return BigDecimal.valueOf(dValue);
} else if (dataType == DataType.Double) {
return java.lang.Double.parseDouble(value.toString());
} else if (dataType == DataType.Single) {
return Float.parseFloat(value.toString());
} else if (dataType == DataType.Byte) {
Double dValue = (Double) coerceData(value, DataType.Double);
return dValue.byteValue();
} else if (dataType == DataType.DateTime || dataType == DataType.DateTimeOffset) {
// ISO 8601 format parser
return javax.xml.bind.DatatypeConverter.parseDateTime(value.toString()).getTime();
} else if (dataType == DataType.Guid) {
return UUID.fromString(value.toString());
}
return value;
}
}