package com.feedly.cassandra.entity; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import me.prettyprint.hector.api.Serializer; import com.feedly.cassandra.dao.CounterColumn; /** * Holds metadata for a primitive or enum entity property (column family column) * * @author kireet */ public class SimplePropertyMetadata extends PropertyMetadataBase { private final Serializer<?> _serializer; private final boolean _isCounter; @SuppressWarnings("unchecked") public SimplePropertyMetadata(String name, Class<?> fieldClass, Annotation[] annotations, String physicalName, int ttl, Method getter, Method setter, Class<? extends Serializer<?>> serializerClass, boolean useCompositeKeySerializer) { super(name, fieldClass, annotations, physicalName, ttl, getter, setter, useCompositeKeySerializer, EPropertyType.SIMPLE); _isCounter = fieldClass.equals(CounterColumn.class); if(serializerClass != null) _serializer = getSerializerInstance(serializerClass); // else if(fieldClass.equals(Map.class) || fieldClass.equals(List.class) || fieldClass.equals(SortedMap.class)) // _serializer = ByteIndicatorSerializer.get(); else if(fieldClass.isEnum()) _serializer = new EnumSerializer((Class<? extends Enum<?>>) fieldClass); else if(fieldClass.equals(Object.class) || fieldClass.equals(Number.class)) _serializer = ByteIndicatorSerializer.get(); else _serializer = EntityUtils.getSerializer(fieldClass); if(_serializer == null && !_isCounter) { throw new IllegalArgumentException(name + ": invalid type. cannot serialize " + fieldClass.getName()); } } private Serializer<?> getSerializerInstance(Class<? extends Serializer<?>> serializerClass) { try { Method m = serializerClass.getMethod("get"); int mod = m.getModifiers(); int reqFlags = Modifier.PUBLIC & Modifier.STATIC; if( (mod | reqFlags) == reqFlags) { return (Serializer<?>) m.invoke(null); } } catch(NoSuchMethodException ex) { //dropped } catch(Exception ex) { throw new RuntimeException("error creating serializer instance from get() factory method", ex); } try { return serializerClass.newInstance(); } catch(Exception ex) { throw new RuntimeException("error creating serializer instance from constructor", ex); } } public Serializer<?> getSerializer() { return _serializer; } public boolean hasCounter() { return _isCounter; } public boolean hasSimple() { return !_isCounter; } }