Skip to content

Commit af7b6be

Browse files
committed
Re-enable WFS Server
1 parent 1a7ad76 commit af7b6be

File tree

3 files changed

+209
-16
lines changed

3 files changed

+209
-16
lines changed

src/mapserver/qgswfsprojectparser.cpp

+203
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgswfsprojectparser.h"
1919
#include "qgsconfigparserutils.h"
20+
#include "qgsmaplayerregistry.h"
2021
#include "qgsvectordataprovider.h"
2122

2223
QgsWFSProjectParser::QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& filePath ):
@@ -392,3 +393,205 @@ QStringList QgsWFSProjectParser::wfstDeleteLayers() const
392393
}
393394
return wfsList;
394395
}
396+
397+
void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const
398+
{
399+
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
400+
if ( projectLayerElements.size() < 1 )
401+
{
402+
return;
403+
}
404+
405+
QStringList wfsLayersId = mProjectParser.wfsLayers();
406+
QStringList typeNameList;
407+
if ( aTypeName != "" )
408+
{
409+
QStringList typeNameSplit = aTypeName.split( "," );
410+
foreach ( const QString &str, typeNameSplit )
411+
{
412+
if ( str.contains( ":" ) )
413+
typeNameList << str.section( ":", 1, 1 );
414+
else
415+
typeNameList << str;
416+
}
417+
}
418+
419+
foreach ( const QDomElement &elem, projectLayerElements )
420+
{
421+
QString type = elem.attribute( "type" );
422+
if ( type == "vector" )
423+
{
424+
//addJoinLayersForElement( elem ); //todo: fixme
425+
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
426+
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
427+
if ( !layer )
428+
continue;
429+
430+
QString typeName = layer->name();
431+
typeName = typeName.replace( " ", "_" );
432+
433+
if ( wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || typeNameList.contains( typeName ) ) )
434+
{
435+
//do a select with searchRect and go through all the features
436+
QgsVectorDataProvider* provider = layer->dataProvider();
437+
if ( !provider )
438+
{
439+
continue;
440+
}
441+
442+
//hidden attributes for this layer
443+
const QSet<QString>& layerExcludedAttributes = layer->excludeAttributesWFS();
444+
445+
//xsd:element
446+
QDomElement elementElem = doc.createElement( "element"/*xsd:element*/ );
447+
elementElem.setAttribute( "name", typeName );
448+
elementElem.setAttribute( "type", "qgs:" + typeName + "Type" );
449+
elementElem.setAttribute( "substitutionGroup", "gml:_Feature" );
450+
parentElement.appendChild( elementElem );
451+
452+
//xsd:complexType
453+
QDomElement complexTypeElem = doc.createElement( "complexType"/*xsd:complexType*/ );
454+
complexTypeElem.setAttribute( "name", typeName + "Type" );
455+
parentElement.appendChild( complexTypeElem );
456+
457+
//xsd:complexType
458+
QDomElement complexContentElem = doc.createElement( "complexContent"/*xsd:complexContent*/ );
459+
complexTypeElem.appendChild( complexContentElem );
460+
461+
//xsd:extension
462+
QDomElement extensionElem = doc.createElement( "extension"/*xsd:extension*/ );
463+
extensionElem.setAttribute( "base", "gml:AbstractFeatureType" );
464+
complexContentElem.appendChild( extensionElem );
465+
466+
//xsd:sequence
467+
QDomElement sequenceElem = doc.createElement( "sequence"/*xsd:sequence*/ );
468+
extensionElem.appendChild( sequenceElem );
469+
470+
//xsd:element
471+
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
472+
geomElem.setAttribute( "name", "geometry" );
473+
QGis::WkbType wkbType = layer->wkbType();
474+
if ( wkbType != QGis::WKBNoGeometry )
475+
{
476+
switch ( wkbType )
477+
{
478+
case QGis::WKBPoint25D:
479+
case QGis::WKBPoint:
480+
geomElem.setAttribute( "type", "gml:PointPropertyType" );
481+
break;
482+
case QGis::WKBLineString25D:
483+
case QGis::WKBLineString:
484+
geomElem.setAttribute( "type", "gml:LineStringPropertyType" );
485+
break;
486+
case QGis::WKBPolygon25D:
487+
case QGis::WKBPolygon:
488+
geomElem.setAttribute( "type", "gml:PolygonPropertyType" );
489+
break;
490+
case QGis::WKBMultiPoint25D:
491+
case QGis::WKBMultiPoint:
492+
geomElem.setAttribute( "type", "gml:MultiPointPropertyType" );
493+
break;
494+
case QGis::WKBMultiLineString25D:
495+
case QGis::WKBMultiLineString:
496+
geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" );
497+
break;
498+
case QGis::WKBMultiPolygon25D:
499+
case QGis::WKBMultiPolygon:
500+
geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" );
501+
break;
502+
default:
503+
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
504+
break;
505+
}
506+
geomElem.setAttribute( "minOccurs", "0" );
507+
geomElem.setAttribute( "maxOccurs", "1" );
508+
sequenceElem.appendChild( geomElem );
509+
}
510+
511+
//const QgsFields& fields = provider->fields();
512+
const QgsFields& fields = layer->pendingFields();
513+
for ( int idx = 0; idx < fields.count(); ++idx )
514+
{
515+
516+
QString attributeName = fields[idx].name();
517+
//skip attribute if excluded from WFS publication
518+
if ( layerExcludedAttributes.contains( attributeName ) )
519+
{
520+
continue;
521+
}
522+
523+
//xsd:element
524+
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
525+
geomElem.setAttribute( "name", attributeName );
526+
QVariant::Type attributeType = fields[idx].type();
527+
if ( attributeType == QVariant::Int )
528+
geomElem.setAttribute( "type", "integer" );
529+
else if ( attributeType == QVariant::Double )
530+
geomElem.setAttribute( "type", "double" );
531+
else
532+
geomElem.setAttribute( "type", "string" );
533+
534+
sequenceElem.appendChild( geomElem );
535+
536+
QString alias = layer->attributeAlias( idx );
537+
if ( !alias.isEmpty() )
538+
{
539+
geomElem.setAttribute( "alias", alias );
540+
}
541+
}
542+
}
543+
}
544+
}
545+
QgsMapLayerRegistry::instance()->removeAllMapLayers();
546+
return;
547+
}
548+
549+
QStringList QgsWFSProjectParser::wfsLayers() const
550+
{
551+
return mProjectParser.wfsLayers();
552+
}
553+
554+
QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aTypeName, bool useCache ) const
555+
{
556+
QList<QgsMapLayer*> layerList;
557+
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
558+
559+
if ( projectLayerElements.size() < 1 )
560+
{
561+
return layerList;
562+
}
563+
QStringList wfsLayersId = wfsLayers();
564+
565+
QStringList typeNameList;
566+
if ( aTypeName != "" )
567+
{
568+
QStringList typeNameSplit = aTypeName.split( "," );
569+
foreach ( const QString &str, typeNameSplit )
570+
{
571+
if ( str.contains( ":" ) )
572+
typeNameList << str.section( ":", 1, 1 );
573+
else
574+
typeNameList << str;
575+
}
576+
}
577+
578+
foreach ( const QDomElement &elem, projectLayerElements )
579+
{
580+
QString type = elem.attribute( "type" );
581+
if ( type == "vector" )
582+
{
583+
//addJoinLayersForElement( elem, useCache ); //todo: fixme
584+
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
585+
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
586+
if ( !layer )
587+
continue;
588+
589+
QString typeName = layer->name();
590+
typeName = typeName.replace( " ", "_" );
591+
592+
if ( wfsLayersId.contains( layer->id() ) && ( aTypeName == "" || typeNameList.contains( typeName ) ) )
593+
layerList.push_back( mLayer );
594+
}
595+
}
596+
return layerList;
597+
}

src/mapserver/qgswfsprojectparser.h

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class QgsWFSProjectParser
3131
QString wfsServiceUrl() const;
3232
void featureTypeList( QDomElement& parentElement, QDomDocument& doc ) const;
3333

34+
void describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const;
35+
36+
QStringList wfsLayers() const;
37+
38+
QList<QgsMapLayer*> mapLayerFromTypeName( const QString& aTypeName, bool useCache = true ) const;
39+
3440
private:
3541
QgsServerProjectParser mProjectParser;
3642

src/mapserver/qgswfsserver.cpp

-16
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,6 @@ QDomDocument QgsWFSServer::describeFeatureType()
307307
QgsDebugMsg( "Entering." );
308308
QDomDocument doc;
309309

310-
#if 0 //todo: fixme
311-
312310
//xsd:schema
313311
QDomElement schemaElement = doc.createElement( "schema"/*xsd:schema*/ );
314312
schemaElement.setAttribute( "xmlns", "http://www.w3.org/2001/XMLSchema" );
@@ -364,14 +362,11 @@ QDomDocument QgsWFSServer::describeFeatureType()
364362
mConfigParser->describeFeatureType( typeName, schemaElement, doc );
365363
}
366364

367-
#endif //0 //todo: fixme
368-
369365
return doc;
370366
}
371367

372368
int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format )
373369
{
374-
#if 0 //todo: fixme
375370
QgsDebugMsg( "Info format is:" + format );
376371

377372
QStringList wfsLayersId = mConfigParser->wfsLayers();
@@ -1080,14 +1075,11 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10801075
else
10811076
endGetFeature( request, format );
10821077

1083-
#endif // 0 //todo: fixme
1084-
10851078
return 0;
10861079
}
10871080

10881081
void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect )
10891082
{
1090-
#if 0 //todo: fixme
10911083
QByteArray result;
10921084
QString fcString;
10931085
if ( format == "GeoJSON" )
@@ -1214,9 +1206,6 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
12141206
request.sendGetFeatureResponse( &result );
12151207
}
12161208
fcString = "";
1217-
1218-
#endif //0 //todo: fixme
1219-
12201209
}
12211210

12221211
void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /*const*/
@@ -1286,9 +1275,6 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
12861275
{
12871276
// Getting the transaction document
12881277
QDomDocument doc;
1289-
return doc;
1290-
1291-
#if 0 //todo: fixme
12921278

12931279
QString errorMsg;
12941280
if ( !doc.setContent( requestBody, true, &errorMsg ) )
@@ -1650,8 +1636,6 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
16501636
respElem.appendChild( trElem );
16511637

16521638
return resp;
1653-
1654-
#endif //0 //todo: fixme
16551639
}
16561640

16571641
QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, QgsVectorLayer* layer )

0 commit comments

Comments
 (0)