/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.eo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.catalog.DimensionInfo;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.MetadataMap;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.geotools.coverage.grid.io.StructuredGridCoverage2DReader;
import org.junit.Before;
import org.junit.Test;
import org.opengis.coverage.grid.GridCoverageReader;
/**
* EoCatalogBuilder tests
*
* @author Davide Savazzi - geo-solutions.it
*/
public class EoCatalogBuilderTest extends GeoServerSystemTestSupport {
private Catalog catalog;
private WorkspaceInfo ws;
private EoCatalogBuilder builder;
private List<String> styles;
@Before
public void setup() {
catalog = getCatalog();
ws = catalog.getDefaultWorkspace();
builder = new EoCatalogBuilder(catalog);
styles = new ArrayList<String>();
styles.add("black");
styles.add("blue");
styles.add("brown");
styles.add("cyan");
styles.add("green");
styles.add("magenta");
styles.add("orange");
styles.add("red");
styles.add("white");
styles.add("yellow");
}
private void checkStyles(LayerInfo layer) {
assertEquals(10, layer.getStyles().size());
List<String> stylesNotFound = new ArrayList<String>(styles);
for (StyleInfo style : layer.getStyles()) {
stylesNotFound.remove(style.getName());
}
assertEquals(0, stylesNotFound.size());
}
private void checkTimeDimension(LayerInfo layer) {
ResourceInfo resource = layer.getResource();
MetadataMap metadata = resource.getMetadata();
DimensionInfo timeDimension = (DimensionInfo) metadata.get("time");
assertNotNull(timeDimension);
}
@Test
public void testEoMasksLayerCreation() {
String groupName = "EO-Dataset";
String maskName = "Masks";
LayerInfo layer = builder.createEoMasksLayer(ws, groupName, maskName, getUrl("EO_Airmass"));
assertNotNull(layer);
assertEquals(groupName + "_" + maskName, layer.getName());
layer = catalog.getLayerByName(layer.getName());
assertEquals(EoLayerType.BITMASK.name(), layer.getMetadata().get(EoLayerType.KEY));
checkTimeDimension(layer);
checkStyles(layer);
}
@Test
public void testEoParametersLayerCreation() {
String groupName = "EO-Dataset";
String paramName = "Params";
LayerInfo layer = builder.createEoParametersLayer(ws, groupName, paramName, getUrl("EO_Airmass"));
assertNotNull(layer);
assertEquals(groupName + "_" + paramName, layer.getName());
layer = catalog.getLayerByName(layer.getName());
assertEquals(EoLayerType.GEOPHYSICAL_PARAMETER.name(), layer.getMetadata().get(EoLayerType.KEY));
checkTimeDimension(layer);
}
@Test
public void testEoOutlineLayerCreation() throws Exception {
String groupName = "EO-Dataset";
LayerInfo browseLayer = builder.createEoBrowseImageLayer(ws, groupName, getUrl("EO_Nat"));
assertNotNull(browseLayer);
assertEquals(groupName + "_BROWSE", browseLayer.getName());
assertEquals(EoLayerType.BROWSE_IMAGE.name(), browseLayer.getMetadata().get(EoLayerType.KEY));
checkTimeDimension(browseLayer);
CoverageInfo coverage = (CoverageInfo) browseLayer.getResource();
StructuredGridCoverage2DReader reader = (StructuredGridCoverage2DReader) coverage.getGridCoverageReader(null, null);
LayerInfo layer = builder.createEoOutlineLayer(getUrl("EO_Nat"), ws, groupName, coverage.getNativeCoverageName(), reader);
assertNotNull(layer);
assertEquals(groupName + "_outlines", layer.getName());
checkTimeDimension(layer);
layer = catalog.getLayerByName(layer.getName());
assertEquals(EoLayerType.COVERAGE_OUTLINE.name(), layer.getMetadata().get(EoLayerType.KEY));
checkStyles(layer);
}
@Test
public void testEoBandsLayerCreation() {
try {
builder.createEoMosaicLayer(ws, "EO-Band", EoLayerType.BAND_COVERAGE, getUrl("EO_Airmass"), true);
fail("The layer must not be created because it doesn't have custom dimensions");
} catch (IllegalArgumentException e) {
}
LayerInfo layer = builder.createEoMosaicLayer(ws, "EO-Band", EoLayerType.BAND_COVERAGE, getUrl("EO_Channels"), true);
layer = catalog.getLayerByName("EO-Band");
assertEquals(EoLayerType.BAND_COVERAGE.name(), layer.getMetadata().get(EoLayerType.KEY));
// check dimensions
checkTimeDimension(layer);
DimensionInfo customDimension = (DimensionInfo) layer.getResource().getMetadata().get(ResourceInfo.CUSTOM_DIMENSION_PREFIX + "CHANNEL");
assertNotNull(customDimension);
}
@Test
public void testEoBandsLayerUsage() {
try {
builder.createEoMosaicLayer(ws, "EO-Band-2", EoLayerType.BAND_COVERAGE, getUrl("EO_Airmass"), true);
fail("The layer must not be created because it doesn't have custom dimensions");
} catch (IllegalArgumentException e) {
}
LayerInfo layer = builder.createEoMosaicLayer(ws, "EO-Band-2", EoLayerType.BAND_COVERAGE, getUrl("EO_Channels"), true);
layer = catalog.getLayerByName("EO-Band-2");
assertEquals(EoLayerType.BAND_COVERAGE.name(), layer.getMetadata().get(EoLayerType.KEY));
// check dimensions
checkTimeDimension(layer);
DimensionInfo customDimension = (DimensionInfo) layer.getResource().getMetadata().get(ResourceInfo.CUSTOM_DIMENSION_PREFIX + "CHANNEL");
assertNotNull(customDimension);
}
@Test
public void testStoreCreation() throws URISyntaxException {
CoverageStoreInfo store = builder.createEoMosaicStore(ws, "EO-store", getUrl("EO_Airmass"));
try {
assertNotNull(store);
assertEquals(ws, store.getWorkspace());
assertEquals("EO-store", store.getName());
assertEquals("ImageMosaic", store.getType());
store = catalog.getStoreByName("EO-store", CoverageStoreInfo.class);
assertNotNull(store);
assertEquals(ws, store.getWorkspace());
assertEquals("EO-store", store.getName());
assertEquals("ImageMosaic", store.getType());
} finally {
catalog.remove(store);
}
}
@Test
public void testEoLayerGroupCreation() {
String groupName = "EO-Dataset2";
String groupTitle = "title";
LayerGroupInfo group = builder.createEoLayerGroup(ws, groupName, groupTitle, getUrl("EO_Nat"), getUrl("EO_Channels"), "airmass", getUrl("EO_Airmass"), null, null);
assertNotNull(group);
assertEquals(groupName, group.getName());
assertEquals(groupTitle, group.getTitle());
assertEquals(3, group.getLayers().size());
assertEquals(LayerGroupInfo.Mode.EO, group.getMode());
assertNotNull(group.getRootLayer());
assertEquals(groupName + "_BROWSE", group.getRootLayer().getName());
}
private String getUrl(String resource) {
return getClass().getResource(resource).toExternalForm();
}
}