From 7645234b6d9d7d7229ccf0a8cd682db8c2307c76 Mon Sep 17 00:00:00 2001 From: Dirk Stenger Date: Fri, 22 Apr 2016 16:40:42 +0200 Subject: [PATCH 1/7] Extended WFS TransactionHandler to evaluate an incoming srsName when processing an Insert transaction. --- .../services/wfs/TransactionHandler.java | 30 +++++++++++++++++-- .../services/wfs/WebFeatureService.java | 6 ++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index 96d4f5b403..9d1b68da68 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -194,12 +194,14 @@ class TransactionHandler { * * @param response * response that is used to write the result + * @param queryCRS + * list of all supported CRS * @throws OWSException * if a WFS specific exception occurs, e.g. a feature type is not served * @throws IOException * @throws XMLStreamException */ - void doTransaction( HttpResponseBuffer response ) + void doTransaction( HttpResponseBuffer response, List queryCRS ) throws OWSException, XMLStreamException, IOException { LOG.debug( "doTransaction: " + request ); @@ -226,7 +228,9 @@ void doTransaction( HttpResponseBuffer response ) break; } case INSERT: { - doInsert( (Insert) operation ); + Insert insert = (Insert) operation; + evaluateSrsName( insert, queryCRS ); + doInsert( insert ); break; } case NATIVE: { @@ -901,4 +905,24 @@ private GMLVersion determineFormat( Version requestVersion, String format ) { } return gmlVersion; } -} + + private void evaluateSrsName( Insert insert, List queryCRS ) + throws OWSException { + String srsName = insert.getSrsName(); + if ( srsName != null && queryCRS != null ) { + if ( !queryCRS.contains( CRSManager.getCRSRef( srsName ) ) ) { + String message = "The value of the srsName parameter is not one of the SRS values the server claims to support in its capabilities document."; + String handle = retrieveHandle( insert ); + throw new OWSException( message, OWSException.OPERATION_PROCESSING_FAILED, handle ); + } + } + } + + private String retrieveHandle( Insert insert ) { + String handle = insert.getHandle(); + if ( handle == null || "".equals( handle ) ) + return "Transaction"; + return handle; + } + +} \ No newline at end of file diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/WebFeatureService.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/WebFeatureService.java index f17c5f513d..2139590790 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/WebFeatureService.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/WebFeatureService.java @@ -790,7 +790,7 @@ public void doKVP( Map kvpParamsUC, HttpServletRequest request, } checkTransactionsEnabled( requestName ); Transaction transaction = TransactionKVPAdapter.parse( kvpParamsUC ); - new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response ); + new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response, queryCRS ); break; default: throw new RuntimeException( "Internal error: Unhandled request '" + requestName + "'." ); @@ -946,7 +946,7 @@ public void doXML( XMLStreamReader xmlStream, HttpServletRequest request, HttpRe checkTransactionsEnabled( requestName ); TransactionXmlReader transactionReader = new TransactionXmlReaderFactory().createReader( xmlStream ); Transaction transaction = transactionReader.read( xmlStream ); - new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response ); + new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response, queryCRS ); break; default: throw new RuntimeException( "Internal error: Unhandled request '" + requestName + "'." ); @@ -1107,7 +1107,7 @@ public void doSOAP( SOAPEnvelope soapDoc, HttpServletRequest request, HttpRespon checkTransactionsEnabled( requestName ); TransactionXmlReader transactionReader = new TransactionXmlReaderFactory().createReader( requestVersion ); Transaction transaction = transactionReader.read( bodyXmlStream ); - new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response ); + new TransactionHandler( this, service, transaction, idGenMode ).doTransaction( response, queryCRS ); break; default: throw new RuntimeException( "Internal error: Unhandled request '" + requestName + "'." ); From e8ed6a1a07592b74a0ab96adc4af9fa1df687a51 Mon Sep 17 00:00:00 2001 From: Dirk Stenger Date: Mon, 25 Apr 2016 10:22:55 +0200 Subject: [PATCH 2/7] Enhanced srsName evaluation to also consider srsNames of single geometries in TransactionHandler --- .../services/wfs/TransactionHandler.java | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index 9d1b68da68..bb1a36b454 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -92,6 +92,7 @@ import org.deegree.cs.coordinatesystems.ICRS; import org.deegree.cs.exceptions.UnknownCRSException; import org.deegree.cs.persistence.CRSManager; +import org.deegree.cs.refs.coordinatesystem.CRSRef; import org.deegree.feature.Feature; import org.deegree.feature.FeatureCollection; import org.deegree.feature.GenericFeatureCollection; @@ -108,6 +109,7 @@ import org.deegree.filter.Filters; import org.deegree.filter.IdFilter; import org.deegree.filter.OperatorFilter; +import org.deegree.geometry.Geometry; import org.deegree.geometry.GeometryFactory; import org.deegree.geometry.validation.CoordinateValidityInspector; import org.deegree.gml.GMLInputFactory; @@ -228,9 +230,7 @@ void doTransaction( HttpResponseBuffer response, List queryCRS ) break; } case INSERT: { - Insert insert = (Insert) operation; - evaluateSrsName( insert, queryCRS ); - doInsert( insert ); + doInsert( (Insert) operation, queryCRS ); break; } case NATIVE: { @@ -362,10 +362,11 @@ private void doDelete( Delete delete, Lock lock ) } } - private void doInsert( Insert insert ) + private void doInsert( Insert insert, List queryCRS ) throws OWSException { LOG.debug( "doInsert: " + insert ); + evaluateSrsNameForInsert( insert, queryCRS ); if ( service.getStores().length == 0 ) { throw new OWSException( "Cannot perform insert. No feature store defined.", NO_APPLICABLE_CODE ); @@ -397,6 +398,7 @@ private void doInsert( Insert insert ) try { XMLStreamReader xmlStream = insert.getFeatures(); FeatureCollection fc = parseFeaturesOrCollection( xmlStream, inputFormat, defaultCRS ); + evaluateSrsNameForFeatureCollection( fc, queryCRS, insert.getHandle() ); FeatureStore fs = service.getStores()[0]; ta = acquireTransaction( fs ); IDGenMode mode = insert.getIdGen(); @@ -906,23 +908,36 @@ private GMLVersion determineFormat( Version requestVersion, String format ) { return gmlVersion; } - private void evaluateSrsName( Insert insert, List queryCRS ) + private void evaluateSrsNameForInsert( Insert insert, List queryCRS ) throws OWSException { String srsName = insert.getSrsName(); + if ( srsName != null ) { + CRSRef crs = CRSManager.getCRSRef( srsName ); + evaluateSrsName( crs, queryCRS, insert.getHandle() ); + } + } + + private void evaluateSrsNameForFeatureCollection( FeatureCollection fc, List queryCRS, String handle ) + throws OWSException { + List geometries = fc.getGeometryProperties(); + for ( Property geometry : geometries ) { + if ( geometry instanceof Geometry ) { + ICRS crs = ( (Geometry) geometry ).getCoordinateSystem(); + evaluateSrsName( crs, queryCRS, handle ); + } + } + } + + private void evaluateSrsName( ICRS srsName, List queryCRS, String handle ) + throws OWSException { if ( srsName != null && queryCRS != null ) { - if ( !queryCRS.contains( CRSManager.getCRSRef( srsName ) ) ) { + if ( !queryCRS.contains( srsName ) ) { String message = "The value of the srsName parameter is not one of the SRS values the server claims to support in its capabilities document."; - String handle = retrieveHandle( insert ); + if ( handle == null || "".equals( handle ) ) + handle = "Transaction"; throw new OWSException( message, OWSException.OPERATION_PROCESSING_FAILED, handle ); } } } - private String retrieveHandle( Insert insert ) { - String handle = insert.getHandle(); - if ( handle == null || "".equals( handle ) ) - return "Transaction"; - return handle; - } - } \ No newline at end of file From 3e84e60f2d6c738b9622262d149aeb4456b94976 Mon Sep 17 00:00:00 2001 From: Dirk Stenger Date: Mon, 25 Apr 2016 12:14:16 +0200 Subject: [PATCH 3/7] Extended evaluateSrsNameForFeatureCollection to scan all features and properties --- .../services/wfs/TransactionHandler.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index bb1a36b454..ef02d5a8b0 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -47,6 +47,7 @@ import static org.deegree.commons.xml.CommonNamespaces.XLNNS; import static org.deegree.commons.xml.XMLAdapter.writeElement; import static org.deegree.commons.xml.stax.XMLStreamUtils.skipElement; +import static org.deegree.feature.Features.findFeaturesAndGeometries; import static org.deegree.gml.GMLInputFactory.createGMLStreamReader; import static org.deegree.gml.GMLVersion.GML_32; import static org.deegree.protocol.wfs.WFSConstants.VERSION_100; @@ -66,9 +67,11 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; @@ -413,6 +416,8 @@ private void doInsert( Insert insert, List queryCRS ) for ( String newFid : newFids ) { inserted.add( newFid, insert.getHandle() ); } + } catch ( OWSException e ) { + throw e; } catch ( XMLParsingException e ) { String exceptionCode = INVALID_PARAMETER_VALUE; if ( VERSION_200.equals( request.getVersion() ) ) { @@ -919,12 +924,13 @@ private void evaluateSrsNameForInsert( Insert insert, List queryCRS ) private void evaluateSrsNameForFeatureCollection( FeatureCollection fc, List queryCRS, String handle ) throws OWSException { - List geometries = fc.getGeometryProperties(); - for ( Property geometry : geometries ) { - if ( geometry instanceof Geometry ) { - ICRS crs = ( (Geometry) geometry ).getCoordinateSystem(); - evaluateSrsName( crs, queryCRS, handle ); - } + Set geometries = new LinkedHashSet(); + for ( Feature feature : fc ) + findFeaturesAndGeometries( feature, geometries, new LinkedHashSet(), new LinkedHashSet(), + new LinkedHashSet() ); + for ( Geometry geometry : geometries ) { + ICRS crs = geometry.getCoordinateSystem(); + evaluateSrsName( crs, queryCRS, handle ); } } From 29f2b0f413614b6e5b723426a8f4260dcf506177 Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Tue, 26 Apr 2016 09:56:46 +0200 Subject: [PATCH 4/7] refactoring: evaluate feature per feature collection --- .../services/wfs/TransactionHandler.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index ef02d5a8b0..66519c8be2 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -435,8 +435,10 @@ private void doInsert( Insert insert, List queryCRS ) private FeatureCollection parseFeaturesOrCollection( XMLStreamReader xmlStream, GMLVersion inputFormat, ICRS defaultCRS ) - throws XMLStreamException, XMLParsingException, UnknownCRSException, - ReferenceResolvingException { + throws XMLStreamException, + XMLParsingException, + UnknownCRSException, + ReferenceResolvingException { FeatureCollection fc = null; @@ -616,7 +618,8 @@ private List getReplacementProps( Update update, Feat PropertyType pt = ft.getPropertyDeclaration( propName ); if ( pt == null ) { throw new OWSException( "Cannot update property '" + propName + "' of feature type '" + ft.getName() - + "'. The feature type does not define this property.", OPERATION_NOT_SUPPORTED ); + + "'. The feature type does not define this property.", + OPERATION_NOT_SUPPORTED ); } XMLStreamReader xmlStream = replacement.getReplacementValue(); int index = simpleMultiProp == null ? 0 : simpleMultiProp.second; @@ -633,7 +636,8 @@ private List getReplacementProps( Update update, Feat GMLFeatureReader featureReader = gmlReader.getFeatureReader(); ICRS crs = master.getDefaultQueryCrs(); - Property prop = featureReader.parseProperty( new XMLStreamReaderWrapper( xmlStream, null ), pt, crs ); + Property prop = featureReader.parseProperty( new XMLStreamReaderWrapper( xmlStream, null ), pt, + crs ); // TODO make this hack unnecessary TypedObjectNode propValue = prop.getValue(); @@ -924,10 +928,15 @@ private void evaluateSrsNameForInsert( Insert insert, List queryCRS ) private void evaluateSrsNameForFeatureCollection( FeatureCollection fc, List queryCRS, String handle ) throws OWSException { - Set geometries = new LinkedHashSet(); for ( Feature feature : fc ) - findFeaturesAndGeometries( feature, geometries, new LinkedHashSet(), new LinkedHashSet(), - new LinkedHashSet() ); + evaluateSrsNameForFeature( feature, queryCRS, handle ); + } + + private void evaluateSrsNameForFeature( Feature feature, List queryCRS, String handle ) + throws OWSException { + Set geometries = new LinkedHashSet(); + findFeaturesAndGeometries( feature, geometries, new LinkedHashSet(), new LinkedHashSet(), + new LinkedHashSet() ); for ( Geometry geometry : geometries ) { ICRS crs = geometry.getCoordinateSystem(); evaluateSrsName( crs, queryCRS, handle ); From 120424677428cf5ace2b0418045f7df14723387f Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Tue, 26 Apr 2016 10:08:09 +0200 Subject: [PATCH 5/7] throw InvalidParameterValue Exception is srsName parameter is not supported --- .../services/wfs/TransactionHandler.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index 66519c8be2..0e306db535 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -95,7 +95,6 @@ import org.deegree.cs.coordinatesystems.ICRS; import org.deegree.cs.exceptions.UnknownCRSException; import org.deegree.cs.persistence.CRSManager; -import org.deegree.cs.refs.coordinatesystem.CRSRef; import org.deegree.feature.Feature; import org.deegree.feature.FeatureCollection; import org.deegree.feature.GenericFeatureCollection; @@ -369,7 +368,6 @@ private void doInsert( Insert insert, List queryCRS ) throws OWSException { LOG.debug( "doInsert: " + insert ); - evaluateSrsNameForInsert( insert, queryCRS ); if ( service.getStores().length == 0 ) { throw new OWSException( "Cannot perform insert. No feature store defined.", NO_APPLICABLE_CODE ); @@ -383,17 +381,7 @@ private void doInsert( Insert insert, List queryCRS ) throw new OWSException( msg, NO_APPLICABLE_CODE ); } - ICRS defaultCRS = null; - if ( insert.getSrsName() != null ) { - try { - defaultCRS = CRSManager.lookup( insert.getSrsName() ); - } catch ( UnknownCRSException e ) { - String msg = "Cannot perform insert. Specified srsName '" + insert.getSrsName() - + "' is not supported by this WFS."; - throw new OWSException( msg, INVALID_PARAMETER_VALUE, "srsName" ); - } - } - + ICRS defaultCRS = determineDefaultCrs( insert, queryCRS ); GMLVersion inputFormat = determineFormat( request.getVersion(), insert.getInputFormat() ); // TODO streaming @@ -540,7 +528,6 @@ private void doNative( Native nativeOp ) private void doUpdate( Update update, Lock lock ) throws OWSException { - LOG.debug( "doUpdate: " + update ); QName ftName = update.getTypeName(); FeatureType ft = service.lookupFeatureType( ftName ); @@ -917,13 +904,23 @@ private GMLVersion determineFormat( Version requestVersion, String format ) { return gmlVersion; } - private void evaluateSrsNameForInsert( Insert insert, List queryCRS ) + private ICRS determineDefaultCrs( Insert insert, List queryCRS ) throws OWSException { String srsName = insert.getSrsName(); if ( srsName != null ) { - CRSRef crs = CRSManager.getCRSRef( srsName ); - evaluateSrsName( crs, queryCRS, insert.getHandle() ); + try { + ICRS defaultCrs = CRSManager.lookup( insert.getSrsName() ); + if ( !isCrsSupported( defaultCrs, queryCRS ) ) { + String msg = "The value of the srsName parameter is not one of the SRS values the server claims to support in its capabilities document."; + throw new OWSException( msg, INVALID_PARAMETER_VALUE, "srsName" ); + } + return defaultCrs; + } catch ( UnknownCRSException e ) { + String msg = "Cannot perform insert. Specified srsName '" + srsName + "' is not supported by this WFS."; + throw new OWSException( msg, INVALID_PARAMETER_VALUE, "srsName" ); + } } + return null; } private void evaluateSrsNameForFeatureCollection( FeatureCollection fc, List queryCRS, String handle ) @@ -943,16 +940,23 @@ private void evaluateSrsNameForFeature( Feature feature, List queryCRS, St } } - private void evaluateSrsName( ICRS srsName, List queryCRS, String handle ) + private void evaluateSrsName( ICRS crs, List supportedCrs, String handle ) throws OWSException { - if ( srsName != null && queryCRS != null ) { - if ( !queryCRS.contains( srsName ) ) { - String message = "The value of the srsName parameter is not one of the SRS values the server claims to support in its capabilities document."; - if ( handle == null || "".equals( handle ) ) - handle = "Transaction"; - throw new OWSException( message, OWSException.OPERATION_PROCESSING_FAILED, handle ); - } + if ( !isCrsSupported( crs, supportedCrs ) ) { + String message = "The value of the at least one geometrie srs is not one of the SRS values " + + "the server claims to support in its capabilities document."; + if ( handle == null || "".equals( handle ) ) + handle = "Transaction"; + throw new OWSException( message, OWSException.OPERATION_PROCESSING_FAILED, handle ); } } + private boolean isCrsSupported( ICRS crs, List supportedCrs ) + throws OWSException { + if ( crs != null && supportedCrs != null ) + if ( !supportedCrs.contains( crs ) ) + return false; + return true; + } + } \ No newline at end of file From 053078048cafd63140878a00bfb54f0d7cd20233 Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Thu, 28 Apr 2016 14:13:16 +0200 Subject: [PATCH 6/7] #414 - added check if geometries are in the valid domain of the crs --- .../services/wfs/TransactionHandler.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java index 0e306db535..abdf3b370a 100644 --- a/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java +++ b/deegree-services/deegree-services-wfs/src/main/java/org/deegree/services/wfs/TransactionHandler.java @@ -111,8 +111,10 @@ import org.deegree.filter.Filters; import org.deegree.filter.IdFilter; import org.deegree.filter.OperatorFilter; +import org.deegree.geometry.Envelope; import org.deegree.geometry.Geometry; import org.deegree.geometry.GeometryFactory; +import org.deegree.geometry.SimpleGeometryFactory; import org.deegree.geometry.validation.CoordinateValidityInspector; import org.deegree.gml.GMLInputFactory; import org.deegree.gml.GMLStreamReader; @@ -155,6 +157,8 @@ class TransactionHandler { private static final Logger LOG = LoggerFactory.getLogger( TransactionHandler.class ); + private static final SimpleGeometryFactory GEOM_FACTORY = new SimpleGeometryFactory(); + private final WebFeatureService master; private final WfsFeatureStoreManager service; @@ -937,6 +941,7 @@ private void evaluateSrsNameForFeature( Feature feature, List queryCRS, St for ( Geometry geometry : geometries ) { ICRS crs = geometry.getCoordinateSystem(); evaluateSrsName( crs, queryCRS, handle ); + evaluateValidDomain( crs, geometry, handle ); } } @@ -951,6 +956,24 @@ private void evaluateSrsName( ICRS crs, List supportedCrs, String handle ) } } + private void evaluateValidDomain( ICRS crs, Geometry geometry, String handle ) + throws OWSException { + double[] validDomain = crs.getValidDomain(); + if ( validDomain == null ) { + LOG.warn( "Valid domain of crs {} is not available. Check if geometry is inside the valid " + + "domain not possible. The check is skipped and insert processed.", crs.getAlias() ); + return; + } + Envelope validDomainBbox = GEOM_FACTORY.createEnvelope( validDomain[0], validDomain[1], validDomain[2], + validDomain[3], crs ); + if ( !geometry.isWithin( validDomainBbox ) ) { + String message = "At least one geometry is not in the valid domain of the srs."; + if ( handle == null || "".equals( handle ) ) + handle = "Transaction"; + throw new OWSException( message, OWSException.OPERATION_PROCESSING_FAILED, handle ); + } + } + private boolean isCrsSupported( ICRS crs, List supportedCrs ) throws OWSException { if ( crs != null && supportedCrs != null ) From 61821232cc366ef55db0d1e65c6cacdab143e9d9 Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Tue, 22 Aug 2017 15:52:51 +0200 Subject: [PATCH 7/7] #3859 - added EPSG:32615 as configured CRS --- .../src/main/workspace/services/wfs100.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/deegree-workspaces/deegree-workspace-compliance-tests/src/main/workspace/services/wfs100.xml b/deegree-workspaces/deegree-workspace-compliance-tests/src/main/workspace/services/wfs100.xml index 1816778a43..c5f1b73620 100644 --- a/deegree-workspaces/deegree-workspace-compliance-tests/src/main/workspace/services/wfs100.xml +++ b/deegree-workspaces/deegree-workspace-compliance-tests/src/main/workspace/services/wfs100.xml @@ -8,4 +8,5 @@ true true EPSG:4326 + EPSG:32615 \ No newline at end of file