16
16
***************************************************************************/
17
17
18
18
#include " qgswfsprojectparser.h"
19
+ #include " qgsconfigparserutils.h"
20
+ #include " qgsvectordataprovider.h"
19
21
20
22
QgsWFSProjectParser::QgsWFSProjectParser ( QDomDocument* xmlDoc, const QString& filePath ):
21
23
mProjectParser( xmlDoc, filePath )
@@ -25,3 +27,368 @@ QgsWFSProjectParser::QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& f
25
27
QgsWFSProjectParser::~QgsWFSProjectParser ()
26
28
{
27
29
}
30
+
31
+ void QgsWFSProjectParser::serviceCapabilities ( QDomElement& parentElement, QDomDocument& doc ) const
32
+ {
33
+ QDomElement serviceElem = doc.createElement ( " Service" );
34
+
35
+ QDomElement propertiesElem = mProjectParser .propertiesElem ();
36
+ if ( propertiesElem.isNull () )
37
+ {
38
+ QgsConfigParserUtils::fallbackServiceCapabilities ( parentElement, doc );
39
+ return ;
40
+ }
41
+
42
+ QDomElement serviceCapabilityElem = propertiesElem.firstChildElement ( " WMSServiceCapabilities" );
43
+ if ( serviceCapabilityElem.isNull () || serviceCapabilityElem.text ().compare ( " true" , Qt::CaseInsensitive ) != 0 )
44
+ {
45
+ QgsConfigParserUtils::fallbackServiceCapabilities ( parentElement, doc );
46
+ return ;
47
+ }
48
+
49
+ QDomElement wmsNameElem = doc.createElement ( " Name" );
50
+ QDomText wmsNameText = doc.createTextNode ( " WFS" );
51
+ wmsNameElem.appendChild ( wmsNameText );
52
+ serviceElem.appendChild ( wmsNameElem );
53
+
54
+ // WMS title
55
+ QDomElement titleElem = propertiesElem.firstChildElement ( " WMSServiceTitle" );
56
+ if ( !titleElem.isNull () )
57
+ {
58
+ QDomElement wmsTitleElem = doc.createElement ( " Title" );
59
+ QDomText wmsTitleText = doc.createTextNode ( titleElem.text () );
60
+ wmsTitleElem.appendChild ( wmsTitleText );
61
+ serviceElem.appendChild ( wmsTitleElem );
62
+ }
63
+
64
+ // WMS abstract
65
+ QDomElement abstractElem = propertiesElem.firstChildElement ( " WMSServiceAbstract" );
66
+ if ( !abstractElem.isNull () )
67
+ {
68
+ QDomElement wmsAbstractElem = doc.createElement ( " Abstract" );
69
+ QDomText wmsAbstractText = doc.createTextNode ( abstractElem.text () );
70
+ wmsAbstractElem.appendChild ( wmsAbstractText );
71
+ serviceElem.appendChild ( wmsAbstractElem );
72
+ }
73
+
74
+ // keyword list
75
+ QDomElement keywordListElem = propertiesElem.firstChildElement ( " WMSKeywordList" );
76
+ if ( !keywordListElem.isNull () && !keywordListElem.text ().isEmpty () )
77
+ {
78
+ QDomNodeList keywordList = keywordListElem.elementsByTagName ( " value" );
79
+ QStringList keywords;
80
+ for ( int i = 0 ; i < keywordList.size (); ++i )
81
+ {
82
+ keywords << keywordList.at ( i ).toElement ().text ();
83
+ }
84
+
85
+ if ( keywordList.size () > 0 )
86
+ {
87
+ QDomElement wfsKeywordElem = doc.createElement ( " Keywords" );
88
+ QDomText keywordText = doc.createTextNode ( keywords.join ( " , " ) );
89
+ wfsKeywordElem.appendChild ( keywordText );
90
+ serviceElem.appendChild ( wfsKeywordElem );
91
+ }
92
+ }
93
+
94
+ // OnlineResource element is mandatory according to the WMS specification
95
+ QDomElement wmsOnlineResourceElem = propertiesElem.firstChildElement ( " WMSOnlineResource" );
96
+ QDomElement onlineResourceElem = doc.createElement ( " OnlineResource" );
97
+ onlineResourceElem.setAttribute ( " xmlns:xlink" , " http://www.w3.org/1999/xlink" );
98
+ onlineResourceElem.setAttribute ( " xlink:type" , " simple" );
99
+ if ( !wmsOnlineResourceElem.isNull () )
100
+ {
101
+ onlineResourceElem.setAttribute ( " xlink:href" , wmsOnlineResourceElem.text () );
102
+ }
103
+
104
+ serviceElem.appendChild ( onlineResourceElem );
105
+
106
+ // Fees
107
+ QDomElement feesElem = propertiesElem.firstChildElement ( " WMSFees" );
108
+ if ( !feesElem.isNull () )
109
+ {
110
+ QDomElement wmsFeesElem = doc.createElement ( " Fees" );
111
+ QDomText wmsFeesText = doc.createTextNode ( feesElem.text () );
112
+ wmsFeesElem.appendChild ( wmsFeesText );
113
+ serviceElem.appendChild ( wmsFeesElem );
114
+ }
115
+
116
+ // AccessConstraints
117
+ QDomElement accessConstraintsElem = propertiesElem.firstChildElement ( " WMSAccessConstraints" );
118
+ if ( !accessConstraintsElem.isNull () )
119
+ {
120
+ QDomElement wmsAccessConstraintsElem = doc.createElement ( " AccessConstraints" );
121
+ QDomText wmsAccessConstraintsText = doc.createTextNode ( accessConstraintsElem.text () );
122
+ wmsAccessConstraintsElem.appendChild ( wmsAccessConstraintsText );
123
+ serviceElem.appendChild ( wmsAccessConstraintsElem );
124
+ }
125
+ parentElement.appendChild ( serviceElem );
126
+ }
127
+
128
+ QString QgsWFSProjectParser::serviceUrl () const
129
+ {
130
+ return mProjectParser .serviceUrl ();
131
+ }
132
+
133
+ QString QgsWFSProjectParser::wfsServiceUrl () const
134
+ {
135
+ QString url;
136
+
137
+ if ( !mProjectParser .xmlDocument () )
138
+ {
139
+ return url;
140
+ }
141
+
142
+ QDomElement propertiesElem = mProjectParser .propertiesElem ();
143
+ if ( !propertiesElem.isNull () )
144
+ {
145
+ QDomElement wfsUrlElem = propertiesElem.firstChildElement ( " WFSUrl" );
146
+ if ( !wfsUrlElem.isNull () )
147
+ {
148
+ url = wfsUrlElem.text ();
149
+ }
150
+ }
151
+ return url;
152
+ }
153
+
154
+ void QgsWFSProjectParser::featureTypeList ( QDomElement& parentElement, QDomDocument& doc ) const
155
+ {
156
+ const QList<QDomElement>& projectLayerElements = mProjectParser .projectLayerElements ();
157
+ if ( projectLayerElements.size () < 1 )
158
+ {
159
+ return ;
160
+ }
161
+
162
+ QStringList wfsLayersId = mProjectParser .wfsLayers ();
163
+ QStringList wfstUpdateLayersId = wfstUpdateLayers ();
164
+ QStringList wfstInsertLayersId = wfstInsertLayers ();
165
+ QStringList wfstDeleteLayersId = wfstDeleteLayers ();
166
+
167
+ QMap<QString, QgsMapLayer *> layerMap;
168
+
169
+ foreach ( const QDomElement &elem, projectLayerElements )
170
+ {
171
+ QString type = elem.attribute ( " type" );
172
+ if ( type == " vector" )
173
+ {
174
+ // addJoinLayersForElement( elem ); //todo: fixme
175
+ QgsMapLayer *layer = mProjectParser .createLayerFromElement ( elem );
176
+ if ( layer && wfsLayersId.contains ( layer->id () ) )
177
+ {
178
+ QgsDebugMsg ( QString ( " add layer %1 to map" ).arg ( layer->id () ) );
179
+ layerMap.insert ( layer->id (), layer );
180
+
181
+ QDomElement layerElem = doc.createElement ( " FeatureType" );
182
+ QDomElement nameElem = doc.createElement ( " Name" );
183
+ // We use the layer name even though it might not be unique.
184
+ // Because the id sometimes contains user/pw information and the name is more descriptive
185
+ QString typeName = layer->name ();
186
+ typeName = typeName.replace ( " " , " _" );
187
+ QDomText nameText = doc.createTextNode ( typeName );
188
+ nameElem.appendChild ( nameText );
189
+ layerElem.appendChild ( nameElem );
190
+
191
+ QDomElement titleElem = doc.createElement ( " Title" );
192
+ QString titleName = layer->title ();
193
+ if ( titleName.isEmpty () )
194
+ {
195
+ titleName = layer->name ();
196
+ }
197
+ QDomText titleText = doc.createTextNode ( titleName );
198
+ titleElem.appendChild ( titleText );
199
+ layerElem.appendChild ( titleElem );
200
+
201
+ QDomElement abstractElem = doc.createElement ( " Abstract" );
202
+ QString abstractName = layer->abstract ();
203
+ if ( abstractName.isEmpty () )
204
+ {
205
+ abstractName = " " ;
206
+ }
207
+ QDomText abstractText = doc.createTextNode ( abstractName );
208
+ abstractElem.appendChild ( abstractText );
209
+ layerElem.appendChild ( abstractElem );
210
+
211
+ // keyword list
212
+ if ( !layer->keywordList ().isEmpty () )
213
+ {
214
+ QDomElement keywordsElem = doc.createElement ( " Keywords" );
215
+ QDomText keywordsText = doc.createTextNode ( layer->keywordList () );
216
+ keywordsElem.appendChild ( keywordsText );
217
+ layerElem.appendChild ( keywordsElem );
218
+ }
219
+
220
+ // appendExGeographicBoundingBox( layerElem, doc, layer->extent(), layer->crs() );
221
+
222
+ QDomElement srsElem = doc.createElement ( " SRS" );
223
+ QDomText srsText = doc.createTextNode ( layer->crs ().authid () );
224
+ srsElem.appendChild ( srsText );
225
+ layerElem.appendChild ( srsElem );
226
+
227
+ // wfs:Operations element
228
+ QDomElement operationsElement = doc.createElement ( " Operations" /* wfs:Operations*/ );
229
+ // wfs:Query element
230
+ QDomElement queryElement = doc.createElement ( " Query" /* wfs:Query*/ );
231
+ operationsElement.appendChild ( queryElement );
232
+
233
+ QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( layer );
234
+ QgsVectorDataProvider* provider = vlayer->dataProvider ();
235
+ if (( provider->capabilities () & QgsVectorDataProvider::AddFeatures ) && wfstInsertLayersId.contains ( layer->id () ) )
236
+ {
237
+ // wfs:Insert element
238
+ QDomElement insertElement = doc.createElement ( " Insert" /* wfs:Insert*/ );
239
+ operationsElement.appendChild ( insertElement );
240
+ }
241
+ if (( provider->capabilities () & QgsVectorDataProvider::ChangeAttributeValues ) &&
242
+ ( provider->capabilities () & QgsVectorDataProvider::ChangeGeometries ) &&
243
+ wfstUpdateLayersId.contains ( layer->id () ) )
244
+ {
245
+ // wfs:Update element
246
+ QDomElement updateElement = doc.createElement ( " Update" /* wfs:Update*/ );
247
+ operationsElement.appendChild ( updateElement );
248
+ }
249
+ if (( provider->capabilities () & QgsVectorDataProvider::DeleteFeatures ) && wfstDeleteLayersId.contains ( layer->id () ) )
250
+ {
251
+ // wfs:Delete element
252
+ QDomElement deleteElement = doc.createElement ( " Delete" /* wfs:Delete*/ );
253
+ operationsElement.appendChild ( deleteElement );
254
+ }
255
+
256
+ layerElem.appendChild ( operationsElement );
257
+
258
+ QgsRectangle layerExtent = layer->extent ();
259
+ QDomElement bBoxElement = doc.createElement ( " LatLongBoundingBox" );
260
+ bBoxElement.setAttribute ( " minx" , QString::number ( layerExtent.xMinimum () ) );
261
+ bBoxElement.setAttribute ( " miny" , QString::number ( layerExtent.yMinimum () ) );
262
+ bBoxElement.setAttribute ( " maxx" , QString::number ( layerExtent.xMaximum () ) );
263
+ bBoxElement.setAttribute ( " maxy" , QString::number ( layerExtent.yMaximum () ) );
264
+ layerElem.appendChild ( bBoxElement );
265
+
266
+ // layer metadata URL
267
+ QString metadataUrl = layer->metadataUrl ();
268
+ if ( !metadataUrl.isEmpty () )
269
+ {
270
+ QDomElement metaUrlElem = doc.createElement ( " MetadataURL" );
271
+ QString metadataUrlType = layer->metadataUrlType ();
272
+ metaUrlElem.setAttribute ( " type" , metadataUrlType );
273
+ QString metadataUrlFormat = layer->metadataUrlFormat ();
274
+ if ( metadataUrlFormat == " text/xml" )
275
+ {
276
+ metaUrlElem.setAttribute ( " format" , " XML" );
277
+ }
278
+ else
279
+ {
280
+ metaUrlElem.setAttribute ( " format" , " TXT" );
281
+ }
282
+ QDomText metaUrlText = doc.createTextNode ( metadataUrl );
283
+ metaUrlElem.appendChild ( metaUrlText );
284
+ layerElem.appendChild ( metaUrlElem );
285
+ }
286
+
287
+ parentElement.appendChild ( layerElem );
288
+ }
289
+ }
290
+ }
291
+ return ;
292
+ }
293
+
294
+ QStringList QgsWFSProjectParser::wfstUpdateLayers () const
295
+ {
296
+ QStringList publiedIds = mProjectParser .wfsLayers ();
297
+ QStringList wfsList;
298
+ if ( !mProjectParser .xmlDocument () )
299
+ {
300
+ return wfsList;
301
+ }
302
+
303
+ QDomElement propertiesElem = mProjectParser .propertiesElem ();
304
+ if ( propertiesElem.isNull () )
305
+ {
306
+ return wfsList;
307
+ }
308
+ QDomElement wfstLayersElem = propertiesElem.firstChildElement ( " WFSTLayers" );
309
+ if ( wfstLayersElem.isNull () )
310
+ {
311
+ return wfsList;
312
+ }
313
+ QDomElement wfstUpdateLayersElem = wfstLayersElem.firstChildElement ( " Update" );
314
+ if ( wfstUpdateLayersElem.isNull () )
315
+ {
316
+ return wfsList;
317
+ }
318
+ QDomNodeList valueList = wfstUpdateLayersElem.elementsByTagName ( " value" );
319
+ for ( int i = 0 ; i < valueList.size (); ++i )
320
+ {
321
+ QString id = valueList.at ( i ).toElement ().text ();
322
+ if ( publiedIds.contains ( id ) )
323
+ wfsList << id;
324
+ }
325
+ return wfsList;
326
+ }
327
+
328
+ QStringList QgsWFSProjectParser::wfstInsertLayers () const
329
+ {
330
+ QStringList updateIds = wfstUpdateLayers ();
331
+ QStringList wfsList;
332
+ if ( !mProjectParser .xmlDocument () )
333
+ {
334
+ return wfsList;
335
+ }
336
+
337
+ QDomElement propertiesElem = mProjectParser .propertiesElem ();
338
+ if ( propertiesElem.isNull () )
339
+ {
340
+ return wfsList;
341
+ }
342
+ QDomElement wfstLayersElem = propertiesElem.firstChildElement ( " WFSTLayers" );
343
+ if ( wfstLayersElem.isNull () )
344
+ {
345
+ return wfsList;
346
+ }
347
+ QDomElement wfstInsertLayersElem = wfstLayersElem.firstChildElement ( " Insert" );
348
+ if ( wfstInsertLayersElem.isNull () )
349
+ {
350
+ return wfsList;
351
+ }
352
+ QDomNodeList valueList = wfstInsertLayersElem.elementsByTagName ( " value" );
353
+ for ( int i = 0 ; i < valueList.size (); ++i )
354
+ {
355
+ QString id = valueList.at ( i ).toElement ().text ();
356
+ if ( updateIds.contains ( id ) )
357
+ wfsList << id;
358
+ }
359
+ return wfsList;
360
+ }
361
+
362
+ QStringList QgsWFSProjectParser::wfstDeleteLayers () const
363
+ {
364
+ QStringList insertIds = wfstInsertLayers ();
365
+ QStringList wfsList;
366
+ if ( !mProjectParser .xmlDocument () )
367
+ {
368
+ return wfsList;
369
+ }
370
+
371
+ QDomElement propertiesElem = mProjectParser .propertiesElem ();
372
+ if ( propertiesElem.isNull () )
373
+ {
374
+ return wfsList;
375
+ }
376
+ QDomElement wfstLayersElem = propertiesElem.firstChildElement ( " WFSTLayers" );
377
+ if ( wfstLayersElem.isNull () )
378
+ {
379
+ return wfsList;
380
+ }
381
+ QDomElement wfstDeleteLayersElem = wfstLayersElem.firstChildElement ( " Delete" );
382
+ if ( wfstDeleteLayersElem.isNull () )
383
+ {
384
+ return wfsList;
385
+ }
386
+ QDomNodeList valueList = wfstDeleteLayersElem.elementsByTagName ( " value" );
387
+ for ( int i = 0 ; i < valueList.size (); ++i )
388
+ {
389
+ QString id = valueList.at ( i ).toElement ().text ();
390
+ if ( insertIds.contains ( id ) )
391
+ wfsList << id;
392
+ }
393
+ return wfsList;
394
+ }
0 commit comments