Skip to content

Commit 3954555

Browse files
author
Marco Hugentobler
committed
[FEATURE]: Possibility to restrict layers / groups from WMS publication
1 parent a1a2b25 commit 3954555

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

src/mapserver/qgsprojectparser.cpp

+80
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc, const QString& filePat
7171
mLegendGroupElements.push_back( groupNodeList.at( i ).toElement() );
7272
}
7373
}
74+
75+
mRestrictedLayers = restrictedLayers();
7476
}
7577
}
7678

@@ -367,6 +369,10 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
367369
{
368370
layerElem.setAttribute( "queryable", "1" );
369371
QString name = currentChildElem.attribute( "name" );
372+
if ( mRestrictedLayers.contains( name ) ) //unpublished group
373+
{
374+
continue;
375+
}
370376
QDomElement nameElem = doc.createElement( "Name" );
371377
QDomText nameText = doc.createTextNode( name );
372378
nameElem.appendChild( nameText );
@@ -434,6 +440,10 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
434440
continue;
435441
}
436442

443+
if ( mRestrictedLayers.contains( currentLayer->name() ) ) //unpublished layer
444+
{
445+
continue;
446+
}
437447
if ( nonIdentifiableLayers.contains( currentLayer->id() ) )
438448
{
439449
layerElem.setAttribute( "queryable", "0" );
@@ -665,6 +675,13 @@ QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, c
665675
Q_UNUSED( styleName );
666676
QList<QgsMapLayer*> layerList;
667677

678+
//first check if the layer name refers an unpublished layer / group
679+
QSet<QString> rLayers = restrictedLayers();
680+
if ( mRestrictedLayers.contains( lName ) )
681+
{
682+
return layerList;
683+
}
684+
668685
if ( !mXMLDoc )
669686
{
670687
return layerList;
@@ -2017,3 +2034,66 @@ void QgsProjectParser::projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap )
20172034
}
20182035
}
20192036
}
2037+
2038+
QSet<QString> QgsProjectParser::restrictedLayers() const
2039+
{
2040+
QSet<QString> restrictedLayerSet;
2041+
2042+
if ( !mXMLDoc )
2043+
{
2044+
return restrictedLayerSet;
2045+
}
2046+
2047+
//names of unpublished layers / groups
2048+
QDomElement propertiesElem = mXMLDoc->documentElement().firstChildElement( "properties" );
2049+
if ( !propertiesElem.isNull() )
2050+
{
2051+
QDomElement wmsLayerRestrictionElem = propertiesElem.firstChildElement( "WMSRestrictedLayers" );
2052+
if ( !wmsLayerRestrictionElem.isNull() )
2053+
{
2054+
QStringList restrictedLayersAndGroups;
2055+
QDomNodeList wmsLayerRestrictionValues = wmsLayerRestrictionElem.elementsByTagName( "value" );
2056+
for ( int i = 0; i < wmsLayerRestrictionValues.size(); ++i )
2057+
{
2058+
restrictedLayerSet.insert( wmsLayerRestrictionValues.at( i ).toElement().text() );
2059+
}
2060+
}
2061+
}
2062+
2063+
//get legend dom element
2064+
if ( restrictedLayerSet.size() < 1 || !mXMLDoc )
2065+
{
2066+
return restrictedLayerSet;
2067+
}
2068+
2069+
QDomElement legendElem = mXMLDoc->documentElement().firstChildElement( "legend" );
2070+
if ( legendElem.isNull() )
2071+
{
2072+
return restrictedLayerSet;
2073+
}
2074+
2075+
//go through all legend groups and insert names of subgroups / sublayers if there is a match
2076+
QDomNodeList legendGroupList = legendElem.elementsByTagName( "legendgroup" );
2077+
for ( int i = 0; i < legendGroupList.size(); ++i )
2078+
{
2079+
//get name
2080+
QDomElement groupElem = legendGroupList.at( i ).toElement();
2081+
QString groupName = groupElem.attribute( "name" );
2082+
if ( restrictedLayerSet.contains( groupName ) )
2083+
{
2084+
//match: add names of subgroups and sublayers to set
2085+
QDomNodeList subgroupList = groupElem.elementsByTagName( "legendgroup" );
2086+
for ( int j = 0; j < subgroupList.size(); ++j )
2087+
{
2088+
restrictedLayerSet.insert( subgroupList.at( j ).toElement().attribute( "name" ) );
2089+
}
2090+
QDomNodeList sublayerList = groupElem.elementsByTagName( "legendlayer" );
2091+
for ( int k = 0; k < sublayerList.size(); ++k )
2092+
{
2093+
restrictedLayerSet.insert( sublayerList.at( k ).toElement().attribute( "name" ) );
2094+
}
2095+
}
2096+
}
2097+
2098+
return restrictedLayerSet;
2099+
}

src/mapserver/qgsprojectparser.h

+5
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ class QgsProjectParser: public QgsConfigParser
134134
QHash< QString, QDomElement > mProjectLayerElementsById;
135135
/**Project layer elements, accessible by layer name*/
136136
QHash< QString, QDomElement > mProjectLayerElementsByName;
137+
/**Names of layers and groups which should not be published*/
138+
QSet<QString> mRestrictedLayers;
137139

138140
/**Creates a maplayer object from <maplayer> element. The layer cash owns the maplayer, so don't delete it
139141
@return the maplayer or 0 in case of error*/
@@ -191,6 +193,9 @@ class QgsProjectParser: public QgsConfigParser
191193
void projectLayerMap( QMap<QString, QgsMapLayer*>& layerMap ) const;
192194

193195
static QString editTypeString( QgsVectorLayer::EditType type );
196+
197+
/**Returns a complete string set with all the restricted layer names (layers/groups that are not to be published)*/
198+
QSet<QString> restrictedLayers() const;
194199
};
195200

196201
#endif // QGSPROJECTPARSER_H

0 commit comments

Comments
 (0)