package mil.nga.giat.geowave.adapter.vector;
import mil.nga.giat.geowave.core.geotime.TimeUtils;
import mil.nga.giat.geowave.core.geotime.TimeUtils;
import mil.nga.giat.geowave.core.geotime.store.dimension.Time;
import mil.nga.giat.geowave.core.geotime.store.dimension.Time.Timestamp;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.adapter.IndexFieldHandler;
import mil.nga.giat.geowave.core.store.data.PersistentValue;
import mil.nga.giat.geowave.core.store.data.field.FieldVisibilityHandler;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.AttributeDescriptor;
/**
* This class handles the internal responsibility of persisting single timestamp
* instants based on a temporal attribute (a Java binding class of Date or
* Calendar for an attribute)to and from a GeoWave common index field for
* SimpleFeature data.
*
*/
public class FeatureTimestampHandler implements
IndexFieldHandler<SimpleFeature, Time, Object>
{
private final FeatureAttributeHandler nativeTimestampHandler;
private final FieldVisibilityHandler<SimpleFeature, Object> visibilityHandler;
private final ByteArrayId[] nativeFieldIds;
public FeatureTimestampHandler(
final AttributeDescriptor timestampAttrDesc ) {
this(
timestampAttrDesc,
null);
}
public FeatureTimestampHandler(
final AttributeDescriptor timestampAttrDesc,
final FieldVisibilityHandler<SimpleFeature, Object> visibilityHandler ) {
nativeTimestampHandler = new FeatureAttributeHandler(
timestampAttrDesc);
this.visibilityHandler = visibilityHandler;
nativeFieldIds = new ByteArrayId[] {
nativeTimestampHandler.getFieldId()
};
}
@Override
public ByteArrayId[] getNativeFieldIds() {
return nativeFieldIds;
}
@Override
public Time toIndexValue(
final SimpleFeature row ) {
final Object object = nativeTimestampHandler.getFieldValue(row);
byte[] visibility;
if (visibilityHandler != null) {
visibility = visibilityHandler.getVisibility(
row,
nativeTimestampHandler.getFieldId(),
object);
}
else {
visibility = new byte[] {};
}
return new Timestamp(
TimeUtils.getTimeMillis(object),
visibility);
}
@SuppressWarnings("unchecked")
@Override
public PersistentValue<Object>[] toNativeValues(
final Time indexValue ) {
final Class<?> bindingClass = nativeTimestampHandler.attrDesc.getType().getBinding();
final Object obj = TimeUtils.getTimeValue(
bindingClass,
(long) indexValue.toNumericData().getCentroid());
return new PersistentValue[] {
new PersistentValue<Object>(
nativeTimestampHandler.getFieldId(),
obj)
};
}
}