comparison rdf/PluginRDFIndexer.cpp @ 461:2019d89ebcf9

* Some work on querying and cacheing plugin RDF from a central index
author Chris Cannam
date Fri, 17 Oct 2008 15:26:29 +0000
parents 93fb1ebff76b
children c9b055f84326
comparison
equal deleted inserted replaced
460:93fb1ebff76b 461:2019d89ebcf9
16 #include "PluginRDFIndexer.h" 16 #include "PluginRDFIndexer.h"
17 17
18 #include "SimpleSPARQLQuery.h" 18 #include "SimpleSPARQLQuery.h"
19 19
20 #include "data/fileio/FileSource.h" 20 #include "data/fileio/FileSource.h"
21 #include "data/fileio/PlaylistFileReader.h"
21 #include "plugin/PluginIdentifier.h" 22 #include "plugin/PluginIdentifier.h"
22 23
23 #include "base/Profiler.h" 24 #include "base/Profiler.h"
24 25
25 #include <vamp-sdk/PluginHostAdapter.h> 26 #include <vamp-sdk/PluginHostAdapter.h>
26 27
27 #include <QFileInfo> 28 #include <QFileInfo>
28 #include <QDir> 29 #include <QDir>
29 #include <QUrl> 30 #include <QUrl>
31 #include <QDateTime>
32 #include <QSettings>
33 #include <QFile>
30 34
31 #include <iostream> 35 #include <iostream>
32 using std::cerr; 36 using std::cerr;
33 using std::endl; 37 using std::endl;
34 using std::vector; 38 using std::vector;
93 } 97 }
94 } 98 }
95 99
96 PluginRDFIndexer::~PluginRDFIndexer() 100 PluginRDFIndexer::~PluginRDFIndexer()
97 { 101 {
102 QMutexLocker locker(&m_mutex);
103
98 while (!m_sources.empty()) { 104 while (!m_sources.empty()) {
99 delete *m_sources.begin(); 105 delete *m_sources.begin();
100 m_sources.erase(m_sources.begin()); 106 m_sources.erase(m_sources.begin());
101 } 107 }
102 } 108 }
103 109
110 bool
111 PluginRDFIndexer::indexConfiguredURLs()
112 {
113 std::cerr << "PluginRDFIndexer::indexConfiguredURLs" << std::endl;
114
115 QSettings settings;
116 settings.beginGroup("RDF");
117
118 QString indexKey("rdf-indices");
119 QStringList indices = settings.value(indexKey).toStringList();
120
121 for (int i = 0; i < indices.size(); ++i) {
122
123 QString index = indices[i];
124
125 std::cerr << "PluginRDFIndexer::indexConfiguredURLs: index url is "
126 << index.toStdString() << std::endl;
127
128 expireCacheMaybe(index);
129
130 FileSource indexSource(index, 0, FileSource::PersistentCache);
131 if (!indexSource.isAvailable()) continue;
132 indexSource.waitForData();
133
134 PlaylistFileReader reader(indexSource);
135 if (!reader.isOK()) continue;
136
137 PlaylistFileReader::Playlist list = reader.load();
138 for (PlaylistFileReader::Playlist::const_iterator j = list.begin();
139 j != list.end(); ++j) {
140 std::cerr << "PluginRDFIndexer::indexConfiguredURLs: url is "
141 << j->toStdString() << std::endl;
142 indexURL(*j);
143 }
144 }
145
146 QString urlListKey("rdf-urls");
147 QStringList urls = settings.value(urlListKey).toStringList();
148
149 for (int i = 0; i < urls.size(); ++i) {
150 indexURL(urls[i]);
151 }
152
153 settings.endGroup();
154 return true;
155 }
156
104 QString 157 QString
105 PluginRDFIndexer::getURIForPluginId(QString pluginId) 158 PluginRDFIndexer::getURIForPluginId(QString pluginId)
106 { 159 {
160 QMutexLocker locker(&m_mutex);
161
107 if (m_idToUriMap.find(pluginId) == m_idToUriMap.end()) return ""; 162 if (m_idToUriMap.find(pluginId) == m_idToUriMap.end()) return "";
108 return m_idToUriMap[pluginId]; 163 return m_idToUriMap[pluginId];
109 } 164 }
110 165
111 QString 166 QString
112 PluginRDFIndexer::getIdForPluginURI(QString uri) 167 PluginRDFIndexer::getIdForPluginURI(QString uri)
113 { 168 {
169 QMutexLocker locker(&m_mutex);
170
114 if (m_uriToIdMap.find(uri) == m_uriToIdMap.end()) { 171 if (m_uriToIdMap.find(uri) == m_uriToIdMap.end()) {
115 172
116 // Haven't found this uri referenced in any document on the 173 // Haven't found this uri referenced in any document on the
117 // local filesystem; try resolving the pre-fragment part of 174 // local filesystem; try resolving the pre-fragment part of
118 // the uri as a document URL and reading that if possible. 175 // the uri as a document URL and reading that if possible.
135 } 192 }
136 193
137 QString 194 QString
138 PluginRDFIndexer::getDescriptionURLForPluginId(QString pluginId) 195 PluginRDFIndexer::getDescriptionURLForPluginId(QString pluginId)
139 { 196 {
197 QMutexLocker locker(&m_mutex);
198
140 if (m_idToDescriptionMap.find(pluginId) == m_idToDescriptionMap.end()) return ""; 199 if (m_idToDescriptionMap.find(pluginId) == m_idToDescriptionMap.end()) return "";
141 return m_idToDescriptionMap[pluginId]; 200 return m_idToDescriptionMap[pluginId];
142 } 201 }
143 202
144 QString 203 QString
145 PluginRDFIndexer::getDescriptionURLForPluginURI(QString uri) 204 PluginRDFIndexer::getDescriptionURLForPluginURI(QString uri)
146 { 205 {
206 QMutexLocker locker(&m_mutex);
207
147 QString id = getIdForPluginURI(uri); 208 QString id = getIdForPluginURI(uri);
148 if (id == "") return ""; 209 if (id == "") return "";
149 return getDescriptionURLForPluginId(id); 210 return getDescriptionURLForPluginId(id);
150 } 211 }
151 212
152 QStringList 213 QStringList
153 PluginRDFIndexer::getIndexedPluginIds() 214 PluginRDFIndexer::getIndexedPluginIds()
154 { 215 {
216 QMutexLocker locker(&m_mutex);
217
155 QStringList ids; 218 QStringList ids;
156 for (StringMap::const_iterator i = m_idToDescriptionMap.begin(); 219 for (StringMap::const_iterator i = m_idToDescriptionMap.begin();
157 i != m_idToDescriptionMap.end(); ++i) { 220 i != m_idToDescriptionMap.end(); ++i) {
158 ids.push_back(i->first); 221 ids.push_back(i->first);
159 } 222 }
166 QUrl url = QUrl::fromLocalFile(filepath); 229 QUrl url = QUrl::fromLocalFile(filepath);
167 QString urlString = url.toString(); 230 QString urlString = url.toString();
168 return indexURL(urlString); 231 return indexURL(urlString);
169 } 232 }
170 233
234 void
235 PluginRDFIndexer::expireCacheMaybe(QString urlString)
236 {
237 QString cacheFile = FileSource::getPersistentCacheFilePath(urlString);
238
239 QSettings settings;
240 settings.beginGroup("RDF");
241
242 QString key("rdf-expiry-times");
243
244 QMap<QString, QVariant> expiryMap = settings.value(key).toMap();
245 QDateTime lastExpiry = expiryMap[urlString].toDateTime();
246
247 if (!QFileInfo(cacheFile).exists()) {
248 expiryMap[urlString] = QDateTime::currentDateTime();
249 settings.setValue(key, expiryMap);
250 settings.endGroup();
251 return;
252 }
253
254 if (!lastExpiry.isValid() ||
255 (lastExpiry.addDays(2) < QDateTime::currentDateTime())) {
256
257 std::cerr << "Expiring old cache file " << cacheFile.toStdString()
258 << std::endl;
259
260 if (QFile(cacheFile).remove()) {
261
262 expiryMap[urlString] = QDateTime::currentDateTime();
263 settings.setValue(key, expiryMap);
264 }
265 }
266
267 settings.endGroup();
268 }
269
171 bool 270 bool
172 PluginRDFIndexer::indexURL(QString urlString) 271 PluginRDFIndexer::indexURL(QString urlString)
173 { 272 {
174 Profiler profiler("PluginRDFIndexer::indexURL"); 273 Profiler profiler("PluginRDFIndexer::indexURL");
175 274
275 std::cerr << "PluginRDFIndexer::indexURL(" << urlString.toStdString() << ")" << std::endl;
276
277 QMutexLocker locker(&m_mutex);
278
176 QString localString = urlString; 279 QString localString = urlString;
177 280
178 if (FileSource::isRemote(urlString) && 281 if (FileSource::isRemote(urlString) &&
179 FileSource::canHandleScheme(urlString)) { 282 FileSource::canHandleScheme(urlString)) {
283
284 //!!! how do we avoid hammering the server if it doesn't have
285 //!!! the file, and/or the network if it can't get through?
286
287 expireCacheMaybe(urlString);
180 288
181 FileSource *source = new FileSource 289 FileSource *source = new FileSource
182 (urlString, 0, FileSource::PersistentCache); 290 (urlString, 0, FileSource::PersistentCache);
183 if (!source->isAvailable()) { 291 if (!source->isAvailable()) {
184 delete source; 292 delete source;