/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.rest.catalog;
import it.geosolutions.imageio.utilities.ImageIOUtilities;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.io.FileUtils;
import org.geoserver.catalog.CoverageDimensionInfo;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.rest.RestBaseController;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.data.DataUtilities;
import org.geotools.util.NumberRange;
import org.junit.Before;
import org.junit.Test;
import org.opengis.coverage.grid.GridCoverageReader;
import org.springframework.mock.web.MockHttpServletResponse;
import org.w3c.dom.Document;
import java.net.URL;
import java.util.List;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class CoverageControllerTest extends CatalogRESTTestSupport {
private final static double DELTA = 1E-6;
@Override
protected void setUpTestData(SystemTestData testData) throws Exception {
testData.setUpDefaultRasterLayers();
}
@Before
public void addBlueMarbleCoverage() throws Exception {
getTestData().addDefaultRasterLayer(SystemTestData.TASMANIA_BM, getCatalog());
}
@Test
public void testGetAllByWorkspaceXML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/wcs/coverages.xml");
assertEquals(
catalog.getCoveragesByNamespace( catalog.getNamespaceByPrefix( "wcs") ).size(),
dom.getElementsByTagName( "coverage").getLength() );
}
@Test
public void testGetAllByWorkspaceJSON() throws Exception {
JSONObject json = (JSONObject) getAsJSON(RestBaseController.ROOT_PATH + "/workspaces/wcs/coverages.json");
JSONArray coverages = json.getJSONObject("coverages").getJSONArray("coverage");
assertEquals(catalog.getCoveragesByNamespace( catalog.getNamespaceByPrefix( "wcs")).size(), coverages.size());
}
void addCoverageStore(boolean autoConfigureCoverage) throws Exception {
URL zip = getClass().getResource( "test-data/usa.zip" );
byte[] bytes = FileUtils.readFileToByteArray( DataUtilities.urlToFile(zip) );
MockHttpServletResponse response =
putAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/file.worldimage" +
(!autoConfigureCoverage ? "?configure=none" : ""), bytes, "application/zip");
assertEquals( 201, response.getStatus() );
}
@Test
public void testGetAllByCoverageStore() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:usa" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";
Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
addCoverageStore(true);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 1, dom.getElementsByTagName( "coverage").getLength() );
assertXpathEvaluatesTo( "1", "count(//coverage/name[text()='usa'])", dom );
}
@Test
public void testPutAllUnauthorized() throws Exception {
assertEquals( 405, putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages").getStatus() );
}
@Test
public void testDeleteAllUnauthorized() throws Exception {
assertEquals( 405, deleteAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages").getStatus() );
}
@Test
public void testGetAsXML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble.xml");
assertXpathEvaluatesTo("BlueMarble", "/coverage/name", dom);
assertXpathEvaluatesTo( "1", "count(//latLonBoundingBox)", dom);
assertXpathEvaluatesTo( "1", "count(//nativeFormat)", dom);
assertXpathEvaluatesTo( "1", "count(//grid)", dom);
assertXpathEvaluatesTo( "1", "count(//supportedFormats)", dom);
}
@Test
public void testGetAsJSON() throws Exception {
JSON json = getAsJSON( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble.json");
JSONObject coverage = ((JSONObject)json).getJSONObject("coverage");
assertNotNull(coverage);
assertEquals( "BlueMarble", coverage.get("name") );
}
@Test
public void testGetAsHTML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble.html" );
assertEquals( "html", dom.getDocumentElement().getNodeName() );
}
@Test
public void testGetWrongCoverage() throws Exception {
// Parameters for the request
String ws = "wcs";
String cs = "BlueMarble";
String c = "BlueMarblesssss";
// Request path
String requestPath = RestBaseController.ROOT_PATH + "/workspaces/" + ws + "/coverages/" + c + ".html";
String requestPath2 = RestBaseController.ROOT_PATH + "/workspaces/" + ws + "/coveragestores/" + cs + "/coverages/" + c + ".html";
// Exception path
String exception = "No such coverage: "+ws+","+c;
String exception2 = "No such coverage: "+ws+","+cs+","+c;
// CASE 1: No coveragestore set
// First request should thrown an exception
MockHttpServletResponse response = getAsServletResponse(requestPath);
assertEquals(404, response.getStatus());
assertTrue(response.getContentAsString().contains(
exception));
// Same request with ?quietOnNotFound should not throw an exception
response = getAsServletResponse(requestPath + "?quietOnNotFound=true");
assertEquals(404, response.getStatus());
assertFalse(response.getContentAsString().contains(
exception));
// No exception thrown
assertTrue(response.getContentAsString().isEmpty());
// CASE 2: coveragestore set
// First request should thrown an exception
response = getAsServletResponse(requestPath2);
assertEquals(404, response.getStatus());
assertTrue(response.getContentAsString().contains(
exception2));
// Same request with ?quietOnNotFound should not throw an exception
response = getAsServletResponse(requestPath2 + "?quietOnNotFound=true");
assertEquals(404, response.getStatus());
assertFalse(response.getContentAsString().contains(
exception2));
// No exception thrown
assertTrue(response.getContentAsString().isEmpty());
}
@Test
public void testPostAsXML() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:usa" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";
Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
addCoverageStore(false);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );
String xml =
"<coverage>" +
"<name>usa</name>"+
"<title>usa is a A raster file accompanied by a spatial data file</title>" +
"<description>Generated from WorldImage</description>" +
"<srs>EPSG:4326</srs>" +
/*"<latLonBoundingBox>"+
"<minx>-130.85168</minx>"+
"<maxx>-62.0054</maxx>"+
"<miny>20.7052</miny>"+
"<maxy>54.1141</maxy>"+
"</latLonBoundingBox>"+
"<nativeBoundingBox>"+
"<minx>-130.85168</minx>"+
"<maxx>-62.0054</maxx>"+
"<miny>20.7052</miny>"+
"<maxy>54.1141</maxy>"+
"<crs>EPSG:4326</crs>"+
"</nativeBoundingBox>"+
"<grid dimension=\"2\">"+
"<range>"+
"<low>0 0</low>"+
"<high>983 598</high>"+
"</range>"+
"<transform>"+
"<scaleX>0.07003690742624616</scaleX>"+
"<scaleY>-0.05586772575250837</scaleY>"+
"<shearX>0.0</shearX>"+
"<shearX>0.0</shearX>"+
"<translateX>-130.81666154628687</translateX>"+
"<translateY>54.08616613712375</translateY>"+
"</transform>"+
"<crs>EPSG:4326</crs>"+
"</grid>"+*/
"<supportedFormats>"+
"<string>PNG</string>"+
"<string>GEOTIFF</string>"+
"</supportedFormats>"+
"<requestSRS>"+
"<string>EPSG:4326</string>"+
"</requestSRS>"+
"<responseSRS>"+
"<string>EPSG:4326</string>"+
"</responseSRS>"+
"<store>usaWorldImage</store>"+
"<namespace>gs</namespace>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/usa" ) );
dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );
dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/usa.xml");
assertXpathEvaluatesTo("-130.85168", "/coverage/latLonBoundingBox/minx", dom);
assertXpathEvaluatesTo("983 598", "/coverage/grid/range/high", dom);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 1, dom.getElementsByTagName( "coverage").getLength() );
}
@Test
public void testPostAsJSON() throws Exception {
// remove the test store and test that the layer is not available
removeStore("gs", "usaWorldImage");
String request = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:usa" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff&gridbasecrs=EPSG:4326&store=true";
Document document = getAsDOM(request);
assertEquals( "ows:ExceptionReport", document.getDocumentElement().getNodeName());
// add the test store, no coverages should be available
addCoverageStore(false);
JSONObject json = (JSONObject) getAsJSON(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.json");
assertThat(json.getString("coverages").isEmpty(), is(true));
// content for the POST request
String content = "{" +
" \"coverage\": {" +
" \"description\": \"Generated from WorldImage\"," +
" \"name\": \"usa\"," +
" \"namespace\": \"gs\"," +
" \"requestSRS\": {" +
" \"string\": [" +
" \"EPSG:4326\"" +
" ]" +
" }," +
" \"responseSRS\": {" +
" \"string\": [" +
" \"EPSG:4326\"" +
" ]" +
" }," +
" \"srs\": \"EPSG:4326\"," +
" \"store\": \"usaWorldImage\"," +
" \"supportedFormats\": {" +
" \"string\": [" +
" \"PNG\"," +
" \"GEOTIFF\"" +
" ]" +
" }," +
" \"title\": \"usa is a A raster file accompanied by a spatial data file\"" +
" }" +
"}";
// perform the POST request that will create the USA coverage
MockHttpServletResponse response = postAsServletResponse(
RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/", content, "application/json");
assertEquals(201, response.getStatus());
assertNotNull(response.getHeader( "Location"));
assertTrue(response.getHeader("Location").endsWith("/workspaces/gs/coveragestores/usaWorldImage/coverages/usa" ));
// check that the coverage exists using the WCS service
document = getAsDOM(request);
assertEquals("wcs:Coverages", document.getDocumentElement().getNodeName());
// check create coverage attributes
json = (JSONObject) getAsJSON(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/usa.json");
assertThat(json.getJSONObject("coverage").getString("name"), is("usa"));
assertThat(json.getJSONObject("coverage").getJSONObject("latLonBoundingBox").getString("minx"), is("-130.85168"));
assertThat(json.getJSONObject("coverage").getJSONObject("grid").getJSONObject("range").getString("high"), is("983 598"));
// check that the coverage is listed
json = (JSONObject) getAsJSON(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.json");
JSONArray coverages = json.getJSONObject("coverages").getJSONArray("coverage");
assertThat(coverages.size(), is(1));
assertThat(coverages.getJSONObject(0).getString("name"), is("usa"));
}
@Test
public void testPostAsXMLWithNativeName() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:differentName" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";
Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
addCoverageStore(false);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );
String xml =
"<coverage>" +
"<name>differentName</name>"+
"<title>usa is a A raster file accompanied by a spatial data file</title>" +
"<description>Generated from WorldImage</description>" +
"<srs>EPSG:4326</srs>" +
"<supportedFormats>"+
"<string>PNG</string>"+
"<string>GEOTIFF</string>"+
"</supportedFormats>"+
"<requestSRS>"+
"<string>EPSG:4326</string>"+
"</requestSRS>"+
"<responseSRS>"+
"<string>EPSG:4326</string>"+
"</responseSRS>"+
"<store>usaWorldImage</store>"+
"<namespace>gs</namespace>"+
"<nativeCoverageName>usa</nativeCoverageName>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName" ) );
dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );
dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName.xml");
assertXpathEvaluatesTo("-130.85168", "/coverage/latLonBoundingBox/minx", dom);
assertXpathEvaluatesTo("983 598", "/coverage/grid/range/high", dom);
}
@Test
public void testPostNewAsXMLWithNativeCoverageName() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:differentName" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";
Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
addCoverageStore(false);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );
String xml =
"<coverage>" +
"<name>differentName</name>"+
"<nativeCoverageName>usa</nativeCoverageName>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName" ) );
dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );
dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName.xml");
assertXpathEvaluatesTo("differentName", "/coverage/name", dom);
assertXpathEvaluatesTo("differentName", "/coverage/title", dom);
assertXpathEvaluatesTo("usa", "/coverage/nativeCoverageName", dom);
}
@Test
public void testPostNewAsXMLWithNativeNameFallback() throws Exception {
removeStore("gs", "usaWorldImage");
String req = "wcs?service=wcs&request=getcoverage&version=1.1.1&identifier=gs:differentName" +
"&boundingbox=-100,30,-80,44,EPSG:4326&format=image/tiff" +
"&gridbasecrs=EPSG:4326&store=true";
Document dom = getAsDOM( req );
assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
addCoverageStore(false);
dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages.xml");
assertEquals( 0, dom.getElementsByTagName( "coverage").getLength() );
String xml =
"<coverage>" +
"<name>differentName</name>"+
"<nativeName>usa</nativeName>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/", xml, "text/xml");
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName" ) );
dom = getAsDOM( req );
assertEquals( "wcs:Coverages", dom.getDocumentElement().getNodeName() );
dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/usaWorldImage/coverages/differentName.xml");
assertXpathEvaluatesTo("differentName", "/coverage/name", dom);
assertXpathEvaluatesTo("differentName", "/coverage/title", dom);
assertXpathEvaluatesTo("usa", "/coverage/nativeCoverageName", dom);
}
@Test
public void testPutWithCalculation() throws Exception {
String path = RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/DEM/coverages/DEM.xml";
String clearLatLonBoundingBox =
"<coverage>"
+ "<latLonBoundingBox/>"
+ "</coverage>";
MockHttpServletResponse response =
putAsServletResponse(path, clearLatLonBoundingBox, "text/xml");
assertEquals(
"Couldn't remove lat/lon bounding box: \n" + response.getContentAsString(),
200,
response.getStatus());
Document dom = getAsDOM(path);
assertXpathEvaluatesTo("0.0", "/coverage/latLonBoundingBox/minx", dom);
print(dom);
String updateNativeBounds =
"<coverage>"
+ "<srs>EPSG:3785</srs>"
+ "</coverage>";
response = putAsServletResponse(
path,
updateNativeBounds,
"text/xml");
assertEquals(
"Couldn't update native bounding box: \n"
+ response.getContentAsString(), 200,
response.getStatus());
dom = getAsDOM(path);
print(dom);
assertXpathExists("/coverage/nativeBoundingBox/minx[text()!='0.0']",
dom);
}
// public void testPostAsJSON() throws Exception {
// Document dom = getAsDOM( "wfs?request=getfeature&typename=wcs:pdsa");
// assertEquals( "ows:ExceptionReport", dom.getDocumentElement().getNodeName());
//
// addPropertyDataStore(false);
// String json =
// "{" +
// "'coverage':{" +
// "'name':'pdsa'," +
// "'nativeName':'pdsa'," +
// "'srs':'EPSG:4326'," +
// "'nativeBoundingBox':{" +
// "'minx':0.0," +
// "'maxx':1.0," +
// "'miny':0.0," +
// "'maxy':1.0," +
// "'crs':'EPSG:4326'" +
// "}," +
// "'nativeCRS':'EPSG:4326'," +
// "'store':'pds'" +
// "}" +
// "}";
// MockHttpServletResponse response =
// postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/gs/coveragestores/pds/coverages/", json, "text/json");
//
// assertEquals( 201, response.getStatusCode() );
// assertNotNull( response.getHeader( "Location") );
// assertTrue( response.getHeader("Location").endsWith( "/workspaces/gs/coveragestores/pds/coverages/pdsa" ) );
//
// dom = getAsDOM( "wfs?request=getfeature&typename=gs:pdsa");
// assertEquals( "wfs:FeatureCollection", dom.getDocumentElement().getNodeName());
// assertEquals( 2, dom.getElementsByTagName( "gs:pdsa").getLength());
// }
//
@Test
public void testPostToResource() throws Exception {
String xml =
"<coverage>"+
"<name>foo</name>"+
"</coverage>";
MockHttpServletResponse response =
postAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble", xml, "text/xml");
assertEquals( 405, response.getStatus() );
}
@Test
public void testPutXML() throws Exception {
String xml =
"<coverage>" +
"<title>new title</title>" +
"</coverage>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble", xml, "text/xml");
assertEquals( 200, response.getStatus() );
Document dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble.xml");
assertXpathEvaluatesTo("new title", "/coverage/title", dom );
CoverageInfo c = catalog.getCoverageByName( "wcs", "BlueMarble");
assertEquals( "new title", c.getTitle() );
}
@Test
public void testPutJSON() throws Exception {
// update the coverage title
String jsonPayload = "{\n" +
" \"coverage\": {\n" +
" \"title\": \"new title 2\"\n" +
" }\n" +
"}";
MockHttpServletResponse response = putAsServletResponse(
RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble", jsonPayload, "application/json");
assertEquals(200, response.getStatus());
// check that the coverage title was correctly updated
JSONObject json = (JSONObject) getAsJSON(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble.json");
assertThat(json.getJSONObject("coverage").getString("title"), is("new title 2"));
CoverageInfo coverage = catalog.getCoverageByName( "wcs", "BlueMarble");
assertEquals("new title 2", coverage.getTitle());
}
@Test
public void testPutNonDestructive() throws Exception {
CoverageInfo c = catalog.getCoverageByName( "wcs", "BlueMarble");
assertTrue(c.isEnabled());
boolean isAdvertised = c.isAdvertised();
String xml =
"<coverage>" +
"<title>new title</title>" +
"</coverage>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble", xml, "text/xml");
assertEquals( 200, response.getStatus() );
c = catalog.getCoverageByName( "wcs", "BlueMarble");
assertTrue(c.isEnabled());
assertEquals(isAdvertised, c.isAdvertised());
}
@Test
public void testPutNonExistant() throws Exception {
String xml =
"<coverage>" +
"<title>new title</title>" +
"</coverage>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/NonExistant", xml, "text/xml");
assertEquals( 404, response.getStatus() );
}
@Test
public void testDelete() throws Exception {
assertNotNull( catalog.getCoverageByName("wcs", "BlueMarble"));
for (LayerInfo l : catalog.getLayers( catalog.getCoverageByName("wcs", "BlueMarble") ) ) {
catalog.remove(l);
}
assertEquals( 200,
deleteAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble").getStatus());
assertNull( catalog.getCoverageByName("wcs", "BlueMarble"));
}
@Test
public void testDeleteNonExistant() throws Exception {
assertEquals( 404,
deleteAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/NonExistant").getStatus());
}
@Test
public void testDeleteRecursive() throws Exception {
assertNotNull(catalog.getCoverageByName("wcs", "BlueMarble"));
assertNotNull(catalog.getLayerByName("wcs:BlueMarble"));
assertEquals(403, deleteAsServletResponse(
RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble").getStatus());
assertEquals( 200, deleteAsServletResponse(
RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/BlueMarble/coverages/BlueMarble?recurse=true").getStatus());
assertNull(catalog.getCoverageByName("wcs", "BlueMarble"));
assertNull(catalog.getLayerByName("wcs:BlueMarble"));
}
@Test
public void testCoverageWrapping() throws Exception {
String xml =
"<coverage>" +
"<name>tazdem</name>" +
"<title>new title</title>" +
"</coverage>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/DEM/coverages/DEM", xml, "text/xml");
assertEquals( 200, response.getStatus() );
Document dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/DEM/coverages/tazdem.xml");
assertXpathEvaluatesTo("new title", "/coverage/title", dom );
CoverageInfo c = catalog.getCoverageByName( "wcs", "tazdem");
assertEquals( "new title", c.getTitle() );
List<CoverageDimensionInfo> dimensions = c.getDimensions();
CoverageDimensionInfo dimension = dimensions.get(0);
assertEquals( "GRAY_INDEX", dimension.getName());
NumberRange range = dimension.getRange();
assertEquals( -9999.0, range.getMinimum(), DELTA);
assertEquals( -9999.0, range.getMaximum(), DELTA);
assertEquals("GridSampleDimension[-9999.0,-9999.0]", dimension.getDescription());
List<Double> nullValues = dimension.getNullValues();
assertEquals( -9999.0, nullValues.get(0), DELTA);
// Updating dimension properties
xml =
"<coverage>" +
"<name>tazdem</name>" +
"<title>new title</title>" +
"<dimensions>" +
"<coverageDimension>" +
"<name>Elevation</name>" +
"<description>GridSampleDimension[-100.0,1000.0]</description>" +
"<nullValues>" +
"<double>-999</double>" +
"</nullValues>" +
"<range>" +
"<min>-100</min>" +
"<max>1000</max>" +
"</range>" +
"</coverageDimension>" +
"</dimensions>" +
"</coverage>";
response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/wcs/coveragestores/DEM/coverages/tazdem", xml, "text/xml");
assertEquals( 200, response.getStatus() );
c = catalog.getCoverageByName( "wcs", "tazdem");
dimensions = c.getDimensions();
dimension = dimensions.get(0);
assertEquals( "Elevation", dimension.getName());
range = dimension.getRange();
assertEquals( -100.0, range.getMinimum(), DELTA);
assertEquals( 1000.0, range.getMaximum(), DELTA);
assertEquals("GridSampleDimension[-100.0,1000.0]", dimension.getDescription());
nullValues = dimension.getNullValues();
assertEquals( -999.0, nullValues.get(0), DELTA);
CoverageStoreInfo coverageStore = catalog.getStoreByName("wcs", "DEM", CoverageStoreInfo.class);
GridCoverageReader reader = null;
GridCoverage2D coverage = null;
try {
reader = catalog.getResourcePool().getGridCoverageReader(coverageStore, "tazdem", null);
coverage = (GridCoverage2D) reader.read("tazdem", null);
GridSampleDimension sampleDim = coverage.getSampleDimension(0);
double[] noDataValues = sampleDim.getNoDataValues();
assertEquals( -999.0, noDataValues[0], DELTA);
range = sampleDim.getRange();
assertEquals( -100.0, range.getMinimum(), DELTA);
assertEquals( 1000.0, range.getMaximum(), DELTA);
} finally {
if (coverage != null) {
try {
ImageIOUtilities.disposeImage(coverage.getRenderedImage());
coverage.dispose(true);
} catch (Throwable t) {
// Does nothing;
}
}
if (reader != null) {
try {
reader.dispose();
} catch (Throwable t) {
// Does nothing;
}
}
}
}
}