/*
* Copyright (c) 2014 Carman Consulting, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.carmanconsulting.cassidy.pojo.assembly.mapper;
import com.carmanconsulting.cassidy.context.CassidyContext;
import com.carmanconsulting.cassidy.pojo.assembly.AssemblyStack;
import com.carmanconsulting.cassidy.pojo.assembly.AssemblyStep;
import com.carmanconsulting.cassidy.pojo.assembly.DisassemblerService;
import com.carmanconsulting.cassidy.pojo.mapper.ColumnMapper;
import com.carmanconsulting.cassidy.util.CassidyUtils;
import me.prettyprint.cassandra.serializers.DynamicCompositeSerializer;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.beans.DynamicComposite;
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.ddl.ComparatorType;
import me.prettyprint.hector.api.factory.HFactory;
import java.util.ArrayList;
import java.util.List;
public class AssemblyColumnMapper<V> implements ColumnMapper<DynamicComposite, V> {
//----------------------------------------------------------------------------------------------------------------------
// Fields
//----------------------------------------------------------------------------------------------------------------------
private final CassidyContext context;
private final DisassemblerService disassemblerService;
//----------------------------------------------------------------------------------------------------------------------
// Constructors
//----------------------------------------------------------------------------------------------------------------------
public AssemblyColumnMapper(CassidyContext context, DisassemblerService disassemblerService) {
this.context = context;
this.disassemblerService = disassemblerService;
}
//----------------------------------------------------------------------------------------------------------------------
// ColumnMapper Implementation
//----------------------------------------------------------------------------------------------------------------------
@Override
@SuppressWarnings("unchecked")
public V fromColumns(List<HColumn<DynamicComposite, byte[]>> columns) {
AssemblyStack stack = new AssemblyStack();
for (HColumn<DynamicComposite, byte[]> column : columns) {
final String stepTypeName = (String) column.getName().get(1);
final Class<? extends AssemblyStep> stepType = context.classPath().resolveClass(stepTypeName);
AssemblyStep step = CassidyUtils.instantiate(stepType);
step.initializeFromColumn(column.getValue(), context);
step.execute(stack);
}
return stack.pop();
}
@Override
public ComparatorType getComparatorType() {
return ComparatorType.DYNAMICCOMPOSITETYPE;
}
@Override
public String getComparatorTypeAlias() {
return DynamicComposite.DEFAULT_DYNAMIC_COMPOSITE_ALIASES;
}
@Override
public List<HColumn<DynamicComposite, ?>> toColumns(V object) {
List<AssemblyStep> steps = disassemblerService.disassemble(object);
List<HColumn<DynamicComposite, ?>> columns = new ArrayList<>(steps.size());
for (AssemblyStep step : steps) {
final DynamicComposite name = new DynamicComposite(columns.size(), step.getClass().getName());
final Object columnValue = step.getColumnValue();
final HColumn<DynamicComposite, ?> column = createColumn(name, columnValue);
columns.add(column);
}
return columns;
}
//----------------------------------------------------------------------------------------------------------------------
// Other Methods
//----------------------------------------------------------------------------------------------------------------------
@SuppressWarnings("unchecked")
private <T> HColumn<DynamicComposite, T> createColumn(DynamicComposite name, T columnValue) {
return HFactory.createColumn(name, columnValue, DynamicCompositeSerializer.get(), (Serializer<T>) context.serializerRegistry().getSerializer(columnValue.getClass()));
}
}