@@ -420,15 +420,31 @@ bool QgsWFSProvider::processSQL( const QString &sqlString, QString &errorMsg, QS
420420 }
421421
422422 QgsWFSDescribeFeatureType describeFeatureType ( mShared ->mURI );
423- if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
424- concatenatedTypenames ) )
423+ bool bUsePlural = false ;
424+ QByteArray response;
425+ for ( int i = 0 ; i < 2 ; i++ )
425426 {
426- errorMsg = tr ( " DescribeFeatureType failed for url %1: %2" ).
427- arg ( dataSourceUri (), describeFeatureType.errorMessage () );
428- return false ;
429- }
427+ if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
428+ concatenatedTypenames, bUsePlural ) )
429+ {
430+ errorMsg = tr ( " DescribeFeatureType failed for url %1: %2" ).
431+ arg ( dataSourceUri (), describeFeatureType.errorMessage () );
432+ return false ;
433+ }
430434
431- const QByteArray &response = describeFeatureType.response ();
435+ response = describeFeatureType.response ();
436+ // "http://geoportal.samregion.ru/wfs12?SERVICE=WFS&REQUEST=DescribeFeatureType&TYPENAME=EC_1_132&VERSION=2.0.0"
437+ // returns a <ExceptionText><![CDATA[Missing typeNames parameter]]></ExceptionText>
438+ if ( i == 0 && response.indexOf ( " <![CDATA[Missing typeNames parameter]]>" ) >= 0 )
439+ {
440+ QgsDebugMsg ( " Server does not accept TYPENAME parameter for DescribeFeatureType. Re-trying with TYPENAMES" );
441+ bUsePlural = true ;
442+ }
443+ else
444+ {
445+ break ;
446+ }
447+ }
432448
433449 QDomDocument describeFeatureDocument;
434450 errorMsg.clear ();
@@ -919,7 +935,7 @@ bool QgsWFSProvider::deleteFeatures( const QgsFeatureIds &id )
919935 transactionDoc.appendChild ( transactionElem );
920936 // delete element
921937 QDomElement deleteElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Delete" ) );
922- deleteElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
938+ deleteElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
923939 QDomElement filterElem = transactionDoc.createElementNS ( QgsWFSConstants::OGC_NAMESPACE, QStringLiteral ( " Filter" ) );
924940
925941
@@ -984,7 +1000,7 @@ bool QgsWFSProvider::changeGeometryValues( const QgsGeometryMap &geometry_map )
9841000 continue ;
9851001 }
9861002 QDomElement updateElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Update" ) );
987- updateElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
1003+ updateElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
9881004 // Property
9891005 QDomElement propertyElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Property" ) );
9901006 QDomElement nameElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Name" ) );
@@ -1040,7 +1056,6 @@ QString QgsWFSProvider::convertToXML( const QVariant &value )
10401056 return valueStr;
10411057}
10421058
1043-
10441059bool QgsWFSProvider::changeAttributeValues ( const QgsChangedAttributesMap &attr_map )
10451060{
10461061 // find out typename from uri and strip namespace prefix
@@ -1066,7 +1081,7 @@ bool QgsWFSProvider::changeAttributeValues( const QgsChangedAttributesMap &attr_
10661081 }
10671082
10681083 QDomElement updateElem = transactionDoc.createElementNS ( QgsWFSConstants::WFS_NAMESPACE, QStringLiteral ( " Update" ) );
1069- updateElem.setAttribute ( QgsWFSUtils::typeNameParameterForVersion ( mShared -> mWFSVersion ), tname );
1084+ updateElem.setAttribute ( QStringLiteral ( " typeName " ), tname );
10701085
10711086 QgsAttributeMap::const_iterator attMapIt = attIt.value ().constBegin ();
10721087 for ( ; attMapIt != attIt.value ().constEnd (); ++attMapIt )
@@ -1159,25 +1174,38 @@ QString QgsWFSProvider::translateMetadataValue( const QString &mdKey, const QVar
11591174 {
11601175 return value.toString ();
11611176 }
1162- }
1177+ };
11631178
1164- bool QgsWFSProvider::describeFeatureType ( QString &geometryAttribute,
1165- QgsFields &fields,
1166- QgsWkbTypes::Type &geomType,
1167- bool forceSingularTypeNames )
1179+ bool QgsWFSProvider::describeFeatureType ( QString &geometryAttribute, QgsFields &fields, QgsWkbTypes::Type &geomType )
11681180{
11691181 fields.clear ();
11701182
11711183 QgsWFSDescribeFeatureType describeFeatureType ( mShared ->mURI );
1172- if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
1173- mShared ->mURI .typeName (), forceSingularTypeNames ) )
1184+ bool bUsePlural = false ;
1185+ QByteArray response;
1186+ for ( int i = 0 ; i < 2 ; i++ )
11741187 {
1175- QgsMessageLog::logMessage ( tr ( " DescribeFeatureType network request failed for url %1: %2" ).
1176- arg ( dataSourceUri (), describeFeatureType.errorMessage () ), tr ( " WFS" ) );
1177- return false ;
1178- }
1188+ if ( !describeFeatureType.requestFeatureType ( mShared ->mWFSVersion ,
1189+ mShared ->mURI .typeName (), bUsePlural ) )
1190+ {
1191+ QgsMessageLog::logMessage ( tr ( " DescribeFeatureType network request failed for url %1: %2" ).
1192+ arg ( dataSourceUri (), describeFeatureType.errorMessage () ), tr ( " WFS" ) );
1193+ return false ;
1194+ }
11791195
1180- const QByteArray &response = describeFeatureType.response ();
1196+ response = describeFeatureType.response ();
1197+ // "http://geoportal.samregion.ru/wfs12?SERVICE=WFS&REQUEST=DescribeFeatureType&TYPENAME=EC_1_132&VERSION=2.0.0"
1198+ // returns a <ExceptionText><![CDATA[Missing typeNames parameter]]></ExceptionText>
1199+ if ( i == 0 && response.indexOf ( " <![CDATA[Missing typeNames parameter]]>" ) >= 0 )
1200+ {
1201+ QgsDebugMsg ( " Server does not accept TYPENAME parameter for DescribeFeatureType. Re-trying with TYPENAMES" );
1202+ bUsePlural = true ;
1203+ }
1204+ else
1205+ {
1206+ break ;
1207+ }
1208+ }
11811209
11821210 QDomDocument describeFeatureDocument;
11831211 QString errorMsg;
@@ -1193,19 +1221,11 @@ bool QgsWFSProvider::describeFeatureType( QString &geometryAttribute,
11931221 mShared ->mURI .typeName (),
11941222 geometryAttribute, fields, geomType, errorMsg ) )
11951223 {
1196- // If 2.0.0, let's assume it was a server that only accepted TYPENAME singular form
1197- // and try with that ...
1198- if ( ! forceSingularTypeNames && mShared ->mWFSVersion .startsWith ( ' 2' ) )
1199- {
1200- return QgsWFSProvider::describeFeatureType ( geometryAttribute,
1201- fields,
1202- geomType,
1203- true );
1204- }
12051224 QgsMessageLog::logMessage ( tr ( " Analysis of DescribeFeatureType response failed for url %1: %2" ).
12061225 arg ( dataSourceUri (), errorMsg ), tr ( " WFS" ) );
12071226 return false ;
12081227 }
1228+
12091229 return true ;
12101230}
12111231
@@ -1479,8 +1499,7 @@ QDomElement QgsWFSProvider::createTransactionElement( QDomDocument &doc ) const
14791499 describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " REQUEST" ), QStringLiteral ( " DescribeFeatureType" ) );
14801500 }
14811501 describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " VERSION" ), QStringLiteral ( " 1.0.0" ) );
1482- // TODO: proper support of 2.0.0, for now hardcoded
1483- describeFeatureTypeURL.addQueryItem ( QgsWFSUtils::typeNameParameterForVersion ( WfsVersion ).toUpper (), mShared ->mURI .typeName () );
1502+ describeFeatureTypeURL.addQueryItem ( QStringLiteral ( " TYPENAME" ), mShared ->mURI .typeName () );
14841503
14851504 transactionElem.setAttribute ( QStringLiteral ( " xsi:schemaLocation" ), mApplicationNamespace + ' '
14861505 + describeFeatureTypeURL.toEncoded () );
0 commit comments