package mil.nga.giat.geowave.format.stanag4676.image;
import java.util.HashMap;
import java.util.Map;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.adapter.AdapterPersistenceEncoding;
import mil.nga.giat.geowave.core.store.adapter.IndexedAdapterPersistenceEncoding;
import mil.nga.giat.geowave.core.store.adapter.WritableDataAdapter;
import mil.nga.giat.geowave.core.store.data.PersistentDataset;
import mil.nga.giat.geowave.core.store.data.field.FieldReader;
import mil.nga.giat.geowave.core.store.data.field.FieldUtils;
import mil.nga.giat.geowave.core.store.data.field.FieldVisibilityHandler;
import mil.nga.giat.geowave.core.store.data.field.FieldWriter;
import mil.nga.giat.geowave.core.store.dimension.NumericDimensionField;
import mil.nga.giat.geowave.core.store.index.CommonIndexModel;
import mil.nga.giat.geowave.core.store.index.CommonIndexValue;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
public class ImageChipDataAdapter implements
WritableDataAdapter<ImageChip>
{
public final static ByteArrayId ADAPTER_ID = new ByteArrayId(
"image");
private final static ByteArrayId IMAGE_FIELD_ID = new ByteArrayId(
"image");
private final FieldVisibilityHandler<ImageChip, Object> imageChipVisibilityHandler;
public ImageChipDataAdapter() {
this(
null);
}
public ImageChipDataAdapter(
final FieldVisibilityHandler<ImageChip, Object> imageChipVisibilityHandler ) {
this.imageChipVisibilityHandler = imageChipVisibilityHandler;
}
@Override
public ByteArrayId getAdapterId() {
return ADAPTER_ID;
}
@Override
public boolean isSupported(
final ImageChip entry ) {
return true;
}
@Override
public ByteArrayId getDataId(
final ImageChip entry ) {
return entry.getDataId();
}
@Override
public ImageChip decode(
final IndexedAdapterPersistenceEncoding data,
final PrimaryIndex index ) {
return ImageChipUtils.fromDataIdAndValue(
data.getDataId(),
(byte[]) data.getAdapterExtendedData().getValue(
IMAGE_FIELD_ID));
}
@Override
public AdapterPersistenceEncoding encode(
final ImageChip entry,
final CommonIndexModel indexModel ) {
final Map<ByteArrayId, Object> fieldIdToValueMap = new HashMap<ByteArrayId, Object>();
fieldIdToValueMap.put(
IMAGE_FIELD_ID,
entry.getImageBinary());
return new AdapterPersistenceEncoding(
getAdapterId(),
entry.getDataId(),
new PersistentDataset<CommonIndexValue>(),
new PersistentDataset<Object>(
fieldIdToValueMap));
}
@Override
public FieldReader<Object> getReader(
final ByteArrayId fieldId ) {
if (IMAGE_FIELD_ID.equals(fieldId)) {
return (FieldReader) FieldUtils.getDefaultReaderForClass(byte[].class);
}
return null;
}
@Override
public byte[] toBinary() {
return new byte[] {};
}
@Override
public void fromBinary(
final byte[] bytes ) {}
@Override
public FieldWriter<ImageChip, Object> getWriter(
final ByteArrayId fieldId ) {
if (IMAGE_FIELD_ID.equals(fieldId)) {
if (imageChipVisibilityHandler != null) {
return (FieldWriter) FieldUtils.getDefaultWriterForClass(
byte[].class,
imageChipVisibilityHandler);
}
else {
return (FieldWriter) FieldUtils.getDefaultWriterForClass(byte[].class);
}
}
return null;
}
@Override
public int getPositionOfOrderedField(
final CommonIndexModel model,
final ByteArrayId fieldId ) {
int i = 0;
for (final NumericDimensionField<? extends CommonIndexValue> dimensionField : model.getDimensions()) {
if (fieldId.equals(dimensionField.getFieldId())) {
return i;
}
i++;
}
if (fieldId.equals(IMAGE_FIELD_ID)) {
return i;
}
return -1;
}
@Override
public ByteArrayId getFieldIdForPosition(
final CommonIndexModel model,
final int position ) {
if (position < model.getDimensions().length) {
int i = 0;
for (final NumericDimensionField<? extends CommonIndexValue> dimensionField : model.getDimensions()) {
if (i == position) {
return dimensionField.getFieldId();
}
i++;
}
}
else {
final int numDimensions = model.getDimensions().length;
if (position == numDimensions) {
return IMAGE_FIELD_ID;
}
}
return null;
}
}