Skip to content

Commit 4a4dc6b

Browse files
committedNov 15, 2014
[QGIS-Server] Enhance config cache
Add xmlDocument and server config in cache xmlDocument and server config will be opened once for every requested W*S Every requested W*S will point to the same server config and xmlDocument
1 parent fda637b commit 4a4dc6b

8 files changed

+179
-165
lines changed
 

‎src/mapserver/qgsconfigcache.cpp

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,27 @@ QgsConfigCache::~QgsConfigCache()
4242

4343
QgsServerProjectParser* QgsConfigCache::serverConfiguration( const QString& filePath )
4444
{
45-
QDomDocument* doc = xmlDocument( filePath );
46-
return new QgsServerProjectParser( doc, filePath );
47-
}
48-
49-
QgsWCSProjectParser* QgsConfigCache::wcsConfiguration( const QString& filePath )
50-
{
51-
QgsWCSProjectParser* p = mWCSConfigCache.object( filePath );
45+
QgsServerProjectParser* p = mServerConfigCache.object( filePath );
5246
if ( !p )
5347
{
5448
QDomDocument* doc = xmlDocument( filePath );
5549
if ( !doc )
5650
{
5751
return 0;
5852
}
59-
p = new QgsWCSProjectParser( doc, filePath );
53+
p = new QgsServerProjectParser( doc, filePath );
54+
mServerConfigCache.insert( filePath, p );
55+
mFileSystemWatcher.addPath( filePath );
56+
}
57+
return p;
58+
}
59+
60+
QgsWCSProjectParser* QgsConfigCache::wcsConfiguration( const QString& filePath )
61+
{
62+
QgsWCSProjectParser* p = mWCSConfigCache.object( filePath );
63+
if ( !p )
64+
{
65+
p = new QgsWCSProjectParser( filePath );
6066
mWCSConfigCache.insert( filePath, p );
6167
mFileSystemWatcher.addPath( filePath );
6268
}
@@ -70,13 +76,7 @@ QgsWFSProjectParser* QgsConfigCache::wfsConfiguration( const QString& filePath )
7076
QgsWFSProjectParser* p = mWFSConfigCache.object( filePath );
7177
if ( !p )
7278
{
73-
QDomDocument* doc = xmlDocument( filePath );
74-
if ( !doc )
75-
{
76-
return 0;
77-
}
78-
79-
p = new QgsWFSProjectParser( doc, filePath );
79+
p = new QgsWFSProjectParser( filePath );
8080
mWFSConfigCache.insert( filePath, p );
8181
mFileSystemWatcher.addPath( filePath );
8282
}
@@ -105,7 +105,7 @@ QgsWMSConfigParser* QgsConfigCache::wmsConfiguration( const QString& filePath, c
105105
}
106106
else
107107
{
108-
p = new QgsWMSProjectParser( doc, filePath );
108+
p = new QgsWMSProjectParser( filePath );
109109
}
110110
mWMSConfigCache.insert( filePath, p );
111111
mFileSystemWatcher.addPath( filePath );
@@ -117,6 +117,12 @@ QgsWMSConfigParser* QgsConfigCache::wmsConfiguration( const QString& filePath, c
117117

118118
QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
119119
{
120+
// first get cache
121+
QDomDocument* xmlDoc = mXmlDocumentCache.object( filePath );
122+
if ( xmlDoc )
123+
return xmlDoc;
124+
125+
// i it's first access
120126
//first open file
121127
QFile configFile( filePath );
122128
if ( !configFile.exists() )
@@ -132,7 +138,7 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
132138
}
133139

134140
//then create xml document
135-
QDomDocument* xmlDoc = new QDomDocument();
141+
xmlDoc = new QDomDocument();
136142
QString errorMsg;
137143
int line, column;
138144
if ( !xmlDoc->setContent( &configFile, true, &errorMsg, &line, &column ) )
@@ -142,11 +148,14 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
142148
delete xmlDoc;
143149
return 0;
144150
}
151+
mXmlDocumentCache.insert( filePath, xmlDoc );
145152
return xmlDoc;
146153
}
147154

148155
void QgsConfigCache::removeChangedEntry( const QString& path )
149156
{
157+
mXmlDocumentCache.remove( path );
158+
mServerConfigCache.remove( path );
150159
mWMSConfigCache.remove( path );
151160
mWFSConfigCache.remove( path );
152161
mWCSConfigCache.remove( path );

‎src/mapserver/qgsconfigcache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ 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;
56+
QCache<QString, QgsServerProjectParser> mServerConfigCache;
5557
QCache<QString, QgsWMSConfigParser> mWMSConfigCache;
5658
QCache<QString, QgsWFSProjectParser> mWFSConfigCache;
5759
QCache<QString, QgsWCSProjectParser> mWCSConfigCache;

‎src/mapserver/qgswcsprojectparser.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717

1818
#include "qgswcsprojectparser.h"
1919
#include "qgsconfigparserutils.h"
20+
#include "qgsconfigcache.h"
2021
#include "qgsrasterlayer.h"
2122

22-
QgsWCSProjectParser::QgsWCSProjectParser( QDomDocument* xmlDoc, const QString& filePath ): mProjectParser( xmlDoc, filePath )
23+
QgsWCSProjectParser::QgsWCSProjectParser( const QString& filePath )
2324
{
25+
QgsServerProjectParser* mProjectParser = QgsConfigCache::instance()->serverConfiguration( filePath );
2426
}
2527

2628
QgsWCSProjectParser::~QgsWCSProjectParser()
@@ -29,19 +31,19 @@ QgsWCSProjectParser::~QgsWCSProjectParser()
2931

3032
void QgsWCSProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
3133
{
32-
mProjectParser.serviceCapabilities( parentElement, doc, "WCS" );
34+
mProjectParser->serviceCapabilities( parentElement, doc, "WCS" );
3335
}
3436

3537
QString QgsWCSProjectParser::wcsServiceUrl() const
3638
{
3739
QString url;
3840

39-
if ( !mProjectParser.xmlDocument() )
41+
if ( !mProjectParser->xmlDocument() )
4042
{
4143
return url;
4244
}
4345

44-
QDomElement propertiesElem = mProjectParser.propertiesElem();
46+
QDomElement propertiesElem = mProjectParser->propertiesElem();
4547
if ( !propertiesElem.isNull() )
4648
{
4749
QDomElement wcsUrlElem = propertiesElem.firstChildElement( "WCSUrl" );
@@ -55,12 +57,12 @@ QString QgsWCSProjectParser::wcsServiceUrl() const
5557

5658
QString QgsWCSProjectParser::serviceUrl() const
5759
{
58-
return mProjectParser.serviceUrl();
60+
return mProjectParser->serviceUrl();
5961
}
6062

6163
void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDocument& doc ) const
6264
{
63-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
65+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
6466
if ( projectLayerElements.size() < 1 )
6567
{
6668
return;
@@ -75,7 +77,7 @@ void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDo
7577
QString type = elem.attribute( "type" );
7678
if ( type == "raster" )
7779
{
78-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
80+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
7981
if ( layer && wcsLayersId.contains( layer->id() ) )
8082
{
8183
QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
@@ -137,12 +139,12 @@ void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDo
137139
QStringList QgsWCSProjectParser::wcsLayers() const
138140
{
139141
QStringList wcsList;
140-
if ( !mProjectParser.xmlDocument() )
142+
if ( !mProjectParser->xmlDocument() )
141143
{
142144
return wcsList;
143145
}
144146

145-
QDomElement propertiesElem = mProjectParser.propertiesElem();
147+
QDomElement propertiesElem = mProjectParser->propertiesElem();
146148
if ( propertiesElem.isNull() )
147149
{
148150
return wcsList;
@@ -162,7 +164,7 @@ QStringList QgsWCSProjectParser::wcsLayers() const
162164

163165
void QgsWCSProjectParser::describeCoverage( const QString& aCoveName, QDomElement& parentElement, QDomDocument& doc ) const
164166
{
165-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
167+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
166168
if ( projectLayerElements.size() < 1 )
167169
{
168170
return;
@@ -186,7 +188,7 @@ void QgsWCSProjectParser::describeCoverage( const QString& aCoveName, QDomElemen
186188
QString type = elem.attribute( "type" );
187189
if ( type == "raster" )
188190
{
189-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
191+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
190192
if ( !layer )
191193
continue;
192194
QString coveName = layer->name();
@@ -366,7 +368,7 @@ QList<QgsMapLayer*> QgsWCSProjectParser::mapLayerFromCoverage( const QString& cN
366368
{
367369
QList<QgsMapLayer*> layerList;
368370

369-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
371+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
370372
if ( projectLayerElements.size() < 1 )
371373
{
372374
return layerList;
@@ -379,7 +381,7 @@ QList<QgsMapLayer*> QgsWCSProjectParser::mapLayerFromCoverage( const QString& cN
379381
QString type = elem.attribute( "type" );
380382
if ( type == "raster" )
381383
{
382-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem, useCache );
384+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem, useCache );
383385
QgsRasterLayer* layer = dynamic_cast<QgsRasterLayer*>( mLayer );
384386
if ( !layer || !wcsLayersId.contains( layer->id() ) )
385387
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: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717

1818
#include "qgswfsprojectparser.h"
1919
#include "qgsconfigparserutils.h"
20+
#include "qgsconfigcache.h"
2021
#include "qgsmaplayerregistry.h"
2122
#include "qgsvectordataprovider.h"
2223

23-
QgsWFSProjectParser::QgsWFSProjectParser( QDomDocument* xmlDoc, const QString& filePath ):
24-
mProjectParser( xmlDoc, filePath )
24+
QgsWFSProjectParser::QgsWFSProjectParser( const QString& filePath )
2525
{
26+
QgsServerProjectParser* mProjectParser = QgsConfigCache::instance()->serverConfiguration( filePath );
2627
}
2728

2829
QgsWFSProjectParser::~QgsWFSProjectParser()
@@ -31,24 +32,24 @@ QgsWFSProjectParser::~QgsWFSProjectParser()
3132

3233
void QgsWFSProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const
3334
{
34-
mProjectParser.serviceCapabilities( parentElement, doc, "WFS" );
35+
mProjectParser->serviceCapabilities( parentElement, doc, "WFS" );
3536
}
3637

3738
QString QgsWFSProjectParser::serviceUrl() const
3839
{
39-
return mProjectParser.serviceUrl();
40+
return mProjectParser->serviceUrl();
4041
}
4142

4243
QString QgsWFSProjectParser::wfsServiceUrl() const
4344
{
4445
QString url;
4546

46-
if ( !mProjectParser.xmlDocument() )
47+
if ( !mProjectParser->xmlDocument() )
4748
{
4849
return url;
4950
}
5051

51-
QDomElement propertiesElem = mProjectParser.propertiesElem();
52+
QDomElement propertiesElem = mProjectParser->propertiesElem();
5253
if ( !propertiesElem.isNull() )
5354
{
5455
QDomElement wfsUrlElem = propertiesElem.firstChildElement( "WFSUrl" );
@@ -62,13 +63,13 @@ QString QgsWFSProjectParser::wfsServiceUrl() const
6263

6364
void QgsWFSProjectParser::featureTypeList( QDomElement& parentElement, QDomDocument& doc ) const
6465
{
65-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
66+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
6667
if ( projectLayerElements.size() < 1 )
6768
{
6869
return;
6970
}
7071

71-
QStringList wfsLayersId = mProjectParser.wfsLayers();
72+
QStringList wfsLayersId = mProjectParser->wfsLayers();
7273
QSet<QString> wfstUpdateLayersId = wfstUpdateLayers();
7374
QSet<QString> wfstInsertLayersId = wfstInsertLayers();
7475
QSet<QString> wfstDeleteLayersId = wfstDeleteLayers();
@@ -80,7 +81,7 @@ void QgsWFSProjectParser::featureTypeList( QDomElement& parentElement, QDomDocum
8081
QString type = elem.attribute( "type" );
8182
if ( type == "vector" )
8283
{
83-
QgsMapLayer *layer = mProjectParser.createLayerFromElement( elem );
84+
QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
8485
if ( layer && wfsLayersId.contains( layer->id() ) )
8586
{
8687
QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
@@ -203,12 +204,12 @@ QSet<QString> QgsWFSProjectParser::wfstUpdateLayers() const
203204
{
204205
QSet<QString> publishedIds = wfsLayerSet();
205206
QSet<QString> wfsList;
206-
if ( !mProjectParser.xmlDocument() )
207+
if ( !mProjectParser->xmlDocument() )
207208
{
208209
return wfsList;
209210
}
210211

211-
QDomElement propertiesElem = mProjectParser.propertiesElem();
212+
QDomElement propertiesElem = mProjectParser->propertiesElem();
212213
if ( propertiesElem.isNull() )
213214
{
214215
return wfsList;
@@ -239,12 +240,12 @@ QSet<QString> QgsWFSProjectParser::wfstInsertLayers() const
239240
{
240241
QSet<QString> publishedIds = wfsLayerSet();
241242
QSet<QString> wfsList;
242-
if ( !mProjectParser.xmlDocument() )
243+
if ( !mProjectParser->xmlDocument() )
243244
{
244245
return wfsList;
245246
}
246247

247-
QDomElement propertiesElem = mProjectParser.propertiesElem();
248+
QDomElement propertiesElem = mProjectParser->propertiesElem();
248249
if ( propertiesElem.isNull() )
249250
{
250251
return wfsList;
@@ -275,12 +276,12 @@ QSet<QString> QgsWFSProjectParser::wfstDeleteLayers() const
275276
{
276277
QSet<QString> publishedIds = wfsLayerSet();
277278
QSet<QString> wfsList;
278-
if ( !mProjectParser.xmlDocument() )
279+
if ( !mProjectParser->xmlDocument() )
279280
{
280281
return wfsList;
281282
}
282283

283-
QDomElement propertiesElem = mProjectParser.propertiesElem();
284+
QDomElement propertiesElem = mProjectParser->propertiesElem();
284285
if ( propertiesElem.isNull() )
285286
{
286287
return wfsList;
@@ -309,13 +310,13 @@ QSet<QString> QgsWFSProjectParser::wfstDeleteLayers() const
309310

310311
void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomElement& parentElement, QDomDocument& doc ) const
311312
{
312-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
313+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
313314
if ( projectLayerElements.size() < 1 )
314315
{
315316
return;
316317
}
317318

318-
QStringList wfsLayersId = mProjectParser.wfsLayers();
319+
QStringList wfsLayersId = mProjectParser->wfsLayers();
319320
QStringList typeNameList;
320321
if ( aTypeName != "" )
321322
{
@@ -334,7 +335,7 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
334335
QString type = elem.attribute( "type" );
335336
if ( type == "vector" )
336337
{
337-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
338+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem );
338339
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
339340
if ( !layer )
340341
continue;
@@ -460,7 +461,7 @@ void QgsWFSProjectParser::describeFeatureType( const QString& aTypeName, QDomEle
460461

461462
QStringList QgsWFSProjectParser::wfsLayers() const
462463
{
463-
return mProjectParser.wfsLayers();
464+
return mProjectParser->wfsLayers();
464465
}
465466

466467
QSet<QString> QgsWFSProjectParser::wfsLayerSet() const
@@ -470,13 +471,13 @@ QSet<QString> QgsWFSProjectParser::wfsLayerSet() const
470471

471472
int QgsWFSProjectParser::wfsLayerPrecision( const QString& aLayerId ) const
472473
{
473-
QStringList wfsLayersId = mProjectParser.wfsLayers();
474+
QStringList wfsLayersId = mProjectParser->wfsLayers();
474475
if ( !wfsLayersId.contains( aLayerId ) )
475476
{
476477
return -1;
477478
}
478479
int prec = 8;
479-
QDomElement propertiesElem = mProjectParser.propertiesElem();
480+
QDomElement propertiesElem = mProjectParser->propertiesElem();
480481
if ( !propertiesElem.isNull() )
481482
{
482483
QDomElement wfsPrecElem = propertiesElem.firstChildElement( "WFSLayersPrecision" );
@@ -498,7 +499,7 @@ QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aT
498499
Q_UNUSED( useCache );
499500

500501
QList<QgsMapLayer*> layerList;
501-
const QList<QDomElement>& projectLayerElements = mProjectParser.projectLayerElements();
502+
const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
502503

503504
if ( projectLayerElements.size() < 1 )
504505
{
@@ -524,7 +525,7 @@ QList<QgsMapLayer*> QgsWFSProjectParser::mapLayerFromTypeName( const QString& aT
524525
QString type = elem.attribute( "type" );
525526
if ( type == "vector" )
526527
{
527-
QgsMapLayer *mLayer = mProjectParser.createLayerFromElement( elem );
528+
QgsMapLayer *mLayer = mProjectParser->createLayerFromElement( elem );
528529
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mLayer );
529530
if ( !layer )
530531
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.