package mil.nga.giat.geowave.analytic; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.mapreduce.HadoopWritableSerializationTool; import org.apache.hadoop.io.ObjectWritable; import org.apache.hadoop.io.Writable; public class AdapterWithObjectWritable implements Writable { private ObjectWritable objectWritable; private ByteArrayId adapterId; private ByteArrayId dataId; private boolean isPrimary; public void setObject( final ObjectWritable data ) { objectWritable = data; } public ObjectWritable getObjectWritable() { return objectWritable; } protected void setObjectWritable( final ObjectWritable objectWritable ) { this.objectWritable = objectWritable; } public ByteArrayId getAdapterId() { return adapterId; } public void setAdapterId( final ByteArrayId adapterId ) { this.adapterId = adapterId; } public ByteArrayId getDataId() { return dataId; } public void setDataId( final ByteArrayId dataId ) { this.dataId = dataId; } public boolean isPrimary() { return isPrimary; } public void setPrimary( final boolean isPrimary ) { this.isPrimary = isPrimary; } @Override public void readFields( final DataInput input ) throws IOException { final int adapterIdLength = input.readInt(); final byte[] adapterIdBinary = new byte[adapterIdLength]; input.readFully(adapterIdBinary); adapterId = new ByteArrayId( adapterIdBinary); final int dataIdLength = input.readInt(); if (dataIdLength > 0) { final byte[] dataIdBinary = new byte[dataIdLength]; input.readFully(dataIdBinary); dataId = new ByteArrayId( dataIdBinary); } isPrimary = input.readBoolean(); if (objectWritable == null) { objectWritable = new ObjectWritable(); } objectWritable.readFields(input); } @Override public void write( final DataOutput output ) throws IOException { final byte[] adapterIdBinary = adapterId.getBytes(); output.writeInt(adapterIdBinary.length); output.write(adapterIdBinary); if (dataId != null) { final byte[] dataIdBinary = dataId.getBytes(); output.writeInt(dataIdBinary.length); output.write(dataIdBinary); } else { output.writeInt(0); } output.writeBoolean(isPrimary); objectWritable.write(output); } public static void fillWritableWithAdapter( final HadoopWritableSerializationTool serializationTool, final AdapterWithObjectWritable writableToFill, final ByteArrayId adapterID, final ByteArrayId dataId, final boolean isPrimary, final Object entry ) { writableToFill.setAdapterId(adapterID); writableToFill.setPrimary(isPrimary); writableToFill.setDataId(dataId); writableToFill.setObject(serializationTool.toWritable( adapterID, entry)); } public static Object fromWritableWithAdapter( final HadoopWritableSerializationTool serializationTool, final AdapterWithObjectWritable writableToExtract ) { final ByteArrayId adapterID = writableToExtract.getAdapterId(); final Object innerObj = writableToExtract.objectWritable.get(); return (innerObj instanceof Writable) ? serializationTool.getHadoopWritableSerializerForAdapter( adapterID).fromWritable( (Writable) innerObj) : innerObj; } @Override public String toString() { return "AdapterWithObjectWritable [ adapterId=" + adapterId + ", dataId=" + dataId + ", isPrimary=" + isPrimary + "]"; } }