package com.carmanconsulting.cassidy.pojo.assembly.step;
import com.carmanconsulting.cassidy.context.CassidyContext;
import com.carmanconsulting.cassidy.pojo.assembly.AssemblyStack;
import com.carmanconsulting.cassidy.pojo.assembly.AssemblyStep;
import com.carmanconsulting.cassidy.util.PersistableField;
import me.prettyprint.cassandra.serializers.StringSerializer;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class FieldModifierStep implements AssemblyStep {
//----------------------------------------------------------------------------------------------------------------------
// Fields
//----------------------------------------------------------------------------------------------------------------------
private static final Logger LOGGER = LoggerFactory.getLogger(FieldModifierStep.class);
private String fieldName;
//----------------------------------------------------------------------------------------------------------------------
// Constructors
//----------------------------------------------------------------------------------------------------------------------
protected FieldModifierStep() {
}
protected FieldModifierStep(String fieldName) {
this.fieldName = Validate.notNull(fieldName, "Field name cannot be null.");
}
//----------------------------------------------------------------------------------------------------------------------
// Abstract Methods
//----------------------------------------------------------------------------------------------------------------------
protected abstract Object getValue(AssemblyStack assemblyStack);
//----------------------------------------------------------------------------------------------------------------------
// AssemblyStep Implementation
//----------------------------------------------------------------------------------------------------------------------
@Override
@SuppressWarnings("unchecked")
public void execute(AssemblyStack assemblyStack) {
Object value = getValue(assemblyStack);
final Object target = assemblyStack.peek();
PersistableField field = PersistableField.getPersistableField(target, fieldName);
if (field != null) {
field.setValue(target, value);
} else {
LOGGER.warn("Persistable field {} not found on object of type {}.", fieldName, target.getClass().getCanonicalName());
}
}
@Override
public Object getColumnValue() {
return fieldName;
}
@Override
public void initializeFromColumn(byte[] columnValue, CassidyContext context) {
this.fieldName = StringSerializer.get().fromBytes(columnValue);
}
}