Branch data Line data Source code
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" 21 : : #include "qgsprojectservervalidator.h" 22 : : #include "qgsvectorlayer.h" 23 : : 24 : : 25 : 0 : QString QgsProjectServerValidator::displayValidationError( QgsProjectServerValidator::ValidationError error ) 26 : : { 27 : 0 : switch ( error ) 28 : : { 29 : : case QgsProjectServerValidator::LayerEncoding: 30 : 0 : return QObject::tr( "Encoding is not correctly set. A non 'System' encoding is required" ); 31 : : case QgsProjectServerValidator::LayerShortName: 32 : 0 : 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" ); 33 : : case QgsProjectServerValidator::DuplicatedNames: 34 : 0 : 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" ); 35 : : case QgsProjectServerValidator::ProjectShortName: 36 : 0 : 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" ); 37 : : case QgsProjectServerValidator::ProjectRootNameConflict: 38 : 0 : 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 : 0 : return QString(); 41 : 0 : } 42 : : 43 : 0 : void QgsProjectServerValidator::browseLayerTree( QgsLayerTreeGroup *treeGroup, QStringList &owsNames, QStringList &encodingMessages ) 44 : : { 45 : 0 : QList< QgsLayerTreeNode * > treeGroupChildren = treeGroup->children(); 46 : 0 : for ( int i = 0; i < treeGroupChildren.size(); ++i ) 47 : : { 48 : 0 : QgsLayerTreeNode *treeNode = treeGroupChildren.at( i ); 49 : 0 : if ( treeNode->nodeType() == QgsLayerTreeNode::NodeGroup ) 50 : : { 51 : 0 : QgsLayerTreeGroup *treeGroupChild = static_cast<QgsLayerTreeGroup *>( treeNode ); 52 : 0 : QString shortName = treeGroupChild->customProperty( QStringLiteral( "wmsShortName" ) ).toString(); 53 : 0 : if ( shortName.isEmpty() ) 54 : 0 : owsNames << treeGroupChild->name(); 55 : : else 56 : 0 : owsNames << shortName; 57 : 0 : browseLayerTree( treeGroupChild, owsNames, encodingMessages ); 58 : 0 : } 59 : : else 60 : : { 61 : 0 : QgsLayerTreeLayer *treeLayer = static_cast<QgsLayerTreeLayer *>( treeNode ); 62 : 0 : QgsMapLayer *layer = treeLayer->layer(); 63 : 0 : if ( layer ) 64 : : { 65 : 0 : QString shortName = layer->shortName(); 66 : 0 : if ( shortName.isEmpty() ) 67 : 0 : owsNames << layer->name(); 68 : : else 69 : 0 : owsNames << shortName; 70 : : 71 : 0 : if ( layer->type() == QgsMapLayerType::VectorLayer ) 72 : : { 73 : 0 : QgsVectorLayer *vl = static_cast<QgsVectorLayer *>( layer ); 74 : 0 : if ( vl->dataProvider() && vl->dataProvider()->encoding() == QLatin1String( "System" ) ) 75 : 0 : encodingMessages << layer->name(); 76 : 0 : } 77 : 0 : } 78 : : } 79 : 0 : } 80 : 0 : } 81 : : 82 : 0 : bool QgsProjectServerValidator::validate( QgsProject *project, QList<QgsProjectServerValidator::ValidationResult> &results ) 83 : : { 84 : 0 : results.clear(); 85 : 0 : bool result = true; 86 : : 87 : 0 : if ( !project ) 88 : 0 : return false; 89 : : 90 : 0 : if ( !project->layerTreeRoot() ) 91 : 0 : return false; 92 : : 93 : 0 : QStringList owsNames, encodingMessages; 94 : 0 : browseLayerTree( project->layerTreeRoot(), owsNames, encodingMessages ); 95 : : 96 : 0 : QStringList duplicateNames, regExpMessages; 97 : 0 : QRegExp snRegExp = QgsApplication::shortNameRegExp(); 98 : 0 : const auto constOwsNames = owsNames; 99 : 0 : for ( const QString &name : constOwsNames ) 100 : : { 101 : 0 : if ( !snRegExp.exactMatch( name ) ) 102 : : { 103 : 0 : regExpMessages << name; 104 : 0 : } 105 : : 106 : 0 : if ( duplicateNames.contains( name ) ) 107 : : { 108 : 0 : continue; 109 : : } 110 : : 111 : 0 : if ( owsNames.count( name ) > 1 ) 112 : : { 113 : 0 : duplicateNames << name; 114 : 0 : } 115 : : } 116 : : 117 : 0 : if ( !duplicateNames.empty() ) 118 : : { 119 : 0 : result = false; 120 : 0 : results << ValidationResult( QgsProjectServerValidator::DuplicatedNames, duplicateNames.join( QLatin1String( ", " ) ) ); 121 : 0 : } 122 : : 123 : 0 : if ( !regExpMessages.empty() ) 124 : : { 125 : 0 : result = false; 126 : 0 : results << ValidationResult( QgsProjectServerValidator::LayerShortName, regExpMessages.join( QLatin1String( ", " ) ) ); 127 : 0 : } 128 : : 129 : 0 : if ( !encodingMessages.empty() ) 130 : : { 131 : 0 : result = false; 132 : 0 : results << ValidationResult( QgsProjectServerValidator::LayerEncoding, encodingMessages.join( QLatin1String( ", " ) ) ); 133 : 0 : } 134 : : 135 : : // Determine the root layername 136 : 0 : QString rootLayerName = project->readEntry( QStringLiteral( "WMSRootName" ), QStringLiteral( "/" ), "" ); 137 : 0 : if ( rootLayerName.isEmpty() && !project->title().isEmpty() ) 138 : : { 139 : 0 : rootLayerName = project->title(); 140 : 0 : } 141 : 0 : if ( !rootLayerName.isEmpty() ) 142 : : { 143 : 0 : if ( owsNames.count( rootLayerName ) >= 1 ) 144 : : { 145 : 0 : result = false; 146 : 0 : results << ValidationResult( QgsProjectServerValidator::ProjectRootNameConflict, rootLayerName ); 147 : 0 : } 148 : : 149 : 0 : if ( !snRegExp.exactMatch( rootLayerName ) ) 150 : : { 151 : 0 : result = false; 152 : 0 : results << ValidationResult( QgsProjectServerValidator::ProjectShortName, rootLayerName ); 153 : 0 : } 154 : 0 : } 155 : : 156 : 0 : return result; 157 : 0 : }