package mil.nga.giat.geowave.adapter.raster.adapter.merge; import java.io.IOException; import java.util.Map; import mil.nga.giat.geowave.adapter.raster.adapter.MergeableRasterTile; import mil.nga.giat.geowave.adapter.raster.adapter.RasterTile; import mil.nga.giat.geowave.core.index.ByteArrayId; import mil.nga.giat.geowave.core.index.ByteArrayUtils; import mil.nga.giat.geowave.core.index.Mergeable; import mil.nga.giat.geowave.core.index.Persistable; import mil.nga.giat.geowave.core.index.PersistenceUtils; import mil.nga.giat.geowave.core.store.adapter.RowMergingDataAdapter.RowTransform; /** * This class can be used by both the RasterTileCombiner and the * RasterTileVisibilityCombiner to execute the merge strategy */ public class RasterTileRowTransform<T extends Persistable> implements RowTransform<Mergeable> { public static final String TRANSFORM_NAME = "RasterTile"; public static final String MERGE_STRATEGY_KEY = "MERGE_STRATEGY"; private RootMergeStrategy<T> mergeStrategy; // this priority is fairly arbitrary at the moment private static final int RASTER_TILE_PRIORITY = 4; public Mergeable transform( final ByteArrayId adapterId, final Mergeable mergeable ) { if ((mergeable != null) && (mergeable instanceof RasterTile)) { final RasterTile<T> rasterTile = (RasterTile) mergeable; return new MergeableRasterTile<T>( rasterTile.getDataBuffer(), rasterTile.getMetadata(), mergeStrategy, adapterId); } return mergeable; } @Override public void initOptions( final Map<String, String> options ) throws IOException { final String mergeStrategyStr = options.get(MERGE_STRATEGY_KEY); if (mergeStrategyStr != null) { final byte[] mergeStrategyBytes = ByteArrayUtils.byteArrayFromString(mergeStrategyStr); mergeStrategy = PersistenceUtils.fromBinary( mergeStrategyBytes, RootMergeStrategy.class); } } @Override public Mergeable getRowAsMergeableObject( final ByteArrayId adapterId, final ByteArrayId fieldId, final byte[] rowValueBinary ) { final RasterTile mergeable = PersistenceUtils.classFactory( RasterTile.class.getName(), RasterTile.class); if (mergeable != null) { mergeable.fromBinary(rowValueBinary); } return transform( adapterId, mergeable); } @Override public byte[] getBinaryFromMergedObject( final Mergeable rowObject ) { return rowObject.toBinary(); } @Override public byte[] toBinary() { return new byte[] {}; } @Override public void fromBinary( final byte[] bytes ) {} @Override public String getTransformName() { return TRANSFORM_NAME; } @Override public int getBaseTransformPriority() { return RASTER_TILE_PRIORITY; } }