Skip to content

Commit 7de1dff

Browse files
committedNov 21, 2014
Merge pull request #1689 from rldhont/server_cache_project_config
[QGIS-Server] Enhance config cache
2 parents 6c836f0 + d663599 commit 7de1dff

8 files changed

+179
-162
lines changed
 

‎src/mapserver/qgsconfigcache.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ QgsConfigCache::~QgsConfigCache()
4343
QgsServerProjectParser* QgsConfigCache::serverConfiguration( const QString& filePath )
4444
{
4545
QDomDocument* doc = xmlDocument( filePath );
46+
if ( !doc )
47+
{
48+
return 0;
49+
}
4650
return new QgsServerProjectParser( doc, filePath );
4751
}
4852

@@ -56,7 +60,7 @@ QgsWCSProjectParser* QgsConfigCache::wcsConfiguration( const QString& filePath )
5660
{
5761
return 0;
5862
}
59-
p = new QgsWCSProjectParser( doc, filePath );
63+
p = new QgsWCSProjectParser( filePath );
6064
mWCSConfigCache.insert( filePath, p );
6165
mFileSystemWatcher.addPath( filePath );
6266
}
@@ -75,8 +79,7 @@ QgsWFSProjectParser* QgsConfigCache::wfsConfiguration( const QString& filePath )
7579
{
7680
return 0;
7781
}
78-
79-
p = new QgsWFSProjectParser( doc, filePath );
82+
p = new QgsWFSProjectParser( filePath );
8083
mWFSConfigCache.insert( filePath, p );
8184
mFileSystemWatcher.addPath( filePath );
8285
}
@@ -105,7 +108,7 @@ QgsWMSConfigParser* QgsConfigCache::wmsConfiguration( const QString& filePath, c
105108
}
106109
else
107110
{
108-
p = new QgsWMSProjectParser( doc, filePath );
111+
p = new QgsWMSProjectParser( filePath );
109112
}
110113
mWMSConfigCache.insert( filePath, p );
111114
mFileSystemWatcher.addPath( filePath );
@@ -130,23 +133,31 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
130133
QgsMessageLog::logMessage( "Error, cannot open configuration file '" + filePath + "'", "Server", QgsMessageLog::CRITICAL );
131134
return 0;
132135
}
133-
134-
//then create xml document
135-
QDomDocument* xmlDoc = new QDomDocument();
136-
QString errorMsg;
137-
int line, column;
138-
if ( !xmlDoc->setContent( &configFile, true, &errorMsg, &line, &column ) )
136+
137+
// first get cache
138+
QDomDocument* xmlDoc = mXmlDocumentCache.object( filePath );
139+
if ( !xmlDoc )
139140
{
140-
QgsMessageLog::logMessage( "Error parsing file '" + filePath +
141-
QString( "': parse error %1 at row %2, column %3" ).arg( errorMsg ).arg( line ).arg( column ), "Server", QgsMessageLog::CRITICAL );
142-
delete xmlDoc;
143-
return 0;
141+
//then create xml document
142+
xmlDoc = new QDomDocument();
143+
QString errorMsg;
144+
int line, column;
145+
if ( !xmlDoc->setContent( &configFile, true, &errorMsg, &line, &column ) )
146+
{
147+
QgsMessageLog::logMessage( "Error parsing file '" + filePath +
148+
QString( "': parse error %1 at row %2, column %3" ).arg( errorMsg ).arg( line ).arg( column ), "Server", QgsMessageLog::CRITICAL );
149+
delete xmlDoc;
150+
return 0;
151+
}
152+
mXmlDocumentCache.insert( filePath, xmlDoc );
153+
mFileSystemWatcher.addPath( filePath );
144154
}
145155
return xmlDoc;
146156
}
147157

148158
void QgsConfigCache::removeChangedEntry( const QString& path )
149159
{
160+
mXmlDocumentCache.remove( path );
150161
mWMSConfigCache.remove( path );
151162
mWFSConfigCache.remove( path );
152163
mWCSConfigCache.remove( path );

‎src/mapserver/qgsconfigcache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class QgsConfigCache: public QObject
5252
/**Returns xml document for project file / sld or 0 in case of errors*/
5353
QDomDocument* xmlDocument( const QString& filePath );
5454

55+
QCache<QString, QDomDocument> mXmlDocumentCache;
5556
QCache<QString, QgsWMSConfigParser> mWMSConfigCache;
5657
QCache<QString, QgsWFSProjectParser> mWFSConfigCache;
5758
QCache<QString, QgsWCSProjectParser> mWCSConfigCache;

‎src/mapserver/qgswcsprojectparser.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
***************************************************************************/
1717

1818
#include "qgswcsprojectparser.h"
19+
#include "qgsconfigcache.h"
1920
#include "qgsconfigparserutils.h"
21+
#include "qgsconfigcache.h"
2022
#include "qgsrasterlayer.h"
2123

22-
QgsWCSProjectParser::QgsWCSProjectParser( QDomDocument* xmlDoc, const QString& filePath ): mProjectParser( xmlDoc, filePath )
24+
QgsWCSProjectParser::QgsWCSProjectParser( const QString& filePath )
2325
{
26+
mProjectParser = QgsConfigCache::instance()->serverConfiguration( filePath );
2427
}
2528

2629
QgsWCSProjectParser::~QgsWCSProjectParser()
@@ -29,19 +32,19 @@ QgsWCSProjectParser::~QgsWCSProjectParser()
2932

3033
void QgsWCSProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
3134
{
32-
mProjectParser.serviceCapabilities( parentElement, doc, "WCS" );
35+
mProjectParser->serviceCapabilities( parentElement, doc, "WCS" );
3336
}
3437

3538
QString QgsWCSProjectParser::wcsServiceUrl() const
3639
{
3740
QString url;
3841

39-
if ( !mProjectParser.xmlDocument() )
42+
if ( !mProjectParser->xmlDocument() )
4043
{
4144
return url;
4245
}
4346

44-
QDomElement propertiesElem = mProjectParser.propertiesElem();
47+
QDomElement propertiesElem = mProjectParser->propertiesElem();
4548
if ( !propertiesElem.isNull() )
4649
{
4750
QDomElement wcsUrlElem = propertiesElem.firstChildElement( "WCSUrl" );
@@ -55,12 +58,12 @@ QString QgsWCSProjectParser::wcsServiceUrl() const
5558

5659
QString QgsWCSProjectParser::serviceUrl() const
5760
{
58-
return mProjectParser.serviceUrl();
61+
return mProjectParser->serviceUrl();
5962
}
6063

6164
void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDocument& doc ) const
6265
{
63-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
66+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
6467
if ( projectLayerElements.size() < 1 )
6568
{
6669
return;
@@ -75,7 +78,7 @@ void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDo
7578
QString type = elem.attribute( "type" );
7679
if ( type == "raster" )
7780
{
78-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
81+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
7982
if ( layer && wcsLayersId.contains( layer->id() ) )
8083
{
8184
QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
@@ -137,12 +140,12 @@ void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDo
137140
QStringList QgsWCSProjectParser::wcsLayers() const
138141
{
139142
QStringList wcsList;
140-
if ( !mProjectParser.xmlDocument() )
143+
if ( !mProjectParser->xmlDocument() )
141144
{
142145
return wcsList;
143146
}
144147

145-
QDomElement propertiesElem = mProjectParser.propertiesElem();
148+
QDomElement propertiesElem = mProjectParser->propertiesElem();
146149
if ( propertiesElem.isNull() )
147150
{
148151
return wcsList;
@@ -162,7 +165,7 @@ QStringList QgsWCSProjectParser::wcsLayers() const
162165

163166
void QgsWCSProjectParser::describeCoverage( const QString& aCoveName, QDomElement& parentElement, QDomDocument& doc ) const
164167
{
165-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
168+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
166169
if ( projectLayerElements.size() < 1 )
167170
{
168171
return;
@@ -186,7 +189,7 @@ void QgsWCSProjectParser::describeCoverage( const QString& aCoveName, QDomElemen
186189
QString type = elem.attribute( "type" );
187190
if ( type == "raster" )
188191
{
189-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
192+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
190193
if ( !layer )
191194
continue;
192195
QString coveName = layer->name();
@@ -366,7 +369,7 @@ QList<QgsMapLayer*> QgsWCSProjectParser::mapLayerFromCoverage( const QString& cN
366369
{
367370
QList<QgsMapLayer*> layerList;
368371

369-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
372+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
370373
if ( projectLayerElements.size() < 1 )
371374
{
372375
return layerList;
@@ -379,7 +382,7 @@ QList<QgsMapLayer*> QgsWCSProjectParser::mapLayerFromCoverage( const QString& cN
379382
QString type = elem.attribute( "type" );
380383
if ( type == "raster" )
381384
{
382-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem, useCache );
385+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem, useCache );
383386
QgsRasterLayer* layer = dynamic_cast<QgsRasterLayer*>( mLayer );
384387
if ( !layer || !wcsLayersId.contains( layer->id() ) )
385388
return layerList;

‎src/mapserver/qgswcsprojectparser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
class QgsWCSProjectParser
2424
{
2525
public:
26-
QgsWCSProjectParser( QDomDocument* xmlDoc, const QString& filePath );
26+
QgsWCSProjectParser( const QString& filePath );
2727
~QgsWCSProjectParser();
2828

2929
void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
@@ -35,7 +35,7 @@ class QgsWCSProjectParser
3535
QList<QgsMapLayer*> mapLayerFromCoverage( const QString& cName, bool useCache = true ) const;
3636

3737
private:
38-
QgsServerProjectParser mProjectParser;
38+
QgsServerProjectParser* mProjectParser;
3939
};
4040

4141
#endif // QGSWCSPROJECTPARSER_H

‎src/mapserver/qgswfsprojectparser.cpp

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
***************************************************************************/
1717

1818
#include "qgswfsprojectparser.h"
19+
#include "qgsconfigcache.h"
1920
#include "qgsconfigparserutils.h"
21+
#include "qgsconfigcache.h"
2022
#include "qgsmaplayerregistry.h"
2123
#include "qgsvectordataprovider.h"
2224

23-
QgsWFSProjectParser::QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& filePath ):
24-
mProjectParser( xmlDoc, filePath )
25+
QgsWFSProjectParser::QgsWFSProjectParser( const QString& filePath )
2526
{
27+
mProjectParser = QgsConfigCache::instance()->serverConfiguration( filePath );
2628
}
2729

2830
QgsWFSProjectParser::~QgsWFSProjectParser()
@@ -31,24 +33,24 @@ QgsWFSProjectParser::~QgsWFSProjectParser()
3133

3234
void QgsWFSProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
3335
{
34-
mProjectParser.serviceCapabilities( parentElement, doc, "WFS" );
36+
mProjectParser->serviceCapabilities( parentElement, doc, "WFS" );
3537
}
3638

3739
QString QgsWFSProjectParser::serviceUrl() const
3840
{
39-
return mProjectParser.serviceUrl();
41+
return mProjectParser->serviceUrl();
4042
}
4143

4244
QString QgsWFSProjectParser::wfsServiceUrl() const
4345
{
4446
QString url;
4547

46-
if ( !mProjectParser.xmlDocument() )
48+
if ( !mProjectParser->xmlDocument() )
4749
{
4850
return url;
4951
}
5052

51-
QDomElement propertiesElem = mProjectParser.propertiesElem();
53+
QDomElement propertiesElem = mProjectParser->propertiesElem();
5254
if ( !propertiesElem.isNull() )
5355
{
5456
QDomElement wfsUrlElem = propertiesElem.firstChildElement( "WFSUrl" );
@@ -62,13 +64,13 @@ QString QgsWFSProjectParser::wfsServiceUrl() const
6264

6365
void QgsWFSProjectParser::featureTypeList( QDomElement& parentElement, QDomDocument& doc ) const
6466
{
65-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
67+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
6668
if ( projectLayerElements.size() < 1 )
6769
{
6870
return;
6971
}
7072

71-
QStringList wfsLayersId = mProjectParser.wfsLayers();
73+
QStringList wfsLayersId = mProjectParser->wfsLayers();
7274
QSet<QString> wfstUpdateLayersId = wfstUpdateLayers();
7375
QSet<QString> wfstInsertLayersId = wfstInsertLayers();
7476
QSet<QString> wfstDeleteLayersId = wfstDeleteLayers();
@@ -80,7 +82,7 @@ void QgsWFSProjectParser::featureTypeList( QDomElement& parentElement, QDomDocum
8082
QString type = elem.attribute( "type" );
8183
if ( type == "vector" )
8284
{
83-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
85+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
8486
if ( layer && wfsLayersId.contains( layer->id() ) )
8587
{
8688
QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
@@ -203,12 +205,12 @@ QSet<QString> QgsWFSProjectParser::wfstUpdateLayers() const
203205
{
204206
QSet<QString> publishedIds = wfsLayerSet();
205207
QSet<QString> wfsList;
206-
if ( !mProjectParser.xmlDocument() )
208+
if ( !mProjectParser->xmlDocument() )
207209
{
208210
return wfsList;
209211
}
210212

211-
QDomElement propertiesElem = mProjectParser.propertiesElem();
213+
QDomElement propertiesElem = mProjectParser->propertiesElem();
212214
if ( propertiesElem.isNull() )
213215
{
214216
return wfsList;
@@ -239,12 +241,12 @@ QSet<QString> QgsWFSProjectParser::wfstInsertLayers() const
239241
{
240242
QSet<QString> publishedIds = wfsLayerSet();
241243
QSet<QString> wfsList;
242-
if ( !mProjectParser.xmlDocument() )
244+
if ( !mProjectParser->xmlDocument() )
243245
{
244246
return wfsList;
245247
}
246248

247-
QDomElement propertiesElem = mProjectParser.propertiesElem();
249+
QDomElement propertiesElem = mProjectParser->propertiesElem();
248250
if ( propertiesElem.isNull() )
249251
{
250252
return wfsList;
@@ -275,12 +277,12 @@ QSet<QString> QgsWFSProjectParser::wfstDeleteLayers() const
275277
{
276278
QSet<QString> publishedIds = wfsLayerSet();
277279
QSet<QString> wfsList;
278-
if ( !mProjectParser.xmlDocument() )
280+
if ( !mProjectParser->xmlDocument() )
279281
{
280282
return wfsList;
281283
}
282284

283-
QDomElement propertiesElem = mProjectParser.propertiesElem();
285+
QDomElement propertiesElem = mProjectParser->propertiesElem();
284286
if ( propertiesElem.isNull() )
285287
{
286288
return wfsList;
@@ -309,13 +311,13 @@ QSet<QString> QgsWFSProjectParser::wfstDeleteLayers() const
309311

310312
void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const
311313
{
312-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
314+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
313315
if ( projectLayerElements.size() < 1 )
314316
{
315317
return;
316318
}
317319

318-
QStringList wfsLayersId = mProjectParser.wfsLayers();
320+
QStringList wfsLayersId = mProjectParser->wfsLayers();
319321
QStringList typeNameList;
320322
if ( aTypeName != "" )
321323
{
@@ -334,7 +336,7 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
334336
QString type = elem.attribute( "type" );
335337
if ( type == "vector" )
336338
{
337-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
339+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem );
338340
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
339341
if ( !layer )
340342
continue;
@@ -460,7 +462,7 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
460462

461463
QStringList QgsWFSProjectParser::wfsLayers() const
462464
{
463-
return mProjectParser.wfsLayers();
465+
return mProjectParser->wfsLayers();
464466
}
465467

466468
QSet<QString> QgsWFSProjectParser::wfsLayerSet() const
@@ -470,13 +472,13 @@ QSet<QString> QgsWFSProjectParser::wfsLayerSet() const
470472

471473
int QgsWFSProjectParser::wfsLayerPrecision( const QString& aLayerId ) const
472474
{
473-
QStringList wfsLayersId = mProjectParser.wfsLayers();
475+
QStringList wfsLayersId = mProjectParser->wfsLayers();
474476
if ( !wfsLayersId.contains( aLayerId ) )
475477
{
476478
return -1;
477479
}
478480
int prec = 8;
479-
QDomElement propertiesElem = mProjectParser.propertiesElem();
481+
QDomElement propertiesElem = mProjectParser->propertiesElem();
480482
if ( !propertiesElem.isNull() )
481483
{
482484
QDomElement wfsPrecElem = propertiesElem.firstChildElement( "WFSLayersPrecision" );
@@ -498,7 +500,7 @@ QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aT
498500
Q_UNUSED( useCache );
499501

500502
QList<QgsMapLayer*> layerList;
501-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
503+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
502504

503505
if ( projectLayerElements.size() < 1 )
504506
{
@@ -524,7 +526,7 @@ QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aT
524526
QString type = elem.attribute( "type" );
525527
if ( type == "vector" )
526528
{
527-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
529+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem );
528530
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
529531
if ( !layer )
530532
continue;

‎src/mapserver/qgswfsprojectparser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
class QgsWFSProjectParser
2424
{
2525
public:
26-
QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& filePath );
26+
QgsWFSProjectParser( const QString& filePath );
2727
~QgsWFSProjectParser();
2828

2929
void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
@@ -44,7 +44,7 @@ class QgsWFSProjectParser
4444
QSet<QString> wfstDeleteLayers() const;
4545

4646
private:
47-
QgsServerProjectParser mProjectParser;
47+
QgsServerProjectParser* mProjectParser;
4848
};
4949

5050
#endif // QGSWFSPROJECTPARSER_H

‎src/mapserver/qgswmsprojectparser.cpp

Lines changed: 105 additions & 105 deletions
Large diffs are not rendered by default.

‎src/mapserver/qgswmsprojectparser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class QSvgRenderer;
2828
class QgsWMSProjectParser : public QgsWMSConfigParser
2929
{
3030
public:
31-
QgsWMSProjectParser( QDomDocument* xmlDoc, const QString& filePath );
31+
QgsWMSProjectParser( const QString& filePath );
3232
virtual ~QgsWMSProjectParser();
3333

3434
/**Adds layer and style specific capabilities elements to the parent node. This includes the individual layers and styles, their description, native CRS, bounding boxes, etc.
@@ -107,10 +107,10 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
107107

108108
void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const;
109109

110-
bool useLayerIDs() const { return mProjectParser.useLayerIDs(); }
110+
bool useLayerIDs() const { return mProjectParser->useLayerIDs(); }
111111

112112
private:
113-
QgsServerProjectParser mProjectParser;
113+
QgsServerProjectParser* mProjectParser;
114114

115115
mutable QFont mLegendLayerFont;
116116
mutable QFont mLegendItemFont;

0 commit comments

Comments
 (0)
Please sign in to comment.