/*
* ImageI/O-Ext - OpenSource Java Image translation Library
* http://www.geo-solutions.it/
* http://java.net/projects/imageio-ext/
* (C) 2007 - 2009, GeoSolutions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* either version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package it.geosolutions.imageio.plugins.mrsid;
import it.geosolutions.imageio.gdalframework.GDALCommonIIOImageMetadata;
import it.geosolutions.imageio.gdalframework.GDALUtilities;
import java.util.Map;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormat;
import javax.imageio.metadata.IIOMetadataNode;
import org.gdal.gdal.Dataset;
import org.w3c.dom.Node;
/**
* Specialization of {@link IIOMetadata} specific for the MrSID format. It
* provides the user with the specific MrSID metadata.
*
* @author Daniele Romagnoli, GeoSolutions.
* @author Simone Giannecchini, GeoSolutions.
*/
public class MrSIDIIOImageMetadata extends GDALCommonIIOImageMetadata {
/**
* The name of the metadata format for this object.
*/
public final static String mrsidImageMetadataName = "org_gdal_imageio_mrsid_metadata";
/**
* The name of the class implementing <code>IIOMetadataFormat</code> and
* representing the metadata format for this object.
*/
public static final String mrsidImageMetadataFormatClassName = "it.geosolutions.imageio.gdalframework.MrSIDIIOImageMetadataFormat";
/**
* <code>MrSIDIIOImageMetadata</code> constructor.
*
* @param dataseName
* The name (usually a File path or a subdataset name when
* the format supports subdatasets) of the dataset we want to
* open.
*/
public MrSIDIIOImageMetadata(final String datasetName) {
super(datasetName, mrsidImageMetadataName,
mrsidImageMetadataFormatClassName);
}
/**
* <code>MrSIDIIOImageMetadata</code> constructor.
*
* @param dataset
* The name (usually a File path or a subdataset name when
* the format supports subdatasets) of the dataset we want to
* open.
*/
public MrSIDIIOImageMetadata(final Dataset dataset,final String datasetName) {
super(dataset, datasetName, mrsidImageMetadataName,
mrsidImageMetadataFormatClassName);
}
/**
* Returns an XML DOM <code>Node</code> object that represents the root of
* a tree of common stream metadata contained within this object according
* to the conventions defined by a given metadata format name.
*
* @param formatName
* the name of the requested metadata format. Actually
* supported format name are {@link #mrsidImageMetadataName}
* and
* {@link GDALCommonIIOImageMetadata#nativeMetadataFormatName}.
*/
public Node getAsTree(String formatName) {
if (formatName.equalsIgnoreCase(mrsidImageMetadataName))
return getMrSIDMetadataTree();
return super.getAsTree(formatName);
}
/**
* Returns the XML DOM <code>Node</code> object that represents the root
* of a tree of metadata contained within this object on its native format,
* which contains MrSID specific information.
*
* @return a root node containing common metadata exposed on its native
* format.
*/
private Node getMrSIDMetadataTree() {
// Create root node
final IIOMetadataNode root = new IIOMetadataNode(mrsidImageMetadataName);
// final Dataset ds = GDALUtilities.acquireDataSet(getDatasetName(),
// gdalconst.GA_ReadOnly);
// final Map gdalMetadataMap = ds.GetMetadata_Dict("");
final Map defaultDomainMap = getGdalMetadataDomain(GDALUtilities.GDALMetadataDomain.DEFAULT);
// //
//
// ImageDescriptor
//
// //
IIOMetadataNode node = new IIOMetadataNode("ImageDescriptor");
node.setAttribute("IMAGE__INPUT_NAME", getDatasetName());
GDALUtilities.setNodeAttribute("IMAGE__INPUT_FILE_SIZE",
defaultDomainMap.get("IMAGE__INPUT_FILE_SIZE"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__DYNAMIC_RANGE_WINDOW",
defaultDomainMap.get("IMAGE__DYNAMIC_RANGE_WINDOW"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__DYNAMIC_RANGE_LEVEL",
defaultDomainMap.get("IMAGE__DYNAMIC_RANGE_LEVEL"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__COMPRESSION_VERSION",
defaultDomainMap.get("IMAGE__COMPRESSION_VERSION"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__TARGET_COMPRESSION_RATIO",
defaultDomainMap.get("IMAGE__TARGET_COMPRESSION_RATIO"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__COMPRESSION_NLEV",
defaultDomainMap.get("IMAGE__COMPRESSION_NLEV"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__COMPRESSION_WEIGHT",
defaultDomainMap.get("IMAGE__COMPRESSION_WEIGHT"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__COMPRESSION_GAMMA",
defaultDomainMap.get("IMAGE__COMPRESSION_GAMMA"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__COMPRESSION_BLOCK_SIZE",
defaultDomainMap.get("IMAGE__COMPRESSION_BLOCK_SIZE"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMAGE__CREATION_DATE", defaultDomainMap
.get("IMAGE__CREATION_DATE"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMAGE__WIDTH", defaultDomainMap
.get("IMAGE__WIDTH"), node, IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities
.setNodeAttribute("IMAGE__HEIGHT", defaultDomainMap
.get("IMAGE__HEIGHT"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMAGE__TRANSPARENT_DATA_VALUE",
defaultDomainMap.get("IMAGE__TRANSPARENT_DATA_VALUE"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMAGE__COLOR_SCHEME", defaultDomainMap
.get("IMAGE__COLOR_SCHEME"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMAGE__DATA_TYPE", defaultDomainMap
.get("IMAGE__DATA_TYPE"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMAGE__BITS_PER_SAMPLE",
defaultDomainMap.get("IMAGE__BITS_PER_SAMPLE"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
root.appendChild(node);
// //
//
// Georeferencing
//
// //
node = new IIOMetadataNode("Georeferencing");
GDALUtilities.setNodeAttribute("IMG__HORIZONTAL_UNITS",
defaultDomainMap.get("IMG__HORIZONTAL_UNITS"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMG__PROJECTION_TYPE", defaultDomainMap
.get("IMG__PROJECTION_TYPE"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMG__PROJECTION_NUMBER",
defaultDomainMap.get("IMG__PROJECTION_NUMBER"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMG__PROJECTION_ZONE", defaultDomainMap
.get("IMG__PROJECTION_ZONE"), node,
IIOMetadataFormat.DATATYPE_INTEGER);
GDALUtilities.setNodeAttribute("IMG__SPHEROID_NAME", defaultDomainMap
.get("IMG__SPHEROID_NAME"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMG__SPHEROID_SEMI_MAJOR_AXIS",
defaultDomainMap.get("IMG__SPHEROID_SEMI_MAJOR_AXIS"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMG__SPHEROID_SEMI_MINOR_AXIS",
defaultDomainMap.get("IMG__SPHEROID_SEMI_MINOR_AXIS"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMG__SPHEROID_ECCENTRICITY_SQUARED",
defaultDomainMap.get("IMG__SPHEROID_ECCENTRICITY_SQUARED"),
node, IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMG__SPHEROID_RADIUS", defaultDomainMap
.get("IMG__SPHEROID_RADIUS"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__XY_ORIGIN", defaultDomainMap
.get("IMAGE__XY_ORIGIN"), node,
IIOMetadataFormat.DATATYPE_STRING);
GDALUtilities.setNodeAttribute("IMAGE__X_RESOLUTION", defaultDomainMap
.get("IMAGE__X_RESOLUTION"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__Y_RESOLUTION", defaultDomainMap
.get("IMAGE__Y_RESOLUTION"), node,
IIOMetadataFormat.DATATYPE_DOUBLE);
GDALUtilities.setNodeAttribute("IMAGE__WKT", defaultDomainMap
.get("IMAGE__WKT"), node, IIOMetadataFormat.DATATYPE_STRING);
root.appendChild(node);
// GDALUtilities.closeDataSet(ds);
return root;
}
/**
* Returns <code>true</code> since this object does not support the
* <code>mergeTree</code>, <code>setFromTree</code>, and
* <code>reset</code> methods.
*
* @return <code>true</code> since this <code>IIOMetadata</code> object
* cannot be modified.
*/
public boolean isReadOnly() {
return true;
}
/**
* Method unsupported. Calling this method will throws an
* <code>UnsupportedOperationException</code>
*
* @see javax.imageio.metadata.IIOMetadata#mergeTree()
*
* @see #isReadOnly()
*/
public void mergeTree(String formatName, Node root)
throws IIOInvalidTreeException {
throw new UnsupportedOperationException(
"mergeTree operation is not allowed");
}
/**
* Method unsupported. Calling this method will throws an
* <code>UnsupportedOperationException</code>
*
* @see javax.imageio.metadata.IIOMetadata#reset()
*
* @see #isReadOnly()
*/
public void reset() {
throw new UnsupportedOperationException(
"reset operation is not allowed");
}
}