package org.geotools.data.wfs.v1_1_0;
import static org.geotools.data.wfs.protocol.wfs.WFSOperationType.DESCRIBE_FEATURETYPE;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.CUBEWERX_GOVUNITCE;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.CUBEWERX_ROADSEG;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_ARCHSITES;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_POI;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_ROADS;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_STATES;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_TASMANIA_CITIES;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.GEOS_TIGER_ROADS;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.createTestProtocol;
import static org.geotools.data.wfs.v1_1_0.DataTestSupport.wfs;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.geotools.data.DefaultQuery;
import org.geotools.data.wfs.protocol.http.DefaultHTTPProtocol;
import org.geotools.data.wfs.protocol.http.HTTPProtocol;
import org.geotools.data.wfs.protocol.http.HTTPResponse;
import org.geotools.data.wfs.protocol.wfs.GetFeature;
import org.geotools.data.wfs.protocol.wfs.Version;
import org.geotools.data.wfs.protocol.wfs.WFSResponse;
import org.geotools.data.wfs.protocol.wfs.GetFeature.ResultType;
import org.geotools.data.wfs.v1_1_0.DataTestSupport.TestHttpProtocol;
import org.geotools.data.wfs.v1_1_0.DataTestSupport.TestHttpResponse;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.v1_1.OGCConfiguration;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.test.TestData;
import org.geotools.wfs.WFS;
import org.geotools.xml.Parser;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.PropertyIsEqualTo;
import org.opengis.filter.capability.FilterCapabilities;
import org.opengis.filter.capability.GeometryOperand;
import org.opengis.filter.capability.SpatialCapabilities;
import org.opengis.filter.capability.SpatialOperator;
import org.opengis.filter.capability.SpatialOperators;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
/**
* Unit test suite for {@link WFS_1_1_0_Protocol}
*
* @author Gabriel Roldan (OpenGeo)
* @since 2.6.x
*/
@SuppressWarnings("nls")
public class WFS_1_1_0_ProtocolTest {
/**
* @throws java.lang.Exception
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
/**
* Test method for
* {@link WFS_1_1_0_Protocol#WFS_1_1_0_Protocol(java.io.InputStream, org.geotools.data.wfs.protocol.http.HTTPProtocol)}
* .
*
* @throws IOException
*/
@Test
public void testWFS_1_1_0_Protocol() throws IOException {
try {
createTestProtocol(GEOS_STATES.SCHEMA);
fail("Excpected IOException as a capabilities document was not provided");
} catch (IOException e) {
assertTrue(true);
}
try {
InputStream badData = new ByteArrayInputStream(new byte[1024]);
HTTPProtocol connFac = new DefaultHTTPProtocol();
new WFS_1_1_0_Protocol(badData, connFac);
fail("Excpected IOException as a capabilities document was not provided");
} catch (IOException e) {
assertTrue(true);
}
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertNotNull(wfs);
assertNotNull(((WFS_1_1_0_Protocol) wfs).capabilities);
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getServiceVersion()}.
*
* @throws IOException
*/
@Test
public void testGetServiceVersion() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertSame(Version.v1_1_0, wfs.getServiceVersion());
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getServiceTitle()}.
*
* @throws IOException
*/
@Test
public void testGetServiceTitle() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertEquals("My GeoServer WFS", wfs.getServiceTitle());
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getServiceAbstract()} .
*
* @throws IOException
*/
@Test
public void testGetServiceAbstract() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertEquals("This is a description of your Web Feature Server.", wfs.getServiceAbstract()
.trim());
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getServiceKeywords()} .
*
* @throws IOException
*/
@Test
public void testGetServiceKeywords() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
Set<String> serviceKeywords = wfs.getServiceKeywords();
assertNotNull(serviceKeywords);
assertEquals(3, serviceKeywords.size());
assertTrue(serviceKeywords.contains("WFS"));
assertTrue(serviceKeywords.contains("WMS"));
assertTrue(serviceKeywords.contains("GEOSERVER"));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getServiceProviderUri()}.
*
* @throws IOException
*/
@Test
public void testGetServiceProviderUri() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertNotNull(wfs.getServiceProviderUri());
assertEquals("http://www.geoserver.org", wfs.getServiceProviderUri().toString());
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getSupportedGetFeatureOutputFormats()} .
*
* @throws IOException
*/
@Test
public void testGetSupportedGetFeatureOutputFormats() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
Set<String> supportedOutputFormats = wfs.getSupportedGetFeatureOutputFormats();
assertNotNull(supportedOutputFormats);
assertEquals(2, supportedOutputFormats.size()); // should be 2 once GEOT-2096 is fixed
assertTrue(supportedOutputFormats.contains("text/gml; subtype=gml/3.1.1"));
assertTrue(supportedOutputFormats.contains("text/xml; subtype=gml/2.1.2"));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getSupportedOutputFormats(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetSupportedOutputFormatsByFeatureType() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
Set<String> archSitesOutputFormats = wfs
.getSupportedOutputFormats(GEOS_ARCHSITES.FEATURETYPENAME);
assertNotNull(archSitesOutputFormats);
assertEquals(8, archSitesOutputFormats.size());
assertTrue(archSitesOutputFormats.contains("GML2"));
assertTrue(archSitesOutputFormats.contains("text/xml; subtype=gml/2.1.2"));
assertTrue(archSitesOutputFormats.contains("GML2-GZIP"));
assertTrue(archSitesOutputFormats.contains("text/xml; subtype=gml/3.1.1"));
assertTrue(archSitesOutputFormats.contains("gml3"));
assertTrue(archSitesOutputFormats.contains("SHAPE-ZIP"));
assertTrue(archSitesOutputFormats.contains("json"));
assertTrue(archSitesOutputFormats.contains("text/gml; subtype=gml/3.1.1"));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeNames()}.
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeNames() throws IOException {
// test against a geoserver capabilities
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
Set<QName> featureTypeNames = wfs.getFeatureTypeNames();
assertEquals(6, featureTypeNames.size());
for (QName name : featureTypeNames) {
assertFalse(name.toString(), XMLConstants.DEFAULT_NS_PREFIX.equals(name.getPrefix()));
}
assertTrue(featureTypeNames.contains(GEOS_ARCHSITES.TYPENAME));
assertTrue(featureTypeNames.contains(GEOS_POI.TYPENAME));
assertTrue(featureTypeNames.contains(GEOS_ROADS.TYPENAME));
assertTrue(featureTypeNames.contains(GEOS_STATES.TYPENAME));
assertTrue(featureTypeNames.contains(GEOS_TASMANIA_CITIES.TYPENAME));
assertTrue(featureTypeNames.contains(GEOS_TIGER_ROADS.TYPENAME));
// test against a cubewerx capabilities
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
featureTypeNames = wfs.getFeatureTypeNames();
// there are 14 featuretypes in the capabilities document
assertEquals(14, featureTypeNames.size());
for (QName name : featureTypeNames) {
assertFalse(name.toString(), XMLConstants.DEFAULT_NS_PREFIX.equals(name.getPrefix()));
}
assertTrue(featureTypeNames.contains(CUBEWERX_GOVUNITCE.TYPENAME));
assertTrue(featureTypeNames.contains(CUBEWERX_ROADSEG.TYPENAME));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeName(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeNameGeoServer() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getFeatureTypeName("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
// test against a geoserver capabilities
assertEquals(GEOS_ARCHSITES.TYPENAME, wfs
.getFeatureTypeName(GEOS_ARCHSITES.FEATURETYPENAME));
assertEquals(GEOS_POI.TYPENAME, wfs.getFeatureTypeName(GEOS_POI.FEATURETYPENAME));
assertEquals(GEOS_ROADS.TYPENAME, wfs.getFeatureTypeName(GEOS_ROADS.FEATURETYPENAME));
assertEquals(GEOS_STATES.TYPENAME, wfs.getFeatureTypeName(GEOS_STATES.FEATURETYPENAME));
assertEquals(GEOS_TASMANIA_CITIES.TYPENAME, wfs
.getFeatureTypeName(GEOS_TASMANIA_CITIES.FEATURETYPENAME));
assertEquals(GEOS_TIGER_ROADS.TYPENAME, wfs
.getFeatureTypeName(GEOS_TIGER_ROADS.FEATURETYPENAME));
// test against a cubewerx capabilities
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
assertEquals(CUBEWERX_GOVUNITCE.TYPENAME, wfs
.getFeatureTypeName(CUBEWERX_GOVUNITCE.FEATURETYPENAME));
assertEquals(CUBEWERX_ROADSEG.TYPENAME, wfs
.getFeatureTypeName(CUBEWERX_ROADSEG.FEATURETYPENAME));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFilterCapabilities()}.
*
* @throws IOException
*/
@Test
public void testGetFilterCapabilities() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
FilterCapabilities filterCapabilities = wfs.getFilterCapabilities();
assertNotNull(filterCapabilities);
SpatialCapabilities spatialCapabilities = filterCapabilities.getSpatialCapabilities();
Collection<GeometryOperand> geometryOperands = spatialCapabilities.getGeometryOperands();
assertEquals(4, geometryOperands.size());
assertTrue(geometryOperands.contains(GeometryOperand.Envelope));
assertTrue(geometryOperands.contains(GeometryOperand.Point));
assertTrue(geometryOperands.contains(GeometryOperand.LineString));
assertTrue(geometryOperands.contains(GeometryOperand.Polygon));
SpatialOperators spatialOperators = spatialCapabilities.getSpatialOperators();
Collection<SpatialOperator> operators = spatialOperators.getOperators();
assertEquals(9, operators.size());
assertNotNull(spatialOperators.getOperator("Disjoint"));
assertNotNull(spatialOperators.getOperator("Equals"));
assertNotNull(spatialOperators.getOperator("DWithin"));
assertNotNull(spatialOperators.getOperator("Beyond"));
assertNotNull(spatialOperators.getOperator("Intersects"));
assertNotNull(spatialOperators.getOperator("Touches"));
assertNotNull(spatialOperators.getOperator("Crosses"));
assertNotNull(spatialOperators.getOperator("Contains"));
assertNotNull(spatialOperators.getOperator("BBOX"));
// intentionally removed from the test caps doc
assertNull(spatialOperators.getOperator("Overlaps"));
}
/**
* Test method for
* {@link WFS_1_1_0_Protocol#supportsOperation(org.geotools.data.wfs.protocol.wfs.WFSOperationType, org.geotools.data.wfs.protocol.http.HttpMethod)}
* .
*
* @throws IOException
*/
@Test
public void testSupportsOperation() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertTrue(wfs.supportsOperation(DESCRIBE_FEATURETYPE, false));
// post was deliberately left off on the test capabilities file
assertFalse(wfs.supportsOperation(DESCRIBE_FEATURETYPE, true));
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
assertTrue(wfs.supportsOperation(DESCRIBE_FEATURETYPE, false));
assertTrue(wfs.supportsOperation(DESCRIBE_FEATURETYPE, true));
}
/**
* Test method for
* {@link WFS_1_1_0_Protocol#getOperationURL(org.geotools.data.wfs.protocol.wfs.WFSOperationType, org.geotools.data.wfs.protocol.http.HttpMethod)}
* .
*
* @throws IOException
*/
@Test
public void testGetOperationURL() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
URL operationURL = wfs.getOperationURL(DESCRIBE_FEATURETYPE, false);
assertNotNull(operationURL);
assertEquals("http://localhost:8080/geoserver/wfs?", operationURL.toExternalForm());
// post was deliberately left off on the test capabilities file
assertNull(wfs.getOperationURL(DESCRIBE_FEATURETYPE, true));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeTitle(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeTitle() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertEquals("archsites_Type", wfs.getFeatureTypeTitle(GEOS_ARCHSITES.FEATURETYPENAME));
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeAbstract(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeAbstract() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
assertEquals("Generated from sfArchsites", wfs
.getFeatureTypeAbstract(GEOS_ARCHSITES.FEATURETYPENAME));
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
assertNull(wfs.getFeatureTypeAbstract(CUBEWERX_GOVUNITCE.FEATURETYPENAME));
try {
wfs.getFeatureTypeAbstract("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeWGS84Bounds(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeWGS84Bounds() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getFeatureTypeAbstract("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
ReferencedEnvelope wgs84Bounds = wfs
.getFeatureTypeWGS84Bounds(GEOS_ARCHSITES.FEATURETYPENAME);
assertNotNull(wgs84Bounds);
assertSame(DefaultGeographicCRS.WGS84, wgs84Bounds.getCoordinateReferenceSystem());
assertEquals(-103D, wgs84Bounds.getMinX(), 1.0e-3);
assertEquals(44D, wgs84Bounds.getMinY(), 1.0e-3);
assertEquals(-102D, wgs84Bounds.getMaxX(), 1.0e-3);
assertEquals(45D, wgs84Bounds.getMaxY(), 1.0e-3);
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
assertNotNull(wfs.getFeatureTypeWGS84Bounds(CUBEWERX_GOVUNITCE.FEATURETYPENAME));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getDefaultCRS(java.lang.String)}.
*
* @throws IOException
*/
@Test
public void testGetDefaultCRS() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getDefaultCRS("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
assertEquals("EPSG:26713", wfs.getDefaultCRS(GEOS_ARCHSITES.FEATURETYPENAME));
assertEquals("EPSG:4326", wfs.getDefaultCRS(GEOS_STATES.FEATURETYPENAME));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getSupportedCRSIdentifiers(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetSupportedCRSIdentifiers() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getSupportedCRSIdentifiers("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
Set<String> supportedCRSs;
supportedCRSs = wfs.getSupportedCRSIdentifiers(GEOS_ARCHSITES.FEATURETYPENAME);
// capabilities doesn't set other crs's for this feature type than the default one...
assertNotNull(supportedCRSs);
assertEquals(1, supportedCRSs.size());
assertTrue(supportedCRSs.contains("EPSG:26713"));
createTestProtocol(CUBEWERX_GOVUNITCE.CAPABILITIES);
supportedCRSs = wfs.getSupportedCRSIdentifiers(CUBEWERX_GOVUNITCE.FEATURETYPENAME);
// capabilities defines more crs's for this ftype
assertNotNull(supportedCRSs);
assertEquals(2, supportedCRSs.size());
assertTrue(supportedCRSs.contains("EPSG:4269"));
assertTrue(supportedCRSs.contains("EPSG:4326"));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureTypeKeywords(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetFeatureTypeKeywords() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getFeatureTypeKeywords("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
Set<String> keywords;
keywords = wfs.getFeatureTypeKeywords(GEOS_ARCHSITES.FEATURETYPENAME);
assertNotNull(keywords);
assertEquals(1, keywords.size());
assertTrue(keywords.contains("archsites sfArchsites"));
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getDescribeFeatureTypeURLGet(java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testGetDescribeFeatureTypeURLGet() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.getDescribeFeatureTypeURLGet("nonExistentTypeName");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
URL url;
url = wfs.getDescribeFeatureTypeURLGet(GEOS_ARCHSITES.FEATURETYPENAME);
assertNotNull(url);
String externalForm = url.toExternalForm();
externalForm = URLDecoder.decode(externalForm, "UTF-8");
assertTrue(externalForm.startsWith("http://localhost:8080/geoserver/wfs?"));
assertTrue(externalForm.contains("REQUEST=DescribeFeatureType"));
assertTrue(externalForm.contains("TYPENAME=sf:archsites"));
assertTrue(externalForm.contains("VERSION=1.1.0"));
assertTrue(externalForm.contains("SERVICE=WFS"));
assertTrue(externalForm.contains("NAMESPACE=xmlns(sf=http://www.openplans.org/spearfish)"));
// assertTrue(externalForm.contains("OUTPUTFORMAT=text/xml; subtype=gml/3.1.1"));
}
/**
* Test method for
* {@link WFS_1_1_0_Protocol#describeFeatureType(java.lang.String, java.lang.String)} .
*
* @throws IOException
*/
@Test
public void testDescribeFeatureType_HTTP_GET() throws IOException {
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES);
try {
wfs.describeFeatureTypeGET("nonExistentTypeName", "text/xml; subtype=gml/3.1.1");
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
HTTPResponse httpResponse = new TestHttpResponse("text/xml; subtype=gml/3.1.1", null,
"mock-content");
TestHttpProtocol mockHttp = new TestHttpProtocol(httpResponse);
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp);
WFSResponse wfsResponse;
wfsResponse = wfs.describeFeatureTypeGET(GEOS_ARCHSITES.FEATURETYPENAME,
"text/xml; subtype=gml/3.1.1");
URL baseUrl = mockHttp.targetUrl;
assertNotNull(baseUrl);
String externalForm = baseUrl.toExternalForm();
externalForm = URLDecoder.decode(externalForm, "UTF-8");
assertTrue(externalForm.startsWith("http://localhost:8080/geoserver/wfs?"));
assertTrue(externalForm.contains("REQUEST=DescribeFeatureType"));
assertTrue(externalForm.contains("TYPENAME=sf:archsites"));
assertTrue(externalForm.contains("VERSION=1.1.0"));
assertTrue(externalForm.contains("SERVICE=WFS"));
assertTrue(externalForm.contains("NAMESPACE=xmlns(sf=http://www.openplans.org/spearfish)"));
// assertTrue(externalForm.contains("OUTPUTFORMAT=text/xml; subtype=gml/3.1.1"));
assertNotNull(wfsResponse);
assertEquals(Charset.forName("UTF-8"), wfsResponse.getCharacterEncoding());
assertEquals("text/xml; subtype=gml/3.1.1", wfsResponse.getContentType());
assertNotNull(wfsResponse.getInputStream());
}
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureHits(org.geotools.data.Query)} .
* <p>
* If the server returns a FeatureCollection with numberOfFeatures=N attribute, {@code
* getFeatureHits} shall return N
* </p>
*
* @throws IOException
*/
/*
* @Test public void testGetFeatureHitsSupported() throws IOException { String responseContent =
* "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
* "<wfs:FeatureCollection numberOfFeatures=\"217\" timeStamp=\"2008-10-24T13:53:53.034-04:00\" "
* +
* "xsi:schemaLocation=\"http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd\" "
* + "xmlns:wfs=\"http://www.opengis.net/wfs\" " +
* "xmlns:topp=\"http://www.openplans.org/topp\" " + "xmlns:seb=\"http://seb.com\" " +
* "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
* "xmlns:ows=\"http://www.opengis.net/ows\" " +
* "xmlns:gml=\"http://www.opengis.net/gml\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"/>";
*
* final TestHttpResponse response = new TestHttpResponse("text/xml; subtype=gml/3.1.1",
* "UTF-8", responseContent);
*
* HTTPProtocol mockHttp = new TestHttpProtocol(response);
*
* createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp); DefaultQuery query = new
* DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
*
* int featureHits = wfs.getFeatureHits(query); assertEquals(217, featureHits); }
*/
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureHits(org.geotools.data.Query)} .
* <p>
* If the server returns an exception report, {@code getFeatureHits} shall throw an IOException
* </p>
*
* @throws IOException
*/
// @Test
/*
* public void testGetFeatureHitsException() throws IOException { String responseContent =
* "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<ows:ExceptionReport version=\"1.0.0\" " +
* "xsi:schemaLocation=\"http://www.opengis.net/ows http://localhost:8080/geoserver/schemas/ows/1.0.0/owsExceptionReport.xsd\""
* +
* " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:ows=\"http://www.opengis.net/ows\">"
* + " <ows:Exception exceptionCode=\"mockExceptionCode\" locator=\"mockLocatorName\">" +
* " <ows:ExceptionText>Feature type sf:archsites2 unknown</ows:ExceptionText>" +
* " <ows:ExceptionText>Details:</ows:ExceptionText>" +
* " <ows:ExceptionText>mock exception report</ows:ExceptionText>" +
* " </ows:Exception></ows:ExceptionReport>";
*
* final TestHttpResponse response = new TestHttpResponse(
* "application/vnd.ogc.se_xml;chatset=UTF-8", "UTF-8", responseContent);
*
* HTTPProtocol mockHttp = new TestHttpProtocol(response);
*
* createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp); DefaultQuery query = new
* DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
*
* try { wfs.getFeatureHits(query);
* fail("Expected IOException if the server returned an exception report"); } catch (IOException
* e) { // make sure the error message propagates assertEquals("mock exception report",
* e.getMessage()); } }
*/
/**
* Test method for {@link WFS_1_1_0_Protocol#getFeatureHits(org.geotools.data.Query)} .
* <p>
* May the server not support resultType=hits even if declared in the capabilities document (eg.
* CubeWerx) and hence return the FeatureCollection with full contents and no {@code
* numberOfFeatures} attribute. In this case return -1.
* </p>
*
* @throws IOException
*/
/*
* @Test public void testGetFeatureHitsNotSupported() throws IOException { String
* responseContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
* "<wfs:FeatureCollection timeStamp=\"2008-10-24T13:53:53.034-04:00\" " +
* "xsi:schemaLocation=\"http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd\" "
* + "xmlns:wfs=\"http://www.opengis.net/wfs\" " +
* "xmlns:topp=\"http://www.openplans.org/topp\" " + "xmlns:seb=\"http://seb.com\" " +
* "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
* "xmlns:ows=\"http://www.opengis.net/ows\" " +
* "xmlns:gml=\"http://www.opengis.net/gml\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"/>";
*
* final TestHttpResponse response = new TestHttpResponse("text/xml; subtype=gml/3.1.1",
* "UTF-8", responseContent);
*
* HTTPProtocol mockHttp = new TestHttpProtocol(response);
*
* createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp); DefaultQuery query = new
* DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
*
* int featureHits = wfs.getFeatureHits(query); assertEquals(-1, featureHits); }
*/
/**
* Test method for {@link WFS_1_1_0_Protocol#issueGetFeatureGET(net.opengis.wfs.GetFeatureType, Map)
*
* @throws IOException
*/
@Test
public void testIssueGetFeature_GET() throws IOException {
final InputStream responseContent = TestData.openStream(this, GEOS_ARCHSITES.DATA);
final TestHttpResponse httpResponse;
final String defaultWfs11OutputFormat = "text/xml; subtype=gml/3.1.1";
httpResponse = new TestHttpResponse(defaultWfs11OutputFormat, "UTF-16", responseContent);
TestHttpProtocol mockHttp = new TestHttpProtocol(httpResponse);
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp);
WFSStrategy strategy = new GeoServerStrategy();
wfs.setStrategy(strategy);
DefaultQuery query = new DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
GetFeature getFeature = new GetFeatureQueryAdapter(query, defaultWfs11OutputFormat,
"EPSG:4326", ResultType.RESULTS);
WFSResponse response;
response = wfs.issueGetFeatureGET(getFeature);
assertNotNull(response);
assertEquals(defaultWfs11OutputFormat, response.getContentType());
assertNotNull(response.getInputStream());
assertEquals(Charset.forName("UTF-16"), response.getCharacterEncoding());
URL baseUrl = mockHttp.targetUrl;
Map<String, String> kvp = mockHttp.issueGetKvp;
assertNotNull(baseUrl);
assertNotNull(kvp);
assertEquals("http://localhost:8080/geoserver/wfs?", baseUrl.toExternalForm());
assertEquals("WFS", kvp.get("SERVICE"));
assertEquals("1.1.0", kvp.get("VERSION"));
assertEquals("GetFeature", kvp.get("REQUEST"));
assertEquals(GEOS_ARCHSITES.FEATURETYPENAME, kvp.get("TYPENAME"));
assertEquals(defaultWfs11OutputFormat, kvp.get("OUTPUTFORMAT"));
assertNotNull(kvp.get("SRSNAME"));
assertNull(kvp.get("PROPERTYNAME"));
assertNull(kvp.get("MAXFEATURES"));
assertNull(kvp.get("FEATUREID"));
assertNull(kvp.get("FILTER"));
}
@Test
public void testIssueGetFeature_GET_OptionalParameters() throws Exception {
final InputStream responseContent = TestData.openStream(this, GEOS_ARCHSITES.DATA);
final TestHttpResponse httpResponse;
final String defaultWfs11OutputFormat = "text/xml; subtype=gml/3.1.1";
httpResponse = new TestHttpResponse(defaultWfs11OutputFormat, "UTF-16", responseContent);
TestHttpProtocol mockHttp = new TestHttpProtocol(httpResponse);
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp);
DefaultQuery query = new DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
query.setMaxFeatures(1000);
query.setPropertyNames(new String[] { "cat", "the_geom" });
query.setCoordinateSystem(CRS.decode("EPSG:23030"));
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);
Filter filter = ff.id(Collections.singleton(ff.featureId("archsites.1")));
query.setFilter(filter);
WFSResponse response;
WFSStrategy strategy = new GeoServerStrategy();
wfs.setStrategy(strategy);
wfs.setDescribeFeatureTypeURLOverride(TestData.url(this, GEOS_ARCHSITES.SCHEMA));
GetFeature getFeature = new GetFeatureQueryAdapter(query, defaultWfs11OutputFormat,
"EPSG:26713", ResultType.RESULTS);
response = wfs.issueGetFeatureGET(getFeature);
assertNotNull(response);
Map<String, String> kvp = mockHttp.issueGetKvp;
assertEquals("1000", kvp.get("MAXFEATURES"));
String propertyName = kvp.get("PROPERTYNAME");
assertEquals("cat,the_geom", propertyName);
String srsName = kvp.get("SRSNAME");
// 23030 is not in the caps, so we assume its not supported
// assertEquals("EPSG:23030", srsName);
assertEquals("EPSG:26713", srsName);
assertEquals("archsites.1", kvp.get("FEATUREID"));
assertNull("FEATUREID and FILTER are mutually exclusive", kvp.get("FILTER"));
// now try with a non feature id filter
filter = ff.equals(ff.property("cat"), ff.literal(1));
query.setFilter(filter);
getFeature = new GetFeatureQueryAdapter(query, defaultWfs11OutputFormat, "EPSG:23030",
ResultType.RESULTS);
response = wfs.issueGetFeatureGET(getFeature);
kvp = mockHttp.issueGetKvp;
assertNull("FEATUREID and FILTER are mutually exclusive", kvp.get("FEATUREID"));
String encodedFilter = kvp.get("FILTER");
assertNotNull(encodedFilter);
Parser filterParser = new Parser(new OGCConfiguration());
Filter parsed = (Filter) filterParser.parse(new StringReader(encodedFilter));
assertTrue(parsed instanceof PropertyIsEqualTo);
}
/**
* Test method for {@link WFS_1_1_0_Protocol#issueGetFeaturePOST(net.opengis.wfs.GetFeatureType)
*
* @throws IOException
* @throws ParserConfigurationException
* @throws SAXException
*/
@Test
public void testIssueGetFeature_POST() throws IOException, ParserConfigurationException,
SAXException {
final InputStream responseContent = TestData.openStream(this, GEOS_ARCHSITES.DATA);
final TestHttpResponse httpResponse;
final String defaultWfs11OutputFormat = "text/xml; subtype=gml/3.1.1";
httpResponse = new TestHttpResponse(defaultWfs11OutputFormat, "UTF-16", responseContent);
TestHttpProtocol mockHttp = new TestHttpProtocol(httpResponse);
createTestProtocol(GEOS_ARCHSITES.CAPABILITIES, mockHttp);
WFSStrategy strategy = new GeoServerStrategy();
wfs.setStrategy(strategy);
DefaultQuery query = new DefaultQuery(GEOS_ARCHSITES.FEATURETYPENAME);
GetFeature getFeature = new GetFeatureQueryAdapter(query, defaultWfs11OutputFormat,
"EPSG:4326", ResultType.RESULTS);
WFSResponse response;
response = wfs.issueGetFeaturePOST(getFeature);
assertNotNull(response);
assertEquals(defaultWfs11OutputFormat, response.getContentType());
assertNotNull(response.getInputStream());
assertEquals(Charset.forName("UTF-16"), response.getCharacterEncoding());
assertEquals(-1, mockHttp.postCallbackContentLength);
assertEquals("text/xml", mockHttp.postCallbackContentType);
Document dom;
String issuedRequest;
{
ByteArrayOutputStream out = mockHttp.postCallbackEncodedRequestBody;
issuedRequest = out.toString();
System.out.println("Issued request: " + issuedRequest);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
dom = docBuilder.parse(new ByteArrayInputStream(out.toByteArray()));
}
//was the featuretype declaration included?
String expectedNsDecl = "xmlns:sf=\"" + GEOS_ARCHSITES.TYPENAME.getNamespaceURI() + "\"";
assertTrue(issuedRequest, issuedRequest.contains(expectedNsDecl));
Element root = dom.getDocumentElement();
assertEquals(WFS.GetFeature.getLocalPart(), root.getLocalName());
assertEquals(WFS.NAMESPACE, root.getNamespaceURI());
}
}