/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-2013, 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.gce.imagemosaic; import java.awt.Dimension; import java.awt.Rectangle; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.util.Properties; import javax.media.jai.PlanarImage; import org.apache.commons.io.IOUtils; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.coverage.grid.io.AbstractGridFormat; import org.geotools.gce.imagemosaic.ImageMosaicEventHandlers.ExceptionEvent; import org.geotools.gce.imagemosaic.ImageMosaicEventHandlers.ProcessingEvent; import org.geotools.gce.imagemosaic.ImageMosaicEventHandlers.ProcessingEventListener; import org.geotools.gce.imagemosaic.Utils.Prop; import org.geotools.gce.imagemosaic.catalog.GranuleCatalog; import org.geotools.gce.imagemosaic.catalogbuilder.CatalogBuilderConfiguration; import org.geotools.geometry.GeneralEnvelope; import org.geotools.test.TestData; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; /** * Testing {@link CatalogBuilder} and its related subclasses. * * @author Simone Giannecchini, GeoSolutions SAS * * @source $URL$ */ public class CatalogBuilderTest extends Assert { /** Used to avoid errors if building on a system where hostname is not defined */ private boolean hostnameDefined; @Before public void setup() { try { InetAddress.getLocalHost(); hostnameDefined = true; } catch (Exception ex) { hostnameDefined = false; } } private final class CatalogBuilderListener extends ProcessingEventListener{ @Override public void exceptionOccurred(ExceptionEvent event) { throw new RuntimeException(event.getException()); } @Override public void getNotification(ProcessingEvent event) { } } @Test public void catalogBuilderConfiguration() throws Exception{ // create a stub configuration final CatalogBuilderConfiguration c1 = new CatalogBuilderConfiguration(); c1.setParameter(Prop.INDEX_NAME, "index"); c1.setParameter(Prop.LOCATION_ATTRIBUTE, "location"); c1.setParameter(Prop.ABSOLUTE_PATH, "true"); c1.setParameter(Prop.ROOT_MOSAIC_DIR, TestData.file(this, "/rgb").toString()); c1.setParameter(Prop.INDEXING_DIRECTORIES, TestData.file(this,"/rgb").toString()); // c1.setIndexName("index"); // c1.setLocationAttribute("location"); // c1.setAbsolute(true); // 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 CatalogBuilderConfiguration c2 = new CatalogBuilderConfiguration(); c2.setParameter(Prop.INDEX_NAME, "index"); c2.setParameter(Prop.LOCATION_ATTRIBUTE, "location"); c2.setParameter(Prop.ABSOLUTE_PATH, "true"); c2.setParameter(Prop.ROOT_MOSAIC_DIR, TestData.file(this, "/rgb").toString()); c2.setParameter(Prop.INDEXING_DIRECTORIES, TestData.file(this,"/rgb").toString()); // c2.setIndexName("index"); // c2.setLocationAttribute("location"); // c2.setAbsolute(true); // 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()); CatalogBuilderConfiguration c3 = c2.clone(); assertTrue(c3.equals(c2)); assertEquals(c3.hashCode(), c2.hashCode()); //check errors final CatalogBuilderConfiguration c4= new CatalogBuilderConfiguration(); assertNotNull(c4.toString()); } @Test @Ignore public void buildCatalog() throws FileNotFoundException, IOException{ if (hostnameDefined){ ImageMosaicDirectoryWalker builder = null; ImageMosaicReader reader = null; ParameterValue<GridGeometry2D> gg = null; GeneralEnvelope envelope = null; Dimension dim = null; Rectangle rasterArea = null; GridEnvelope2D range = null; GridCoverage2D coverage = null; final ParameterValue<Boolean> useJai = AbstractGridFormat.USE_JAI_IMAGEREAD.createValue(); useJai.setValue(false); final ParameterValue<String> tileSize = AbstractGridFormat.SUGGESTED_TILE_SIZE.createValue(); tileSize.setValue("128,128"); //build a relative index and then make it run CatalogBuilderConfiguration c1 = new CatalogBuilderConfiguration(); c1.setParameter(Prop.INDEX_NAME, "shpindex"); c1.setParameter(Prop.LOCATION_ATTRIBUTE, "location"); c1.setParameter(Prop.ABSOLUTE_PATH, "false"); c1.setParameter(Prop.ROOT_MOSAIC_DIR, TestData.file(this, "/overview/0").toString()); c1.setParameter(Prop.INDEXING_DIRECTORIES, TestData.file(this,"/overview/0").toString()); // 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()); ImageMosaicEventHandlers eventHandler = new ImageMosaicEventHandlers(); final ImageMosaicConfigHandler catalogHandler = new ImageMosaicConfigHandler(c1, eventHandler); // TODO // build the index builder = new ImageMosaicDirectoryWalker(catalogHandler, eventHandler); eventHandler.addProcessingEventListener(new CatalogBuilderListener()); builder.run(); final File relativeMosaic=TestData.file(this,"/overview/"+c1.getIndexName()+".shp"); assertTrue(relativeMosaic.exists()); assertTrue(new ImageMosaicFormat().accepts(relativeMosaic)); reader = (ImageMosaicReader) new ImageMosaicReader(relativeMosaic); // limit yourself to reading just a bit of it gg = AbstractGridFormat.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(); //caching should be false by default Properties props= new Properties(); InputStream in= null; try{ in= TestData.openStream(this, "/overview/"+c1.getIndexName()+".properties"); assertNotNull("unable to find mosaic properties file",in); props.load(in); assertTrue(props.containsKey("Caching")); assertTrue(props.getProperty("Caching").equalsIgnoreCase("false")); } finally { if(in!=null){ IOUtils.closeQuietly(in); } } // dispose coverage.dispose(true); reader.dispose(); //build an absolute index and then make it run CatalogBuilderConfiguration c2 = new CatalogBuilderConfiguration(); c2.setParameter(Prop.INDEX_NAME, "shpindex_absolute"); c2.setParameter(Prop.LOCATION_ATTRIBUTE, "location"); c2.setParameter(Prop.ABSOLUTE_PATH, "true"); c2.setParameter(Prop.CACHING, "true"); c2.setParameter(Prop.ROOT_MOSAIC_DIR, TestData.file(this, "/overview").toString()); c2.setParameter(Prop.INDEXING_DIRECTORIES, TestData.file(this,"/overview").toString()); // c2.setIndexName("shpindex_absolute"); // c2.setLocationAttribute("location"); // c2.setAbsolute(true); // c2.setCaching(true); // c2.setRootMosaicDirectory(TestData.file(this,"/overview").toString()); // c2.setIndexingDirectories(Arrays.asList(TestData.file(this,"/overview/0").toString())); assertNotNull(c2.toString()); ImageMosaicEventHandlers eventHandler2 = new ImageMosaicEventHandlers(); final ImageMosaicConfigHandler catalogHandler2 = new ImageMosaicConfigHandler(c2, eventHandler); // build the index builder = new ImageMosaicDirectoryWalker(catalogHandler2, eventHandler); eventHandler2.addProcessingEventListener(new CatalogBuilderListener()); builder.run(); final File absoluteMosaic=TestData.file(this,"/overview/"+c2.getIndexName()+".shp"); assertTrue(absoluteMosaic.exists()); //caching should be false by default props= new Properties(); in= null; try{ in= TestData.openStream(this, "/overview/"+c2.getIndexName()+".properties"); assertNotNull("unable to find mosaic properties file",in); props.load(in); assertTrue(props.containsKey("Caching")); assertTrue(props.getProperty("Caching").equalsIgnoreCase("true")); } finally { if(in!=null){ IOUtils.closeQuietly(in); } } assertTrue(new ImageMosaicFormat().accepts(absoluteMosaic)); reader = (ImageMosaicReader) new ImageMosaicReader(absoluteMosaic); // limit yourself to reading just a bit of it gg = AbstractGridFormat.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(); // dispose coverage.dispose(true); reader.dispose(); } } @Test @Ignore public void buildCachingIndex() throws FileNotFoundException, IOException { if (hostnameDefined){ ImageMosaicDirectoryWalker builder = null; ImageMosaicReader reader = null; FileInputStream inStream = null; CatalogBuilderConfiguration c1 = new CatalogBuilderConfiguration(); // c1.setIndexName("shpindex"); // c1.setLocationAttribute("location"); // c1.setAbsolute(false); // c1.setRootMosaicDirectory(TestData.file(this, "/caching").toString()); // c1.setIndexingDirectories(Arrays.asList(TestData.file(this,"/caching").toString())); c1.setParameter(Prop.INDEX_NAME, "shpindex"); c1.setParameter(Prop.LOCATION_ATTRIBUTE, "location"); c1.setParameter(Prop.ABSOLUTE_PATH, "false"); c1.setParameter(Prop.ROOT_MOSAIC_DIR, TestData.file(this, "/caching").toString()); c1.setParameter(Prop.INDEXING_DIRECTORIES, TestData.file(this,"/caching").toString()); Properties prop = new Properties(); try { // c1.setCaching(false); c1.setParameter(Prop.CACHING, "false"); ImageMosaicEventHandlers eventHandler = new ImageMosaicEventHandlers(); final ImageMosaicConfigHandler catalogHandler = new ImageMosaicConfigHandler(c1, eventHandler); // TODO // build the index builder = new ImageMosaicDirectoryWalker(catalogHandler, eventHandler); eventHandler.addProcessingEventListener(new CatalogBuilderListener()); builder.run(); final File relativeMosaic = TestData.file(this, "/caching/" + c1.getIndexName() + ".shp"); final File propertiesFile = TestData.file(this, "/caching/" + c1.getIndexName() + ".properties"); assertTrue(relativeMosaic.exists()); inStream = new FileInputStream(propertiesFile); prop.load(inStream); String value = prop.getProperty("Caching"); assertNotNull(value); assertTrue (value.toLowerCase().equals("false")); assertTrue(new ImageMosaicFormat().accepts(relativeMosaic)); reader = (ImageMosaicReader) new ImageMosaicReader(relativeMosaic); GranuleCatalog catalog = reader.getRasterManager(reader.defaultName).granuleCatalog; assertTrue(catalog.getClass().toString().endsWith("GTDataStoreGranuleCatalog")); } finally { if (inStream != null){ IOUtils.closeQuietly(inStream); } try { if (reader != null){ reader.dispose(); } } catch (Throwable t){ //Eat exception } } try { // c1.setCaching(true); c1.setParameter(Prop.CACHING, "true"); ImageMosaicEventHandlers eventHandler = new ImageMosaicEventHandlers(); final ImageMosaicConfigHandler catalogHandler = new ImageMosaicConfigHandler(c1, eventHandler); // TODO // build the index builder = new ImageMosaicDirectoryWalker(catalogHandler, eventHandler); eventHandler.addProcessingEventListener(new CatalogBuilderListener()); builder.run(); final File relativeMosaic = TestData.file(this, "/caching/" + c1.getIndexName() + ".shp"); final File propertiesFile = TestData.file(this, "/caching/" + c1.getIndexName() + ".properties"); inStream = new FileInputStream(propertiesFile); prop.load(inStream); String value = prop.getProperty("Caching"); assertNotNull(value); assertTrue (value.toLowerCase().equals("true")); assertTrue(relativeMosaic.exists()); assertTrue(new ImageMosaicFormat().accepts(relativeMosaic)); reader = (ImageMosaicReader) new ImageMosaicReader(relativeMosaic); GranuleCatalog catalog = reader.getRasterManager(reader.defaultName).granuleCatalog; assertTrue(catalog.getClass().toString().endsWith("STRTreeGranuleCatalog")); } finally { if (inStream != null){ IOUtils.closeQuietly(inStream); } try { if (reader != null){ reader.dispose(); } } catch (Throwable t){ //Eat exception } } } } }