/* Copyright (c) 2001 - 2009 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.geoserver.catalog.rest; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import java.io.File; import java.io.FileOutputStream; import java.util.List; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.data.test.MockData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.mockrunner.mock.web.MockHttpServletResponse; public class CoverageStoreTest extends CatalogRESTTestSupport { @Override protected void populateDataDirectory(MockData dataDirectory) throws Exception { dataDirectory.addWellKnownCoverageTypes(); } public void testGetAllAsXML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores.xml"); assertEquals( catalog.getStoresByWorkspace( "wcs", CoverageStoreInfo.class ).size(), dom.getElementsByTagName( "coverageStore").getLength() ); } public void testGetAllAsJSON() throws Exception { JSON json = getAsJSON( "/rest/workspaces/wcs/coveragestores.json"); assertTrue( json instanceof JSONObject ); Object coveragestores = ((JSONObject)json).getJSONObject("coverageStores").get("coverageStore"); assertNotNull( coveragestores ); if( coveragestores instanceof JSONArray ) { assertEquals( catalog.getCoverageStoresByWorkspace("wcs").size() , ((JSONArray)coveragestores).size() ); } else { assertEquals( 1, catalog.getCoverageStoresByWorkspace("wcs").size() ); } } public void testGetAllAsHTML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores.html"); List<CoverageStoreInfo> coveragestores = catalog.getCoverageStoresByWorkspace("wcs"); NodeList links = xp.getMatchingNodes("//html:a", dom ); assertEquals( coveragestores.size(), links.getLength() ); for ( int i = 0; i < coveragestores.size(); i++ ){ CoverageStoreInfo cs = coveragestores.get( i ); Element link = (Element) links.item( i ); assertTrue( link.getAttribute("href").endsWith( cs.getName() + ".html") ); } } public void testPutAllUnauthorized() throws Exception { assertEquals( 405, putAsServletResponse("/rest/workspaces/wcs/coveragestores").getStatusCode() ); } public void testDeleteAllUnauthorized() throws Exception { assertEquals( 405, deleteAsServletResponse("/rest/workspaces/wcs/coveragestores").getStatusCode() ); } public void testGetAsXML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores/BlueMarble.xml"); assertEquals( "coverageStore", dom.getDocumentElement().getNodeName() ); assertEquals( "BlueMarble", xp.evaluate( "/coverageStore/name", dom) ); assertEquals( "wcs", xp.evaluate( "/coverageStore/workspace/name", dom) ); } public void testGetAsHTML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores/BlueMarble.html"); CoverageStoreInfo cs = catalog.getCoverageStoreByName( "wcs", "BlueMarble" ); List<CoverageInfo> coverages = catalog.getCoveragesByCoverageStore( cs ); NodeList links = xp.getMatchingNodes("//html:a", dom ); assertEquals( coverages.size(), links.getLength() ); for ( int i = 0; i < coverages.size(); i++ ){ CoverageInfo ft = coverages.get( i ); Element link = (Element) links.item( i ); assertTrue( link.getAttribute("href").endsWith( ft.getName() + ".html") ); } } File setupNewCoverageStore() throws Exception { File dir = new File( "./target/usa" ); dir.mkdir(); dir.deleteOnExit(); File f = new File( dir, "usa.prj"); f.deleteOnExit(); FileOutputStream fout = new FileOutputStream( f ); IOUtils.copy( getClass().getResourceAsStream("test-data/usa.prj"), fout ); fout.flush(); fout.close(); f = new File( dir, "usa.meta"); f.deleteOnExit(); fout = new FileOutputStream( f ); IOUtils.copy( getClass().getResourceAsStream("test-data/usa.meta"), fout ); fout.flush(); fout.close(); f = new File( dir, "usa.png"); f.deleteOnExit(); fout = new FileOutputStream( f ); IOUtils.copy( getClass().getResourceAsStream("test-data/usa.png"), fout ); fout.flush(); fout.close(); return f; } public void testPostAsXML() throws Exception { File f = setupNewCoverageStore(); String xml = "<coverageStore>" + "<name>newCoverageStore</name>" + "<type>WorldImage</type>" + "<url>file://" + f.getAbsolutePath() + "</url>" + "<workspace>wcs</workspace>" + "</coverageStore>"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/wcs/coveragestores", xml, "text/xml" ); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/workspaces/wcs/coveragestores/newCoverageStore" ) ); CoverageStoreInfo newCoverageStore = catalog.getCoverageStoreByName( "newCoverageStore" ); assertNotNull( newCoverageStore ); assertNotNull(newCoverageStore.getFormat()); } public void testGetAsJSON() throws Exception { JSON json = getAsJSON( "/rest/workspaces/wcs/coveragestores/BlueMarble.json" ); JSONObject coverageStore = ((JSONObject)json).getJSONObject("coverageStore"); assertNotNull(coverageStore); assertEquals( "BlueMarble", coverageStore.get( "name") ); assertEquals( "wcs", coverageStore.getJSONObject( "workspace").get( "name" )); assertNotNull( coverageStore.get( "type") ); assertNotNull( coverageStore.get( "url") ); } public void testPostAsJSON() throws Exception { File f = setupNewCoverageStore(); String json = "{'coverageStore':{" + "'name':'newCoverageStore'," + "'type': 'WorldImage'," + "'url':'" + f.getAbsolutePath().replace('\\','/') + "'," + "'workspace':'wcs'," + "}" + "}"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/wcs/coveragestores", json, "text/json" ); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/workspaces/wcs/coveragestores/newCoverageStore" ) ); CoverageStoreInfo newCoverageStore = catalog.getCoverageStoreByName( "newCoverageStore" ); assertNotNull( newCoverageStore ); assertNotNull( newCoverageStore.getFormat() ); } public void testPostToResource() throws Exception { String xml = "<coverageStore>" + "<name>BlueMarble</name>" + "<enabled>false</enabled>" + "</coverageStore>"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/wcs/coveragestores/BlueMarble", xml, "text/xml"); assertEquals( 405, response.getStatusCode() ); } public void testPut() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores/BlueMarble.xml"); assertXpathEvaluatesTo("true", "/coverageStore/enabled", dom ); String xml = "<coverageStore>" + "<name>BlueMarble</name>" + "<enabled>false</enabled>" + "</coverageStore>"; MockHttpServletResponse response = putAsServletResponse( "/rest/workspaces/wcs/coveragestores/BlueMarble", xml, "text/xml"); assertEquals( 200, response.getStatusCode() ); dom = getAsDOM( "/rest/workspaces/wcs/coveragestores/BlueMarble.xml"); assertXpathEvaluatesTo("false", "/coverageStore/enabled", dom ); assertFalse( catalog.getCoverageStoreByName( "wcs", "BlueMarble").isEnabled() ); } public void testPut2() throws Exception { Document dom = getAsDOM( "/rest/workspaces/wcs/coveragestores/BlueMarble.xml"); assertXpathEvaluatesTo("GeoTIFF", "/coverageStore/type", dom ); String xml = "<coverageStore>" + "<name>BlueMarble</name>" + "<type>WorldImage</type>" + "</coverageStore>"; MockHttpServletResponse response = putAsServletResponse( "/rest/workspaces/wcs/coveragestores/BlueMarble", xml, "text/xml"); assertEquals( 200, response.getStatusCode() ); CoverageStoreInfo cs = catalog.getCoverageStoreByName( "wcs", "BlueMarble" ); assertEquals( "WorldImage", cs.getType() ); } public void testPutNonExistant() throws Exception { String xml = "<coverageStore>" + "<name>changed</name>" + "</coverageStore>"; MockHttpServletResponse response = putAsServletResponse("/rest/workspaces/wcs/coveragestores/nonExistant", xml, "text/xml" ); assertEquals( 404, response.getStatusCode() ); } public void testDeleteNonExistant() throws Exception { assertEquals( 404, deleteAsServletResponse("/rest/workspaces/wcs/coveragestores/nonExistant").getStatusCode() ); } public void testDelete() throws Exception { CoverageStoreInfo cs = catalog.getCoverageStoreByName("wcs","BlueMarble"); List<CoverageInfo> coverages = catalog.getCoveragesByCoverageStore(cs); for ( CoverageInfo c : coverages ) { for ( LayerInfo l : catalog.getLayers(c) ) { catalog.remove(l); } catalog.remove( c ); } assertEquals( 200, deleteAsServletResponse("/rest/workspaces/wcs/coveragestores/BlueMarble").getStatusCode()); assertNull( catalog.getCoverageStoreByName("wcs", "BlueMarble")); } public void testDeleteNonEmpty() throws Exception { assertEquals( 401, deleteAsServletResponse("/rest/workspaces/wcs/coveragestores/BlueMarble").getStatusCode()); } public void testDeleteRecursive() throws Exception { assertNotNull(catalog.getCoverageStoreByName("wcs", "BlueMarble")); MockHttpServletResponse response = deleteAsServletResponse("/rest/workspaces/wcs/coveragestores/BlueMarble?recurse=true"); assertEquals(200, response.getStatusCode()); assertNull(catalog.getCoverageStoreByName("wcs", "BlueMarble")); for (CoverageInfo c : catalog.getCoverages()) { if (c.getStore().getName().equals("BlueMarble")) { fail(); } } } }