Skip to content

Commit f132b43

Browse files
committed
Fix loading of embedded layers and groups in WMS server
1 parent 394a80c commit f132b43

File tree

6 files changed

+100
-107
lines changed

6 files changed

+100
-107
lines changed

src/mapserver/qgsconfigparserutils.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,20 @@ void QgsConfigParserUtils::fallbackServiceCapabilities( QDomElement& parentEleme
203203
}
204204
}
205205
}
206+
207+
QList<QgsMapLayer*> QgsConfigParserUtils::layerMapToList( const QMap< int, QgsMapLayer* >& layerMap, bool reverseOrder )
208+
{
209+
if ( reverseOrder ) //reverse order
210+
{
211+
QList<QgsMapLayer*> list;
212+
QMapIterator< int, QgsMapLayer* > layerMapIt( layerMap );
213+
layerMapIt.toBack();
214+
while ( layerMapIt.hasPrevious() )
215+
{
216+
layerMapIt.previous();
217+
list.append( layerMapIt.value() );
218+
}
219+
return list;
220+
}
221+
return layerMap.values(); //take numbered drawing order
222+
}

src/mapserver/qgsconfigparserutils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class QgsConfigParserUtils
4141

4242
/**Returns default service capabilities from wms_metadata.xml if nothing else is defined*/
4343
static void fallbackServiceCapabilities( QDomElement& parentElement, QDomDocument& doc );
44+
45+
static QList<QgsMapLayer*> layerMapToList( const QMap< int, QgsMapLayer* >& layerMap, bool reverseOrder = false );
4446
};
4547

4648
#endif // QGSCONFIGPARSERUTILS_H

src/mapserver/qgsserverprojectparser.cpp

Lines changed: 9 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,11 @@ int QgsServerProjectParser::numberOfLayers() const
334334
return mProjectLayerElements.size();
335335
}
336336

337+
bool QgsServerProjectParser::updateLegendDrawingOrder() const
338+
{
339+
return legendElem().attribute( "updateDrawingOrder", "true" ).compare( "true", Qt::CaseInsensitive ) == 0;
340+
}
341+
337342
QString QgsServerProjectParser::layerName( const QDomElement& layerElem ) const
338343
{
339344
if ( layerElem.isNull() )
@@ -831,72 +836,11 @@ QSet<QString> QgsServerProjectParser::findRestrictedLayers() const
831836
return restrictedLayerSet;
832837
}
833838

834-
void QgsServerProjectParser::addLayersFromGroup( const QDomElement& legendGroupElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
835-
{
836-
if ( legendGroupElem.attribute( "embedded" ) == "1" ) //embedded group
837-
{
838-
//get project parser
839-
//get group elements from project parser, find the group
840-
//iterate over layers and add them (embedding in embedded groups does not work)
841-
QString groupName = legendGroupElem.attribute( "name" );
842-
QString project = convertToAbsolutePath( legendGroupElem.attribute( "project" ) );
843-
844-
#if 0 //todo: fixme
845-
QgsProjectParser* p = 0; //dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
846-
if ( !p )
847-
{
848-
return;
849-
}
850-
851-
QList<QDomElement> pLegendGroupElems = p->mLegendGroupElements;
852-
QList<QDomElement>::const_iterator pGroupIt = pLegendGroupElems.constBegin();
853-
for ( ; pGroupIt != pLegendGroupElems.constEnd(); ++pGroupIt )
854-
{
855-
if ( pGroupIt->attribute( "name" ) == groupName )
856-
{
857-
p->addLayersFromGroup( *pGroupIt, layerList, useCache );
858-
return;
859-
}
860-
}
861-
#endif //0
862-
}
863-
else //normal group
864-
{
865-
bool updateDrawingOrder = ( legendGroupElem.parentNode().toElement().attribute( "updateDrawingOrder" ) == "true" );
866-
QMap< int, QDomElement > layerOrderList;
867-
QDomNodeList groupElemChildren = legendGroupElem.childNodes();
868-
for ( int i = 0; i < groupElemChildren.size(); ++i )
869-
{
870-
QDomElement elem = groupElemChildren.at( i ).toElement();
871-
if ( elem.tagName() == "legendgroup" )
872-
{
873-
addLayersFromGroup( elem, layerList, useCache );
874-
}
875-
else if ( elem.tagName() == "legendlayer" )
876-
{
877-
int drawingOrder = updateDrawingOrder ? -1 : elem.attribute( "drawingOrder", "-1" ).toInt();
878-
if ( drawingOrder == -1 )
879-
{
880-
addLayerFromLegendLayer( elem, layerList, useCache );
881-
}
882-
else
883-
{
884-
layerOrderList.insert( drawingOrder, elem );
885-
}
886-
}
887-
}
888-
889-
QMap< int, QDomElement >::const_iterator layerOrderIt = layerOrderList.constBegin();
890-
for ( ; layerOrderIt != layerOrderList.constEnd(); ++layerOrderIt )
891-
{
892-
addLayerFromLegendLayer( layerOrderIt.value(), layerList, useCache );
893-
}
894-
}
895-
}
896-
897-
void QgsServerProjectParser::addLayerFromLegendLayer( const QDomElement& legendLayerElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
839+
void QgsServerProjectParser::layerFromLegendLayer( const QDomElement& legendLayerElem, QMap< int, QgsMapLayer*>& layers, bool useCache ) const
898840
{
899841
QString id = legendLayerElem.firstChild().firstChild().toElement().attribute( "layerid" );
842+
int drawingOrder = updateLegendDrawingOrder() ? -1 : legendLayerElem.attribute( "drawingOrder", "-1" ).toInt();
843+
900844
QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById.find( id );
901845
if ( layerIt != mProjectLayerElementsById.constEnd() )
902846
{
@@ -906,7 +850,7 @@ void QgsServerProjectParser::addLayerFromLegendLayer( const QDomElement& legendL
906850
QgsMapLayer* layer = createLayerFromElement( layerIt.value(), useCache );
907851
if ( layer )
908852
{
909-
layerList.append( layer );
853+
layers.insertMulti( drawingOrder, layer );
910854
}
911855
}
912856
}

src/mapserver/qgsserverprojectparser.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,7 @@ class QgsServerProjectParser
8686

8787
const QHash< QString, QDomElement >& projectLayerElementsByName() const { return mProjectLayerElementsByName; }
8888

89-
/**Adds layers from a legend group to list (could be embedded or a normal group)*/
90-
void addLayersFromGroup( const QDomElement& legendGroupElem, QList<QgsMapLayer*>& layerList, bool useCache = true ) const;
91-
92-
void addLayerFromLegendLayer( const QDomElement& legendLayerElem, QList<QgsMapLayer*>& layerList, bool useCache = true ) const;
89+
void layerFromLegendLayer( const QDomElement& legendLayerElem, QMap< int, QgsMapLayer*>& layers, bool useCache = true ) const;
9390

9491
QStringList wfsLayerNames() const;
9592

@@ -119,6 +116,8 @@ class QgsServerProjectParser
119116

120117
int numberOfLayers() const;
121118

119+
bool updateLegendDrawingOrder() const;
120+
122121
private:
123122

124123
/**Content of project file*/

src/mapserver/qgswmsprojectparser.cpp

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -93,27 +93,20 @@ void QgsWMSProjectParser::layersAndStylesCapabilities( QDomElement& parentElemen
9393
QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool useCache ) const
9494
{
9595
Q_UNUSED( styleName );
96-
QList<QgsMapLayer*> layerList;
96+
QMap< int, QgsMapLayer* > layers;
9797

9898
//first check if the layer name refers an unpublished layer / group
9999
if ( mProjectParser.restrictedLayers().contains( lName ) )
100100
{
101-
return layerList;
101+
return QList<QgsMapLayer*>();
102102
}
103103

104104
//does lName refer to a leaf layer
105105
const QHash< QString, QDomElement >& projectLayerElementsByName = mProjectParser.projectLayerElementsByName();
106106
QHash< QString, QDomElement >::const_iterator layerElemIt = projectLayerElementsByName.find( lName );
107107
if ( layerElemIt != projectLayerElementsByName.constEnd() )
108108
{
109-
mProjectParser.addJoinLayersForElement( layerElemIt.value(), useCache );
110-
mProjectParser.addValueRelationLayersForElement( layerElemIt.value(), useCache );
111-
QgsMapLayer* layer = mProjectParser.createLayerFromElement( layerElemIt.value(), useCache );
112-
if ( layer )
113-
{
114-
layerList.push_back( layer );
115-
return layerList;
116-
}
109+
return ( QList<QgsMapLayer*>() << mProjectParser.createLayerFromElement( layerElemIt.value(), useCache ) );
117110
}
118111

119112
//group or project name
@@ -138,28 +131,8 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
138131

139132
if ( !groupElement.isNull() )
140133
{
141-
//embedded group has no children in this project file
142-
if ( groupElement.attribute( "embedded" ) == "1" )
143-
{
144-
mProjectParser.addLayersFromGroup( groupElement, layerList, useCache );
145-
return layerList;
146-
}
147-
148-
//group element found, iterate children and call addLayersFromGroup / addLayerFromLegendLayer for each
149-
QDomNodeList childList = groupElement.childNodes();
150-
for ( uint i = 0; i < childList.length(); ++i )
151-
{
152-
QDomElement childElem = childList.at( i ).toElement();
153-
if ( childElem.tagName() == "legendgroup" )
154-
{
155-
mProjectParser.addLayersFromGroup( childElem, layerList, useCache );
156-
}
157-
else if ( childElem.tagName() == "legendlayer" )
158-
{
159-
mProjectParser.addLayerFromLegendLayer( childElem, layerList, useCache );
160-
}
161-
}
162-
return layerList;
134+
addLayersFromGroup( groupElement, layers, useCache );
135+
return QgsConfigParserUtils::layerMapToList( layers, mProjectParser.updateLegendDrawingOrder() );
163136
}
164137

165138
//still not found. Check if it is a single embedded layer (embedded layers are not contained in mProjectLayerElementsByName)
@@ -170,7 +143,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
170143
QDomElement legendLayerElem = legendLayerList.at( i ).toElement();
171144
if ( legendLayerElem.attribute( "name" ) == lName )
172145
{
173-
mProjectParser.addLayerFromLegendLayer( legendLayerElem, layerList, useCache );
146+
mProjectParser.layerFromLegendLayer( legendLayerElem, layers, useCache );
174147
}
175148
}
176149

@@ -193,9 +166,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
193166
QHash< QString, QDomElement >::const_iterator pLayerNameIt = pLayerByName.find( lName );
194167
if ( pLayerNameIt != pLayerByName.constEnd() )
195168
{
196-
pp.addJoinLayersForElement( pLayerNameIt.value(), useCache );
197-
pp.addValueRelationLayersForElement( pLayerNameIt.value(), useCache );
198-
layerList.push_back( pp.createLayerFromElement( pLayerNameIt.value(), useCache ) );
169+
pp.layerFromLegendLayer( pLayerNameIt.value(), layers, useCache );
199170
break;
200171
}
201172

@@ -205,15 +176,72 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
205176
{
206177
if ( pLegendGroupIt->attribute( "name" ) == lName )
207178
{
208-
pp.addLayersFromGroup( *pLegendGroupIt, layerList, useCache );
179+
addLayersFromGroup( *pLegendGroupIt, layers, useCache );
209180
break;
210181
}
211182
}
212183
}
213184
}
214185
}
215186

216-
return layerList;
187+
return layers.values();
188+
}
189+
190+
void QgsWMSProjectParser::addLayersFromGroup( const QDomElement& legendGroupElem, QMap< int, QgsMapLayer*>& layers, bool useCache ) const
191+
{
192+
if ( legendGroupElem.isNull() )
193+
{
194+
return;
195+
}
196+
197+
if ( legendGroupElem.attribute( "embedded" ) == "1" ) //embedded group
198+
{
199+
QString groupName = legendGroupElem.attribute( "name" );
200+
int drawingOrder = mProjectParser.updateLegendDrawingOrder() ? legendGroupElem.attribute( "drawingOrder", "-1" ).toInt() : -1;
201+
202+
QString project = mProjectParser.convertToAbsolutePath( legendGroupElem.attribute( "project" ) );
203+
QgsWMSProjectParser* p = dynamic_cast<QgsWMSProjectParser*>( QgsConfigCache::instance()->wmsConfiguration( project ) );
204+
if ( p )
205+
{
206+
QgsServerProjectParser& pp = p->mProjectParser;
207+
const QList<QDomElement>& legendGroups = pp.legendGroupElements();
208+
QList<QDomElement>::const_iterator legendIt = legendGroups.constBegin();
209+
for ( ; legendIt != legendGroups.constEnd(); ++legendIt )
210+
{
211+
if ( legendIt->attribute( "name" ) == groupName )
212+
{
213+
QMap< int, QgsMapLayer*> embeddedGroupLayers;
214+
p->addLayersFromGroup( *legendIt, embeddedGroupLayers, useCache );
215+
216+
//reverse order because it will be reversed again afterwards in insertMulti
217+
QList< QgsMapLayer* > embeddedLayerList = QgsConfigParserUtils::layerMapToList( embeddedGroupLayers, pp.updateLegendDrawingOrder() );
218+
219+
QList< QgsMapLayer* >::const_iterator layerIt = embeddedLayerList.constBegin();
220+
for ( ; layerIt != embeddedLayerList.constEnd(); ++layerIt )
221+
{
222+
layers.insertMulti( drawingOrder, *layerIt );
223+
}
224+
}
225+
}
226+
}
227+
}
228+
else //normal group
229+
{
230+
QMap< int, QDomElement > layerOrderList;
231+
QDomNodeList groupElemChildren = legendGroupElem.childNodes();
232+
for ( int i = 0; i < groupElemChildren.size(); ++i )
233+
{
234+
QDomElement elem = groupElemChildren.at( i ).toElement();
235+
if ( elem.tagName() == "legendgroup" )
236+
{
237+
addLayersFromGroup( elem, layers, useCache );
238+
}
239+
else if ( elem.tagName() == "legendlayer" )
240+
{
241+
mProjectParser.layerFromLegendLayer( elem, layers, useCache );
242+
}
243+
}
244+
}
217245
}
218246

219247
QString QgsWMSProjectParser::serviceUrl() const

src/mapserver/qgswmsprojectparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ class QgsWMSProjectParser: public QgsWMSConfigParser
135135
const QMap<QString, QgsMapLayer *> &layerMap, const QStringList &nonIdentifiableLayers,
136136
const QString& strHref, QgsRectangle& combinedBBox, QString strGroup ) const;
137137

138+
/**Adds layers from a legend group to list (could be embedded or a normal group)*/
139+
void addLayersFromGroup( const QDomElement& legendGroupElem, QMap< int, QgsMapLayer*>& layers, bool useCache = true ) const;
140+
138141
QDomElement composerByName( const QString& composerName ) const;
139142

140143
static bool annotationPosition( const QDomElement& elem, double scaleFactor, double& xPos, double& yPos );

0 commit comments

Comments
 (0)