package me.prettyprint.cassandra.serializers;
import java.io.Externalizable;
import java.io.Serializable;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.Date;
import java.util.UUID;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.DynamicComposite;
import me.prettyprint.hector.api.beans.Composite;
/**
* Utility class that infers the concrete Serializer needed to turn a value into
* its binary representation
*
* @author Bozhidar Bozhanov
*
*/
public class SerializerTypeInferer {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> Serializer<T> getSerializer(Object value) {
Serializer serializer = null;
if (value == null) {
serializer = ByteBufferSerializer.get();
} else if (value instanceof BigInteger) {
serializer = BigIntegerSerializer.get();
} else if (value instanceof Boolean) {
serializer = BooleanSerializer.get();
} else if (value instanceof byte[]) {
serializer = BytesArraySerializer.get();
} else if (value instanceof ByteBuffer) {
serializer = ByteBufferSerializer.get();
} else if (value instanceof Character) {
serializer = CharSerializer.get();
} else if (value instanceof Composite) {
serializer = CompositeSerializer.get();
} else if (value instanceof DynamicComposite) {
serializer = DynamicCompositeSerializer.get();
} else if (value instanceof Date) {
serializer = DateSerializer.get();
} else if (value instanceof Double) {
serializer = DoubleSerializer.get();
} else if (value instanceof Float) {
serializer = FloatSerializer.get();
} else if (value instanceof Integer) {
serializer = IntegerSerializer.get();
} else if (value instanceof Long) {
serializer = LongSerializer.get();
} else if (value instanceof Short) {
serializer = ShortSerializer.get();
} else if (value instanceof String) {
serializer = StringSerializer.get();
} else if (value instanceof UUID) {
serializer = UUIDSerializer.get();
} else if (value instanceof Serializable) {
serializer = ObjectSerializer.get();
}
// Add other serializers here
return serializer;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> Serializer<T> getSerializer(Class<?> valueClass) {
Serializer serializer = null;
if (valueClass == BigInteger.class) {
serializer = BigIntegerSerializer.get();
} else if (valueClass.equals(Boolean.class) || valueClass.equals(boolean.class)) {
serializer = BooleanSerializer.get();
} else if (valueClass.equals(byte[].class)) {
serializer = BytesArraySerializer.get();
} else if (valueClass.equals(ByteBuffer.class)) {
serializer = ByteBufferSerializer.get();
} else if (valueClass.equals(Character.class)) {
serializer = CharSerializer.get();
} else if (valueClass.equals(Composite.class)) {
serializer = CompositeSerializer.get();
} else if (valueClass.equals(DynamicComposite.class)) {
serializer = DynamicCompositeSerializer.get();
} else if (valueClass.equals(Date.class)) {
serializer = DateSerializer.get();
} else if (valueClass.equals(Double.class) || valueClass.equals(double.class)) {
serializer = DoubleSerializer.get();
} else if (valueClass.equals(Float.class) || valueClass.equals(float.class)) {
serializer = FloatSerializer.get();
} else if (valueClass.equals(Integer.class) || valueClass.equals(int.class)) {
serializer = IntegerSerializer.get();
} else if (valueClass.equals(Long.class) || valueClass.equals(long.class)) {
serializer = LongSerializer.get();
} else if (valueClass.equals(Short.class) || valueClass.equals(short.class)) {
serializer = ShortSerializer.get();
} else if (valueClass.equals(String.class)) {
serializer = StringSerializer.get();
} else if (valueClass.equals(UUID.class)) {
serializer = UUIDSerializer.get();
} else if (isSerializable(valueClass)) {
serializer = ObjectSerializer.get();
}
// Add other serializers here
return serializer;
}
public static boolean isSerializable(Class<?> clazz) {
return isImplementedBy(clazz, Serializable.class) || isImplementedBy(clazz, Externalizable.class);
}
public static boolean isImplementedBy(Class<?> clazz, Class<?> target) {
if (null == clazz || null == target) {
return false;
}
Class<?>[] interArr = clazz.getInterfaces();
if (null == interArr) {
return false;
}
for (Class<?> interfa : interArr) {
if (interfa.equals(target)) {
return true;
}
}
if(clazz.getSuperclass()!=null) {
return isImplementedBy(clazz.getSuperclass(), target);
}
return false;
}
}