Mercurial > hg > svcore
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; |