/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-2008, Open Source Geospatial Foundation (OSGeo) * * 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; * version 2.1 of the License. * * 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 org.geotools.imageio.hdf4; import it.geosolutions.imageio.ndplugin.BaseImageMetadata; import it.geosolutions.imageio.plugins.hdf4.BaseHDF4ImageReader; import it.geosolutions.imageio.plugins.hdf4.aps.HDF4APSImageReader; import it.geosolutions.imageio.plugins.hdf4.terascan.HDF4TeraScanImageReader; import it.geosolutions.imageio.utilities.SoftValueHashMap; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageReadParam; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.spi.ImageReaderSpi; import org.geotools.imageio.DefaultSliceDescriptor; import org.geotools.imageio.SliceDescriptor; import org.geotools.imageio.SpatioTemporalImageReader; import org.geotools.imageio.hdf4.HDF4SpatioTemporalImageReaderSpi.HDF4_TYPE; import org.geotools.imageio.metadata.SpatioTemporalMetadata; /** * @author Daniele Romagnoli, GeoSolutions * @author Alessio Fabiani, GeoSolutions * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/unsupported/coverage-experiment/hdf4/src/main/java/org/geotools/imageio/hdf4/HDF4SpatioTemporalImageReader.java $ */ public class HDF4SpatioTemporalImageReader extends SpatioTemporalImageReader { private SoftValueHashMap<Integer, IIOMetadata> metadataMap = new SoftValueHashMap<Integer, IIOMetadata>(); /** Inner map to cache the SpatioTemporal metadata instances */ private SoftValueHashMap<Integer, SpatioTemporalMetadata> spatioTemporalMetadataMap = new SoftValueHashMap<Integer, SpatioTemporalMetadata>(); protected HDF4SpatioTemporalImageReader(ImageReaderSpi originatingProvider) { super(originatingProvider); try { directReader = (BaseHDF4ImageReader) originatingProvider.createReaderInstance(); } catch (IOException e) { throw new RuntimeException("Exception occurred while creating a reader" +e.getLocalizedMessage(),e); } } private BaseHDF4ImageReader directReader; @Override public int getHeight(int imageIndex) throws IOException { return directReader.getHeight(imageIndex); } @Override public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex) throws IOException { return directReader.getImageTypes(imageIndex); } @Override public int getNumImages(boolean allowSearch) throws IOException { return directReader.getNumImages(allowSearch); } @Override public IIOMetadata getStreamMetadata() throws IOException { return directReader.getStreamMetadata(); } @Override public int getWidth(int imageIndex) throws IOException { return directReader.getWidth(imageIndex); } @Override public BufferedImage read(int imageIndex, ImageReadParam param) throws IOException { return directReader.read(imageIndex, param); } public void setInput(Object input, boolean seekForwardOnly, boolean ignoreMetadata) { super.setInput(input, seekForwardOnly, ignoreMetadata); directReader.setInput(input, seekForwardOnly, ignoreMetadata); // Parse additional items } @Override public void setInput(Object input, boolean seekForwardOnly) { this.setInput(input, seekForwardOnly, true); } @Override public void setInput(Object input) { this.setInput(input, true, true); } @Override public void dispose() { metadataMap.clear(); metadataMap = null; try{ directReader.dispose(); } finally{ directReader = null; } } @Override public void reset() { this.dispose(); } /** * Returns a {@link SliceDescriptor} instance for the specified imageIndex. * * @param imageIndex * the index of the specified 2D raster. * @see SpatioTemporalImageReader#getSliceDescriptor(int) */ public SliceDescriptor getSliceDescriptor(int imageIndex) throws IOException { return new DefaultSliceDescriptor(getSpatioTemporalMetadata(imageIndex)); } /** * Returns a {@link SpatioTemporalMetadata} instance for the specified * imageIndex. * * @param imageIndex * the index of the specified 2D raster. * @see SpatioTemporalImageReader#getSpatioTemporalMetadata(int) */ public SpatioTemporalMetadata getSpatioTemporalMetadata(int imageIndex) { SpatioTemporalMetadata metadata; synchronized (spatioTemporalMetadataMap) { if (!spatioTemporalMetadataMap.containsKey(imageIndex)) { metadata = new HDF4SpatioTemporalMetadata(this, imageIndex); spatioTemporalMetadataMap.put(imageIndex, metadata); } else { metadata = spatioTemporalMetadataMap.get(imageIndex); if (metadata == null) { metadata = new HDF4SpatioTemporalMetadata(this, imageIndex); spatioTemporalMetadataMap.put(imageIndex, metadata); } } } return metadata; } /** * Returns the ImageMetadata obtained from the underlying flatReader * * @param imageIndex * the index of the specified 2D raster. */ public IIOMetadata getImageMetadata(int imageIndex, final String metadataFormat) throws IOException { IIOMetadata metadata; synchronized (metadataMap) { if (!metadataMap.containsKey(imageIndex)) { metadata = directReader.getImageMetadata(imageIndex, metadataFormat); metadataMap.put(imageIndex, metadata); } else { metadata = (BaseImageMetadata) metadataMap.get(imageIndex); if (metadata == null) { metadata = directReader.getImageMetadata(imageIndex, metadataFormat); metadataMap.put(imageIndex, metadata); } } } return metadata; } public IIOMetadata getImageMetadata(int imageIndex) throws IOException { IIOMetadata metadata; synchronized (metadataMap) { if (!metadataMap.containsKey(imageIndex)) { metadata = directReader.getImageMetadata(imageIndex); metadataMap.put(imageIndex, metadata); } else { metadata = (BaseImageMetadata) metadataMap.get(imageIndex); if (metadata == null) { metadata = directReader.getImageMetadata(imageIndex); metadataMap.put(imageIndex, metadata); } } } return metadata; } public HDF4_TYPE getHDF4Type() { if (directReader instanceof HDF4APSImageReader) return HDF4_TYPE.APS; else if (directReader instanceof HDF4TeraScanImageReader) return HDF4_TYPE.TeraScan; else return HDF4_TYPE.UNDEFINED; } }