QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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 }
QString request() const
Returns REQUEST parameter as a string or an empty string if not defined.
A rectangle specified with double values.
Definition: qgsrectangle.h:41
QString geometryNameAsString() const
Returns GEOMETRYNAME parameter as a string.
QString typeName() const
Returns the type of the parameter as a string.
QgsWfsParameters()
Constructor for WFS parameters with default values only.
int toInt() const
Converts the parameter into an integer.
Format outputFormat() const
Returns format.
QString startIndex() const
Returns STARTINDEX parameter as a string.
QString value(const QString &key) const
Returns the value of a parameter.
QString outputFormatAsString() const
Returns OUTPUTFORMAT parameter as a string.
static void raiseError(const QString &msg)
Raises an exception in case of an invalid parameters.
void dump() const
Dumps parameters.
void load(const QUrlQuery &query)
Loads new parameters.
QStringList sortBy() const
Returns SORTBY parameter as list.
QStringList expFilters() const
Returns EXP_FILTER parameter as list.
QgsProjectVersion versionAsNumber() const
Returns VERSION parameter if defined or its default value.
WFS parameter received from the client.
QgsRectangle bboxAsRectangle() const
Returns BBOX as a rectangle if defined and valid.
QStringList featureIds() const
Returns FEATUREID parameter as list.
QStringList filters() const
Returns FILTER parameter as list.
QString bbox() const
Returns BBOX if defined or an empty string.
QgsWfsParameter(const QgsWfsParameter::Name name=QgsWfsParameter::UNKNOWN, const QVariant::Type type=QVariant::String, const QVariant defaultValue=QVariant(""))
Constructor for QgsWfsParameter.
int startIndexAsInt() const
Returns STARTINDEX parameter as an int or its default value if not defined.
QgsRectangle toRectangle(bool &ok) const
Converts the parameter into a rectangle.
WMS implementation.
Definition: qgswfs.cpp:35
A class to describe the version of a project.
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).
QString version() const
Returns VERSION parameter as a string or an empty string if not defined.
QUrlQuery urlQuery() const
Returns a url query with underlying parameters.
void raiseError() const
Raises an error in case of an invalid conversion.
Format
Output format for the response.
QString resultTypeAsString() const
Returns RESULTTYPE parameter as a string.
QString srsName() const
Returns SRSNAME parameter as a string.
QgsWfsParameter::Name mName
QStringList propertyNames() const
Returns PROPERTYNAME parameter as list.
int toInt(bool &ok) const
Converts the parameter into an integer.
QString maxFeatures() const
Returns MAXFEATURES parameter as a string.
QgsRectangle toRectangle() const
Converts the parameter into a rectangle.
ResultType resultType() const
Returns resultType.
QgsServerParameters provides an interface to retrieve and manipulate global parameters received from ...
QString toString(bool defaultValue=false) const
Converts the parameter into a string.
QStringList typeNames() const
Returns TYPENAME parameter as list.
ResultType
Type of results.
Name
Available parameters for WFS requests.
QStringList toStringListWithExp(const QString &exp="\([^()]+)\") const
Converts the parameter into a list of string.
int maxFeaturesAsInt() const
Returns MAXFEATURES parameter as an int or its default value if not defined.
Provides an interface to retrieve and manipulate WFS parameters received from the client...
static QString name(const QgsWfsParameter::Name)
Converts a parameter&#39;s name into its string representation.
Definition of a parameter with basic conversion methods.