/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wcs2_0;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.util.Set;
import javax.xml.namespace.QName;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.DimensionPresentation;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.data.test.CiteTestData;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.wcs.CoverageCleanerCallback;
import org.geoserver.wcs2_0.response.GranuleStack;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.imagemosaic.ImageMosaicFormat;
import org.geotools.geometry.Envelope2D;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opengis.coverage.grid.GridCoverageReader;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
import org.springframework.mock.web.MockHttpServletResponse;
public class WCSMultiDimSubsetTest extends WCSNetCDFBaseTest{
private static final QName LAMBERTMOSAIC = new QName(CiteTestData.WCS_URI,"lambert",CiteTestData.WCS_PREFIX);
@BeforeClass
public static void init(){
System.setProperty("testdata.force.delete", "true");
}
@Override
protected void setUpTestData(SystemTestData testData) throws Exception {
super.setUpTestData(testData);
testData.setUpDefaultRasterLayers();
}
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
// workaround to add our custom multi dimensional format
try {
Field field = GetCoverage.class.getDeclaredField("mdFormats");
field.setAccessible(true);
((Set<String>) field.get(null)).add(WCSResponseInterceptor.MIME_TYPE);
} catch (NoSuchFieldException e) {
} catch (SecurityException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
super.onSetUp(testData);
testData.addRasterLayer(LAMBERTMOSAIC, "lambertmosaic.zip", null,null,this.getClass(),getCatalog());
String coverageName = getLayerId(LAMBERTMOSAIC);
setupRasterDimension(coverageName, ResourceInfo.TIME, DimensionPresentation.LIST, null);
CoverageInfo info = getCatalog().getCoverageByName(coverageName);
// Add this to prevent resource locking due to deferred disposal
info.getParameters().put("USE_JAI_IMAGEREAD","false");
getCatalog().save(info);
}
/**
* Tests if we can select a single pixel value using a WCS request
*/
@Test
public void sliceLambert() throws Exception {
// check we can read it as a TIFF and it is similare to the original one
GridCoverage2D targetCoverage = null, sourceCoverage=null;
GridCoverageReader coverageReader = null;
try {
// === slicing on Y axis
// source
CoverageInfo coverageInfo = this.getCatalog().getCoverageByName(LAMBERTMOSAIC.getLocalPart());
coverageReader = coverageInfo.getGridCoverageReader(null, null);
final ParameterValue<Boolean> useJAI = ImageMosaicFormat.USE_JAI_IMAGEREAD.createValue();
useJAI.setValue(false);
sourceCoverage = (GridCoverage2D)coverageReader.read(new GeneralParameterValue[]{useJAI});
final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D();
// subsample using the original extension
MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__lambert&&Format=application/custom" +
"&subset=E,http://www.opengis.net/def/crs/EPSG/0/31300(" +sourceEnvelope.x+","+(sourceEnvelope.x+25)+")"+
"&subset=N,http://www.opengis.net/def/crs/EPSG/0/31300(" +sourceEnvelope.y+","+(sourceEnvelope.y+25)+")");
assertNotNull(response);
targetCoverage = applicationContext.getBean(WCSResponseInterceptor.class).getLastResult();
assertEquals((Object)sourceCoverage.getCoordinateReferenceSystem(), (Object)targetCoverage.getCoordinateReferenceSystem());
assertTrue(targetCoverage instanceof GranuleStack);
GridCoverage2D firstResult = ((GranuleStack)targetCoverage).getGranules().get(0);
// checks
assertEquals(1, firstResult.getGridGeometry().getGridRange().getSpan(0));
assertEquals(1, firstResult.getGridGeometry().getGridRange().getSpan(1));
assertEquals(0, firstResult.getGridGeometry().getGridRange().getLow(0));
assertEquals(1, firstResult.getGridGeometry().getGridRange().getLow(1));
} finally {
if (coverageReader != null) {
try {
coverageReader.dispose();
} catch (Exception e) {
// Ignore it
}
}
if (targetCoverage != null) {
try {
CoverageCleanerCallback.disposeCoverage(targetCoverage);
} catch (Exception e) {
// Ignore it
}
}
if (sourceCoverage != null) {
try {
CoverageCleanerCallback.disposeCoverage(sourceCoverage);
} catch (Exception e) {
// Ignore it
}
}
}
}
}