1 : /******************************************************************************
2 : * $Id: ogr_wfs.h 24791 2012-08-15 20:48:55Z rouault $
3 : *
4 : * Project: WFS Translator
5 : * Purpose: Definition of classes for OGR WFS driver.
6 : * Author: Even Rouault, even dot rouault at mines dash paris dot org
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2010, Even Rouault <even dot rouault at mines dash paris dot org>
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #ifndef _OGR_WFS_H_INCLUDED
31 : #define _OGR_WFS_H_INCLUDED
32 :
33 : #include <vector>
34 : #include <set>
35 : #include <map>
36 :
37 : #include "cpl_minixml.h"
38 : #include "ogrsf_frmts.h"
39 : #include "gmlreader.h"
40 : #include "cpl_http.h"
41 :
42 : CPLXMLNode* WFSFindNode(CPLXMLNode* psXML, const char* pszRootName);
43 : CPLString WFS_TurnSQLFilterToOGCFilter( const char * pszFilter,
44 : OGRFeatureDefn* poFDefn,
45 : int nVersion,
46 : int bPropertyIsNotEqualToSupported,
47 : int bUseFeatureId,
48 : int bGmlObjectIdNeedsGMLPrefix,
49 : int* pbOutNeedsNullCheck );
50 :
51 : const char* FindSubStringInsensitive(const char* pszStr,
52 : const char* pszSubStr);
53 :
54 : CPLString WFS_EscapeURL(const char* pszURL);
55 :
56 : /************************************************************************/
57 : /* OGRWFSLayer */
58 : /************************************************************************/
59 :
60 : class OGRWFSDataSource;
61 :
62 : class OGRWFSLayer : public OGRLayer
63 : {
64 : OGRWFSDataSource* poDS;
65 :
66 : OGRFeatureDefn* poFeatureDefn;
67 : int bGotApproximateLayerDefn;
68 : GMLFeatureClass* poGMLFeatureClass;
69 :
70 : int bAxisOrderAlreadyInverted;
71 : OGRSpatialReference *poSRS;
72 :
73 : char* pszBaseURL;
74 : char* pszName;
75 : char* pszNS;
76 : char* pszNSVal;
77 :
78 : int bStreamingDS;
79 : OGRDataSource *poBaseDS;
80 : OGRLayer *poBaseLayer;
81 : int bHasFetched;
82 : int bReloadNeeded;
83 :
84 : CPLString osGeometryColumnName;
85 : OGRwkbGeometryType eGeomType;
86 : int nFeatures;
87 :
88 : CPLString MakeGetFeatureURL(int nMaxFeatures, int bRequestHits);
89 : int MustRetryIfNonCompliantServer(const char* pszServerAnswer);
90 : OGRDataSource* FetchGetFeature(int nMaxFeatures);
91 : OGRFeatureDefn* DescribeFeatureType();
92 : int ExecuteGetFeatureResultTypeHits();
93 :
94 : double dfMinX, dfMinY, dfMaxX, dfMaxY;
95 : int bHasExtents;
96 :
97 : OGRGeometry *poFetchedFilterGeom;
98 :
99 : CPLString osSQLWhere;
100 : CPLString osWFSWhere;
101 :
102 : CPLString osTargetNamespace;
103 : CPLString GetDescribeFeatureTypeURL(int bWithNS);
104 :
105 : int nExpectedInserts;
106 : CPLString osGlobalInsert;
107 : std::vector<CPLString> aosFIDList;
108 :
109 : int bInTransaction;
110 :
111 : CPLString GetPostHeader();
112 :
113 : int bUseFeatureIdAtLayerLevel;
114 :
115 : int bPagingActive;
116 : int nPagingStartIndex;
117 : int nFeatureRead;
118 : int nFeatureCountRequested;
119 :
120 : OGRFeatureDefn* BuildLayerDefnFromFeatureClass(GMLFeatureClass* poClass);
121 :
122 : char *pszRequiredOutputFormat;
123 :
124 : CPLString osFieldToSort;
125 : int bAscFlag;
126 :
127 : public:
128 : OGRWFSLayer(OGRWFSDataSource* poDS,
129 : OGRSpatialReference* poSRS,
130 : int bAxisOrderAlreadyInverted,
131 : const char* pszBaseURL,
132 : const char* pszName,
133 : const char* pszNS,
134 : const char* pszNSVal);
135 :
136 : ~OGRWFSLayer();
137 :
138 : OGRWFSLayer* Clone();
139 :
140 :
141 5713 : const char *GetName() { return pszName; }
142 :
143 : virtual void ResetReading();
144 : virtual OGRFeature* GetNextFeature();
145 : virtual OGRFeature* GetFeature(long nFID);
146 :
147 : virtual OGRFeatureDefn * GetLayerDefn();
148 :
149 0 : virtual const char *GetGeometryColumn() { return osGeometryColumnName; }
150 :
151 : virtual int TestCapability( const char * );
152 :
153 : virtual OGRSpatialReference *GetSpatialRef();
154 :
155 : virtual void SetSpatialFilter( OGRGeometry * );
156 :
157 : virtual OGRErr SetAttributeFilter( const char * );
158 :
159 : virtual int GetFeatureCount( int bForce = TRUE );
160 :
161 : void SetExtents(double dfMinX, double dfMinY, double dfMaxX, double dfMaxY);
162 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE);
163 :
164 : virtual OGRErr CreateFeature( OGRFeature *poFeature );
165 : virtual OGRErr SetFeature( OGRFeature *poFeature );
166 : virtual OGRErr DeleteFeature( long nFID );
167 :
168 : virtual OGRErr StartTransaction();
169 : virtual OGRErr CommitTransaction();
170 : virtual OGRErr RollbackTransaction();
171 :
172 238 : int HasLayerDefn() { return poFeatureDefn != NULL; }
173 :
174 : OGRFeatureDefn* ParseSchema(CPLXMLNode* psSchema);
175 : OGRFeatureDefn* BuildLayerDefn(OGRFeatureDefn* poSrcFDefn = NULL);
176 :
177 : OGRErr DeleteFromFilter( CPLString osOGCFilter );
178 :
179 1 : const std::vector<CPLString>& GetLastInsertedFIDList() { return aosFIDList; }
180 :
181 : const char *GetShortName();
182 :
183 : void SetRequiredOutputFormat(const char* pszRequiredOutputFormatIn);
184 :
185 147 : const char *GetRequiredOutputFormat() { return pszRequiredOutputFormat; };
186 :
187 : void SetOrderBy(const char* pszFieldToSort, int bAscFlag);
188 1 : int HasGotApproximateLayerDefn() { GetLayerDefn(); return bGotApproximateLayerDefn; }
189 : };
190 :
191 : /************************************************************************/
192 : /* OGRWFSDataSource */
193 : /************************************************************************/
194 :
195 : class OGRWFSDataSource : public OGRDataSource
196 : {
197 : char* pszName;
198 : int bRewriteFile;
199 : CPLXMLNode* psFileXML;
200 :
201 : OGRWFSLayer** papoLayers;
202 : int nLayers;
203 : std::map<OGRLayer*, OGRLayer*> oMap;
204 :
205 : int bUpdate;
206 :
207 : int bGetFeatureSupportHits;
208 : CPLString osVersion;
209 : int bNeedNAMESPACE;
210 : int bHasMinOperators;
211 : int bHasNullCheck;
212 : int bPropertyIsNotEqualToSupported;
213 : int bUseFeatureId;
214 : int bGmlObjectIdNeedsGMLPrefix;
215 : int bRequiresEnvelopeSpatialFilter;
216 : int DetectRequiresEnvelopeSpatialFilter(CPLXMLNode* psRoot);
217 :
218 : int bTransactionSupport;
219 : char** papszIdGenMethods;
220 : int DetectTransactionSupport(CPLXMLNode* psRoot);
221 :
222 : CPLString osBaseURL;
223 : CPLString osPostTransactionURL;
224 :
225 : CPLXMLNode* LoadFromFile( const char * pszFilename );
226 :
227 : int bUseHttp10;
228 :
229 : char** papszHttpOptions;
230 :
231 : int bPagingAllowed;
232 : int nPageSize;
233 :
234 : int bIsGEOSERVER;
235 :
236 : int bLoadMultipleLayerDefn;
237 : std::set<CPLString> aoSetAlreadyTriedLayers;
238 :
239 : CPLString osLayerMetadataCSV;
240 : CPLString osLayerMetadataTmpFileName;
241 : OGRDataSource *poLayerMetadataDS;
242 : OGRLayer *poLayerMetadataLayer;
243 :
244 : CPLString osGetCapabilities;
245 : OGRDataSource *poLayerGetCapabilitiesDS;
246 : OGRLayer *poLayerGetCapabilitiesLayer;
247 :
248 : int bKeepLayerNamePrefix;
249 :
250 : CPLHTTPResult* SendGetCapabilities(const char* pszBaseURL,
251 : CPLString& osTypeName);
252 :
253 : int GetLayerIndex(const char* pszName);
254 :
255 : public:
256 : OGRWFSDataSource();
257 : ~OGRWFSDataSource();
258 :
259 : int Open( const char * pszFilename,
260 : int bUpdate );
261 :
262 22 : virtual const char* GetName() { return pszName; }
263 :
264 7 : virtual int GetLayerCount() { return nLayers; }
265 : virtual OGRLayer* GetLayer( int );
266 : virtual OGRLayer* GetLayerByName(const char* pszLayerName);
267 :
268 : virtual int TestCapability( const char * );
269 :
270 : virtual OGRLayer * ExecuteSQL( const char *pszSQLCommand,
271 : OGRGeometry *poSpatialFilter,
272 : const char *pszDialect );
273 : virtual void ReleaseResultSet( OGRLayer * poResultsSet );
274 :
275 15 : int UpdateMode() { return bUpdate; }
276 15 : int SupportTransactions() { return bTransactionSupport; }
277 0 : void DisableSupportHits() { bGetFeatureSupportHits = FALSE; }
278 25 : int GetFeatureSupportHits() { return bGetFeatureSupportHits; }
279 208 : const char *GetVersion() { return osVersion.c_str(); }
280 :
281 : int IsOldDeegree(const char* pszErrorString);
282 64 : int GetNeedNAMESPACE() { return bNeedNAMESPACE; }
283 36 : int HasMinOperators() { return bHasMinOperators; }
284 1 : int HasNullCheck() { return bHasNullCheck; }
285 18 : int UseFeatureId() { return bUseFeatureId; }
286 4 : int RequiresEnvelopeSpatialFilter() { return bRequiresEnvelopeSpatialFilter; }
287 0 : void SetGmlObjectIdNeedsGMLPrefix() { bGmlObjectIdNeedsGMLPrefix = TRUE; }
288 23 : int DoesGmlObjectIdNeedGMLPrefix() { return bGmlObjectIdNeedsGMLPrefix; }
289 :
290 2 : void SetPropertyIsNotEqualToUnSupported() { bPropertyIsNotEqualToSupported = FALSE; }
291 23 : int PropertyIsNotEqualToSupported() { return bPropertyIsNotEqualToSupported; }
292 :
293 : CPLString GetPostTransactionURL();
294 :
295 : void SaveLayerSchema(const char* pszLayerName, CPLXMLNode* psSchema);
296 :
297 : CPLHTTPResult* HTTPFetch( const char* pszURL, char** papszOptions );
298 :
299 54 : int IsPagingAllowed() { return bPagingAllowed; }
300 0 : int GetPageSize() { return nPageSize; }
301 :
302 : void LoadMultipleLayerDefn(const char* pszLayerName,
303 : char* pszNS, char* pszNSVal);
304 :
305 : int GetKeepLayerNamePrefix() { return bKeepLayerNamePrefix; }
306 : };
307 :
308 : /************************************************************************/
309 : /* OGRWFSDriver */
310 : /************************************************************************/
311 :
312 : class OGRWFSDriver : public OGRSFDriver
313 226 : {
314 : public:
315 : ~OGRWFSDriver();
316 :
317 : virtual const char* GetName();
318 : virtual OGRDataSource* Open( const char *, int );
319 : virtual int TestCapability( const char * );
320 : };
321 :
322 :
323 : #endif /* ndef _OGR_WFS_H_INCLUDED */
|