package org.geoserver.wfs.kvp; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import net.opengis.wfs.GetFeatureType; import net.opengis.wfs.QueryType; import net.opengis.wfs.WfsFactory; import org.geoserver.data.test.MockData; import org.geoserver.test.ows.KvpRequestReaderTestSupport; import org.geoserver.wfs.GetFeature; import org.geoserver.wfs.WFSException; import org.geotools.factory.CommonFactoryFinder; public class GetFeatureKvpRequestReaderTest extends KvpRequestReaderTestSupport { private GetFeatureKvpRequestReader reader; protected void setUpInternal() throws Exception { super.setUpInternal(); reader = new GetFeatureKvpRequestReader(GetFeatureType.class, getCatalog(), CommonFactoryFinder.getFilterFactory(null)); } /** * http://jira.codehaus.org/browse/GEOS-1875 */ @SuppressWarnings("unchecked") public void testInvalidTypeNameBbox() throws Exception { Map raw = new HashMap(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("bbox", "-80.4864795578115,25.6176257083275,-80.3401307394915,25.7002737069969"); raw.put("typeName", "cite:InvalidTypeName"); Map parsed = parseKvp(raw); try { // before fix for GEOS-1875 this would bomb out with an NPE instead of the proper // exception reader.read(WfsFactory.eINSTANCE.createGetFeatureType(), parsed, raw); } catch (WFSException e) { assertEquals("InvalidParameterValue", e.getCode()); assertEquals("typeName", e.getLocator()); System.out.println(e.getMessage()); assertTrue(e.getMessage().contains("cite:InvalidTypeName")); } } /** * Same as GEOS-1875, but let's check without bbox and without name prefix * * @throws Exception */ @SuppressWarnings("unchecked") public void testInvalidTypeName() throws Exception { Map raw = new HashMap(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", "InvalidTypeName"); try { Map parsed = parseKvp(raw); reader.read(WfsFactory.eINSTANCE.createGetFeatureType(), parsed, raw); } catch (WFSException e) { assertEquals("InvalidParameterValue", e.getCode()); assertEquals("typeName", e.getLocator()); //System.out.println(e.getMessage()); assertTrue(e.getMessage().contains("InvalidTypeName")); } } /** * See http://jira.codehaus.org/browse/GEOS-1875 * * @throws Exception */ @SuppressWarnings("unchecked") public void testUserProvidedNamespace() throws Exception { final String localPart = MockData.MLINES.getLocalPart(); final String namespace = MockData.MLINES.getNamespaceURI(); final String alternamePrefix = "ex"; final String alternameTypeName = alternamePrefix + ":" + localPart; Map<String, String> raw = new HashMap<String, String>(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", alternameTypeName); raw.put("namespace", "xmlns(" + alternamePrefix + "=" + namespace + ")"); Map<String, Object> parsed = parseKvp(raw); GetFeatureType req = WfsFactory.eINSTANCE.createGetFeatureType(); Object read = reader.read(req, parsed, raw); GetFeatureType parsedReq = (GetFeatureType) read; QueryType query = (QueryType) parsedReq.getQuery().get(0); List<QName> typeNames = query.getTypeName(); assertEquals(1, typeNames.size()); assertEquals(MockData.MLINES, typeNames.get(0)); } /** * See http://jira.codehaus.org/browse/GEOS-1875 * * @throws Exception */ @SuppressWarnings("unchecked") public void testUserProvidedDefaultNamespace() throws Exception { final QName qName = MockData.STREAMS; final String typeName = qName.getLocalPart(); final String defaultNamespace = qName.getNamespaceURI(); Map<String, String> raw = new HashMap<String, String>(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", typeName); raw.put("namespace", "xmlns(" + defaultNamespace + ")"); Map<String, Object> parsed = parseKvp(raw); GetFeatureType req = WfsFactory.eINSTANCE.createGetFeatureType(); Object read = reader.read(req, parsed, raw); GetFeatureType parsedReq = (GetFeatureType) read; QueryType query = (QueryType) parsedReq.getQuery().get(0); List<QName> typeNames = query.getTypeName(); assertEquals(1, typeNames.size()); assertEquals(qName, typeNames.get(0)); } public void testViewParams() throws Exception { Map<String, String> raw = new HashMap<String, String>(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", getLayerId(MockData.STREAMS)); raw.put("viewParams", "where:WHERE PERSONS > 1000000;str:ABCD"); Map<String, Object> parsed = parseKvp(raw); GetFeatureType req = WfsFactory.eINSTANCE.createGetFeatureType(); Object read = reader.read(req, parsed, raw); GetFeatureType parsedReq = (GetFeatureType) read; assertEquals(1, parsedReq.getMetadata().size()); List<Map<String, String>> viewParams = (List<Map<String, String>>) parsedReq.getMetadata().get(GetFeature.SQL_VIEW_PARAMS); assertEquals(1, viewParams.size()); Map<String, String> vp1 = viewParams.get(0); assertEquals("WHERE PERSONS > 1000000", vp1.get("where")); assertEquals("ABCD", vp1.get("str")); } public void testViewParamsMulti() throws Exception { Map<String, String> raw = new HashMap<String, String>(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", getLayerId(MockData.STREAMS) + "," + getLayerId(MockData.BASIC_POLYGONS)); raw.put("viewParams", "where:WHERE PERSONS > 1000000;str:ABCD,where:WHERE PERSONS > 10;str:FOO"); Map<String, Object> parsed = parseKvp(raw); GetFeatureType req = WfsFactory.eINSTANCE.createGetFeatureType(); Object read = reader.read(req, parsed, raw); GetFeatureType parsedReq = (GetFeatureType) read; assertEquals(1, parsedReq.getMetadata().size()); List<Map<String, String>> viewParams = (List<Map<String, String>>) parsedReq.getMetadata().get(GetFeature.SQL_VIEW_PARAMS); assertEquals(2, viewParams.size()); Map<String, String> vp1 = viewParams.get(0); assertEquals("WHERE PERSONS > 1000000", vp1.get("where")); assertEquals("ABCD", vp1.get("str")); Map<String, String> vp2 = viewParams.get(1); assertEquals("WHERE PERSONS > 10", vp2.get("where")); assertEquals("FOO", vp2.get("str")); } public void testViewParamsFanOut() throws Exception { Map<String, String> raw = new HashMap<String, String>(); raw.put("service", "WFS"); raw.put("version", "1.1.0"); raw.put("request", "GetFeature"); raw.put("typeName", getLayerId(MockData.STREAMS) + "," + getLayerId(MockData.BASIC_POLYGONS)); raw.put("viewParams", "where:WHERE PERSONS > 1000000;str:ABCD"); Map<String, Object> parsed = parseKvp(raw); GetFeatureType req = WfsFactory.eINSTANCE.createGetFeatureType(); Object read = reader.read(req, parsed, raw); GetFeatureType parsedReq = (GetFeatureType) read; assertEquals(1, parsedReq.getMetadata().size()); List<Map<String, String>> viewParams = (List<Map<String, String>>) parsedReq.getMetadata().get(GetFeature.SQL_VIEW_PARAMS); assertEquals(2, viewParams.size()); Map<String, String> vp1 = viewParams.get(0); assertEquals("WHERE PERSONS > 1000000", vp1.get("where")); assertEquals("ABCD", vp1.get("str")); Map<String, String> vp2 = viewParams.get(1); assertEquals("WHERE PERSONS > 1000000", vp2.get("where")); assertEquals("ABCD", vp2.get("str")); } }