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