QGIS API Documentation  3.6.0-Noosa (5873452)
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  f = Format::GeoJSON;
246  else if ( fStr.compare( QLatin1String( "gml2" ), Qt::CaseInsensitive ) == 0 )
247  f = Format::GML2;
248  else if ( fStr.compare( QLatin1String( "gml3" ), Qt::CaseInsensitive ) == 0 )
249  f = Format::GML3;
250  else if ( fStr.compare( QLatin1String( "geojson" ), Qt::CaseInsensitive ) == 0 )
251  f = Format::GeoJSON;
252 
253  if ( f == Format::NONE &&
254  request().compare( QLatin1String( "describefeaturetype" ), Qt::CaseInsensitive ) == 0 &&
255  fStr.compare( QLatin1String( "xmlschema" ), Qt::CaseInsensitive ) == 0 )
256  f = Format::GML2;
257 
258  return f;
259  }
260 
262  {
263  return mWfsParameters[ QgsWfsParameter::RESULTTYPE ].toString();
264  }
265 
267  {
268  QString rtStr = resultTypeAsString();
269  if ( rtStr.isEmpty() )
270  return ResultType::RESULTS;
271 
272  ResultType rt = ResultType::RESULTS;
273  if ( rtStr.compare( QLatin1String( "hits" ), Qt::CaseInsensitive ) == 0 )
274  rt = ResultType::HITS;
275  return rt;
276  }
277 
279  {
280  return mWfsParameters[ QgsWfsParameter::PROPERTYNAME ].toStringListWithExp();
281  }
282 
284  {
285  return mWfsParameters[ QgsWfsParameter::MAXFEATURES ].toString();
286  }
287 
289  {
290  return mWfsParameters[ QgsWfsParameter::MAXFEATURES ].toInt();
291  }
292 
294  {
295  return mWfsParameters[ QgsWfsParameter::STARTINDEX ].toString();
296  }
297 
299  {
300  return mWfsParameters[ QgsWfsParameter::STARTINDEX ].toInt();
301  }
302 
304  {
305  return mWfsParameters[ QgsWfsParameter::SRSNAME ].toString();
306  }
307 
308  QStringList QgsWfsParameters::typeNames() const
309  {
310  return mWfsParameters[ QgsWfsParameter::TYPENAME ].toStringList();
311  }
312 
313  QStringList QgsWfsParameters::featureIds() const
314  {
315  return mWfsParameters[ QgsWfsParameter::FEATUREID ].toStringList();
316  }
317 
318  QStringList QgsWfsParameters::filters() const
319  {
320  return mWfsParameters[ QgsWfsParameter::FILTER ].toStringListWithExp();
321  }
322 
323  QString QgsWfsParameters::bbox() const
324  {
325  return mWfsParameters[ QgsWfsParameter::BBOX ].toString();
326  }
327 
329  {
330  return mWfsParameters[ QgsWfsParameter::BBOX ].toRectangle();
331  }
332 
333  QStringList QgsWfsParameters::sortBy() const
334  {
335  return mWfsParameters[ QgsWfsParameter::SORTBY ].toStringListWithExp();
336  }
337 
338  QStringList QgsWfsParameters::expFilters() const
339  {
340  return mWfsParameters[ QgsWfsParameter::EXP_FILTER ].toStringListWithExp( QString( ) );
341  }
342 
344  {
345  return mWfsParameters[ QgsWfsParameter::GEOMETRYNAME ].toString();
346  }
347 
349  {
350  QString vStr = version();
352 
353  if ( vStr.isEmpty() )
354  version = QgsProjectVersion( 1, 1, 0 ); // default value
355  else if ( mVersions.contains( QgsProjectVersion( vStr ) ) )
356  version = QgsProjectVersion( vStr );
357 
358  return version;
359  }
360 
361  void QgsWfsParameters::log( const QString &msg ) const
362  {
363  QgsMessageLog::logMessage( msg, "Server", Qgis::Info );
364  }
365 }
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() 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.