package mil.nga.giat.geowave.adapter.raster.plugin;
import java.awt.Color;
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.imageio.GeoToolsWriteParams;
import org.geotools.factory.Hints;
import org.geotools.parameter.DefaultParameterDescriptor;
import org.geotools.parameter.DefaultParameterDescriptorGroup;
import org.geotools.parameter.ParameterGroup;
import org.geotools.referencing.CRS;
import org.opengis.coverage.grid.Format;
import org.opengis.coverage.grid.GridCoverageWriter;
import org.opengis.parameter.GeneralParameterDescriptor;
import org.opengis.parameter.ParameterDescriptor;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
public class GeoWaveGTRasterFormat extends
AbstractGridFormat implements
Format
{
private final static Logger LOGGER = LoggerFactory.getLogger(GeoWaveGTRasterFormat.class);
public static final ParameterDescriptor<Color> OUTPUT_TRANSPARENT_COLOR = new DefaultParameterDescriptor<Color>(
"OutputTransparentColor",
Color.class,
null,
null);
public static final CoordinateReferenceSystem DEFAULT_CRS;
static {
try {
DEFAULT_CRS = CRS.decode(
"EPSG:4326",
true);
}
catch (final FactoryException e) {
LOGGER.error(
"Unable to decode EPSG:4326 CRS",
e);
throw new RuntimeException(
"Unable to initialize EPSG:4326 CRS");
}
}
public GeoWaveGTRasterFormat() {
super();
setInfo();
}
/**
* Sets the metadata information.
*/
private void setInfo() {
final HashMap<String, String> info = new HashMap<String, String>();
info.put(
"name",
"GeoWaveRasterFormat");
info.put(
"description",
"Image mosaicking and pyramiding in GeoWave");
info.put(
"vendor",
"GeoWave");
info.put(
"docURL",
"https://github.com/ngageoint/geowave");
info.put(
"version",
"0.9.2");
mInfo = info;
// reading parameters
readParameters = new ParameterGroup(
new DefaultParameterDescriptorGroup(
mInfo,
new GeneralParameterDescriptor[] {
READ_GRIDGEOMETRY2D,
OUTPUT_TRANSPARENT_COLOR,
BACKGROUND_COLOR
}));
// reading parameters
writeParameters = null;
}
@Override
public AbstractGridCoverage2DReader getReader(
final Object source ) {
return getReader(
source,
null);
}
@Override
public AbstractGridCoverage2DReader getReader(
final Object source,
final Hints hints ) {
try {
return new GeoWaveRasterReader(
source,
hints);
}
catch (final Exception e) {
LOGGER.warn(
"Cannot create geowave raster reader",
e);
return null;
}
}
@Override
public GridCoverageWriter getWriter(
final Object destination ) {
throw new UnsupportedOperationException(
"This plugin does not support writing.");
}
@Override
public boolean accepts(
final Object source,
final Hints hints ) {
if (source == null) {
return false;
}
if (isParamList(source)) {
return true;
}
return validateURL(source);
}
@Override
public GeoToolsWriteParams getDefaultImageIOWriteParameters() {
throw new UnsupportedOperationException(
"This plugin does not support writing.");
}
@Override
public GridCoverageWriter getWriter(
final Object destination,
final Hints hints ) {
throw new UnsupportedOperationException(
"This plugin does not support writing.");
}
public static boolean isParamList(
final Object source ) {
return ((source instanceof String) && source.toString().contains(
"=") && source.toString().contains(
";"));
}
public static URL getURLFromSource(
final Object source ) {
if (source == null) {
return null;
}
URL sourceURL = null;
try {
if (source instanceof File) {
sourceURL = ((File) source).toURI().toURL();
}
else if (source instanceof URL) {
sourceURL = (URL) source;
}
else if (source instanceof String) {
final File tempFile = new File(
(String) source);
if (tempFile.exists()) {
sourceURL = tempFile.toURI().toURL();
}
else {
sourceURL = new URL(
URLDecoder.decode(
(String) source,
"UTF8"));
}
}
}
catch (final Exception e) {
LOGGER.warn(
"Unable to read source URL",
e);
return null;
}
return sourceURL;
}
public static boolean validateURL(
final Object source ) {
final URL sourceUrl = getURLFromSource(source);
if (sourceUrl == null) {
return false;
}
if (!sourceUrl.getPath().toLowerCase(
Locale.ENGLISH).endsWith(
".xml")) {
return false;
}
// TODO figure out additional ways to validate
return true;
}
}