package com.feedly.cassandra.entity; import static org.junit.Assert.*; import java.util.Date; import java.util.List; import java.util.Map; import java.util.SortedMap; import me.prettyprint.cassandra.serializers.BooleanSerializer; import me.prettyprint.cassandra.serializers.CharSerializer; import me.prettyprint.cassandra.serializers.DateSerializer; import me.prettyprint.cassandra.serializers.DoubleSerializer; import me.prettyprint.cassandra.serializers.FloatSerializer; import me.prettyprint.cassandra.serializers.IntegerSerializer; import me.prettyprint.cassandra.serializers.LongSerializer; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.hector.api.Serializer; import org.junit.Test; import com.feedly.cassandra.anno.Column; import com.feedly.cassandra.anno.ColumnFamily; import com.feedly.cassandra.anno.RowKey; import com.feedly.cassandra.dao.CounterColumn; public class PropertyMetadataFactoryTest { @Test public void testMetadata() throws SecurityException, NoSuchFieldException { int idx = 12; EntityMetadata<SampleEntity> meta = new EntityMetadata<SampleEntity>(SampleEntity.class); assertEquals(idx--, meta.getProperties().size()); /* * counter prop */ SimplePropertyMetadata simpleMeta = (SimplePropertyMetadata) meta.getProperties().get(idx--); assertSimpleProperty(simpleMeta, "theCounter", CounterColumn.class, null); /* * strProp */ simpleMeta = (SimplePropertyMetadata) meta.getProperties().get(idx--); assertSimpleProperty(simpleMeta, "strProp", String.class, StringSerializer.get()); /* * mapOfMaps */ MapPropertyMetadata mapMeta = (MapPropertyMetadata) meta.getProperties().get(idx--); assertEquals("mapOfMaps", mapMeta.getName()); assertEquals(Map.class, mapMeta.getFieldType()); SimplePropertyMetadata keyMeta = mapMeta.getKeyPropertyMetadata(); assertSimpleProperty(keyMeta, "", String.class, StringSerializer.get()); mapMeta = (MapPropertyMetadata) mapMeta.getValuePropertyMetadata(); keyMeta = mapMeta.getKeyPropertyMetadata(); assertSimpleProperty(keyMeta, "", String.class, StringSerializer.get()); SimplePropertyMetadata valueMeta = (SimplePropertyMetadata) mapMeta.getValuePropertyMetadata(); assertSimpleProperty(valueMeta, "", Double.class, DoubleSerializer.get()); /* * map */ mapMeta = (MapPropertyMetadata) meta.getProperties().get(idx--); assertEquals("map", mapMeta.getName()); assertEquals(Map.class, mapMeta.getFieldType()); keyMeta = mapMeta.getKeyPropertyMetadata(); assertSimpleProperty(keyMeta, "", String.class, StringSerializer.get()); valueMeta = (SimplePropertyMetadata) mapMeta.getValuePropertyMetadata(); assertSimpleProperty(valueMeta, "", Double.class, DoubleSerializer.get()); /* * listOfLists */ ListPropertyMetadata listMeta = (ListPropertyMetadata) meta.getProperties().get(idx--); assertEquals("listOfLists", listMeta.getName()); assertEquals(List.class, listMeta.getFieldType()); listMeta = (ListPropertyMetadata) listMeta.getElementPropertyMetadata(); assertEquals("", listMeta.getName()); assertEquals(List.class, listMeta.getFieldType()); valueMeta = (SimplePropertyMetadata) listMeta.getElementPropertyMetadata(); assertSimpleProperty(valueMeta, "", String.class, StringSerializer.get()); /* * list */ listMeta = (ListPropertyMetadata) meta.getProperties().get(idx--); assertEquals("list", listMeta.getName()); assertEquals(List.class, listMeta.getFieldType()); valueMeta = (SimplePropertyMetadata) listMeta.getElementPropertyMetadata(); assertSimpleProperty(valueMeta, "", String.class, StringSerializer.get()); /* * embedded counter */ ObjectPropertyMetadata objMeta = (ObjectPropertyMetadata) meta.getProperties().get(idx--); assertEquals(1, objMeta.getObjectMetadata().getProperties().size()); assertTrue(objMeta.hasCounter()); /* * embedded */ objMeta = (ObjectPropertyMetadata) meta.getProperties().get(idx--); assertEmbeddedMeta("embedded", objMeta); /* * counterMap */ mapMeta = (MapPropertyMetadata) meta.getProperties().get(idx--); assertEquals("counterMap", mapMeta.getName()); assertEquals(SortedMap.class, mapMeta.getFieldType()); assertTrue(mapMeta.hasCounter()); /* * counterList */ listMeta = (ListPropertyMetadata) meta.getProperties().get(idx--); assertEquals("counterList", listMeta.getName()); assertEquals(List.class, listMeta.getFieldType()); assertTrue(listMeta.hasCounter()); /* * beanMap */ mapMeta = (MapPropertyMetadata) meta.getProperties().get(idx--); assertEquals("beanMap", mapMeta.getName()); assertEquals(SortedMap.class, mapMeta.getFieldType()); keyMeta = mapMeta.getKeyPropertyMetadata(); assertSimpleProperty(keyMeta, "", String.class, StringSerializer.get()); ObjectPropertyMetadata beanValueMeta = (ObjectPropertyMetadata) mapMeta.getValuePropertyMetadata(); assertEmbeddedMeta("", beanValueMeta); /* * beanList */ listMeta = (ListPropertyMetadata) meta.getProperties().get(idx--); assertEquals("beanList", listMeta.getName()); assertEquals(List.class, listMeta.getFieldType()); beanValueMeta = (ObjectPropertyMetadata) listMeta.getElementPropertyMetadata(); assertEmbeddedMeta("", beanValueMeta); } private void assertEmbeddedMeta(String name, ObjectPropertyMetadata meta) { assertEquals(name, meta.getName()); assertEquals(EmbeddedBean.class, meta.getFieldType()); assertFalse(meta.hasCounter()); /* * boolVal * charVal * dateVal * doubleVal * floatVal * intVal * longVal * strVal */ List<PropertyMetadataBase> properties = meta.getObjectMetadata().getProperties(); assertEquals(8, properties.size()); assertSimpleProperty(properties.get(0), "boolVal", boolean.class, BooleanSerializer.get()); assertSimpleProperty(properties.get(1), "charVal", char.class, CharSerializer.get()); assertSimpleProperty(properties.get(2), "dateVal", Date.class, DateSerializer.get()); assertSimpleProperty(properties.get(3), "doubleVal", double.class, DoubleSerializer.get()); assertSimpleProperty(properties.get(4), "floatVal", float.class, FloatSerializer.get()); assertSimpleProperty(properties.get(5), "intVal", int.class, IntegerSerializer.get()); assertSimpleProperty(properties.get(6), "longVal", long.class, LongSerializer.get()); assertSimpleProperty(properties.get(7), "strVal", String.class, StringSerializer.get()); } private void assertSimpleProperty(PropertyMetadataBase pm, String name, Class<?> type, Serializer<?> serializer) { SimplePropertyMetadata spm = (SimplePropertyMetadata) pm; assertEquals(name, spm.getName()); assertEquals(type, spm.getFieldType()); assertEquals(serializer, spm.getSerializer()); } @ColumnFamily public class SampleEntity { @RowKey private long rowKey; @Column private EmbeddedBean embedded; @Column private EmbeddedCounterBean embeddedCounter; @Column private String strProp; @Column private List<String> list; @Column private List<List<String>> listOfLists; @Column private List<EmbeddedBean> beanList; @Column private List<CounterColumn> counterList; @Column private Map<String, Double> map; @Column private Map<String, Map<String, Double>> mapOfMaps; @Column private SortedMap<String, EmbeddedBean> beanMap; @Column private SortedMap<String, CounterColumn> counterMap; @Column private CounterColumn theCounter; public long getRowKey() { return rowKey; } public void setRowKey(long rowKey) { this.rowKey = rowKey; } public EmbeddedBean getEmbedded() { return embedded; } public void setEmbedded(EmbeddedBean embedded) { this.embedded = embedded; } public String getStrProp() { return strProp; } public void setStrProp(String strProp) { this.strProp = strProp; } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public List<EmbeddedBean> getBeanList() { return beanList; } public void setBeanList(List<EmbeddedBean> beanList) { this.beanList = beanList; } public Map<String, Double> getMap() { return map; } public void setMap(Map<String, Double> map) { this.map = map; } public SortedMap<String, EmbeddedBean> getBeanMap() { return beanMap; } public void setBeanMap(SortedMap<String, EmbeddedBean> beanMap) { this.beanMap = beanMap; } public List<List<String>> getListOfLists() { return listOfLists; } public void setListOfLists(List<List<String>> listOfLists) { this.listOfLists = listOfLists; } public Map<String, Map<String, Double>> getMapOfMaps() { return mapOfMaps; } public void setMapOfMaps(Map<String, Map<String, Double>> mapOfMaps) { this.mapOfMaps = mapOfMaps; } public CounterColumn getTheCounter() { return theCounter; } public void setTheCounter(CounterColumn theCounter) { this.theCounter = theCounter; } public EmbeddedCounterBean getEmbeddedCounter() { return embeddedCounter; } public void setEmbeddedCounter(EmbeddedCounterBean embeddedCounterBean) { this.embeddedCounter = embeddedCounterBean; } public SortedMap<String, CounterColumn> getCounterMap() { return counterMap; } public void setCounterMap(SortedMap<String, CounterColumn> counterMap) { this.counterMap = counterMap; } public List<CounterColumn> getCounterList() { return counterList; } public void setCounterList(List<CounterColumn> counterList) { this.counterList = counterList; } } }