/* (c) 2014 - 2015 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.v1_1; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.net.URLEncoder; import java.util.Collections; import javax.xml.namespace.QName; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.custommonkey.xmlunit.XpathEngine; import org.geoserver.config.GeoServer; import org.geoserver.config.GeoServerInfo; import org.geoserver.data.test.SystemTestData; import org.geoserver.test.RunTestSetup; import org.geoserver.util.XmlTestUtil; import org.geoserver.wfs.GMLInfo; import org.geoserver.wfs.WFSInfo; import org.geoserver.wfs.WFSTestSupport; import org.geotools.gml3.GML; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class GetFeatureTest extends WFSTestSupport { XmlTestUtil xmlUtil; @Before public void setupXmlUtil() { xmlUtil = new XmlTestUtil(); xmlUtil.addNamespace("wfs", "http://www.opengis.net/wfs"); xmlUtil.addNamespace("sf", "http://cite.opengeospatial.org/gmlsf"); //xmlUtil.setShowXML(System.out); // Uncomment to display XML on failure } @Before public void setupExternalEntities() { GeoServerInfo gsi = this.getGeoServer().getGlobal(); gsi.setXmlExternalEntitiesEnabled(true); getGeoServer().save(gsi); } @Override protected void setUpInternal(SystemTestData data) throws Exception { this.getGeoServer().getGlobal().setXmlExternalEntitiesEnabled(true); WFSInfo wfs = getWFS(); wfs.setFeatureBounding(true); getGeoServer().save(wfs); data.addVectorLayer ( new QName( SystemTestData.SF_URI, "WithGMLProperties", SystemTestData.SF_PREFIX ), Collections.EMPTY_MAP, getClass(), getCatalog()); } @Test public void testGet() throws Exception { testGetFifteenAll("wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&service=wfs"); } @Test public void testGetPropertyNameEmpty() throws Exception { testGetFifteenAll("wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&service=wfs&propertyname="); } @Test public void testGetPropertyNameStar() throws Exception { testGetFifteenAll("wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&service=wfs&propertyname=*"); } private void testGetFifteenAll(String request) throws Exception{ Document doc = getAsDOM(request); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Fifteen"); assertFalse(features.getLength() == 0); for (int i = 0; i < features.getLength(); i++) { Element feature = (Element) features.item(i); assertTrue(feature.hasAttribute("gml:id")); } } // see GEOS-1287 @Test @RunTestSetup public void testGetWithFeatureId() throws Exception { Document doc; doc = getAsDOM("wfs?request=GetFeature&typeName=cdf:Fifteen&version=1.1.0&service=wfs&featureid=Fifteen.2"); //super.print(doc); assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName()); XMLAssert.assertXpathEvaluatesTo("1", "count(//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen)", doc); XMLAssert.assertXpathEvaluatesTo("Fifteen.2", "//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen/@gml:id", doc); doc = getAsDOM("wfs?request=GetFeature&typeName=cite:NamedPlaces&version=1.1.0&service=wfs&featureId=NamedPlaces.1107531895891"); //super.print(doc); assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName()); XMLAssert.assertXpathEvaluatesTo("1", "count(//wfs:FeatureCollection/gml:featureMembers/cite:NamedPlaces)", doc); XMLAssert.assertXpathEvaluatesTo("NamedPlaces.1107531895891", "//wfs:FeatureCollection/gml:featureMembers/cite:NamedPlaces/@gml:id", doc); } @Test public void testGetWithTwoFeatureId() throws Exception { Document doc; doc = getAsDOM("wfs?request=GetFeature&&version=1.1.0&service=wfs&featureid=Fifteen.1,Fifteen.2"); // print(doc); assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName()); XMLAssert.assertXpathEvaluatesTo("2", "count(//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen)", doc); XMLAssert.assertXpathExists("//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen[@gml:id='Fifteen.1']", doc); XMLAssert.assertXpathExists("//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen[@gml:id='Fifteen.2']", doc); } @Test public void testPost() throws Exception { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "xmlns:cdf=\"http://www.opengis.net/cite/data\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "> " + "<wfs:Query typeName=\"cdf:Other\"> " + "<wfs:PropertyName>cdf:string2</wfs:PropertyName> " + "</wfs:Query> " + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Other"); assertFalse(features.getLength() == 0); for (int i = 0; i < features.getLength(); i++) { Element feature = (Element) features.item(i); assertTrue(feature.hasAttribute("gml:id")); } } @Test public void testPostFormEncoded() throws Exception { String request = "wfs?service=WFS&version=1.1.0&request=GetFeature&typename=sf:PrimitiveGeoFeature" + "&namespace=xmlns(" + URLEncoder.encode("sf=http://cite.opengeospatial.org/gmlsf", "UTF-8") + ")"; Document doc = postAsDOM(request); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); assertEquals(5, doc.getElementsByTagName("sf:PrimitiveGeoFeature") .getLength()); } @Test public void testPostWithFilter() throws Exception { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "outputFormat=\"text/xml; subtype=gml/3.1.1\" " + "xmlns:cdf=\"http://www.opengis.net/cite/data\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" > " + "<wfs:Query typeName=\"cdf:Other\"> " + "<ogc:Filter> " + "<ogc:PropertyIsEqualTo> " + "<ogc:PropertyName>cdf:integers</ogc:PropertyName> " + "<ogc:Add> " + "<ogc:Literal>4</ogc:Literal> " + "<ogc:Literal>3</ogc:Literal> " + "</ogc:Add> " + "</ogc:PropertyIsEqualTo> " + "</ogc:Filter> " + "</wfs:Query> " + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Other"); assertFalse(features.getLength() == 0); for (int i = 0; i < features.getLength(); i++) { Element feature = (Element) features.item(i); assertTrue(feature.hasAttribute("gml:id")); } } @Test public void testPostWithBboxFilter() throws Exception { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "outputFormat=\"text/xml; subtype=gml/3.1.1\" " + "xmlns:gml=\"http://www.opengis.net/gml\" " + "xmlns:sf=\"http://cite.opengeospatial.org/gmlsf\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" > " + "<wfs:Query typeName=\"sf:PrimitiveGeoFeature\">" + "<ogc:Filter>" + "<ogc:BBOX>" + " <ogc:PropertyName>pointProperty</ogc:PropertyName>" + " <gml:Envelope srsName=\"EPSG:4326\">" + " <gml:lowerCorner>57.0 -4.5</gml:lowerCorner>" + " <gml:upperCorner>62.0 1.0</gml:upperCorner>" + " </gml:Envelope>" + "</ogc:BBOX>" + "</ogc:Filter>" + "</wfs:Query>" + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("sf:PrimitiveGeoFeature"); assertEquals(1, features.getLength()); } @Test public void testPostWithFailingUrnBboxFilter() throws Exception { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "outputFormat=\"text/xml; subtype=gml/3.1.1\" " + "xmlns:gml=\"http://www.opengis.net/gml\" " + "xmlns:sf=\"http://cite.opengeospatial.org/gmlsf\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" > " + "<wfs:Query typeName=\"sf:PrimitiveGeoFeature\">" + "<ogc:Filter>" + "<ogc:BBOX>" + " <ogc:PropertyName>pointProperty</ogc:PropertyName>" + " <gml:Envelope srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\">" + " <gml:lowerCorner>57.0 -4.5</gml:lowerCorner>" + " <gml:upperCorner>62.0 1.0</gml:upperCorner>" + " </gml:Envelope>" + "</ogc:BBOX>" + "</ogc:Filter>" + "</wfs:Query>" + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName()); NodeList features = doc.getElementsByTagName("sf:PrimitiveGeoFeature"); assertEquals(0, features.getLength()); } @Test public void testPostWithMatchingUrnBboxFilter() throws Exception { assertThat(getGeoServer().getGlobal().isXmlExternalEntitiesEnabled(), Matchers.is(true)); String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "outputFormat=\"text/xml; subtype=gml/3.1.1\" " + "xmlns:gml=\"http://www.opengis.net/gml\" " + "xmlns:sf=\"http://cite.opengeospatial.org/gmlsf\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" > " + "<wfs:Query typeName=\"sf:PrimitiveGeoFeature\">" + "<ogc:Filter>" + "<ogc:BBOX>" + " <ogc:PropertyName>pointProperty</ogc:PropertyName>" + " <gml:Envelope srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\">" + " <gml:lowerCorner>-4.5 57.0</gml:lowerCorner>" + " <gml:upperCorner>1.0 62.0</gml:upperCorner>" + " </gml:Envelope>" + "</ogc:BBOX>" + "</ogc:Filter>" + "</wfs:Query>" + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertThat(doc, xmlUtil.hasNode("wfs:FeatureCollection")); assertThat(doc, xmlUtil.hasNode("//sf:PrimitiveGeoFeature")); } @Test public void testResultTypeHitsGet() throws Exception { Document doc = getAsDOM("wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&resultType=hits&service=wfs"); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Fifteen"); assertEquals(0, features.getLength()); assertEquals("15", doc.getDocumentElement().getAttribute( "numberOfFeatures")); } @Test public void testResultTypeHitsPost() throws Exception { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "outputFormat=\"text/xml; subtype=gml/3.1.1\" " + "xmlns:cdf=\"http://www.opengis.net/cite/data\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "resultType=\"hits\"> " + "<wfs:Query typeName=\"cdf:Seven\"/> " + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Fifteen"); assertEquals(0, features.getLength()); assertEquals("7", doc.getDocumentElement().getAttribute( "numberOfFeatures")); } @Test public void testWithSRS() throws Exception { String xml = "<wfs:GetFeature xmlns:wfs=\"http://www.opengis.net/wfs\" version=\"1.1.0\" service=\"WFS\">" + "<wfs:Query xmlns:cdf=\"http://www.opengis.net/cite/data\" typeName=\"cdf:Other\" srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\"/>" + "</wfs:GetFeature>"; Document dom = postAsDOM("wfs", xml); assertEquals(1, dom.getElementsByTagName("cdf:Other") .getLength()); } @Test public void testWithSillyLiteral() throws Exception { String xml = "<wfs:GetFeature xmlns:cdf=\"http://www.opengis.net/cite/data\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" version=\"1.1.0\" service=\"WFS\">" + "<wfs:Query typeName=\"cdf:Other\" srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\">" + "<ogc:Filter>" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>description</ogc:PropertyName>" + " <ogc:Literal>" + " <wfs:Native vendorId=\"foo\" safeToIgnore=\"true\"/>" + " </ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " </ogc:Filter>" + "</wfs:Query>" + "</wfs:GetFeature>"; Document dom = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", dom.getDocumentElement() .getNodeName()); assertEquals(0, dom.getElementsByTagName("cdf:Other") .getLength()); } @Test public void testWithGmlObjectId() throws Exception { String xml = "<wfs:GetFeature xmlns:cdf=\"http://www.opengis.net/cite/data\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" version=\"1.1.0\" service=\"WFS\">" + "<wfs:Query typeName=\"cdf:Seven\" srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\">" + "</wfs:Query>" + "</wfs:GetFeature>"; Document dom = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", dom.getDocumentElement() .getNodeName()); assertEquals(7, dom.getElementsByTagName("cdf:Seven") .getLength()); NodeList others = dom.getElementsByTagName("cdf:Seven"); String id = ((Element) others.item(0)).getAttributeNS(GML.NAMESPACE, "id"); assertNotNull(id); xml = "<wfs:GetFeature xmlns:cdf=\"http://www.opengis.net/cite/data\" xmlns:wfs=\"http://www.opengis.net/wfs\" xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" version=\"1.1.0\" service=\"WFS\">" + "<wfs:Query typeName=\"cdf:Seven\" srsName=\"urn:x-ogc:def:crs:EPSG:6.11.2:4326\">" + "<ogc:Filter>" + "<ogc:GmlObjectId gml:id=\"" + id + "\"/>" + "</ogc:Filter>" + "</wfs:Query>" + "</wfs:GetFeature>"; dom = postAsDOM("wfs", xml); assertEquals(1, dom.getElementsByTagName("cdf:Seven") .getLength()); } @Test public void testPostWithBoundsEnabled() throws Exception { // enable feature bounds computation WFSInfo wfs = getWFS(); boolean oldFeatureBounding = wfs.isFeatureBounding(); wfs.setFeatureBounding(true); getGeoServer().save( wfs ); try { String xml = "<wfs:GetFeature " + "service=\"WFS\" " + "version=\"1.1.0\" " + "xmlns:cdf=\"http://www.opengis.net/cite/data\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "> " + "<wfs:Query typeName=\"cdf:Other\"> " + "<wfs:PropertyName>cdf:string2</wfs:PropertyName> " + "</wfs:Query> " + "</wfs:GetFeature>"; Document doc = postAsDOM("wfs", xml); assertEquals("wfs:FeatureCollection", doc.getDocumentElement() .getNodeName()); NodeList features = doc.getElementsByTagName("cdf:Other"); assertFalse(features.getLength() == 0); for (int i = 0; i < features.getLength(); i++) { Element feature = (Element) features.item(i); assertTrue(feature.hasAttribute("gml:id")); NodeList boundList = feature.getElementsByTagName("gml:boundedBy"); assertEquals(1, boundList.getLength()); Element boundedBy = (Element) boundList.item(0); NodeList boxList = boundedBy.getElementsByTagName("gml:Envelope"); assertEquals(1, boxList.getLength()); Element box = (Element) boxList.item(0); assertTrue(box.hasAttribute("srsName")); } } finally { wfs.setFeatureBounding(oldFeatureBounding); getGeoServer().save( wfs ); } } @Test public void testAfterFeatureTypeAdded() throws Exception { Document dom = getAsDOM( "wfs?request=getfeature&service=wfs&version=1.1.0&typename=sf:new"); assertEquals( "ExceptionReport", dom.getDocumentElement().getLocalName() ); getTestData().addVectorLayer ( new QName( SystemTestData.SF_URI, "new", SystemTestData.SF_PREFIX ), Collections.EMPTY_MAP, getClass(), getCatalog()); //reloadCatalogAndConfiguration(); dom = getAsDOM( "wfs?request=getfeature&service=wfs&version=1.1.0&typename=sf:new"); assertEquals( "FeatureCollection", dom.getDocumentElement().getLocalName() ); } @Test public void testWithGMLProperties() throws Exception { Document dom = getAsDOM( "wfs?request=getfeature&service=wfs&version=1.1.0&typename=sf:WithGMLProperties"); assertEquals( "FeatureCollection", dom.getDocumentElement().getLocalName() ); NodeList features = dom.getElementsByTagName("sf:WithGMLProperties"); assertEquals( 1, features.getLength() ); for ( int i = 0; i < features.getLength(); i++ ) { Element feature = (Element) features.item( i ); assertEquals( "one", getFirstElementByTagName( feature, "gml:name").getFirstChild().getNodeValue() ); assertEquals( "1", getFirstElementByTagName( feature, "sf:foo").getFirstChild().getNodeValue()); Element location = getFirstElementByTagName( feature, "gml:location" ); assertNotNull( getFirstElementByTagName( location, "gml:Point" ) ); } } @Test public void testLayerQualified() throws Exception { testGetFifteenAll("cdf/Fifteen/wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&service=wfs"); Document dom = getAsDOM("cdf/Seven/wfs?request=GetFeature&typename=cdf:Fifteen&version=1.1.0&service=wfs"); XMLAssert.assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport)", dom); } @Test public void testUserSuppliedNamespacePrefix() throws Exception { testGetFifteenAll("wfs?request=GetFeature&typename=myPrefix:Fifteen&version=1.1.0&service=wfs&" + "namespace=xmlns(myPrefix%3D" // the '=' sign shall be encoded, hence '%3D' + URLEncoder.encode(SystemTestData.FIFTEEN.getNamespaceURI(), "UTF-8") + ")"); } @Test public void testUserSuppliedDefaultNamespace() throws Exception { testGetFifteenAll("wfs?request=GetFeature&typename=Fifteen&version=1.1.0&service=wfs&" + "namespace=xmlns(" + URLEncoder.encode(SystemTestData.FIFTEEN.getNamespaceURI(), "UTF-8") + ")"); } @Test public void testGML32OutputFormat() throws Exception { testGetFifteenAll( "wfs?request=getfeature&typename=cdf:Fifteen&version=1.1.0&service=wfs&outputFormat=gml32"); } @Test public void testGMLAttributeMapping() throws Exception { WFSInfo wfs = getWFS(); GMLInfo gml = wfs.getGML().get(WFSInfo.Version.V_11); gml.setOverrideGMLAttributes(false); getGeoServer().save(wfs); Document dom = getAsDOM("ows?service=WFS&version=1.1.0&request=GetFeature" + "&typename=" + getLayerId(SystemTestData.PRIMITIVEGEOFEATURE)); XMLAssert.assertXpathExists("//gml:name", dom); XMLAssert.assertXpathExists("//gml:description", dom); XMLAssert.assertXpathNotExists("//sf:name", dom); XMLAssert.assertXpathNotExists("//sf:description", dom); gml.setOverrideGMLAttributes(true); getGeoServer().save(wfs); dom = getAsDOM("ows?service=WFS&version=1.1.0&request=GetFeature" + "&typename=" + getLayerId(SystemTestData.PRIMITIVEGEOFEATURE)); XMLAssert.assertXpathNotExists("//gml:name", dom); XMLAssert.assertXpathNotExists("//gml:description", dom); XMLAssert.assertXpathExists("//sf:name", dom); XMLAssert.assertXpathExists("//sf:description", dom); gml.setOverrideGMLAttributes(false); getGeoServer().save(wfs); } @Test public void testSortedAscending() throws Exception { Document dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS"); XMLAssert.assertXpathEvaluatesTo("2", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("113", "//cite:Buildings[1]/cite:FID", dom); XMLAssert.assertXpathEvaluatesTo("114", "//cite:Buildings[2]/cite:FID", dom); // with max features dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS&maxFeatures=1"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("113", "//cite:Buildings[1]/cite:FID", dom); // and with paging, first page dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS&maxFeatures=1&startIndex=0"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("113", "//cite:Buildings[1]/cite:FID", dom); // second page dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS&maxFeatures=1&startIndex=1"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("114", "//cite:Buildings[1]/cite:FID", dom); } @Test public void testSortedDescending() throws Exception { Document dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS D"); XMLAssert.assertXpathEvaluatesTo("2", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("114", "//cite:Buildings[1]/cite:FID", dom); XMLAssert.assertXpathEvaluatesTo("113", "//cite:Buildings[2]/cite:FID", dom); // with max features dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS D&maxFeatures=1"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("114", "//cite:Buildings[1]/cite:FID", dom); // and with paging, first page dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS D&maxFeatures=1&startIndex=0"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("114", "//cite:Buildings[1]/cite:FID", dom); // second page dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS D&maxFeatures=1&startIndex=1"); XMLAssert.assertXpathEvaluatesTo("1", "count(//cite:Buildings)", dom); XMLAssert.assertXpathEvaluatesTo("113", "//cite:Buildings[1]/cite:FID", dom); } @Test public void testSortedInvalidAttribute() throws Exception { Document dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=GODOT"); checkOws10Exception(dom, "InvalidParameterValue"); XMLAssert.assertXpathEvaluatesTo("Illegal property name: GODOT for feature type " + getLayerId(SystemTestData.BUILDINGS), "//ows:ExceptionText", dom); } @Test public void testEncodeSrsDimension() throws Exception { Document dom = getAsDOM("wfs?request=GetFeature&version=1.1.0&service=wfs&typename=" + getLayerId(SystemTestData.PRIMITIVEGEOFEATURE)); XMLAssert.assertXpathExists("//gml:Point[@srsDimension = '2']", dom); WFSInfo wfs = getWFS(); wfs.setCiteCompliant(true); getGeoServer().save(wfs); dom = getAsDOM("wfs?request=GetFeature&version=1.1.0&service=wfs&typename=" + getLayerId(SystemTestData.PRIMITIVEGEOFEATURE)); XMLAssert.assertXpathNotExists("//gml:Point[@srsDimension = '2']", dom); } @Test public void testWfs20AndGML31() throws Exception { Document doc = getAsDOM("wfs?request=GetFeature&typeName=cdf:Fifteen&version=2.0.0&service=wfs&featureid=Fifteen.2&outputFormat=gml3"); // print(doc); XMLAssert.assertXpathEvaluatesTo("1", "count(//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen)", doc); XMLAssert.assertXpathEvaluatesTo("Fifteen.2", "//wfs:FeatureCollection/gml:featureMembers/cdf:Fifteen/@gml:id", doc); } @Test public void testFeatureMembers() throws Exception { WFSInfo wfs = getWFS(); GeoServer gs = getGeoServer(); try { wfs.setEncodeFeatureMember(false); gs.save(wfs); Document dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS"); // print(dom); XMLAssert.assertXpathEvaluatesTo("1", "count(//gml:featureMembers)", dom); XMLAssert.assertXpathEvaluatesTo("0", "count(//gml:featureMember)", dom); wfs.setEncodeFeatureMember(true); gs.save(wfs); dom = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(SystemTestData.BUILDINGS) + "&version=1.1.0&service=wfs&sortBy=ADDRESS"); // print(dom); XMLAssert.assertXpathEvaluatesTo("0", "count(//gml:featureMembers)", dom); XMLAssert.assertXpathEvaluatesTo("2", "count(//gml:featureMember)", dom); } finally { wfs.setEncodeFeatureMember(false); gs.save(wfs); } } /** * Test GetFeature operation invocations using virtual services end points. * A common issue was XSD caches created only with the types of a certain * workspace and reuse the same cache for other workspaces. The principal * consequence was NULL namespaces in the GetFeature result, e.g null:Buildings. */ @Test public void testVirtualServicesInvocation() throws Exception { XpathEngine xpath = XMLUnit.newXpathEngine(); // get rid of the current WFS schema org.geotools.wfs.v1_1.WFS.getInstance().dispose(); // perform a GetFeature request using virtual service for workspace CGF String response = getAsServletResponse(String.format( "%s/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=%s", SystemTestData.CGF_PREFIX, getLayerId(SystemTestData.MLINES))) .getContentAsString(); assertThat(response, notNullValue()); assertThat(response.contains("null:MLines"), is(false)); Document document = dom(new ByteArrayInputStream(response.getBytes()), true); String count = xpath.evaluate("count(//gml:featureMembers/cgf:MLines)", document); assertThat(Integer.parseInt(count), greaterThan(0)); // now perform a GetFeature request using virtual service for workspace CITE response = getAsServletResponse(String.format( "%s/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=%s", SystemTestData.CITE_PREFIX, getLayerId(SystemTestData.BUILDINGS))) .getContentAsString(); assertThat(response, notNullValue()); assertThat(response.contains("null:Buildings"), is(false)); document = dom(new ByteArrayInputStream(response.getBytes()), true); count = xpath.evaluate("count(//gml:featureMembers/cite:Buildings)", document); assertThat(Integer.parseInt(count), greaterThan(0)); } }