Branch data Line data Source code
1 : : /*************************************************************************** 2 : : QgsAbstractMetadataBase.cpp 3 : : -------------------- 4 : : begin : March 2018 5 : : copyright : (C) 2018 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 "qgsabstractmetadatabase.h" 19 : : #include "qgsmaplayer.h" 20 : : 21 : 1 : QString QgsAbstractMetadataBase::identifier() const 22 : : { 23 : 1 : return mIdentifier; 24 : : } 25 : : 26 : 0 : void QgsAbstractMetadataBase::setIdentifier( const QString &identifier ) 27 : : { 28 : 0 : mIdentifier = identifier; 29 : 0 : } 30 : : 31 : 0 : QString QgsAbstractMetadataBase::parentIdentifier() const 32 : : { 33 : 0 : return mParentIdentifier; 34 : : } 35 : : 36 : 0 : void QgsAbstractMetadataBase::setParentIdentifier( const QString &parentIdentifier ) 37 : : { 38 : 0 : mParentIdentifier = parentIdentifier; 39 : 0 : } 40 : : 41 : 0 : QString QgsAbstractMetadataBase::type() const 42 : : { 43 : 0 : return mType; 44 : : } 45 : : 46 : 64 : void QgsAbstractMetadataBase::setType( const QString &type ) 47 : : { 48 : 64 : mType = type; 49 : 64 : } 50 : : 51 : 1 : QString QgsAbstractMetadataBase::title() const 52 : : { 53 : 1 : return mTitle; 54 : : } 55 : : 56 : 0 : void QgsAbstractMetadataBase::setTitle( const QString &title ) 57 : : { 58 : 0 : mTitle = title; 59 : 0 : } 60 : : 61 : 1 : QString QgsAbstractMetadataBase::abstract() const 62 : : { 63 : 1 : return mAbstract; 64 : : } 65 : : 66 : 0 : void QgsAbstractMetadataBase::setAbstract( const QString &abstract ) 67 : : { 68 : 0 : mAbstract = abstract; 69 : 0 : } 70 : : 71 : 0 : QStringList QgsAbstractMetadataBase::history() const 72 : : { 73 : 0 : return mHistory; 74 : : } 75 : : 76 : 0 : void QgsAbstractMetadataBase::setHistory( const QStringList &history ) 77 : : { 78 : 0 : mHistory = history; 79 : 0 : } 80 : : 81 : 0 : void QgsAbstractMetadataBase::addHistoryItem( const QString &text ) 82 : : { 83 : 0 : mHistory << text; 84 : 0 : } 85 : : 86 : 1 : QMap<QString, QStringList> QgsAbstractMetadataBase::keywords() const 87 : : { 88 : 1 : return mKeywords; 89 : : } 90 : : 91 : 0 : void QgsAbstractMetadataBase::setKeywords( const QMap<QString, QStringList> &keywords ) 92 : : { 93 : 0 : mKeywords = keywords; 94 : 0 : } 95 : : 96 : 0 : void QgsAbstractMetadataBase::addKeywords( const QString &vocabulary, const QStringList &keywords ) 97 : : { 98 : 0 : mKeywords.insert( vocabulary, keywords ); 99 : 0 : } 100 : : 101 : 0 : bool QgsAbstractMetadataBase::removeKeywords( const QString &vocabulary ) 102 : : { 103 : 0 : return mKeywords.remove( vocabulary ); 104 : : } 105 : : 106 : 0 : QStringList QgsAbstractMetadataBase::keywordVocabularies() const 107 : : { 108 : 0 : return mKeywords.keys(); 109 : : } 110 : : 111 : 0 : QStringList QgsAbstractMetadataBase::keywords( const QString &vocabulary ) const 112 : : { 113 : 0 : return mKeywords.value( vocabulary ); 114 : 0 : } 115 : : 116 : 0 : QStringList QgsAbstractMetadataBase::categories() const 117 : : { 118 : 0 : if ( mKeywords.contains( QStringLiteral( "gmd:topicCategory" ) ) ) 119 : : { 120 : 0 : return mKeywords.value( QStringLiteral( "gmd:topicCategory" ) ); 121 : : } 122 : : else 123 : : { 124 : 0 : return QStringList(); 125 : : } 126 : 0 : } 127 : : 128 : 0 : void QgsAbstractMetadataBase::setCategories( const QStringList &category ) 129 : : { 130 : 0 : mKeywords.insert( QStringLiteral( "gmd:topicCategory" ), category ); 131 : 0 : } 132 : : 133 : 0 : QList<QgsAbstractMetadataBase::Contact> QgsAbstractMetadataBase::contacts() const 134 : : { 135 : 0 : return mContacts; 136 : : } 137 : : 138 : 0 : void QgsAbstractMetadataBase::setContacts( const QList<QgsAbstractMetadataBase::Contact> &contacts ) 139 : : { 140 : 0 : mContacts = contacts; 141 : 0 : } 142 : : 143 : 0 : void QgsAbstractMetadataBase::addContact( const QgsAbstractMetadataBase::Contact &contact ) 144 : : { 145 : 0 : mContacts << contact; 146 : 0 : } 147 : : 148 : 0 : QList<QgsAbstractMetadataBase::Link> QgsAbstractMetadataBase::links() const 149 : : { 150 : 0 : return mLinks; 151 : : } 152 : : 153 : 0 : void QgsAbstractMetadataBase::setLinks( const QList<QgsAbstractMetadataBase::Link> &links ) 154 : : { 155 : 0 : mLinks = links; 156 : 0 : } 157 : : 158 : 0 : void QgsAbstractMetadataBase::addLink( const QgsAbstractMetadataBase::Link &link ) 159 : : { 160 : 0 : mLinks << link; 161 : 0 : } 162 : : 163 : 0 : QString QgsAbstractMetadataBase::language() const 164 : : { 165 : 0 : return mLanguage; 166 : : } 167 : : 168 : 0 : void QgsAbstractMetadataBase::setLanguage( const QString &language ) 169 : : { 170 : 0 : mLanguage = language; 171 : 0 : } 172 : : 173 : 0 : bool QgsAbstractMetadataBase::readMetadataXml( const QDomElement &metadataElement ) 174 : : { 175 : 0 : QDomNode mnl; 176 : 0 : QDomElement mne; 177 : : 178 : : // set identifier 179 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "identifier" ) ); 180 : 0 : mIdentifier = mnl.toElement().text(); 181 : : 182 : : // set parent identifier 183 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "parentidentifier" ) ); 184 : 0 : mParentIdentifier = mnl.toElement().text(); 185 : : 186 : : // set language 187 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "language" ) ); 188 : 0 : mLanguage = mnl.toElement().text(); 189 : : 190 : : // set type 191 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "type" ) ); 192 : 0 : mType = mnl.toElement().text(); 193 : : 194 : : // set title 195 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "title" ) ); 196 : 0 : mTitle = mnl.toElement().text(); 197 : : 198 : : // set abstract 199 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "abstract" ) ); 200 : 0 : mAbstract = mnl.toElement().text(); 201 : : 202 : : // set keywords 203 : 0 : QDomNodeList keywords = metadataElement.elementsByTagName( QStringLiteral( "keywords" ) ); 204 : 0 : mKeywords.clear(); 205 : 0 : for ( int i = 0; i < keywords.size(); i++ ) 206 : : { 207 : 0 : QStringList keywordsList; 208 : 0 : mnl = keywords.at( i ); 209 : 0 : mne = mnl.toElement(); 210 : : 211 : 0 : QDomNodeList el = mne.elementsByTagName( QStringLiteral( "keyword" ) ); 212 : 0 : for ( int j = 0; j < el.size(); j++ ) 213 : : { 214 : 0 : keywordsList.append( el.at( j ).toElement().text() ); 215 : 0 : } 216 : 0 : addKeywords( mne.attribute( QStringLiteral( "vocabulary" ) ), keywordsList ); 217 : 0 : } 218 : : 219 : : // contact 220 : 0 : QDomNodeList contactsList = metadataElement.elementsByTagName( QStringLiteral( "contact" ) ); 221 : 0 : mContacts.clear(); 222 : 0 : for ( int i = 0; i < contactsList.size(); i++ ) 223 : : { 224 : 0 : mnl = contactsList.at( i ); 225 : 0 : mne = mnl.toElement(); 226 : : 227 : 0 : QgsAbstractMetadataBase::Contact oneContact; 228 : 0 : oneContact.name = mne.namedItem( QStringLiteral( "name" ) ).toElement().text(); 229 : 0 : oneContact.organization = mne.namedItem( QStringLiteral( "organization" ) ).toElement().text(); 230 : 0 : oneContact.position = mne.namedItem( QStringLiteral( "position" ) ).toElement().text(); 231 : 0 : oneContact.voice = mne.namedItem( QStringLiteral( "voice" ) ).toElement().text(); 232 : 0 : oneContact.fax = mne.namedItem( QStringLiteral( "fax" ) ).toElement().text(); 233 : 0 : oneContact.email = mne.namedItem( QStringLiteral( "email" ) ).toElement().text(); 234 : 0 : oneContact.role = mne.namedItem( QStringLiteral( "role" ) ).toElement().text(); 235 : : 236 : 0 : QList< QgsAbstractMetadataBase::Address > addresses; 237 : 0 : QDomNodeList addressList = mne.elementsByTagName( QStringLiteral( "contactAddress" ) ); 238 : 0 : for ( int j = 0; j < addressList.size(); j++ ) 239 : : { 240 : 0 : QDomElement addressElement = addressList.at( j ).toElement(); 241 : 0 : QgsAbstractMetadataBase::Address oneAddress; 242 : 0 : oneAddress.address = addressElement.namedItem( QStringLiteral( "address" ) ).toElement().text(); 243 : 0 : oneAddress.administrativeArea = addressElement.namedItem( QStringLiteral( "administrativearea" ) ).toElement().text(); 244 : 0 : oneAddress.city = addressElement.namedItem( QStringLiteral( "city" ) ).toElement().text(); 245 : 0 : oneAddress.country = addressElement.namedItem( QStringLiteral( "country" ) ).toElement().text(); 246 : 0 : oneAddress.postalCode = addressElement.namedItem( QStringLiteral( "postalcode" ) ).toElement().text(); 247 : 0 : oneAddress.type = addressElement.namedItem( QStringLiteral( "type" ) ).toElement().text(); 248 : 0 : addresses << oneAddress; 249 : 0 : } 250 : 0 : oneContact.addresses = addresses; 251 : 0 : addContact( oneContact ); 252 : 0 : } 253 : : 254 : : // links 255 : 0 : mnl = metadataElement.namedItem( QStringLiteral( "links" ) ); 256 : 0 : mne = mnl.toElement(); 257 : 0 : mLinks.clear(); 258 : 0 : QDomNodeList el = mne.elementsByTagName( QStringLiteral( "link" ) ); 259 : 0 : for ( int i = 0; i < el.size(); i++ ) 260 : : { 261 : 0 : mne = el.at( i ).toElement(); 262 : 0 : QgsAbstractMetadataBase::Link oneLink; 263 : 0 : oneLink.name = mne.attribute( QStringLiteral( "name" ) ); 264 : 0 : oneLink.type = mne.attribute( QStringLiteral( "type" ) ); 265 : 0 : oneLink.url = mne.attribute( QStringLiteral( "url" ) ); 266 : 0 : oneLink.description = mne.attribute( QStringLiteral( "description" ) ); 267 : 0 : oneLink.format = mne.attribute( QStringLiteral( "format" ) ); 268 : 0 : oneLink.mimeType = mne.attribute( QStringLiteral( "mimeType" ) ); 269 : 0 : oneLink.size = mne.attribute( QStringLiteral( "size" ) ); 270 : 0 : addLink( oneLink ); 271 : 0 : } 272 : : 273 : : // history 274 : 0 : QDomNodeList historyNodeList = metadataElement.elementsByTagName( QStringLiteral( "history" ) ); 275 : 0 : QStringList historyList; 276 : 0 : for ( int i = 0; i < historyNodeList.size(); i++ ) 277 : : { 278 : 0 : mnl = historyNodeList.at( i ); 279 : 0 : mne = mnl.toElement(); 280 : 0 : historyList.append( mne.text() ); 281 : 0 : } 282 : 0 : setHistory( historyList ); 283 : : 284 : : return true; 285 : 0 : } 286 : : 287 : 0 : bool QgsAbstractMetadataBase::writeMetadataXml( QDomElement &metadataElement, QDomDocument &document ) const 288 : : { 289 : : // identifier 290 : 0 : QDomElement identifier = document.createElement( QStringLiteral( "identifier" ) ); 291 : 0 : QDomText identifierText = document.createTextNode( mIdentifier ); 292 : 0 : identifier.appendChild( identifierText ); 293 : 0 : metadataElement.appendChild( identifier ); 294 : : 295 : : // parent identifier 296 : 0 : QDomElement parentIdentifier = document.createElement( QStringLiteral( "parentidentifier" ) ); 297 : 0 : QDomText parentIdentifierText = document.createTextNode( mParentIdentifier ); 298 : 0 : parentIdentifier.appendChild( parentIdentifierText ); 299 : 0 : metadataElement.appendChild( parentIdentifier ); 300 : : 301 : : // language 302 : 0 : QDomElement language = document.createElement( QStringLiteral( "language" ) ); 303 : 0 : QDomText languageText = document.createTextNode( mLanguage ); 304 : 0 : language.appendChild( languageText ); 305 : 0 : metadataElement.appendChild( language ); 306 : : 307 : : // type 308 : 0 : QDomElement type = document.createElement( QStringLiteral( "type" ) ); 309 : 0 : QDomText typeText = document.createTextNode( mType ); 310 : 0 : type.appendChild( typeText ); 311 : 0 : metadataElement.appendChild( type ); 312 : : 313 : : // title 314 : 0 : QDomElement title = document.createElement( QStringLiteral( "title" ) ); 315 : 0 : QDomText titleText = document.createTextNode( mTitle ); 316 : 0 : title.appendChild( titleText ); 317 : 0 : metadataElement.appendChild( title ); 318 : : 319 : : // abstract 320 : 0 : QDomElement abstract = document.createElement( QStringLiteral( "abstract" ) ); 321 : 0 : QDomText abstractText = document.createTextNode( mAbstract ); 322 : 0 : abstract.appendChild( abstractText ); 323 : 0 : metadataElement.appendChild( abstract ); 324 : : 325 : : // keywords 326 : 0 : QMapIterator<QString, QStringList> i( mKeywords ); 327 : 0 : while ( i.hasNext() ) 328 : : { 329 : 0 : i.next(); 330 : 0 : QDomElement keywordsElement = document.createElement( QStringLiteral( "keywords" ) ); 331 : 0 : keywordsElement.setAttribute( QStringLiteral( "vocabulary" ), i.key() ); 332 : 0 : const QStringList values = i.value(); 333 : 0 : for ( const QString &kw : values ) 334 : : { 335 : 0 : QDomElement keyword = document.createElement( QStringLiteral( "keyword" ) ); 336 : 0 : QDomText keywordText = document.createTextNode( kw ); 337 : 0 : keyword.appendChild( keywordText ); 338 : 0 : keywordsElement.appendChild( keyword ); 339 : 0 : } 340 : 0 : metadataElement.appendChild( keywordsElement ); 341 : 0 : } 342 : : 343 : : // contact 344 : 0 : for ( const QgsAbstractMetadataBase::Contact &contact : mContacts ) 345 : : { 346 : 0 : QDomElement contactElement = document.createElement( QStringLiteral( "contact" ) ); 347 : 0 : QDomElement nameElement = document.createElement( QStringLiteral( "name" ) ); 348 : 0 : QDomElement organizationElement = document.createElement( QStringLiteral( "organization" ) ); 349 : 0 : QDomElement positionElement = document.createElement( QStringLiteral( "position" ) ); 350 : 0 : QDomElement voiceElement = document.createElement( QStringLiteral( "voice" ) ); 351 : 0 : QDomElement faxElement = document.createElement( QStringLiteral( "fax" ) ); 352 : 0 : QDomElement emailElement = document.createElement( QStringLiteral( "email" ) ); 353 : 0 : QDomElement roleElement = document.createElement( QStringLiteral( "role" ) ); 354 : : 355 : 0 : QDomText nameText = document.createTextNode( contact.name ); 356 : 0 : QDomText orgaText = document.createTextNode( contact.organization ); 357 : 0 : QDomText positionText = document.createTextNode( contact.position ); 358 : 0 : QDomText voiceText = document.createTextNode( contact.voice ); 359 : 0 : QDomText faxText = document.createTextNode( contact.fax ); 360 : 0 : QDomText emailText = document.createTextNode( contact.email ); 361 : 0 : QDomText roleText = document.createTextNode( contact.role ); 362 : : 363 : 0 : for ( const QgsAbstractMetadataBase::Address &oneAddress : contact.addresses ) 364 : : { 365 : 0 : QDomElement addressElement = document.createElement( QStringLiteral( "contactAddress" ) ); 366 : 0 : QDomElement typeElement = document.createElement( QStringLiteral( "type" ) ); 367 : 0 : QDomElement addressDetailedElement = document.createElement( QStringLiteral( "address" ) ); 368 : 0 : QDomElement cityElement = document.createElement( QStringLiteral( "city" ) ); 369 : 0 : QDomElement administrativeAreaElement = document.createElement( QStringLiteral( "administrativearea" ) ); 370 : 0 : QDomElement postalCodeElement = document.createElement( QStringLiteral( "postalcode" ) ); 371 : 0 : QDomElement countryElement = document.createElement( QStringLiteral( "country" ) ); 372 : : 373 : 0 : typeElement.appendChild( document.createTextNode( oneAddress.type ) ); 374 : 0 : addressDetailedElement.appendChild( document.createTextNode( oneAddress.address ) ); 375 : 0 : cityElement.appendChild( document.createTextNode( oneAddress.city ) ); 376 : 0 : administrativeAreaElement.appendChild( document.createTextNode( oneAddress.administrativeArea ) ); 377 : 0 : postalCodeElement.appendChild( document.createTextNode( oneAddress.postalCode ) ); 378 : 0 : countryElement.appendChild( document.createTextNode( oneAddress.country ) ); 379 : : 380 : 0 : addressElement.appendChild( typeElement ); 381 : 0 : addressElement.appendChild( addressDetailedElement ); 382 : 0 : addressElement.appendChild( cityElement ); 383 : 0 : addressElement.appendChild( administrativeAreaElement ); 384 : 0 : addressElement.appendChild( postalCodeElement ); 385 : 0 : addressElement.appendChild( countryElement ); 386 : 0 : contactElement.appendChild( addressElement ); 387 : 0 : } 388 : : 389 : 0 : nameElement.appendChild( nameText ); 390 : 0 : organizationElement.appendChild( orgaText ); 391 : 0 : positionElement.appendChild( positionText ); 392 : 0 : voiceElement.appendChild( voiceText ); 393 : 0 : faxElement.appendChild( faxText ); 394 : 0 : emailElement.appendChild( emailText ); 395 : 0 : roleElement.appendChild( roleText ); 396 : : 397 : 0 : contactElement.appendChild( nameElement ); 398 : 0 : contactElement.appendChild( organizationElement ); 399 : 0 : contactElement.appendChild( positionElement ); 400 : 0 : contactElement.appendChild( voiceElement ); 401 : 0 : contactElement.appendChild( faxElement ); 402 : 0 : contactElement.appendChild( emailElement ); 403 : 0 : contactElement.appendChild( roleElement ); 404 : 0 : metadataElement.appendChild( contactElement ); 405 : 0 : } 406 : : 407 : : // links 408 : 0 : QDomElement links = document.createElement( QStringLiteral( "links" ) ); 409 : 0 : for ( const QgsAbstractMetadataBase::Link &link : mLinks ) 410 : : { 411 : 0 : QDomElement linkElement = document.createElement( QStringLiteral( "link" ) ); 412 : 0 : linkElement.setAttribute( QStringLiteral( "name" ), link.name ); 413 : 0 : linkElement.setAttribute( QStringLiteral( "type" ), link.type ); 414 : 0 : linkElement.setAttribute( QStringLiteral( "url" ), link.url ); 415 : 0 : linkElement.setAttribute( QStringLiteral( "description" ), link.description ); 416 : 0 : linkElement.setAttribute( QStringLiteral( "format" ), link.format ); 417 : 0 : linkElement.setAttribute( QStringLiteral( "mimeType" ), link.mimeType ); 418 : 0 : linkElement.setAttribute( QStringLiteral( "size" ), link.size ); 419 : 0 : links.appendChild( linkElement ); 420 : 0 : } 421 : 0 : metadataElement.appendChild( links ); 422 : : 423 : : // history 424 : 0 : for ( const QString &history : mHistory ) 425 : : { 426 : 0 : QDomElement historyElement = document.createElement( QStringLiteral( "history" ) ); 427 : 0 : QDomText historyText = document.createTextNode( history ); 428 : 0 : historyElement.appendChild( historyText ); 429 : 0 : metadataElement.appendChild( historyElement ); 430 : 0 : } 431 : : 432 : : return true; 433 : 0 : } 434 : : 435 : 0 : bool QgsAbstractMetadataBase::equals( const QgsAbstractMetadataBase &metadataOther ) const 436 : : { 437 : 0 : return ( ( mIdentifier == metadataOther.mIdentifier ) && 438 : 0 : ( mParentIdentifier == metadataOther.mParentIdentifier ) && 439 : 0 : ( mLanguage == metadataOther.mLanguage ) && 440 : 0 : ( mType == metadataOther.mType ) && 441 : 0 : ( mTitle == metadataOther.mTitle ) && 442 : 0 : ( mAbstract == metadataOther.mAbstract ) && 443 : 0 : ( mHistory == metadataOther.mHistory ) && 444 : 0 : ( mKeywords == metadataOther.mKeywords ) && 445 : 0 : ( mContacts == metadataOther.mContacts ) && 446 : 0 : ( mLinks == metadataOther.mLinks ) ); 447 : : } 448 : : 449 : : 450 : 0 : bool QgsAbstractMetadataBase::Contact::operator==( const QgsAbstractMetadataBase::Contact &other ) const 451 : : { 452 : 0 : return name == other.name && 453 : 0 : organization == other.organization && 454 : 0 : position == other.position && 455 : 0 : addresses == other.addresses && 456 : 0 : voice == other.voice && 457 : 0 : fax == other.fax && 458 : 0 : email == other.email && 459 : 0 : role == other.role; 460 : : } 461 : : 462 : 0 : bool QgsAbstractMetadataBase::Link::operator==( const QgsAbstractMetadataBase::Link &other ) const 463 : : { 464 : 0 : return name == other.name && 465 : 0 : type == other.type && 466 : 0 : description == other.description && 467 : 0 : url == other.url && 468 : 0 : format == other.format && 469 : 0 : mimeType == other.mimeType && 470 : 0 : size == other.size; 471 : : } 472 : : 473 : 0 : bool QgsAbstractMetadataBase::Address::operator==( const QgsAbstractMetadataBase::Address &other ) const 474 : : { 475 : 0 : return type == other.type && 476 : 0 : address == other.address && 477 : 0 : city == other.city && 478 : 0 : administrativeArea == other.administrativeArea && 479 : 0 : postalCode == other.postalCode && 480 : 0 : country == other.country; 481 : : }