• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

Nepomuk-Core

  • sources
  • kde-4.12
  • kdelibs
  • nepomuk-core
  • libnepomukcore
  • datamanagement
simpleresource.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Nepomuk KDE project.
3  Copyright (C) 2010 Sebastian Trueg <trueg@kde.org>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) version 3, or any
9  later version accepted by the membership of KDE e.V. (or its
10  successor approved by the membership of KDE e.V.), which shall
11  act as a proxy defined in Section 6 of version 3 of the license.
12 
13  This library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public
19  License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "simpleresource.h"
23 
24 #include <QtCore/QHashIterator>
25 #include <QtCore/QSharedData>
26 #include <QtCore/QVariant>
27 #include <QtCore/QDebug>
28 #include <QtCore/QDataStream>
29 
30 #include <Soprano/Node>
31 #include <Soprano/LiteralValue>
32 #include <Soprano/Vocabulary/RDF>
33 
34 
35 namespace {
36 QAtomicInt s_idCnt;
37 
38 QUrl createBlankUri()
39 {
40  // convert int to string (a...z,aa...az,ba....bz,...)
41  int idCnt = s_idCnt.fetchAndAddRelaxed(1);
42  QByteArray id;
43  do {
44  const int rest = idCnt%26;
45  id.append('a' + rest);
46  idCnt -= rest;
47  idCnt /= 26;
48  } while(idCnt > 0);
49 
50  const QUrl uri = QString(QLatin1String("_:") + id);
51  return uri;
52 }
53 }
54 
55 class Nepomuk2::SimpleResource::Private : public QSharedData
56 {
57 public:
58  QUrl m_uri;
59  PropertyHash m_properties;
60 };
61 
62 Nepomuk2::SimpleResource::SimpleResource(const QUrl& uri)
63 {
64  d = new Private();
65  setUri(uri);
66 }
67 
68 Nepomuk2::SimpleResource::SimpleResource(const PropertyHash& properties)
69 {
70  d = new Private();
71  setUri(QUrl());
72  setProperties(properties);
73 }
74 
75 Nepomuk2::SimpleResource::SimpleResource(const SimpleResource& other)
76  : d(other.d)
77 {
78 }
79 
80 Nepomuk2::SimpleResource::~SimpleResource()
81 {
82 }
83 
84 Nepomuk2::SimpleResource & Nepomuk2::SimpleResource::operator=(const Nepomuk2::SimpleResource &other)
85 {
86  d = other.d;
87  return *this;
88 }
89 
90 QUrl Nepomuk2::SimpleResource::uri() const
91 {
92  return d->m_uri;
93 }
94 
95 void Nepomuk2::SimpleResource::setUri(const QUrl& uri)
96 {
97  if(uri.isEmpty())
98  d->m_uri = createBlankUri();
99  else
100  d->m_uri = uri;
101 }
102 
103 namespace {
104  Soprano::Node convertIfBlankNode( const Soprano::Node & n ) {
105  if( n.isResource() && n.uri().toString().startsWith("_:") ) {
106  return Soprano::Node( n.uri().toString().mid(2) ); // "_:" take 2 characters
107  }
108  return n;
109  }
110 }
111 
112 QList< Soprano::Statement > Nepomuk2::SimpleResource::toStatementList() const
113 {
114  QList<Soprano::Statement> list;
115  QHashIterator<QUrl, QVariant> it( d->m_properties );
116  while( it.hasNext() ) {
117  it.next();
118 
119  Soprano::Node object;
120  if( it.value().type() == QVariant::Url )
121  object = it.value().toUrl();
122  else
123  object = Soprano::LiteralValue( it.value() );
124 
125  list << Soprano::Statement( convertIfBlankNode( d->m_uri ),
126  it.key(),
127  convertIfBlankNode( object ) );
128  }
129  return list;
130 }
131 
132 bool Nepomuk2::SimpleResource::isValid() const
133 {
134  // We do not check if m_uri.isValid() as a blank uri of the form "_:daf" would be invalid
135  if(d->m_uri.isEmpty() || d->m_properties.isEmpty()) {
136  return false;
137  }
138 
139  // properties cannot have empty values
140  PropertyHash::const_iterator end = d->m_properties.constEnd();
141  for(PropertyHash::const_iterator it = d->m_properties.constBegin(); it != end; ++it) {
142  if(!it.value().isValid()) {
143  return false;
144  }
145  }
146 
147  return true;
148 }
149 
150 bool Nepomuk2::SimpleResource::operator==(const Nepomuk2::SimpleResource &other) const
151 {
152  return d->m_uri == other.d->m_uri && d->m_properties == other.d->m_properties;
153 }
154 
155 Nepomuk2::PropertyHash Nepomuk2::SimpleResource::properties() const
156 {
157  return d->m_properties;
158 }
159 
160 bool Nepomuk2::SimpleResource::contains(const QUrl &property) const
161 {
162  return d->m_properties.contains(property);
163 }
164 
165 bool Nepomuk2::SimpleResource::contains(const QUrl &property, const QVariant &value) const
166 {
167  return d->m_properties.contains(property, value);
168 }
169 
170 bool Nepomuk2::SimpleResource::containsNode(const QUrl &property, const Soprano::Node &node) const
171 {
172  if(node.isLiteral())
173  return contains(property, node.literal().variant());
174  else if(node.isResource())
175  return contains(property, node.uri());
176  else
177  return false;
178 }
179 
180 void Nepomuk2::SimpleResource::setPropertyNode(const QUrl &property, const Soprano::Node &value)
181 {
182  d->m_properties.remove(property);
183  addPropertyNode(property, value);
184 }
185 
186 void Nepomuk2::SimpleResource::setProperty(const QUrl &property, const QVariant &value)
187 {
188  d->m_properties.remove(property);
189  addProperty(property, value);
190 }
191 
192 void Nepomuk2::SimpleResource::setProperty(const QUrl& property, const Nepomuk2::SimpleResource& res)
193 {
194  setProperty(property, res.uri());
195 }
196 
197 
198 void Nepomuk2::SimpleResource::setProperty(const QUrl &property, const QVariantList &values)
199 {
200  d->m_properties.remove(property);
201  foreach(const QVariant& v, values) {
202  addProperty(property, v);
203  }
204 }
205 
206 void Nepomuk2::SimpleResource::addProperty(const QUrl &property, const QVariant &value)
207 {
208  // QMultiHash even stores the same key/value pair multiple times!
209  if(!d->m_properties.contains(property, value))
210  d->m_properties.insertMulti(property, value);
211 }
212 
213 void Nepomuk2::SimpleResource::addProperty(const QUrl& property, const Nepomuk2::SimpleResource& res)
214 {
215  addProperty(property, res.uri());
216 }
217 
218 void Nepomuk2::SimpleResource::addPropertyNode(const QUrl &property, const Soprano::Node &node)
219 {
220  if(node.isResource())
221  addProperty(property, QVariant(node.uri()));
222  else if(node.isLiteral())
223  addProperty(property, node.literal().variant());
224  // else do nothing
225 }
226 
227 void Nepomuk2::SimpleResource::remove(const QUrl &property, const QVariant &value)
228 {
229  d->m_properties.remove(property, value);
230 }
231 
232 void Nepomuk2::SimpleResource::remove(const QUrl &property)
233 {
234  d->m_properties.remove(property);
235 }
236 
237 void Nepomuk2::SimpleResource::removeAll(const QUrl &property, const QVariant &value)
238 {
239  if(property.isEmpty()) {
240  if(value.isValid()) {
241  foreach(const QUrl& prop, d->m_properties.keys(value)) {
242  d->m_properties.remove(prop, value);
243  }
244  }
245  else {
246  d->m_properties.clear();
247  }
248  }
249  else if(value.isValid()){
250  d->m_properties.remove(property, value);
251  }
252  else {
253  d->m_properties.remove(property);
254  }
255 }
256 
257 void Nepomuk2::SimpleResource::addType(const QUrl &type)
258 {
259  addProperty(Soprano::Vocabulary::RDF::type(), type);
260 }
261 
262 void Nepomuk2::SimpleResource::setTypes(const QList<QUrl> &types)
263 {
264  QVariantList values;
265  foreach(const QUrl& type, types) {
266  values << type;
267  }
268  setProperty(Soprano::Vocabulary::RDF::type(), values);
269 }
270 
271 void Nepomuk2::SimpleResource::setProperties(const Nepomuk2::PropertyHash &properties)
272 {
273  d->m_properties = properties;
274 }
275 
276 void Nepomuk2::SimpleResource::clear()
277 {
278  d->m_properties.clear();
279 }
280 
281 void Nepomuk2::SimpleResource::addProperties(const Nepomuk2::PropertyHash &properties)
282 {
283  // This is done manually, so that we avoid duplicates
284  // A multihash can contain the same <key, value> pairs multiple times
285  QHashIterator<QUrl, QVariant> it(properties);
286  while(it.hasNext()) {
287  it.next();
288  addProperty(it.key(), it.value());
289  }
290 }
291 
292 QVariantList Nepomuk2::SimpleResource::property(const QUrl &property) const
293 {
294  return d->m_properties.values(property);
295 }
296 
297 uint Nepomuk2::qHash(const SimpleResource& res)
298 {
299  return qHash(res.uri());
300 }
301 
302 QDebug Nepomuk2::operator<<(QDebug dbg, const Nepomuk2::SimpleResource& res)
303 {
304  return dbg << res.uri() << res.properties();
305 }
306 
307 QDataStream & Nepomuk2::operator<<(QDataStream & stream, const Nepomuk2::SimpleResource& resource)
308 {
309  stream << resource.uri() << resource.properties();
310  return stream;
311 }
312 
313 QDataStream & Nepomuk2::operator>>(QDataStream & stream, Nepomuk2::SimpleResource& resource)
314 {
315  QUrl uri;
316  PropertyHash properties;
317  stream >> uri >> properties;
318  resource.setUri(uri);
319  resource.setProperties(properties);
320  return stream;
321 }
Nepomuk2::SimpleResource::toStatementList
QList< Soprano::Statement > toStatementList() const
Converts the resource into a list of statements.
Definition: simpleresource.cpp:112
Nepomuk2::SimpleResource::property
QVariantList property(const QUrl &property) const
Get all values for property.
Definition: simpleresource.cpp:292
Nepomuk2::operator>>
QDataStream & operator>>(QDataStream &, Nepomuk2::SimpleResource &)
Definition: simpleresource.cpp:313
Nepomuk2::SimpleResource::addPropertyNode
void addPropertyNode(const QUrl &property, const Soprano::Node &value)
Add a property.
Definition: simpleresource.cpp:218
Nepomuk2::SimpleResource::setTypes
void setTypes(const QList< QUrl > &types)
A convenience method which sets the property of type rdf:type.
Definition: simpleresource.cpp:262
Nepomuk2::addProperty
KJob * addProperty(const QList< QUrl > &resources, const QUrl &property, const QVariantList &values, const KComponentData &component=KGlobal::mainComponent())
Add one or more property values to one or more resources.
Definition: datamanagement.cpp:36
Nepomuk2::SimpleResource::setProperty
void setProperty(const QUrl &property, const QVariant &value)
Set a property overwriting existing values.
Definition: simpleresource.cpp:186
Nepomuk2::SimpleResource::setProperties
void setProperties(const PropertyHash &properties)
Set the properties, replacing the existing properties.
Definition: simpleresource.cpp:271
Nepomuk2::SimpleResource
Represents a snapshot of one Nepomuk resource.
Definition: simpleresource.h:46
Nepomuk2::SimpleResource::properties
PropertyHash properties() const
Definition: simpleresource.cpp:155
Nepomuk2::operator<<
QDataStream & operator<<(QDataStream &, const Nepomuk2::SimpleResource &)
Definition: simpleresource.cpp:307
Nepomuk2::SimpleResource::contains
bool contains(const QUrl &property) const
Definition: simpleresource.cpp:160
Nepomuk2::SimpleResource::addProperty
void addProperty(const QUrl &property, const QVariant &value)
Add a property.
Definition: simpleresource.cpp:206
Nepomuk2::SimpleResource::isValid
bool isValid() const
Definition: simpleresource.cpp:132
Nepomuk2::SimpleResource::removeAll
void removeAll(const QUrl &property, const QVariant &value)
Remove all property/value pairs matchin the provided pattern.
Definition: simpleresource.cpp:237
Nepomuk2::SimpleResource::addProperties
void addProperties(const PropertyHash &properties)
Add a set of properties to the existing ones.
Definition: simpleresource.cpp:281
Nepomuk2::SimpleResource::clear
void clear()
Clear the resource, remove all properties.
Definition: simpleresource.cpp:276
Nepomuk2::SimpleResource::containsNode
bool containsNode(const QUrl &property, const Soprano::Node &value) const
Definition: simpleresource.cpp:170
Nepomuk2::SimpleResource::SimpleResource
SimpleResource(const QUrl &uri=QUrl())
Definition: simpleresource.cpp:62
simpleresource.h
Nepomuk2::PropertyHash
QMultiHash< QUrl, QVariant > PropertyHash
Definition: simpleresource.h:37
Nepomuk2::SimpleResource::~SimpleResource
virtual ~SimpleResource()
Definition: simpleresource.cpp:80
Nepomuk2::SimpleResource::addType
void addType(const QUrl &type)
A convenience method which adds a property of type rdf:type.
Definition: simpleresource.cpp:257
Nepomuk2::qHash
uint qHash(const SimpleResource &res)
Definition: simpleresource.cpp:297
Nepomuk2::SimpleResource::uri
QUrl uri() const
Definition: simpleresource.cpp:90
Nepomuk2::setProperty
KJob * setProperty(const QList< QUrl > &resources, const QUrl &property, const QVariantList &values, const KComponentData &component=KGlobal::mainComponent())
Set the values of a property for one or more resources.
Definition: datamanagement.cpp:48
Nepomuk2::SimpleResource::remove
void remove(const QUrl &property, const QVariant &value)
Definition: simpleresource.cpp:227
Nepomuk2::SimpleResource::operator=
SimpleResource & operator=(const SimpleResource &other)
Definition: simpleresource.cpp:84
Nepomuk2::SimpleResource::operator==
bool operator==(const SimpleResource &other) const
Definition: simpleresource.cpp:150
Nepomuk2::SimpleResource::setPropertyNode
void setPropertyNode(const QUrl &property, const Soprano::Node &value)
Set a property overwriting existing values.
Definition: simpleresource.cpp:180
Nepomuk2::SimpleResource::setUri
void setUri(const QUrl &uri)
Setting an invalid/empty uri will create a new random ID.
Definition: simpleresource.cpp:95
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:48:09 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Nepomuk-Core

Skip menu "Nepomuk-Core"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal