package org.geotools.gce.imagemosaic; import java.awt.Dimension; import java.awt.Rectangle; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import javax.media.jai.PlanarImage; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.gce.imagemosaic.IndexBuilder.ExceptionEvent; import org.geotools.gce.imagemosaic.IndexBuilder.IndexBuilderConfiguration; import org.geotools.gce.imagemosaic.IndexBuilder.ProcessingEvent; import org.geotools.gce.imagemosaic.IndexBuilder.ProcessingEventListener; import org.geotools.geometry.GeneralEnvelope; import org.geotools.test.TestData; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; /** * Testing {@link IndexBuilder} and its related subclasses. * * @author Simone Giannecchini, GeoSolutions SAS * * * @source $URL$ */ public class IndexBuilderTest extends Assert { private final class IndexBuilderListener extends ProcessingEventListener{ @Override void exceptionOccurred(ExceptionEvent event) { throw new RuntimeException(event.getException()); } @Override void getNotification(ProcessingEvent event) { } } @Test // @Ignore public void indexBuilderConfiguration() throws FileNotFoundException, IOException, CloneNotSupportedException{ // create a stub configuration final IndexBuilderConfiguration c1= new IndexBuilderConfiguration(); c1.setAbsolute(true); c1.setIndexName("index"); c1.setLocationAttribute("location"); c1.setRootMosaicDirectory(TestData.file(this,"/rgb").toString()); c1.setIndexingDirectories(Arrays.asList(TestData.file(this,"/rgb").toString())); assertNotNull(c1.toString()); // create a second stub configuration final IndexBuilderConfiguration c2= new IndexBuilderConfiguration(); c2.setAbsolute(true); c2.setIndexName("index"); c2.setLocationAttribute("location"); c2.setRootMosaicDirectory(TestData.file(this,"/rgb").toString()); c2.setIndexingDirectories(Arrays.asList(TestData.file(this,"/rgb").toString())); assertTrue(c1.equals(c2)); assertEquals(c1.hashCode(), c2.hashCode()); IndexBuilderConfiguration c3 = c2.clone(); assertTrue(c3.equals(c2)); assertEquals(c3.hashCode(), c2.hashCode()); //check errors final IndexBuilderConfiguration c4= new IndexBuilderConfiguration(); assertNotNull(c4.toString()); } @Test public void buildIndex() throws FileNotFoundException, IOException{ //build a relative index and then make it run IndexBuilderConfiguration c1= new IndexBuilderConfiguration(); c1.setAbsolute(true); c1.setIndexName("shpindex"); c1.setLocationAttribute("location"); c1.setAbsolute(false); c1.setRootMosaicDirectory(TestData.file(this,"/overview").toString()); c1.setIndexingDirectories(Arrays.asList(TestData.file(this,"/overview/0").toString())); assertNotNull(c1.toString()); //build the index IndexBuilder builder= new IndexBuilder(c1); builder.addProcessingEventListener(new IndexBuilderListener()); builder.run(); final File relativeMosaic=TestData.file(this,"/overview/"+c1.getIndexName()+".shp"); assertTrue(relativeMosaic.exists()); assertTrue(new ImageMosaicFormat().accepts(relativeMosaic)); ImageMosaicReader reader = (ImageMosaicReader) new ImageMosaicReader(relativeMosaic); // limit yourself to reading just a bit of it ParameterValue<GridGeometry2D> gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D.createValue(); GeneralEnvelope envelope = reader.getOriginalEnvelope(); Dimension dim= new Dimension(); dim.setSize(reader.getOriginalGridRange().getSpan(0)/2.0, reader.getOriginalGridRange().getSpan(1)/2.0); Rectangle rasterArea=(( GridEnvelope2D)reader.getOriginalGridRange()); rasterArea.setSize(dim); GridEnvelope2D range= new GridEnvelope2D(rasterArea); gg.setValue(new GridGeometry2D(range,envelope)); // use imageio with defined tiles final ParameterValue<Boolean> useJai = ImageMosaicFormat.USE_JAI_IMAGEREAD.createValue(); useJai.setValue(false); final ParameterValue<String> tileSize = ImageMosaicFormat.SUGGESTED_TILE_SIZE.createValue(); tileSize.setValue("128,128"); // Test the output coverage GridCoverage2D coverage = (GridCoverage2D) reader.read(new GeneralParameterValue[] {gg,useJai ,tileSize}); Assert.assertNotNull(coverage); PlanarImage.wrapRenderedImage( coverage.getRenderedImage()).getTiles();; //build an absolute index and then make it run c1= new IndexBuilderConfiguration(); c1.setAbsolute(true); c1.setIndexName("shpindex_absolute"); c1.setLocationAttribute("location"); c1.setAbsolute(true); c1.setRootMosaicDirectory(TestData.file(this,"/overview").toString()); c1.setIndexingDirectories(Arrays.asList(TestData.file(this,"/overview/0").toString())); assertNotNull(c1.toString()); //build the index builder= new IndexBuilder(c1); builder.addProcessingEventListener(new IndexBuilderListener()); builder.run(); final File absoluteMosaic=TestData.file(this,"/overview/"+c1.getIndexName()+".shp"); assertTrue(absoluteMosaic.exists()); assertTrue(new ImageMosaicFormat().accepts(absoluteMosaic)); reader = (ImageMosaicReader) new ImageMosaicReader(absoluteMosaic); // limit yourself to reading just a bit of it gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D.createValue(); envelope = reader.getOriginalEnvelope(); dim= new Dimension(); dim.setSize(reader.getOriginalGridRange().getSpan(0)/2.0, reader.getOriginalGridRange().getSpan(1)/2.0); rasterArea=(( GridEnvelope2D)reader.getOriginalGridRange()); rasterArea.setSize(dim); range= new GridEnvelope2D(rasterArea); gg.setValue(new GridGeometry2D(range,envelope)); // use imageio with defined tiles // Test the output coverage coverage = (GridCoverage2D) reader.read(new GeneralParameterValue[] {gg,useJai ,tileSize}); Assert.assertNotNull(coverage); PlanarImage.wrapRenderedImage( coverage.getRenderedImage()).getTiles();; } @Before public void setUp() throws Exception { //force initial ImageIO set up and reordering new ImageMosaicFormatFactory(); } }