package com.netflix.astyanax.entitystore; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import com.google.common.collect.Maps; import com.netflix.astyanax.ColumnListMutation; import com.netflix.astyanax.Serializer; import com.netflix.astyanax.serializers.SerializerTypeInferer; public class MapColumnMapper extends AbstractColumnMapper { private final Class<?> keyClazz; private final Class<?> valueClazz; private final Serializer<?> keySerializer; private final Serializer<Object> valueSerializer; public MapColumnMapper(Field field) { super(field); ParameterizedType stringListType = (ParameterizedType) field.getGenericType(); this.keyClazz = (Class<?>) stringListType.getActualTypeArguments()[0]; this.keySerializer = SerializerTypeInferer.getSerializer(this.keyClazz); this.valueClazz = (Class<?>) stringListType.getActualTypeArguments()[1]; this.valueSerializer = SerializerTypeInferer.getSerializer(this.valueClazz); } @Override public String getColumnName() { return this.columnName; } @Override public boolean fillMutationBatch(Object entity, ColumnListMutation<String> clm, String prefix) throws Exception { Map<?, ?> map = (Map<?, ?>) field.get(entity); if (map == null) { if (columnAnnotation.nullable()) return false; // skip else throw new IllegalArgumentException("cannot write non-nullable column with null value: " + columnName); } for (Entry<?, ?> entry : map.entrySet()) { clm.putColumn(prefix + columnName + "." + entry.getKey().toString(), entry.getValue(), valueSerializer, null); } return true; } @Override public boolean setField(Object entity, Iterator<String> name, com.netflix.astyanax.model.Column<String> column) throws Exception { Map<Object, Object> map = (Map<Object, Object>) field.get(entity); if (map == null) { map = Maps.newLinkedHashMap(); field.set(entity, map); } String key = name.next(); if (name.hasNext()) return false; map.put(keySerializer.fromByteBuffer(keySerializer.fromString(key)), valueSerializer.fromByteBuffer(column.getByteBufferValue())); return true; } @Override public void validate(Object entity) throws Exception { // TODO Auto-generated method stub } }