/* (c) 2014 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.wfs.kvp; import static org.junit.Assert.*; 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.eclipse.emf.common.util.EList; import org.geoserver.data.test.SystemTestData; import org.geoserver.test.GeoServerSystemTestSupport; import org.geoserver.wfs.GetFeature; import org.geoserver.wfs.WFSException; import org.geotools.factory.CommonFactoryFinder; import org.junit.Test; public class GetFeatureKvpRequestReaderTest extends GeoServerSystemTestSupport { private static GetFeatureKvpRequestReader reader; @Override protected void onSetUp(SystemTestData data) throws Exception { reader = new GetFeatureKvpRequestReader(GetFeatureType.class, getCatalog(), CommonFactoryFinder.getFilterFactory(null)); } /** * https://osgeo-org.atlassian.net/browse/GEOS-1875 */ @Test @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 * */ @SuppressWarnings("unchecked") @Test 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 https://osgeo-org.atlassian.net/browse/GEOS-1875 * */ @SuppressWarnings("unchecked") @Test public void testUserProvidedNamespace() throws Exception { final String localPart = SystemTestData.MLINES.getLocalPart(); final String namespace = SystemTestData.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(SystemTestData.MLINES, typeNames.get(0)); } /** * See https://osgeo-org.atlassian.net/browse/GEOS-1875 * */ @SuppressWarnings("unchecked") @Test public void testUserProvidedDefaultNamespace() throws Exception { final QName qName = SystemTestData.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)); } @Test 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(SystemTestData.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.getViewParams().size()); List<Map> viewParams = (EList<Map>) parsedReq.getViewParams(); assertEquals(1, viewParams.size()); Map<String, String> vp1 = viewParams.get(0); assertEquals("WHERE PERSONS > 1000000", vp1.get("where")); assertEquals("ABCD", vp1.get("str")); } @Test 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(SystemTestData.STREAMS) + "," + getLayerId(SystemTestData.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; List<Map> viewParams = (EList<Map>) parsedReq.getViewParams(); 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")); } @Test 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(SystemTestData.STREAMS) + "," + getLayerId(SystemTestData.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; List<Map> viewParams = (EList<Map>) parsedReq.getViewParams(); 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")); } }