42 #ifdef HAVE_SERVER_PYTHON_PLUGINS
46 const QDomDocument *capabilitiesDocument =
nullptr;
48 #ifdef HAVE_SERVER_PYTHON_PLUGINS
50 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
52 capabilitiesDocument = &doc;
62 capabilitiesDocument = &doc;
66 capabilitiesDocument = &doc;
68 response.
setHeader( QStringLiteral(
"Content-Type" ), QStringLiteral(
"text/xml; charset=utf-8" ) );
69 response.
write( capabilitiesDocument->toByteArray() );
81 QDomElement wfsCapabilitiesElement = doc.createElement( QStringLiteral(
"WFS_Capabilities" ) );
82 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns" ),
WFS_NAMESPACE );
83 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
84 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ),
WFS_NAMESPACE +
" http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" );
85 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:ogc" ),
OGC_NAMESPACE );
86 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:gml" ),
GML_NAMESPACE );
87 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
88 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
89 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0.0" ) );
90 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"updateSequence" ), QStringLiteral(
"0" ) );
91 doc.appendChild( wfsCapabilitiesElement );
106 QDomElement filterCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Filter_Capabilities" ) );
107 wfsCapabilitiesElement.appendChild( filterCapabilitiesElement );
108 QDomElement spatialCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Capabilities" ) );
109 filterCapabilitiesElement.appendChild( spatialCapabilitiesElement );
110 QDomElement spatialOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Operators" ) );
111 spatialCapabilitiesElement.appendChild( spatialOperatorsElement );
112 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:BBOX" ) ) );
113 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Disjoint" ) ) );
114 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Intersect" ) ) );
115 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Touches" ) ) );
116 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Crosses" ) ) );
117 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Contains" ) ) );
118 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Overlaps" ) ) );
119 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Within" ) ) );
120 QDomElement scalarCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Scalar_Capabilities" ) );
121 filterCapabilitiesElement.appendChild( scalarCapabilitiesElement );
122 QDomElement comparisonOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Comparison_Operators" ) );
123 scalarCapabilitiesElement.appendChild( comparisonOperatorsElement );
124 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Simple_Comparisons" ) ) );
125 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Between" ) ) );
126 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Like" ) ) );
135 QDomElement serviceElem = doc.createElement( QStringLiteral(
"Service" ) );
138 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
139 QDomText nameText = doc.createTextNode(
"WFS" );
140 nameElem.appendChild( nameText );
141 serviceElem.appendChild( nameElem );
144 if ( !title.isEmpty() )
146 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
147 QDomText titleText = doc.createTextNode( title );
148 titleElem.appendChild( titleText );
149 serviceElem.appendChild( titleElem );
153 if ( !
abstract.isEmpty() )
155 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
156 QDomText abstractText = doc.createCDATASection(
abstract );
157 abstractElem.appendChild( abstractText );
158 serviceElem.appendChild( abstractElem );
162 if ( !keywords.isEmpty() && !keywords.join( QStringLiteral(
", " ) ).isEmpty() )
164 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
165 QDomText keywordsText = doc.createTextNode( keywords.join( QStringLiteral(
", " ) ) );
166 keywordsElem.appendChild( keywordsText );
167 serviceElem.appendChild( keywordsElem );
170 QDomElement onlineResourceElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
172 if ( !onlineResource.isEmpty() )
174 QDomText onlineResourceText = doc.createTextNode( onlineResource );
175 onlineResourceElem.appendChild( onlineResourceText );
177 serviceElem.appendChild( onlineResourceElem );
180 if ( !fees.isEmpty() )
182 QDomElement feesElem = doc.createElement( QStringLiteral(
"Fees" ) );
183 QDomText feesText = doc.createTextNode( fees );
184 feesElem.appendChild( feesText );
185 serviceElem.appendChild( feesElem );
189 if ( !accessConstraints.isEmpty() )
191 QDomElement accessConstraintsElem = doc.createElement( QStringLiteral(
"AccessConstraints" ) );
192 QDomText accessConstraintsText = doc.createTextNode( accessConstraints );
193 accessConstraintsElem.appendChild( accessConstraintsText );
194 serviceElem.appendChild( accessConstraintsElem );
204 QDomElement capabilityElement = doc.createElement( QStringLiteral(
"Capability" ) );
207 QDomElement requestElement = doc.createElement( QStringLiteral(
"Request" ) );
208 capabilityElement.appendChild( requestElement );
210 QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral(
"GetCapabilities" ) );
211 requestElement.appendChild( getCapabilitiesElement );
213 QDomElement dcpTypeElement = doc.createElement( QStringLiteral(
"DCPType" ) );
214 getCapabilitiesElement.appendChild( dcpTypeElement );
215 QDomElement httpElement = doc.createElement( QStringLiteral(
"HTTP" ) );
216 dcpTypeElement.appendChild( httpElement );
219 QString hrefString =
serviceUrl( request, project );
222 QDomElement getElement = doc.createElement( QStringLiteral(
"Get" ) );
223 httpElement.appendChild( getElement );
224 getElement.setAttribute( QStringLiteral(
"onlineResource" ), hrefString );
225 QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
226 getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
227 getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement );
230 QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral(
"DescribeFeatureType" ) );
231 requestElement.appendChild( describeFeatureTypeElement );
232 QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral(
"SchemaDescriptionLanguage" ) );
233 describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement );
234 QDomElement xmlSchemaElement = doc.createElement( QStringLiteral(
"XMLSCHEMA" ) );
235 schemaDescriptionLanguageElement.appendChild( xmlSchemaElement );
236 QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();
237 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement );
238 QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
239 describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
240 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement );
243 QDomElement getFeatureElement = doc.createElement( QStringLiteral(
"GetFeature" ) );
244 requestElement.appendChild( getFeatureElement );
245 QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral(
"ResultFormat" ) );
246 getFeatureElement.appendChild( getFeatureFormatElement );
247 QDomElement gmlFormatElement = doc.createElement( QStringLiteral(
"GML2" ) );
248 getFeatureFormatElement.appendChild( gmlFormatElement );
249 QDomElement gml3FormatElement = doc.createElement( QStringLiteral(
"GML3" ) );
250 getFeatureFormatElement.appendChild( gml3FormatElement );
251 QDomElement geojsonFormatElement = doc.createElement( QStringLiteral(
"GeoJSON" ) );
252 getFeatureFormatElement.appendChild( geojsonFormatElement );
253 QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();
254 getFeatureElement.appendChild( getFeatureDhcTypeGetElement );
255 QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
256 getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
257 getFeatureElement.appendChild( getFeatureDhcTypePostElement );
260 QDomElement transactionElement = doc.createElement( QStringLiteral(
"Transaction" ) );
261 requestElement.appendChild( transactionElement );
262 QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();
263 transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
264 transactionElement.appendChild( transactionDhcTypeElement );
266 return capabilityElement;
271 #ifdef HAVE_SERVER_PYTHON_PLUGINS
278 QDomElement featureTypeListElement = doc.createElement( QStringLiteral(
"FeatureTypeList" ) );
280 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
281 featureTypeListElement.appendChild( operationsElement );
283 QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
284 operationsElement.appendChild( queryElement );
301 #ifdef HAVE_SERVER_PYTHON_PLUGINS
307 QDomElement layerElem = doc.createElement( QStringLiteral(
"FeatureType" ) );
310 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
315 QDomText nameText = doc.createTextNode(
typeName );
316 nameElem.appendChild( nameText );
317 layerElem.appendChild( nameElem );
320 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
321 QString title = layer->
title();
322 if ( title.isEmpty() )
324 title = layer->
name();
326 QDomText titleText = doc.createTextNode( title );
327 titleElem.appendChild( titleText );
328 layerElem.appendChild( titleElem );
331 QString
abstract = layer->
abstract();
332 if ( !
abstract.isEmpty() )
334 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
335 QDomText abstractText = doc.createTextNode(
abstract );
336 abstractElem.appendChild( abstractText );
337 layerElem.appendChild( abstractElem );
342 if ( !keywords.isEmpty() )
344 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
345 QDomText keywordsText = doc.createTextNode( keywords );
346 keywordsElem.appendChild( keywordsText );
347 layerElem.appendChild( keywordsElem );
351 QDomElement srsElem = doc.createElement( QStringLiteral(
"SRS" ) );
352 QDomText srsText = doc.createTextNode( layer->
crs().
authid() );
353 srsElem.appendChild( srsText );
354 layerElem.appendChild( srsElem );
365 QDomElement bBoxElement = doc.createElement( QStringLiteral(
"LatLongBoundingBox" ) );
370 layerElem.appendChild( bBoxElement );
374 if ( !metadataUrl.isEmpty() )
376 QDomElement metaUrlElem = doc.createElement( QStringLiteral(
"MetadataURL" ) );
378 metaUrlElem.setAttribute( QStringLiteral(
"type" ), metadataUrlType );
380 if ( metadataUrlFormat == QLatin1String(
"text/xml" ) )
382 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"XML" ) );
386 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"TXT" ) );
388 QDomText metaUrlText = doc.createTextNode( metadataUrl );
389 metaUrlElem.appendChild( metaUrlText );
390 layerElem.appendChild( metaUrlElem );
394 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
396 QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
397 operationsElement.appendChild( queryElement );
398 if ( wfstUpdateLayersId.contains( layer->
id() ) ||
399 wfstInsertLayersId.contains( layer->
id() ) ||
400 wfstDeleteLayersId.contains( layer->
id() ) )
407 QDomElement insertElement = doc.createElement( QStringLiteral(
"Insert" ) );
408 operationsElement.appendChild( insertElement );
412 wfstUpdateLayersId.contains( layer->
id() ) )
415 QDomElement updateElement = doc.createElement( QStringLiteral(
"Update" ) );
416 operationsElement.appendChild( updateElement );
421 QDomElement deleteElement = doc.createElement( QStringLiteral(
"Delete" ) );
422 operationsElement.appendChild( deleteElement );
426 layerElem.appendChild( operationsElement );
428 featureTypeListElement.appendChild( layerElem );
431 return featureTypeListElement;