package mil.nga.giat.geowave.adapter.vector.field;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import mil.nga.giat.geowave.adapter.vector.export.VectorMRExportCommand;
import mil.nga.giat.geowave.core.index.ByteArrayId;
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.FieldWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.opengis.feature.simple.SimpleFeatureType;
public class SimpleFeatureSerializationProvider
{
private static final Logger LOGGER = LoggerFactory.getLogger(SimpleFeatureSerializationProvider.class);
public static class WholeFeatureReader implements
FieldReader<byte[][]>
{
SimpleFeatureType type;
public WholeFeatureReader(
SimpleFeatureType type ) {
super();
this.type = type;
}
@Override
public byte[][] readField(
final byte[] fieldData ) {
if (fieldData == null) {
return null;
}
final ByteBuffer input = ByteBuffer.wrap(fieldData);
int attrCnt = type.getAttributeCount();
byte[][] retVal = new byte[attrCnt][];
for (int i = 0; i < attrCnt; i++) {
int byteLength;
byteLength = input.getInt();
if (byteLength < 0) {
retVal[i] = null;
continue;
}
byte[] fieldValue = new byte[byteLength];
input.get(fieldValue);
retVal[i] = fieldValue;
}
return retVal;
}
}
public static class WholeFeatureWriter implements
FieldWriter<Object, Object[]>
{
public WholeFeatureWriter() {
super();
}
@Override
public byte[] writeField(
final Object[] fieldValue ) {
if (fieldValue == null) {
return new byte[] {};
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final DataOutputStream output = new DataOutputStream(
baos);
try {
for (Object attr : fieldValue) {
if (attr == null) {
output.writeInt(-1);
continue;
}
FieldWriter writer = FieldUtils.getDefaultWriterForClass(attr.getClass());
byte[] binary = writer.writeField(attr);
output.writeInt(binary.length);
output.write(binary);
}
output.close();
}
catch (IOException e) {
LOGGER.error(
"Unable to write to output",
e);
}
return baos.toByteArray();
}
@Override
public byte[] getVisibility(
final Object rowValue,
final ByteArrayId fieldId,
final Object[] fieldValue ) {
return new byte[] {};
}
}
}