package org.geoserver.wcs2_0.kvp;
import static junit.framework.TestCase.*;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.custommonkey.xmlunit.XMLAssert;
import org.geoserver.wcs2_0.exception.WCS20Exception.WCS20ExceptionCode;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
import org.geotools.util.logging.Logging;
import org.junit.Test;
import org.w3c.dom.Document;
import org.springframework.mock.web.MockHttpServletResponse;
/**
* Testing Scaling Extension KVP
* @author Simone Giannecchini, GeoSolutions SAS
*
*/
public class SubsetKvpTest extends WCSKVPTestSupport {
private Logger LOGGER= Logging.getLogger(SubsetKvpTest.class);
@Test
public void capabilties() throws Exception {
Document dom = getAsDOM("wcs?reQueSt=GetCapabilities&seErvIce=WCS");
// print(dom);
// check the KVP extension 1.0.1
XMLAssert
.assertXpathEvaluatesTo(
"1",
"count(//ows:ServiceIdentification[ows:Profile='http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0.1'])",
dom);
// proper case enforcing on values
dom = getAsDOM("wcs?request=Getcapabilities&service=wCS");
// print(dom);
// check that we have the crs extension
XMLAssert.assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport)", dom);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport//ows:Exception)", dom);
XMLAssert
.assertXpathEvaluatesTo(
"1",
"count(//ows:ExceptionReport//ows:Exception[@exceptionCode='InvalidParameterValue'])",
dom);
XMLAssert.assertXpathEvaluatesTo("1",
"count(//ows:ExceptionReport//ows:Exception[@locator='wCS'])", dom);
}
@Test
public void trim() throws Exception {
// check we can read it as a TIFF and it is similar to the original one
GridCoverage2D targetCoverage = null, sourceCoverage=null;
GeoTiffReader readerTarget = null;
try {
// source
sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null);
final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D();
// subsample using the original extension
MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__BlueMarble&&Format=image/tiff" +
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width/2)+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")");
assertEquals("image/tiff", response.getContentType());
byte[] tiffContents = getBinary(response);
File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target"));
FileUtils.writeByteArrayToFile(file, tiffContents);
readerTarget = new GeoTiffReader(file);
targetCoverage = readerTarget.read(null);
// checks
assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem());
assertEquals(180, targetCoverage.getGridGeometry().getGridRange().getSpan(0));
assertEquals(180, targetCoverage.getGridGeometry().getGridRange().getSpan(1));
assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(0));
assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(1));
// === request does not intersect
response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1"
+ "&coverageId=wcs__BlueMarble&&Format=image/tiff"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +(sourceEnvelope.x+1.1*sourceEnvelope.width)+","+(sourceEnvelope.x+1.2*sourceEnvelope.width)+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +(sourceEnvelope.y+1.1*sourceEnvelope.height)+","+(sourceEnvelope.y+1.2*sourceEnvelope.height)
+")");
assertEquals("application/xml", response.getContentType());
checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidSubsetting.getExceptionCode(),"");
// === trim low > high Lat
response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1"
+ "&coverageId=wcs__BlueMarble&&Format=image/tiff"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +(sourceEnvelope.x)+","+(sourceEnvelope.x+sourceEnvelope.width)+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +(sourceEnvelope.y+sourceEnvelope.height)+","+(sourceEnvelope.y)
+")");
assertEquals("application/xml", response.getContentType());
checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidSubsetting.getExceptionCode(),Double.toString((sourceEnvelope.y+sourceEnvelope.height)));
} finally {
try{
if(readerTarget!=null){
readerTarget.dispose();
}
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(targetCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(sourceCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
}
}
@Test
public void sliceError() throws Exception{
// check we can read it as a TIFF and it is similare to the original one
GridCoverage2D targetCoverage = null, sourceCoverage=null;
GeoTiffReader readerTarget = null;
try {
// === slicing on LONG
// source
sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null);
final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D();
// === error slice point outside coverage
MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__BlueMarble&&Format=image/tiff" +
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width)+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +sourceEnvelope.y*0.9+")");
assertEquals("application/xml", response.getContentType());
checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidSubsetting.getExceptionCode(), Double.toString(sourceEnvelope.y*0.9));
// === error slice point outside coverage
response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__BlueMarble&&Format=image/tiff" +
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +sourceEnvelope.x*0.9+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")");
assertEquals("application/xml", response.getContentType());
checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidSubsetting.getExceptionCode(), Double.toString(sourceEnvelope.x*0.9));
} finally {
try{
if(readerTarget!=null){
readerTarget.dispose();
}
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(targetCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(sourceCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
}
}
@Test
public void slice() throws Exception {
// check we can read it as a TIFF and it is similare to the original one
GridCoverage2D targetCoverage = null, sourceCoverage=null;
GeoTiffReader readerTarget = null;
try {
// === slicing on LONG
// source
sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null);
final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D();
// subsample using the original extension
MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" +
"&coverageId=wcs__BlueMarble&&Format=image/tiff" +
"&subset=http://www.opengis.net/def/axis/OGC/0/Long(" +sourceEnvelope.x+")"+
"&subset=http://www.opengis.net/def/axis/OGC/0/Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")");
assertEquals("image/tiff", response.getContentType());
byte[] tiffContents = getBinary(response);
File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target"));
FileUtils.writeByteArrayToFile(file, tiffContents);
readerTarget = new GeoTiffReader(file);
targetCoverage = readerTarget.read(null);
// checks
assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem());
assertEquals(1, targetCoverage.getGridGeometry().getGridRange().getSpan(0));
assertEquals(180, targetCoverage.getGridGeometry().getGridRange().getSpan(1));
assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(0));
assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(1));
} finally {
try{
if(readerTarget!=null){
readerTarget.dispose();
}
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(targetCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
try{
scheduleForCleaning(sourceCoverage);
} catch (Exception e) {
LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e);
}
}
}
}