Package com.carmanconsulting.cassidy.pojo.simple

Source Code of com.carmanconsulting.cassidy.pojo.simple.SimpleColumnMapper

package com.carmanconsulting.cassidy.pojo.simple;

import com.carmanconsulting.cassidy.pojo.mapper.ColumnMapper;
import com.carmanconsulting.cassidy.util.CassidyUtils;
import com.carmanconsulting.cassidy.util.ClassResolver;
import com.carmanconsulting.cassidy.util.PersistableField;
import me.prettyprint.cassandra.serializers.AsciiSerializer;
import me.prettyprint.cassandra.serializers.StringSerializer;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.ddl.ComparatorType;
import me.prettyprint.hector.api.factory.HFactory;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class SimpleColumnMapper<V> implements ColumnMapper<String, V> {
//----------------------------------------------------------------------------------------------------------------------
// Fields
//----------------------------------------------------------------------------------------------------------------------

    private static final String POJO_TYPE_COLUMN_NAME = "<<<POJO_TYPE>>>";
    private final Map<String, PersistableField> fieldsMap = new HashMap<>();
    private final ClassResolver classResolver;

//----------------------------------------------------------------------------------------------------------------------
// Constructors
//----------------------------------------------------------------------------------------------------------------------

    public SimpleColumnMapper(Class<V> valueType, ClassResolver classResolver) {
        this.classResolver = classResolver;
        List<PersistableField> fields = PersistableField.getPersistableFields(valueType);
        for (PersistableField field : fields) {
            fieldsMap.put(field.getColumnName(), field);
        }
    }

//----------------------------------------------------------------------------------------------------------------------
// ColumnMapper Implementation
//----------------------------------------------------------------------------------------------------------------------

    @Override
    @SuppressWarnings("unchecked")
    public V fromColumns(List<HColumn<String, byte[]>> columns) {
        final Iterator<HColumn<String, byte[]>> iterator = columns.iterator();
        final V entity = instantiateFromColumn(iterator.next());
        while (iterator.hasNext()) {
            final HColumn<String, byte[]> column = iterator.next();
            final PersistableField field = fieldsMap.get(column.getName());
            if (field != null) {
                final Object fieldValue = field.getSerializer().fromBytes(column.getValue());
                field.setValue(entity, fieldValue);
            }
        }
        return entity;
    }

    @Override
    public ComparatorType getComparatorType() {
        return ComparatorType.ASCIITYPE;
    }

    @Override
    public String getComparatorTypeAlias() {
        return null;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<HColumn<String, ?>> toColumns(V object) {
        List<HColumn<String, ?>> columns = new LinkedList<>();
        columns.add(HFactory.createStringColumn(POJO_TYPE_COLUMN_NAME, object.getClass().getName()));
        for (PersistableField field : fieldsMap.values()) {
            final Object fieldValue = field.getValue(object);
            if (fieldValue != null) {
                columns.add(HFactory.createColumn(field.getColumnName(), fieldValue, AsciiSerializer.get(), field.getSerializer()));
            }
        }
        return columns;
    }

//----------------------------------------------------------------------------------------------------------------------
// Other Methods
//----------------------------------------------------------------------------------------------------------------------

    @SuppressWarnings("unchecked")
    private V instantiateFromColumn(HColumn<String, byte[]> column) {
        final String typeName = StringSerializer.get().fromBytes(column.getValue());
        final V object = (V) CassidyUtils.instantiate(classResolver.resolveClass(typeName));
        nullFields(object);
        return object;
    }

    private void nullFields(V object) {
        for (PersistableField field : fieldsMap.values()) {
            field.setNull(object);
        }
    }
}
TOP

Related Classes of com.carmanconsulting.cassidy.pojo.simple.SimpleColumnMapper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.