package org.geotools.coverage.grid.io.imageio;
import java.io.IOException;
import java.io.Serializable;
import java.util.AbstractList;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.spi.ImageInputStreamSpi;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.factory.GeoTools;
import org.geotools.factory.Hints;
import org.geotools.gce.RasterManager;
import org.geotools.gce.RasterManagerBuilder;
/**
*
*
* @source $URL$
*/
public abstract class ImageReaderWalker extends AbstractList<RasterManager> implements List<RasterManager> {
protected final Map<String, java.io.Serializable> sourceParams;
/** Hints used by the {@link AbstractGridCoverage2DReader} subclasses. */
private Hints hints = GeoTools.getDefaultHints();
private List<RasterManager> elements;
protected final ImageInputStreamSpi inStreamSPI;
protected final ImageReaderSpi readerSPI;
public ImageReaderWalker(Map<String, Serializable> sourceParams, Hints hints,
ImageInputStreamSpi inStreamSPI, ImageReaderSpi readerSPI) {
this.sourceParams = sourceParams;
this.hints = hints;
this.inStreamSPI = inStreamSPI;
this.readerSPI = readerSPI;
}
public ImageInputStreamSpi getInStreamSPI() {
return inStreamSPI;
}
public ImageReaderSpi getReaderSPI() {
return readerSPI;
}
@Override
public RasterManager get(int index) {
return elements.get(index);
}
@Override
public int size() {
if(elements==null)
return 0;
return elements.size();
}
public Hints getHints() {
return hints.clone();
}
protected void initialize() throws IOException {
// get a raster manager builder
final RasterManagerBuilder rasterManagerBuilder=getRasterManagerBuilder();
if(rasterManagerBuilder==null){
throw new IOException("Unable to obtain a RasterManagerBuilder");
}
//
// Tell underlying implementation that we are starting to process
//
startWalk();
//
// Stream metadata
//
// now parse the stream metadata
if(rasterManagerBuilder.needsStreamMetadata()){
rasterManagerBuilder.parseStreamMetadata(getStreamMetadata());
}
//
// Main Loop on each image
//
// now start parsing metadata plus other info for each image we have
final int numSteps=getNumElemements();
for(int i=0; i<numSteps; i++){
prepareElement(i);
try{
rasterManagerBuilder.addElement(i,acquireReader(i),getSource(i));
} finally {
releaseReader(i);
}
}
//
// Release Resources
//
endWalk();
//
// Create raster managers
//
this.elements=rasterManagerBuilder.create();
rasterManagerBuilder.dispose();
}
protected abstract ImageReaderSource<?> getSource(int i)throws IOException;
protected abstract ImageReader acquireReader(int i)throws IOException;
protected abstract void releaseReader(int i)throws IOException;
protected abstract void endWalk()throws IOException ;
protected abstract void prepareElement(int i)throws IOException;
protected abstract int getNumElemements()throws IOException;
protected abstract void startWalk() throws IOException;
protected abstract IIOMetadata getStreamMetadata() throws IOException;
protected abstract RasterManagerBuilder getRasterManagerBuilder();
protected abstract ImageInputStream createImageInputStream() throws IOException;
}