QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgswfsparameters.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgswfsparameters.cpp
3  --------------------
4  begin : Sept 14, 2017
5  copyright : (C) 2017 by RenĂ©-Luc Dhont
6  email : rldhont at 3liz dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgswfsparameters.h"
19 #include "qgsmessagelog.h"
20 
21 namespace QgsWfs
22 {
23  //
24  // QgsWfsParameter
25  //
27  const QVariant::Type type,
28  const QVariant defaultValue )
29  : QgsServerParameterDefinition( type, defaultValue )
30  , mName( name )
31  {
32  }
33 
35  {
36  bool ok = false;
37  const int val = QgsServerParameterDefinition::toInt( ok );
38 
39  if ( !ok )
40  {
41  raiseError();
42  }
43 
44  return val;
45  }
46 
48  {
49  QString value = toString();
50  const QStringList corners = mValue.toString().split( ',' );
51  if ( corners.size() == 5 )
52  {
53  value.resize( value.size() - corners[4].size() - 1 );
54  }
55 
57  param.mValue = QVariant( value );
58 
59  bool ok = false;
60  const QgsRectangle rectangle = param.toRectangle( ok );
61 
62  if ( !ok )
63  {
64  const QString msg = QString( "%1 ('%2') cannot be converted into rectangle" ).arg( name( mName ), toString() );
66  }
67 
68  return rectangle;
69  }
70 
71  QStringList QgsWfsParameter::toStringListWithExp( const QString &exp ) const
72  {
73  QStringList theList;
74 
75  QString val = mValue.toString();
76  if ( val.isEmpty() )
77  return theList;
78 
79  if ( exp.isEmpty() )
80  theList << val;
81  else
82  {
83  QRegExp rx( exp );
84  if ( rx.indexIn( val, 0 ) == -1 )
85  {
86  theList << val;
87  }
88  else
89  {
90  int pos = 0;
91  while ( ( pos = rx.indexIn( val, pos ) ) != -1 )
92  {
93  theList << rx.cap( 1 );
94  pos += rx.matchedLength();
95  }
96  }
97  }
98 
99  return theList;
100  }
101 
103  {
104  const QString msg = QString( "%1 ('%2') cannot be converted into %3" ).arg( name( mName ), toString(), typeName() );
106  }
107 
109  {
110  const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWfsParameter::Name>() );
111  return metaEnum.valueToKey( name );
112  }
113 
115  {
116  const QMetaEnum metaEnum( QMetaEnum::fromType<QgsWfsParameter::Name>() );
117  return ( QgsWfsParameter::Name ) metaEnum.keyToValue( name.toUpper().toStdString().c_str() );
118  }
119 
120  //
121  // QgsWfsParameters
122  //
125  {
126  // Available version number
127  mVersions.append( QgsProjectVersion( 1, 0, 0 ) );
128  mVersions.append( QgsProjectVersion( 1, 1, 0 ) );
129 
131  save( pOutputFormat );
132 
134  save( pResultType );
135 
137  save( pPropertyName );
138 
140  QVariant::Int,
141  QVariant( -1 ) );
142  save( pMaxFeatures );
143 
145  QVariant::Int,
146  QVariant( 0 ) );
147  save( pStartIndex );
148 
150  save( pSrsName );
151 
153  save( pTypeName );
154 
156  save( pFeatureId );
157 
159  save( pFilter );
160 
162  save( pBbox );
163 
165  save( pSortBy );
166 
168  save( pExpFilter );
169 
171  save( pGeometryName );
172  }
173 
175  : QgsWfsParameters()
176  {
177  load( parameters.urlQuery() );
178  }
179 
180  bool QgsWfsParameters::loadParameter( const QString &key, const QString &value )
181  {
182  bool loaded = false;
183 
184  const QgsWfsParameter::Name name = QgsWfsParameter::name( key );
185  if ( name >= 0 )
186  {
187  mWfsParameters[name].mValue = value;
188  if ( ! mWfsParameters[name].isValid() )
189  {
190  mWfsParameters[name].raiseError();
191  }
192 
193  loaded = true;
194  }
195 
196  return loaded;
197  }
198 
199  void QgsWfsParameters::save( const QgsWfsParameter &parameter )
200  {
201  mWfsParameters[ parameter.mName ] = parameter;
202  }
203 
205  {
206  log( "WFS Request parameters:" );
207  for ( auto parameter : mWfsParameters.toStdMap() )
208  {
209  const QString value = parameter.second.toString();
210 
211  if ( ! value.isEmpty() )
212  {
213  const QString name = QgsWfsParameter::name( parameter.first );
214  log( QStringLiteral( " - %1 : %2" ).arg( name, value ) );
215  }
216  }
217 
218  if ( !version().isEmpty() )
219  log( QStringLiteral( " - VERSION : %1" ).arg( version() ) );
220  }
221 
223  {
224  return mWfsParameters[ QgsWfsParameter::OUTPUTFORMAT ].toString();
225  }
226 
228  {
229  QString fStr = outputFormatAsString();
230 
231  if ( fStr.isEmpty() )
232  {
233  if ( versionAsNumber() >= QgsProjectVersion( 1, 1, 0 ) )
234  return Format::GML3;
235  else
236  return Format::GML2;
237  }
238 
239  Format f = Format::NONE;
240  if ( fStr.compare( QLatin1String( "text/xml; subtype=gml/2.1.2" ), Qt::CaseInsensitive ) == 0 )
241  f = Format::GML2;
242  else if ( fStr.compare( QLatin1String( "text/xml; subtype=gml/3.1.1" ), Qt::CaseInsensitive ) == 0 )
243  f = Format::GML3;
244  else if ( fStr.compare( QLatin1String( "application/vnd.geo+json" ), Qt::CaseInsensitive ) == 0 ||
245  // Needs to check for space too, because a + sign in the query string is interpreted as a space
246  fStr.compare( QLatin1String( "application/vnd.geo json" ), Qt::CaseInsensitive ) == 0 ||
247  fStr.compare( QLatin1String( "application/geo+json" ), Qt::CaseInsensitive ) == 0 ||
248  fStr.compare( QLatin1String( "application/geo json" ), Qt::CaseInsensitive ) == 0 ||
249  fStr.compare( QLatin1String( "application/json" ), Qt::CaseInsensitive ) == 0 ||
250  fStr.compare( QLatin1String( "geojson" ), Qt::CaseInsensitive ) == 0
251  )
252  f = Format::GeoJSON;
253  else if ( fStr.compare( QLatin1String( "gml2" ), Qt::CaseInsensitive ) == 0 )
254  f = Format::GML2;
255  else if ( fStr.compare( QLatin1String( "gml3" ), Qt::CaseInsensitive ) == 0 )
256  f = Format::GML3;
257 
258  if ( f == Format::NONE &&
259  request().compare( QLatin1String( "describefeaturetype" ), Qt::CaseInsensitive ) == 0 &&
260  fStr.compare( QLatin1String( "xmlschema" ), Qt::CaseInsensitive ) == 0 )
261  f = Format::GML2;
262 
263  return f;
264  }
265 
267  {
268  return mWfsParameters[ QgsWfsParameter::RESULTTYPE ].toString();
269  }
270 
272  {
273  QString rtStr = resultTypeAsString();
274  if ( rtStr.isEmpty() )
275  return ResultType::RESULTS;
276 
277  ResultType rt = ResultType::RESULTS;
278  if ( rtStr.compare( QLatin1String( "hits" ), Qt::CaseInsensitive ) == 0 )
279  rt = ResultType::HITS;
280  return rt;
281  }
282 
284  {
285  return mWfsParameters[ QgsWfsParameter::PROPERTYNAME ].toStringListWithExp();
286  }
287 
289  {
290  return mWfsParameters[ QgsWfsParameter::MAXFEATURES ].toString();
291  }
292 
294  {
295  return mWfsParameters[ QgsWfsParameter::MAXFEATURES ].toInt();
296  }
297 
299  {
300  return mWfsParameters[ QgsWfsParameter::STARTINDEX ].toString();
301  }
302 
304  {
305  return mWfsParameters[ QgsWfsParameter::STARTINDEX ].toInt();
306  }
307 
309  {
310  return mWfsParameters[ QgsWfsParameter::SRSNAME ].toString();
311  }
312 
313  QStringList QgsWfsParameters::typeNames() const
314  {
315  return mWfsParameters[ QgsWfsParameter::TYPENAME ].toStringList();
316  }
317 
318  QStringList QgsWfsParameters::featureIds() const
319  {
320  return mWfsParameters[ QgsWfsParameter::FEATUREID ].toStringList();
321  }
322 
323  QStringList QgsWfsParameters::filters() const
324  {
325  return mWfsParameters[ QgsWfsParameter::FILTER ].toStringListWithExp();
326  }
327 
328  QString QgsWfsParameters::bbox() const
329  {
330  return mWfsParameters[ QgsWfsParameter::BBOX ].toString();
331  }
332 
334  {
335  return mWfsParameters[ QgsWfsParameter::BBOX ].toRectangle();
336  }
337 
338  QStringList QgsWfsParameters::sortBy() const
339  {
340  return mWfsParameters[ QgsWfsParameter::SORTBY ].toStringListWithExp();
341  }
342 
343  QStringList QgsWfsParameters::expFilters() const
344  {
345  return mWfsParameters[ QgsWfsParameter::EXP_FILTER ].toStringListWithExp( QString( ) );
346  }
347 
349  {
350  return mWfsParameters[ QgsWfsParameter::GEOMETRYNAME ].toString();
351  }
352 
354  {
355  QString vStr = version();
357 
358  if ( vStr.isEmpty() )
359  version = QgsProjectVersion( 1, 1, 0 ); // default value
360  else if ( mVersions.contains( QgsProjectVersion( vStr ) ) )
361  version = QgsProjectVersion( vStr );
362 
363  return version;
364  }
365 
366  void QgsWfsParameters::log( const QString &msg ) const
367  {
368  QgsMessageLog::logMessage( msg, "Server", Qgis::Info );
369  }
370 }
QgsWfs::QgsWfsParameters::resultTypeAsString
QString resultTypeAsString() const
Returns RESULTTYPE parameter as a string.
Definition: qgswfsparameters.cpp:266
QgsWfs::QgsWfsParameter::RESULTTYPE
@ RESULTTYPE
Definition: qgswfsparameters.h:47
QgsWfs::QgsWfsParameter::raiseError
void raiseError() const
Raises an error in case of an invalid conversion.
Definition: qgswfsparameters.cpp:102
QgsWfs::QgsWfsParameters::featureIds
QStringList featureIds() const
Returns FEATUREID parameter as list.
Definition: qgswfsparameters.cpp:318
QgsServerParameterDefinition::raiseError
static void raiseError(const QString &msg)
Raises an exception in case of an invalid parameters.
Definition: qgsserverparameters.cpp:356
QgsWfs::QgsWfsParameter::FILTER
@ FILTER
Definition: qgswfsparameters.h:54
QgsWfs::QgsWfsParameters::maxFeaturesAsInt
int maxFeaturesAsInt() const
Returns MAXFEATURES parameter as an int or its default value if not defined.
Definition: qgswfsparameters.cpp:293
QgsServerParameters::request
QString request() const
Returns REQUEST parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:527
QgsWfs::QgsWfsParameter
WFS parameter received from the client.
Definition: qgswfsparameters.h:38
QgsWfs::QgsWfsParameters::srsName
QString srsName() const
Returns SRSNAME parameter as a string.
Definition: qgswfsparameters.cpp:308
QgsWfs::QgsWfsParameters::outputFormatAsString
QString outputFormatAsString() const
Returns OUTPUTFORMAT parameter as a string.
Definition: qgswfsparameters.cpp:222
QgsServerParameters::load
void load(const QUrlQuery &query)
Loads new parameters.
Definition: qgsserverparameters.cpp:549
QgsWfs::QgsWfsParameters::resultType
ResultType resultType() const
Returns resultType.
Definition: qgswfsparameters.cpp:271
QgsWfs::QgsWfsParameters::dump
void dump() const
Dumps parameters.
Definition: qgswfsparameters.cpp:204
QgsWfs::QgsWfsParameters::startIndexAsInt
int startIndexAsInt() const
Returns STARTINDEX parameter as an int or its default value if not defined.
Definition: qgswfsparameters.cpp:303
QgsWfs::QgsWfsParameter::toRectangle
QgsRectangle toRectangle() const
Converts the parameter into a rectangle.
Definition: qgswfsparameters.cpp:47
QgsWfs::QgsWfsParameter::STARTINDEX
@ STARTINDEX
Definition: qgswfsparameters.h:50
QgsWfs::QgsWfsParameters::Format
Format
Output format for the response.
Definition: qgswfsparameters.h:133
QgsServerParameters::value
QString value(const QString &key) const
Returns the value of a parameter.
Definition: qgsserverparameters.cpp:532
QgsWfs::QgsWfsParameters::versionAsNumber
QgsProjectVersion versionAsNumber() const
Returns VERSION parameter if defined or its default value.
Definition: qgswfsparameters.cpp:353
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:42
QgsWfs::QgsWfsParameters::outputFormat
Format outputFormat() const
Returns format.
Definition: qgswfsparameters.cpp:227
QgsWfs::QgsWfsParameter::MAXFEATURES
@ MAXFEATURES
Definition: qgswfsparameters.h:49
QgsWfs::QgsWfsParameter::mName
QgsWfsParameter::Name mName
Definition: qgswfsparameters.h:116
QgsWfs::QgsWfsParameter::BBOX
@ BBOX
Definition: qgswfsparameters.h:55
QgsServerParameters::version
QString version() const
Returns VERSION parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:477
QgsWfs::QgsWfsParameter::PROPERTYNAME
@ PROPERTYNAME
Definition: qgswfsparameters.h:48
QgsWfs::QgsWfsParameter::Name
Name
Available parameters for WFS requests.
Definition: qgswfsparameters.h:44
QgsWfs::QgsWfsParameters::typeNames
QStringList typeNames() const
Returns TYPENAME parameter as list.
Definition: qgswfsparameters.cpp:313
QgsWfs::QgsWfsParameters::filters
QStringList filters() const
Returns FILTER parameter as list.
Definition: qgswfsparameters.cpp:323
QgsWfs::QgsWfsParameter::toInt
int toInt() const
Converts the parameter into an integer.
Definition: qgswfsparameters.cpp:34
Qgis::Info
@ Info
Definition: qgis.h:90
QgsWfs::QgsWfsParameter::GEOMETRYNAME
@ GEOMETRYNAME
Definition: qgswfsparameters.h:58
QgsWfs::QgsWfsParameters::bbox
QString bbox() const
Returns BBOX if defined or an empty string.
Definition: qgswfsparameters.cpp:328
QgsWfs::QgsWfsParameter::QgsWfsParameter
QgsWfsParameter(const QgsWfsParameter::Name name=QgsWfsParameter::UNKNOWN, const QVariant::Type type=QVariant::String, const QVariant defaultValue=QVariant(""))
Constructor for QgsWfsParameter.
Definition: qgswfsparameters.cpp:26
QgsWfs::QgsWfsParameter::SRSNAME
@ SRSNAME
Definition: qgswfsparameters.h:51
QgsServerParameterDefinition
Definition of a parameter with basic conversion methods.
Definition: qgsserverparameters.h:35
QgsWfs::QgsWfsParameter::OUTPUTFORMAT
@ OUTPUTFORMAT
Definition: qgswfsparameters.h:46
QgsWfs::QgsWfsParameters
Provides an interface to retrieve and manipulate WFS parameters received from the client.
Definition: qgswfsparameters.h:126
QgsWfs
WMS implementation.
Definition: qgswfs.cpp:36
QgsWfs::QgsWfsParameters::maxFeatures
QString maxFeatures() const
Returns MAXFEATURES parameter as a string.
Definition: qgswfsparameters.cpp:288
QgsWfs::QgsWfsParameters::ResultType
ResultType
Type of results.
Definition: qgswfsparameters.h:143
QgsServerParameterDefinition::toString
QString toString(bool defaultValue=false) const
Converts the parameter into a string.
Definition: qgsserverparameters.cpp:65
QgsWfs::QgsWfsParameters::sortBy
QStringList sortBy() const
Returns SORTBY parameter as list.
Definition: qgswfsparameters.cpp:338
QgsServerParameterDefinition::toInt
int toInt(bool &ok) const
Converts the parameter into an integer.
Definition: qgsserverparameters.cpp:313
QgsServerParameterDefinition::mValue
QVariant mValue
Definition: qgsserverparameters.h:165
QgsWfs::QgsWfsParameter::EXP_FILTER
@ EXP_FILTER
Definition: qgswfsparameters.h:57
QgsWfs::QgsWfsParameter::FEATUREID
@ FEATUREID
Definition: qgswfsparameters.h:53
QgsWfs::QgsWfsParameters::startIndex
QString startIndex() const
Returns STARTINDEX parameter as a string.
Definition: qgswfsparameters.cpp:298
qgswfsparameters.h
QgsWfs::QgsWfsParameters::propertyNames
QStringList propertyNames() const
Returns PROPERTYNAME parameter as list.
Definition: qgswfsparameters.cpp:283
QgsMessageLog::logMessage
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Definition: qgsmessagelog.cpp:27
QgsServerParameters::urlQuery
QUrlQuery urlQuery() const
Returns a url query with underlying parameters.
Definition: qgsserverparameters.cpp:434
QgsWfs::QgsWfsParameters::bboxAsRectangle
QgsRectangle bboxAsRectangle() const
Returns BBOX as a rectangle if defined and valid.
Definition: qgswfsparameters.cpp:333
QgsServerParameters
QgsServerParameters provides an interface to retrieve and manipulate global parameters received from ...
Definition: qgsserverparameters.h:229
QgsWfs::QgsWfsParameters::geometryNameAsString
QString geometryNameAsString() const
Returns GEOMETRYNAME parameter as a string.
Definition: qgswfsparameters.cpp:348
QgsWfs::QgsWfsParameter::name
static QString name(const QgsWfsParameter::Name)
Converts a parameter's name into its string representation.
Definition: qgswfsparameters.cpp:108
QgsServerParameterDefinition::typeName
QString typeName() const
Returns the type of the parameter as a string.
Definition: qgsserverparameters.cpp:38
QgsWfs::QgsWfsParameter::toStringListWithExp
QStringList toStringListWithExp(const QString &exp="\\‍(([^()]+)\\‍)") const
Converts the parameter into a list of string.
Definition: qgswfsparameters.cpp:71
QgsWfs::QgsWfsParameter::SORTBY
@ SORTBY
Definition: qgswfsparameters.h:56
QgsWfs::QgsWfsParameters::QgsWfsParameters
QgsWfsParameters()
Constructor for WFS parameters with default values only.
Definition: qgswfsparameters.cpp:123
QgsProjectVersion
A class to describe the version of a project.
Definition: qgsprojectversion.h:32
QgsWfs::QgsWfsParameter::TYPENAME
@ TYPENAME
Definition: qgswfsparameters.h:52
QgsWfs::QgsWfsParameters::expFilters
QStringList expFilters() const
Returns EXP_FILTER parameter as list.
Definition: qgswfsparameters.cpp:343
qgsmessagelog.h
QgsServerParameterDefinition::toRectangle
QgsRectangle toRectangle(bool &ok) const
Converts the parameter into a rectangle.
Definition: qgsserverparameters.cpp:186