From b1e02ee52100ddb93ca7ab0326a98db654dbece2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=27Hont=20Ren=C3=A9-Luc?= Date: Thu, 15 Nov 2012 17:47:02 +0100 Subject: [PATCH] DescribeFeatureType improvement --- src/mapserver/qgsprojectparser.cpp | 14 +++++++---- src/mapserver/qgswfsserver.cpp | 38 ++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index a3e9e1ed25e..93f4e110514 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -250,6 +250,11 @@ void QgsProjectParser::describeFeatureType( const QString& aTypeName, QDomElemen } QStringList wfsLayersId = wfsLayers(); + QStringList typeNameList; + if ( aTypeName != "" ) + { + typeNameList = aTypeName.split( "," ); + } foreach ( const QDomElement &elem, mProjectLayerElements ) { @@ -258,7 +263,11 @@ void QgsProjectParser::describeFeatureType( const QString& aTypeName, QDomElemen { QgsMapLayer *mLayer = createLayerFromElement( elem ); QgsVectorLayer* layer = dynamic_cast( mLayer ); - if ( layer && wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || layer->name() == aTypeName ) ) + + QString typeName = layer->name(); + typeName = typeName.replace( QString( " " ), QString( "_" ) ); + + if ( layer && wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || typeNameList.contains( typeName ) ) ) { //do a select with searchRect and go through all the features QgsVectorDataProvider* provider = layer->dataProvider(); @@ -270,9 +279,6 @@ void QgsProjectParser::describeFeatureType( const QString& aTypeName, QDomElemen //hidden attributes for this layer const QSet& layerExcludedAttributes = layer->excludeAttributesWFS(); - QString typeName = layer->name(); - typeName = typeName.replace( QString( " " ), QString( "_" ) ); - //xsd:element QDomElement elementElem = doc.createElement( "element"/*xsd:element*/ ); elementElem.setAttribute( "name", typeName ); diff --git a/src/mapserver/qgswfsserver.cpp b/src/mapserver/qgswfsserver.cpp index 3d755054f43..675b791d2db 100644 --- a/src/mapserver/qgswfsserver.cpp +++ b/src/mapserver/qgswfsserver.cpp @@ -284,18 +284,42 @@ QDomDocument QgsWFSServer::describeFeatureType() importElement.setAttribute( "schemaLocation", "http://schemas.opengis.net/gml/2.1.2/feature.xsd" ); schemaElement.appendChild( importElement ); - //read TYPENAME - QString typeName; - QMap::const_iterator type_name_it = mParameterMap.find( "TYPENAME" ); - if ( type_name_it != mParameterMap.end() ) + //defining typename + QString typeName = ""; + + QDomDocument queryDoc; + QString errorMsg; + if ( queryDoc.setContent( mParameterMap.value( "REQUEST_BODY" ), true, &errorMsg ) ) { - typeName = type_name_it.value(); + //read doc + QDomElement queryDocElem = queryDoc.documentElement(); + QDomNodeList docChildNodes = queryDocElem.childNodes(); + if ( docChildNodes.size() ) + { + for ( int i = 0; i < docChildNodes.size(); i++ ) + { + QDomElement docChildElem = docChildNodes.at( i ).toElement(); + if ( docChildElem.tagName() == "TypeName" ) + { + if ( typeName == "" ) + typeName = docChildElem.text(); + else + typeName += "," + docChildElem.text(); + } + } + } + mConfigParser->describeFeatureType( typeName, schemaElement, doc ); } else { - typeName = ""; + //read TYPENAME + QMap::const_iterator type_name_it = mParameterMap.find( "TYPENAME" ); + if ( type_name_it != mParameterMap.end() ) + { + typeName = type_name_it.value(); + } + mConfigParser->describeFeatureType( typeName, schemaElement, doc ); } - mConfigParser->describeFeatureType( typeName, schemaElement, doc ); return doc; }