/* 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 static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; import java.io.File; import java.io.FileOutputStream; import java.util.List; import java.util.Properties; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.StoreInfo; import org.geotools.data.DataStore; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.mockrunner.mock.web.MockHttpServletResponse; public class DataStoreTest extends CatalogRESTTestSupport { public void testGetAllAsXML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores.xml"); assertEquals( catalog.getStoresByWorkspace( "sf", DataStoreInfo.class ).size(), dom.getElementsByTagName( "dataStore").getLength() ); } public void testGetAllAsJSON() throws Exception { JSON json = getAsJSON( "/rest/workspaces/sf/datastores.json"); assertTrue( json instanceof JSONObject ); Object datastores = ((JSONObject)json).getJSONObject("dataStores").get("dataStore"); assertNotNull( datastores ); if( datastores instanceof JSONArray ) { assertEquals( catalog.getDataStoresByWorkspace("sf").size() , ((JSONArray)datastores).size() ); } else { assertEquals( 1, catalog.getDataStoresByWorkspace("sf").size() ); } } public void testGetAllAsHTML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores.html"); List<DataStoreInfo> datastores = catalog.getDataStoresByWorkspace("sf"); NodeList links = xp.getMatchingNodes("//html:a", dom ); assertEquals( datastores.size(), links.getLength() ); for ( int i = 0; i < datastores.size(); i++ ){ DataStoreInfo ds = datastores.get( i ); Element link = (Element) links.item( i ); assertTrue( link.getAttribute("href").endsWith( ds.getName() + ".html") ); } } public void testPutAllUnauthorized() throws Exception { assertEquals( 405, putAsServletResponse("/rest/workspaces/sf/datastores").getStatusCode() ); } public void testDeleteAllUnauthorized() throws Exception { assertEquals( 405, deleteAsServletResponse("/rest/workspaces/sf/datastores").getStatusCode() ); } public void testGetAsXML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores/sf.xml"); assertEquals( "dataStore", dom.getDocumentElement().getNodeName() ); assertEquals( "sf", xp.evaluate( "/dataStore/name", dom) ); assertEquals( "sf", xp.evaluate( "/dataStore/workspace/name", dom) ); assertXpathExists( "/dataStore/connectionParameters", dom ); } public void testGetAsHTML() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores/sf.html"); DataStoreInfo ds = catalog.getDataStoreByName( "sf" ); List<FeatureTypeInfo> featureTypes = catalog.getFeatureTypesByDataStore( ds ); NodeList links = xp.getMatchingNodes("//html:a", dom ); assertEquals( featureTypes.size(), links.getLength() ); for ( int i = 0; i < featureTypes.size(); i++ ){ FeatureTypeInfo ft = featureTypes.get( i ); Element link = (Element) links.item( i ); assertTrue( link.getAttribute("href").endsWith( ft.getName() + ".html") ); } } File setupNewDataStore() throws Exception { Properties props = new Properties(); props.put( "_", "name:StringpointProperty:Point"); props.put( "NewDataStore.0", "'zero'|POINT(0 0)"); props.put( "NewDataStore.1", "'one'|POINT(1 1)"); File dir = new File( "./target/nds" ); dir.mkdir(); File file = new File( dir, "newDataStore.properties"); file.deleteOnExit(); dir.deleteOnExit(); props.store( new FileOutputStream( file ), null ); return dir; } public void testPostAsXML() throws Exception { File dir = setupNewDataStore(); String xml = "<dataStore>" + "<name>newDataStore</name>" + "<connectionParameters>" + "<namespace><string>sf</string></namespace>" + "<directory>" + "<string>" + dir.getAbsolutePath() + "</string>" + "</directory>" + "</connectionParameters>" + "<workspace>sf</workspace>" + "</dataStore>"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/sf/datastores", xml, "text/xml" ); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/workspaces/sf/datastores/newDataStore" ) ); DataStoreInfo newDataStore = catalog.getDataStoreByName( "newDataStore" ); assertNotNull( newDataStore ); DataStore ds = (DataStore) newDataStore.getDataStore(null); assertNotNull(ds); } public void testGetAsJSON() throws Exception { JSON json = getAsJSON( "/rest/workspaces/sf/datastores/sf.json" ); JSONObject dataStore = ((JSONObject)json).getJSONObject("dataStore"); assertNotNull(dataStore); assertEquals( "sf", dataStore.get( "name") ); assertEquals( "sf", dataStore.getJSONObject( "workspace").get( "name" ) ); assertNotNull( dataStore.get( "connectionParameters") ); } public void testPostAsJSON() throws Exception { File dir = setupNewDataStore(); String json = "{'dataStore':{" + "'connectionParameters': {" + "'namespace': {'string':'sf'}," + "'directory': {'string':'" + dir.getAbsolutePath().replace('\\','/') + "'}" + "}," + "'workspace':'sf'," + "'name':'newDataStore'," + "}" + "}"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/sf/datastores", json, "text/json" ); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/workspaces/sf/datastores/newDataStore" ) ); DataStoreInfo newDataStore = catalog.getDataStoreByName( "newDataStore" ); assertNotNull( newDataStore ); DataStore ds = (DataStore) newDataStore.getDataStore(null); assertNotNull(ds); } public void testPostToResource() throws Exception { String xml = "<dataStore>" + "<name>sf</name>" + "<enabled>false</enabled>" + "</dataStore>"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/sf/datastores/sf", xml, "text/xml"); assertEquals( 405, response.getStatusCode() ); } public void testPut() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores/sf.xml"); assertXpathEvaluatesTo("true", "/dataStore/enabled", dom ); String xml = "<dataStore>" + "<name>sf</name>" + "<enabled>false</enabled>" + "</dataStore>"; MockHttpServletResponse response = putAsServletResponse( "/rest/workspaces/sf/datastores/sf", xml, "text/xml"); assertEquals( 200, response.getStatusCode() ); dom = getAsDOM( "/rest/workspaces/sf/datastores/sf.xml"); assertXpathEvaluatesTo("false", "/dataStore/enabled", dom ); assertFalse( catalog.getDataStoreByName( "sf", "sf").isEnabled() ); } public void testPut2() throws Exception { Document dom = getAsDOM( "/rest/workspaces/sf/datastores/sf.xml"); assertXpathEvaluatesTo("2", "count(//dataStore/connectionParameters/*)", dom ); String xml = "<dataStore>" + "<name>sf</name>" + "<connectionParameters>" + "<one>" + "<string>1</string>" + "</one>" + "<two>"+ "<string>2</string>" + "</two>" + "</connectionParameters>"+ "</dataStore>"; MockHttpServletResponse response = putAsServletResponse( "/rest/workspaces/sf/datastores/sf", xml, "text/xml"); assertEquals( 200, response.getStatusCode() ); DataStoreInfo ds = catalog.getDataStoreByName( "sf", "sf" ); assertEquals( 2, ds.getConnectionParameters().size() ); assertTrue( ds.getConnectionParameters().containsKey( "one" ) ); assertTrue( ds.getConnectionParameters().containsKey( "two" ) ); } public void testPutNonExistant() throws Exception { String xml = "<dataStore>" + "<name>changed</name>" + "</dataStore>"; MockHttpServletResponse response = putAsServletResponse("/rest/workspaces/sf/datastores/nonExistant", xml, "text/xml" ); assertEquals( 404, response.getStatusCode() ); } public void testDeleteNonExistant() throws Exception { assertEquals( 404, deleteAsServletResponse("/rest/workspaces/sf/datastores/nonExistant").getStatusCode() ); } public void testDelete() throws Exception { File dir = setupNewDataStore(); String xml = "<dataStore>" + "<name>newDataStore</name>" + "<connectionParameters>" + "<entry>" + "<string>namespace</string>" + "<string>sf</string>" + "</entry>" + "<entry>" + "<string>directory</string>" + "<string>" + dir.getAbsolutePath() + "</string>" + "</entry>" + "</connectionParameters>" + "<workspace>sf</workspace>" + "</dataStore>"; MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces/sf/datastores", xml, "text/xml" ); assertEquals( 201, response.getStatusCode() ); assertNotNull( catalog.getDataStoreByName("sf", "newDataStore")); assertEquals( 200, deleteAsServletResponse("/rest/workspaces/sf/datastores/newDataStore").getStatusCode()); assertNull( catalog.getDataStoreByName("sf", "newDataStore")); } public void testDeleteNonEmptyForbidden() throws Exception { assertEquals( 403, deleteAsServletResponse("/rest/workspaces/sf/datastores/sf").getStatusCode()); } public void testDeleteRecursive() throws Exception { assertNotNull(catalog.getDataStoreByName("sf", "sf")); MockHttpServletResponse response = deleteAsServletResponse("/rest/workspaces/sf/datastores/sf?recurse=true"); assertEquals(200, response.getStatusCode()); assertNull(catalog.getDataStoreByName("sf", "sf")); for (FeatureTypeInfo ft : catalog.getFeatureTypes()) { if (ft.getStore().getName().equals("sf")) { fail(); } } } public void testPutNameChangeForbidden() throws Exception { String xml = "<dataStore>" + "<name>newName</name>" + "</dataStore>"; assertEquals( 403, putAsServletResponse("/rest/workspaces/sf/datastores/sf", xml, "text/xml").getStatusCode()); } public void testPutWorkspaceChangeForbidden() throws Exception { String xml = "<dataStore>" + "<workspace>gs</workspace>" + "</dataStore>"; assertEquals( 403, putAsServletResponse("/rest/workspaces/sf/datastores/sf", xml, "text/xml").getStatusCode()); } }