/* 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.ByteArrayOutputStream; import java.io.File; import java.util.List; import net.sf.json.JSON; import net.sf.json.JSONObject; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.StyleInfo; import org.geotools.styling.Style; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.mockrunner.mock.web.MockHttpServletResponse; public class StyleTest extends CatalogRESTTestSupport { public void testGetAllAsXML() throws Exception { Document dom = getAsDOM( "/rest/styles.xml" ); List<StyleInfo> styles = catalog.getStyles(); assertXpathEvaluatesTo(""+styles.size(), "count(//style)", dom); } public void testGetAllASJSON() throws Exception { JSON json = getAsJSON("/rest/styles.json"); List<StyleInfo> styles = catalog.getStyles(); assertEquals( styles.size(), ((JSONObject) json).getJSONObject("styles").getJSONArray("style").size()); } public void testGetAllAsHTML() throws Exception { Document dom = getAsDOM( "/rest/styles.html"); List<StyleInfo> styles = catalog.getStyles(); NodeList links = xp.getMatchingNodes("//html:a", dom); for ( int i = 0; i < styles.size(); i++ ) { StyleInfo s = (StyleInfo) styles.get( i ); Element link = (Element) links.item( i ); assertTrue( link.getAttribute("href").endsWith( s.getName()+ ".html")); } } public void testGetAsXML() throws Exception { Document dom = getAsDOM( "/rest/styles/Ponds.xml" ); assertEquals( "style", dom.getDocumentElement().getNodeName() ); assertXpathEvaluatesTo("Ponds", "/style/name", dom); assertXpathEvaluatesTo("Ponds.sld", "/style/filename", dom); } public void testGetAsJSON() throws Exception { JSON json = getAsJSON( "/rest/styles/Ponds.json"); JSONObject style = ((JSONObject)json).getJSONObject("style"); assertEquals( "Ponds", style.get( "name") ); assertEquals( "Ponds.sld", style.get( "filename") ); } public void testGetAsSLD() throws Exception { Document dom = getAsDOM( "/rest/styles/Ponds.sld"); assertEquals( "sld:StyledLayerDescriptor", dom.getDocumentElement().getNodeName() ); } String newSLDXML() { return "<sld:StyledLayerDescriptor xmlns:sld='http://www.opengis.net/sld'>"+ "<sld:NamedLayer>"+ "<sld:Name>foo</sld:Name>"+ "<sld:UserStyle>"+ "<sld:Name>foo</sld:Name>"+ "<sld:FeatureTypeStyle>"+ "<sld:Name>foo</sld:Name>"+ "</sld:FeatureTypeStyle>" + "</sld:UserStyle>" + "</sld:NamedLayer>" + "</sld:StyledLayerDescriptor>"; } public void testPostAsSLD() throws Exception { String xml = newSLDXML(); MockHttpServletResponse response = postAsServletResponse( "/rest/styles", xml, StyleResource.MEDIATYPE_SLD.toString()); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/styles/foo" ) ); assertNotNull( catalog.getStyleByName( "foo" ) ); } public void testPostAsSLDWithName() throws Exception { String xml = newSLDXML(); MockHttpServletResponse response = postAsServletResponse( "/rest/styles?name=bar", xml, StyleResource.MEDIATYPE_SLD.toString()); assertEquals( 201, response.getStatusCode() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/styles/bar" ) ); assertNotNull( catalog.getStyleByName( "bar" ) ); } public void testPut() throws Exception { StyleInfo style = catalog.getStyleByName( "Ponds"); assertEquals( "Ponds.sld", style.getFilename() ); String xml = "<style>" + "<name>Ponds</name>" + "<filename>Forests.sld</filename>" + "</style>"; MockHttpServletResponse response = putAsServletResponse("/rest/styles/Ponds", xml.getBytes(), "text/xml"); assertEquals( 200, response.getStatusCode() ); style = catalog.getStyleByName( "Ponds"); assertEquals( "Forests.sld", style.getFilename() ); } public void testPutAsSLD() throws Exception { String xml = newSLDXML(); MockHttpServletResponse response = putAsServletResponse( "/rest/styles/Ponds", xml, StyleResource.MEDIATYPE_SLD.toString()); assertEquals( 200, response.getStatusCode() ); Style s = catalog.getStyleByName( "Ponds" ).getStyle(); ByteArrayOutputStream out = new ByteArrayOutputStream(); new SLDFormat().write(s, out); xml = new String(out.toByteArray()); assertTrue(xml.contains("<sld:Name>foo</sld:Name>")); } public void testDelete() throws Exception { String xml = "<style>" + "<name>dummy</name>" + "<filename>dummy.sld</filename>" + "</style>"; post( "/rest/styles", xml, "text/xml"); assertNotNull( catalog.getStyleByName( "dummy" ) ); MockHttpServletResponse response = deleteAsServletResponse("/rest/styles/dummy"); assertEquals( 200, response.getStatusCode() ); assertNull( catalog.getStyleByName( "dummy" ) ); } public void testDeleteWithLayerReference() throws Exception { assertNotNull( catalog.getStyleByName( "Ponds" ) ); MockHttpServletResponse response = deleteAsServletResponse("/rest/styles/Ponds"); assertEquals( 403, response.getStatusCode() ); assertNotNull( catalog.getStyleByName( "Ponds" ) ); } public void testDeleteWithoutPurge() throws Exception { String xml = newSLDXML(); MockHttpServletResponse response = postAsServletResponse( "/rest/styles", xml, StyleResource.MEDIATYPE_SLD.toString()); assertNotNull( catalog.getStyleByName( "foo" ) ); //ensure the style not deleted on disk assertTrue(new File(getDataDirectory().findStyleDir(), "foo.sld").exists()); response = deleteAsServletResponse("/rest/styles/foo"); assertEquals( 200, response.getStatusCode() ); //ensure the style not deleted on disk assertTrue(new File(getDataDirectory().findStyleDir(), "foo.sld").exists()); } public void testDeleteWithPurge() throws Exception { String xml = newSLDXML(); MockHttpServletResponse response = postAsServletResponse( "/rest/styles", xml, StyleResource.MEDIATYPE_SLD.toString()); assertNotNull( catalog.getStyleByName( "foo" ) ); //ensure the style not deleted on disk assertTrue(new File(getDataDirectory().findStyleDir(), "foo.sld").exists()); response = deleteAsServletResponse("/rest/styles/foo?purge=true"); assertEquals( 200, response.getStatusCode() ); //ensure the style not deleted on disk assertFalse(new File(getDataDirectory().findStyleDir(), "foo.sld").exists()); } public void testGetAllByLayer() throws Exception { Document dom = getAsDOM( "/rest/layers/cite:BasicPolygons/styles.xml"); LayerInfo layer = catalog.getLayerByName( "cite:BasicPolygons" ); assertXpathEvaluatesTo(layer.getStyles().size()+"", "count(//style)", dom ); } public void testPostByLayer() throws Exception { LayerInfo l = catalog.getLayerByName( "cite:BasicPolygons" ); int nstyles = l.getStyles().size(); String xml = "<style>" + "<name>Ponds</name>" + "</style>"; MockHttpServletResponse response = postAsServletResponse( "/rest/layers/cite:BasicPolygons/styles", xml, "text/xml"); assertEquals( 201, response.getStatusCode() ); LayerInfo l2 = catalog.getLayerByName( "cite:BasicPolygons" ); assertEquals( nstyles+1, l2.getStyles().size() ); assertTrue( l2.getStyles().contains( catalog.getStyleByName( "Ponds") ) ); } public void testPostByLayerWithDefault() throws Exception { LayerInfo l = catalog.getLayerByName( "cite:BasicPolygons" ); int nstyles = l.getStyles().size(); String xml = "<style>" + "<name>Ponds</name>" + "</style>"; MockHttpServletResponse response = postAsServletResponse( "/rest/layers/cite:BasicPolygons/styles?default=true", xml, "text/xml"); assertEquals( 201, response.getStatusCode() ); LayerInfo l2 = catalog.getLayerByName( "cite:BasicPolygons" ); assertEquals( nstyles+1, l2.getStyles().size() ); assertEquals( catalog.getStyleByName( "Ponds"), l2.getDefaultStyle() ); } public void testPostByLayerExistingWithDefault() throws Exception { testPostByLayer(); LayerInfo l = catalog.getLayerByName("cite:BasicPolygons"); int nstyles = l.getStyles().size(); String xml = "<style>" + "<name>Ponds</name>" + "</style>"; MockHttpServletResponse response = postAsServletResponse( "/rest/layers/cite:BasicPolygons/styles?default=true", xml, "text/xml"); assertEquals( 201, response.getStatusCode() ); LayerInfo l2 = catalog.getLayerByName("cite:BasicPolygons"); assertEquals( nstyles, l2.getStyles().size() ); assertEquals( catalog.getStyleByName( "Ponds"), l2.getDefaultStyle() ); } }