package org.springframework.data.simpledb.attributeutil;
import org.springframework.data.simpledb.reflection.SupportedCoreTypes;
import org.springframework.util.Assert;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public final class SimpleDBAttributeConverter {
private SimpleDBAttributeConverter() {
/* utility class */
}
public static String encode(Object ob) {
String integerNumberEncoding = AmazonSimpleDBUtil.encodeAsIntegerNumber(ob);
if(integerNumberEncoding != null) {
return integerNumberEncoding;
}
String realNumberEncoding = AmazonSimpleDBUtil.encodeAsRealNumber(ob);
if(realNumberEncoding != null) {
return realNumberEncoding;
}
if(ob instanceof Date) {
Date d = (Date) ob;
return AmazonSimpleDBUtil.encodeDate(d);
}
return ob.toString();
}
public static List<String> encodeArray(final Object arrayValues) {
Assert.notNull(arrayValues);
Assert.isTrue(SupportedCoreTypes.ARRAYS.isOfType(arrayValues.getClass()));
final List<String> attributeValues = new ArrayList<String>();
final int primitiveCollLength = Array.getLength(arrayValues);
for(int idx = 0; idx < primitiveCollLength; idx++) {
Object itemValue = Array.get(arrayValues, idx);
attributeValues.add(encode(itemValue));
}
return attributeValues;
}
public static Object decodeToFieldOfType(String value, Class<?> retType) throws ParseException {
Object val = null;
if(Number.class.isAssignableFrom(retType) || (retType.isPrimitive() && retType != boolean.class)) {
val = decodeToFieldOfNumericType(value, retType);
} else if(BigDecimal.class.isAssignableFrom(retType)) {
val = AmazonSimpleDBUtil.decodeRealNumber(value);
} else if(Date.class.isAssignableFrom(retType)) {
val = AmazonSimpleDBUtil.decodeDate(value);
} else if(Boolean.class.isAssignableFrom(retType) || retType == boolean.class) {
val = Boolean.parseBoolean(value);
} else if(String.class.isAssignableFrom(retType)) {
val = value;
}
return val;
}
private static Object decodeToFieldOfNumericType(String value, Class<?> retType) throws ParseException {
Object val = null;
if(Integer.class.isAssignableFrom(retType) || retType == int.class) {
val = AmazonSimpleDBUtil.decodeIntegerNumber(value).intValue();
} else if(Long.class.isAssignableFrom(retType) || retType == long.class) {
val = AmazonSimpleDBUtil.decodeIntegerNumber(value).longValue();
} else if(Short.class.isAssignableFrom(retType) || retType == short.class) {
val = AmazonSimpleDBUtil.decodeIntegerNumber(value).shortValue();
} else if(Byte.class.isAssignableFrom(retType) || retType == byte.class) {
val = AmazonSimpleDBUtil.decodeIntegerNumber(value).byteValue();
} else if(Float.class.isAssignableFrom(retType) || retType == float.class) {
val = AmazonSimpleDBUtil.decodeRealNumber(value).floatValue();
} else if(Double.class.isAssignableFrom(retType) || retType == double.class) {
val = AmazonSimpleDBUtil.decodeRealNumber(value).doubleValue();
}
return val;
}
public static Object decodeToPrimitiveArray(List<String> fromSimpleDbAttValues, Class<?> retType)
throws ParseException {
Object primitiveCollection = Array.newInstance(retType, fromSimpleDbAttValues.size());
int idx = 0;
for(Iterator<String> iterator = fromSimpleDbAttValues.iterator(); iterator.hasNext(); idx++) {
Array.set(primitiveCollection, idx, decodeToFieldOfType(iterator.next(), retType));
}
return primitiveCollection;
}
}