Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayermetadatavalidator.cpp 3 : : ----------------------------- 4 : : begin : April 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson 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 : : #include "qgslayermetadatavalidator.h" 19 : : #include "qgslayermetadata.h" 20 : : #include "qgsprojectmetadata.h" 21 : : 22 : : // 23 : : // QgsNativeMetadataBaseValidator 24 : : // 25 : : 26 : 0 : bool QgsNativeMetadataBaseValidator::validate( const QgsAbstractMetadataBase *metadata, QList<QgsAbstractMetadataBaseValidator::ValidationResult> &results ) const 27 : : { 28 : 0 : results.clear(); 29 : 0 : if ( !metadata ) 30 : 0 : return false; 31 : : 32 : 0 : int index = 0; 33 : 0 : bool result = true; 34 : 0 : if ( metadata->identifier().isEmpty() ) 35 : : { 36 : 0 : result = false; 37 : 0 : results << ValidationResult( QObject::tr( "identifier" ), QObject::tr( "Identifier element is required." ) ); 38 : 0 : } 39 : : 40 : 0 : if ( metadata->language().isEmpty() ) 41 : : { 42 : 0 : result = false; 43 : 0 : results << ValidationResult( QObject::tr( "language" ), QObject::tr( "Language element is required." ) ); 44 : 0 : } 45 : : 46 : 0 : if ( metadata->type().isEmpty() ) 47 : : { 48 : 0 : result = false; 49 : 0 : results << ValidationResult( QObject::tr( "type" ), QObject::tr( "Type element is required." ) ); 50 : 0 : } 51 : : 52 : 0 : if ( metadata->title().isEmpty() ) 53 : : { 54 : 0 : result = false; 55 : 0 : results << ValidationResult( QObject::tr( "title" ), QObject::tr( "Title element is required." ) ); 56 : 0 : } 57 : : 58 : 0 : if ( metadata->abstract().isEmpty() ) 59 : : { 60 : 0 : result = false; 61 : 0 : results << ValidationResult( QObject::tr( "abstract" ), QObject::tr( "Abstract element is required." ) ); 62 : 0 : } 63 : : 64 : 0 : if ( metadata->contacts().isEmpty() ) 65 : : { 66 : 0 : result = false; 67 : 0 : results << ValidationResult( QObject::tr( "contacts" ), QObject::tr( "At least one contact is required." ) ); 68 : 0 : } 69 : : 70 : 0 : if ( metadata->links().isEmpty() ) 71 : : { 72 : 0 : result = false; 73 : 0 : results << ValidationResult( QObject::tr( "links" ), QObject::tr( "At least one link is required." ) ); 74 : 0 : } 75 : : 76 : : // validate keywords 77 : 0 : QgsAbstractMetadataBase::KeywordMap keywords = metadata->keywords(); 78 : 0 : QgsAbstractMetadataBase::KeywordMap::const_iterator keywordIt = keywords.constBegin(); 79 : 0 : index = 0; 80 : 0 : for ( ; keywordIt != keywords.constEnd(); ++keywordIt ) 81 : : { 82 : 0 : if ( keywordIt.key().isEmpty() ) 83 : : { 84 : 0 : result = false; 85 : 0 : results << ValidationResult( QObject::tr( "keywords" ), QObject::tr( "Keyword vocabulary cannot be empty." ), index ); 86 : 0 : } 87 : 0 : if ( keywordIt.value().isEmpty() ) 88 : : { 89 : 0 : result = false; 90 : 0 : results << ValidationResult( QObject::tr( "keywords" ), QObject::tr( "Keyword list cannot be empty." ), index ); 91 : 0 : } 92 : 0 : index++; 93 : 0 : } 94 : : 95 : : // validate contacts 96 : 0 : index = 0; 97 : 0 : const auto constContacts = metadata->contacts(); 98 : 0 : for ( const QgsAbstractMetadataBase::Contact &contact : constContacts ) 99 : : { 100 : 0 : if ( contact.name.isEmpty() ) 101 : : { 102 : 0 : result = false; 103 : 0 : results << ValidationResult( QObject::tr( "contacts" ), QObject::tr( "Contact name cannot be empty." ), index ); 104 : 0 : } 105 : 0 : index++; 106 : : } 107 : : 108 : : // validate links 109 : 0 : index = 0; 110 : 0 : const auto constLinks = metadata->links(); 111 : 0 : for ( const QgsAbstractMetadataBase::Link &link : constLinks ) 112 : : { 113 : 0 : if ( link.name.isEmpty() ) 114 : : { 115 : 0 : result = false; 116 : 0 : results << ValidationResult( QObject::tr( "links" ), QObject::tr( "Link name cannot be empty." ), index ); 117 : 0 : } 118 : 0 : if ( link.type.isEmpty() ) 119 : : { 120 : 0 : result = false; 121 : 0 : results << ValidationResult( QObject::tr( "links" ), QObject::tr( "Link type cannot be empty." ), index ); 122 : 0 : } 123 : 0 : if ( link.url.isEmpty() ) 124 : : { 125 : 0 : result = false; 126 : 0 : results << ValidationResult( QObject::tr( "links" ), QObject::tr( "Link url cannot be empty." ), index ); 127 : 0 : } 128 : 0 : index++; 129 : : } 130 : : 131 : 0 : return result; 132 : 0 : } 133 : : 134 : : // 135 : : // QgsNativeMetadataValidator 136 : : // 137 : : 138 : 0 : bool QgsNativeMetadataValidator::validate( const QgsAbstractMetadataBase *baseMetadata, QList<ValidationResult> &results ) const 139 : : { 140 : 0 : results.clear(); 141 : : 142 : 0 : const QgsLayerMetadata *metadata = dynamic_cast< const QgsLayerMetadata * >( baseMetadata ); 143 : 0 : if ( !metadata ) 144 : 0 : return false; 145 : : 146 : 0 : bool result = true; 147 : 0 : if ( !QgsNativeMetadataBaseValidator::validate( metadata, results ) ) 148 : 0 : result = false; 149 : : 150 : 0 : if ( metadata->licenses().isEmpty() ) 151 : : { 152 : 0 : result = false; 153 : 0 : results << ValidationResult( QObject::tr( "license" ), QObject::tr( "At least one license is required." ) ); 154 : 0 : } 155 : : 156 : 0 : if ( !metadata->crs().isValid() ) 157 : : { 158 : 0 : result = false; 159 : 0 : results << ValidationResult( QObject::tr( "crs" ), QObject::tr( "A valid CRS element is required." ) ); 160 : 0 : } 161 : : 162 : 0 : int index = 0; 163 : 0 : const auto constSpatialExtents = metadata->extent().spatialExtents(); 164 : 0 : for ( const QgsLayerMetadata::SpatialExtent &extent : constSpatialExtents ) 165 : : { 166 : 0 : if ( !extent.extentCrs.isValid() ) 167 : : { 168 : 0 : result = false; 169 : 0 : results << ValidationResult( QObject::tr( "extent" ), QObject::tr( "A valid CRS element for the spatial extent is required." ), index ); 170 : 0 : } 171 : : 172 : 0 : if ( extent.bounds.width() == 0.0 || extent.bounds.height() == 0.0 ) 173 : : { 174 : 0 : result = false; 175 : 0 : results << ValidationResult( QObject::tr( "extent" ), QObject::tr( "A valid spatial extent is required." ), index ); 176 : 0 : } 177 : 0 : index++; 178 : : } 179 : : 180 : 0 : return result; 181 : 0 : } 182 : : 183 : : 184 : : // 185 : : // QgsNativeProjectMetadataValidator 186 : : // 187 : : 188 : 0 : bool QgsNativeProjectMetadataValidator::validate( const QgsAbstractMetadataBase *baseMetadata, QList<QgsAbstractMetadataBaseValidator::ValidationResult> &results ) const 189 : : { 190 : 0 : results.clear(); 191 : : 192 : 0 : const QgsProjectMetadata *metadata = dynamic_cast< const QgsProjectMetadata * >( baseMetadata ); 193 : 0 : if ( !metadata ) 194 : 0 : return false; 195 : : 196 : 0 : bool result = true; 197 : 0 : if ( !QgsNativeMetadataBaseValidator::validate( metadata, results ) ) 198 : 0 : result = false; 199 : : 200 : 0 : if ( metadata->author().isEmpty() ) 201 : : { 202 : 0 : result = false; 203 : 0 : results << ValidationResult( QObject::tr( "author" ), QObject::tr( "A project author is required." ) ); 204 : 0 : } 205 : : 206 : 0 : if ( !metadata->creationDateTime().isValid() ) 207 : : { 208 : 0 : result = false; 209 : 0 : results << ValidationResult( QObject::tr( "creation" ), QObject::tr( "The project creation date/time is required." ) ); 210 : 0 : } 211 : : 212 : 0 : return result; 213 : 0 : }