QGIS API Documentation  3.17.0-Master (df2c9ff931)
qgsprojectservervalidator.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsprojectservervalidator.cpp
3  ---------------------------
4  begin : March 2020
5  copyright : (C) 2020 by Etienne Trimaille
6  email : etienne dot trimaille at gmail 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 
19 #include "qgsapplication.h"
20 #include "qgslayertreelayer.h"
22 #include "qgsvectorlayer.h"
23 
24 
26 {
27  switch ( error )
28  {
30  return QObject::tr( "Encoding is not correctly set. A non 'System' encoding is required" );
32  return QObject::tr( "Layer short name is not valid. It must start with an unaccented alphabetical letter, followed by any alphanumeric letters, dot, dash or underscore" );
34  return QObject::tr( "One or more layers or groups have the same name or short name. Both the 'name' and 'short name' for layers and groups must be unique" );
36  return QObject::tr( "The project root name (either the project short name or project title) is not valid. It must start with an unaccented alphabetical letter, followed by any alphanumeric letters, dot, dash or underscore" );
38  return QObject::tr( "The project root name (either the project short name or project title) is already used by a layer or a group" );
39  }
40  return QString();
41 }
42 
43 void QgsProjectServerValidator::browseLayerTree( QgsLayerTreeGroup *treeGroup, QStringList &owsNames, QStringList &encodingMessages )
44 {
45  QList< QgsLayerTreeNode * > treeGroupChildren = treeGroup->children();
46  for ( int i = 0; i < treeGroupChildren.size(); ++i )
47  {
48  QgsLayerTreeNode *treeNode = treeGroupChildren.at( i );
49  if ( treeNode->nodeType() == QgsLayerTreeNode::NodeGroup )
50  {
51  QgsLayerTreeGroup *treeGroupChild = static_cast<QgsLayerTreeGroup *>( treeNode );
52  QString shortName = treeGroupChild->customProperty( QStringLiteral( "wmsShortName" ) ).toString();
53  if ( shortName.isEmpty() )
54  owsNames << treeGroupChild->name();
55  else
56  owsNames << shortName;
57  browseLayerTree( treeGroupChild, owsNames, encodingMessages );
58  }
59  else
60  {
61  QgsLayerTreeLayer *treeLayer = static_cast<QgsLayerTreeLayer *>( treeNode );
62  QgsMapLayer *layer = treeLayer->layer();
63  if ( layer )
64  {
65  QString shortName = layer->shortName();
66  if ( shortName.isEmpty() )
67  owsNames << layer->name();
68  else
69  owsNames << shortName;
70 
71  if ( layer->type() == QgsMapLayerType::VectorLayer )
72  {
73  QgsVectorLayer *vl = static_cast<QgsVectorLayer *>( layer );
74  if ( vl->dataProvider() && vl->dataProvider()->encoding() == QLatin1String( "System" ) )
75  encodingMessages << layer->name();
76  }
77  }
78  }
79  }
80 }
81 
82 bool QgsProjectServerValidator::validate( QgsProject *project, QList<QgsProjectServerValidator::ValidationResult> &results )
83 {
84  results.clear();
85  bool result = true;
86 
87  if ( !project )
88  return false;
89 
90  if ( !project->layerTreeRoot() )
91  return false;
92 
93  QStringList owsNames, encodingMessages;
94  browseLayerTree( project->layerTreeRoot(), owsNames, encodingMessages );
95 
96  QStringList duplicateNames, regExpMessages;
97  QRegExp snRegExp = QgsApplication::shortNameRegExp();
98  const auto constOwsNames = owsNames;
99  for ( const QString &name : constOwsNames )
100  {
101  if ( !snRegExp.exactMatch( name ) )
102  {
103  regExpMessages << name;
104  }
105 
106  if ( duplicateNames.contains( name ) )
107  {
108  continue;
109  }
110 
111  if ( owsNames.count( name ) > 1 )
112  {
113  duplicateNames << name;
114  }
115  }
116 
117  if ( !duplicateNames.empty() )
118  {
119  result = false;
120  results << ValidationResult( QgsProjectServerValidator::DuplicatedNames, duplicateNames.join( QLatin1String( ", " ) ) );
121  }
122 
123  if ( !regExpMessages.empty() )
124  {
125  result = false;
126  results << ValidationResult( QgsProjectServerValidator::LayerShortName, regExpMessages.join( QLatin1String( ", " ) ) );
127  }
128 
129  if ( !encodingMessages.empty() )
130  {
131  result = false;
132  results << ValidationResult( QgsProjectServerValidator::LayerEncoding, encodingMessages.join( QLatin1String( ", " ) ) );
133  }
134 
135  // Determine the root layername
136  QString rootLayerName = project->readEntry( QStringLiteral( "WMSRootName" ), QStringLiteral( "/" ), "" );
137  if ( rootLayerName.isEmpty() && !project->title().isEmpty() )
138  {
139  rootLayerName = project->title();
140  }
141  if ( !rootLayerName.isEmpty() )
142  {
143  if ( owsNames.count( rootLayerName ) >= 1 )
144  {
145  result = false;
147  }
148 
149  if ( !snRegExp.exactMatch( rootLayerName ) )
150  {
151  result = false;
153  }
154  }
155 
156  return result;
157 }
Layer tree group node serves as a container for layers and further groups.
QString encoding() const
Returns the encoding which is used for accessing data.
Base class for all map layer types.
Definition: qgsmaplayer.h:84
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
Reads a string from the specified scope and key.
Layer/group short name is not valid.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
static bool validate(QgsProject *project, QList< QgsProjectServerValidator::ValidationResult > &results)
Validates a project to detect problems on QGIS Server, and returns true if it&#39;s considered valid...
The project root name is already used by a layer or a group.
The project short name is not valid.
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer. Properties are stored in a map and saved in project file...
This class is a base class for nodes in a layer tree.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts, annotations, canvases, etc.
Definition: qgsproject.h:98
static QString displayValidationError(QgsProjectServerValidator::ValidationError error)
Returns a human readable string for a given error.
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project&#39;s layer tree.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
static QRegExp shortNameRegExp()
Returns the short name regular expression for line edit validator.
A duplicated layer/group name in the layer tree.
Contains the parameters describing a project validation failure.
Encoding is not correctly set on a vector layer.
QString name
Definition: qgsmaplayer.h:88
QgsMapLayerType type
Definition: qgsmaplayer.h:92
QString name() const override
Returns the group&#39;s name.
QString title() const
Returns the project&#39;s title.
Definition: qgsproject.cpp:519
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer&#39;s data provider, it may be nullptr.
Container of other groups and layers.
Represents a vector layer which manages a vector based data sets.
ValidationError
Errors that might be raised by the validation process.
Layer tree node points to a map layer.