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
+ #include < iostream>
21
+
22
+ namespace QgsWfs
23
+ {
24
+ QgsWfsParameters::QgsWfsParameters ()
25
+ {
26
+ // Available version number
27
+ mVersions .append ( QgsProjectVersion ( 1 , 0 , 0 ) );
28
+ mVersions .append ( QgsProjectVersion ( 1 , 1 , 0 ) );
29
+
30
+ const Parameter pOutputFormat = { ParameterName::OUTPUTFORMAT,
31
+ QVariant::String,
32
+ QVariant ( " " ),
33
+ QVariant ()
34
+ };
35
+ save ( pOutputFormat );
36
+
37
+ const Parameter pSrsName = { ParameterName::SRSNAME,
38
+ QVariant::String,
39
+ QVariant ( " " ),
40
+ QVariant ()
41
+ };
42
+ save ( pSrsName );
43
+ }
44
+
45
+ QgsWfsParameters::QgsWfsParameters ( const QgsServerRequest::Parameters ¶meters )
46
+ {
47
+ load ( parameters );
48
+ }
49
+
50
+ void QgsWfsParameters::load ( const QgsServerRequest::Parameters ¶meters )
51
+ {
52
+ mRequestParameters = parameters;
53
+
54
+ const QMetaEnum metaEnum ( QMetaEnum::fromType<ParameterName>() );
55
+ foreach ( QString key, parameters.keys () )
56
+ {
57
+ const ParameterName name = ( ParameterName ) metaEnum.keyToValue ( key.toStdString ().c_str () );
58
+ if ( name >= 0 )
59
+ {
60
+ QVariant value ( parameters[key] );
61
+ if ( value.canConvert ( mParameters [name].mType ) )
62
+ {
63
+ mParameters [name].mValue = value;
64
+ }
65
+ else
66
+ {
67
+ raiseError ( name );
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ void QgsWfsParameters::dump () const
74
+ {
75
+ const QMetaEnum metaEnum ( QMetaEnum::fromType<ParameterName>() );
76
+
77
+ log ( " WFS Request parameters:" );
78
+ for ( auto parameter : mParameters .toStdMap () )
79
+ {
80
+ const QString value = parameter.second .mValue .toString ();
81
+
82
+ if ( ! value.isEmpty () )
83
+ {
84
+ const QString name = metaEnum.valueToKey ( parameter.first );
85
+ log ( " - " + name + " : " + value );
86
+ }
87
+ }
88
+
89
+ if ( !version ().isEmpty () )
90
+ log ( " - VERSION : " + version () );
91
+ }
92
+
93
+ void QgsWfsParameters::save ( const Parameter ¶meter )
94
+ {
95
+ mParameters [ parameter.mName ] = parameter;
96
+ }
97
+
98
+ QVariant QgsWfsParameters::value ( ParameterName name ) const
99
+ {
100
+ return mParameters [name].mValue ;
101
+ }
102
+
103
+ QVariant QgsWfsParameters::defaultValue ( ParameterName name ) const
104
+ {
105
+ return mParameters [name].mDefaultValue ;
106
+ }
107
+
108
+ QString QgsWfsParameters::outputFormatAsString () const
109
+ {
110
+ return value ( ParameterName::OUTPUTFORMAT ).toString ();
111
+ }
112
+
113
+ QgsWfsParameters::Format QgsWfsParameters::outputFormat () const
114
+ {
115
+ QString fStr = outputFormatAsString ();
116
+
117
+ if ( fStr .isEmpty () )
118
+ {
119
+ if ( versionAsNumber () >= QgsProjectVersion ( 1 , 1 , 0 ) )
120
+ return Format::GML3;
121
+ else
122
+ return Format::GML2;
123
+ }
124
+
125
+ Format f = Format::NONE;
126
+ if ( fStr .compare ( QLatin1String ( " text/xml; subtype=gml/2.1.2" ), Qt::CaseInsensitive ) == 0 )
127
+ f = Format::GML2;
128
+ else if ( fStr .compare ( QLatin1String ( " text/xml; subtype=gml/3.1.1" ), Qt::CaseInsensitive ) == 0 )
129
+ f = Format::GML3;
130
+ else if ( fStr .compare ( QLatin1String ( " application/vnd.geo+json" ), Qt::CaseInsensitive ) == 0 )
131
+ f = Format::GeoJSON;
132
+ else if ( fStr .compare ( QLatin1String ( " gml2" ), Qt::CaseInsensitive ) == 0 )
133
+ f = Format::GML2;
134
+ else if ( fStr .compare ( QLatin1String ( " gml3" ), Qt::CaseInsensitive ) == 0 )
135
+ f = Format::GML3;
136
+ else if ( fStr .compare ( QLatin1String ( " geojson" ), Qt::CaseInsensitive ) == 0 )
137
+ f = Format::GeoJSON;
138
+
139
+ return f;
140
+ }
141
+
142
+ QString QgsWfsParameters::srsName () const
143
+ {
144
+ return value ( ParameterName::SRSNAME ).toString ();
145
+ }
146
+
147
+ QString QgsWfsParameters::version () const
148
+ {
149
+ // VERSION parameter is not managed with other parameters because
150
+ // there's a conflict with qgis VERSION defined in qgsconfig.h
151
+ if ( mRequestParameters .contains ( " VERSION" ) )
152
+ return mRequestParameters [" VERSION" ];
153
+ else
154
+ return QString ();
155
+ }
156
+
157
+ QgsProjectVersion QgsWfsParameters::versionAsNumber () const
158
+ {
159
+ QString vStr = version ();
160
+ QgsProjectVersion version;
161
+
162
+ if ( vStr.isEmpty () )
163
+ version = QgsProjectVersion ( 1 , 1 , 0 ); // default value
164
+ else if ( mVersions .contains ( QgsProjectVersion ( vStr ) ) )
165
+ version = QgsProjectVersion ( vStr );
166
+
167
+ return version;
168
+ }
169
+
170
+ QString QgsWfsParameters::name ( ParameterName name ) const
171
+ {
172
+ const QMetaEnum metaEnum ( QMetaEnum::fromType<ParameterName>() );
173
+ return metaEnum.valueToKey ( name );
174
+ }
175
+
176
+ void QgsWfsParameters::log ( const QString &msg ) const
177
+ {
178
+ QgsMessageLog::logMessage ( msg, " Server" , QgsMessageLog::INFO );
179
+ }
180
+
181
+ void QgsWfsParameters::raiseError ( ParameterName paramName ) const
182
+ {
183
+ const QString value = mParameters [paramName].mValue .toString ();
184
+ const QString param = name ( paramName );
185
+ const QString type = QVariant::typeToName ( mParameters [paramName].mType );
186
+ raiseError ( param + " ('" + value + " ') cannot be converted into " + type );
187
+ }
188
+
189
+ void QgsWfsParameters::raiseError ( const QString &msg ) const
190
+ {
191
+ throw QgsBadRequestException ( QStringLiteral ( " Invalid WFS Parameter" ), msg );
192
+ }
193
+ }
0 commit comments