diff rdf/PluginRDFDescription.cpp @ 439:beb2948baa77

* Merge revisions 1041 to 1130 from sv-rdf-import branch
author Chris Cannam
date Thu, 18 Sep 2008 12:09:32 +0000
parents
children 5746c559af15
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rdf/PluginRDFDescription.cpp	Thu Sep 18 12:09:32 2008 +0000
@@ -0,0 +1,221 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2008 QMUL.
+   
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "PluginRDFDescription.h"
+
+#include "PluginRDFIndexer.h"
+#include "SimpleSPARQLQuery.h"
+
+#include "plugin/PluginIdentifier.h"
+
+#include <iostream>
+using std::cerr;
+using std::endl;
+
+PluginRDFDescription::PluginRDFDescription(QString pluginId) :
+    m_pluginId(pluginId),
+    m_haveDescription(false)
+{
+    PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance();
+    QString url = indexer->getDescriptionURLForPluginId(pluginId);
+    if (url == "") {
+        cerr << "PluginRDFDescription: WARNING: No RDF description available for plugin ID \""
+             << pluginId.toStdString() << "\"" << endl;
+    } else {
+        if (!indexURL(url)) {
+            cerr << "PluginRDFDescription: ERROR: Failed to query RDF description for plugin ID \""
+                 << pluginId.toStdString() << "\"" << endl;
+        } else {
+            m_haveDescription = true;
+        }
+    }
+}
+
+PluginRDFDescription::~PluginRDFDescription()
+{
+}
+
+bool
+PluginRDFDescription::haveDescription() const
+{
+    return m_haveDescription;
+}
+
+PluginRDFDescription::OutputType
+PluginRDFDescription::getOutputType(QString outputId) const
+{
+    if (m_outputTypes.find(outputId) == m_outputTypes.end()) {
+        return OutputTypeUnknown;
+    }
+    return m_outputTypes.find(outputId)->second;
+}
+
+PluginRDFDescription::OutputDisposition
+PluginRDFDescription::getOutputDisposition(QString outputId) const
+{
+    if (m_outputDispositions.find(outputId) == m_outputDispositions.end()) {
+        return OutputDispositionUnknown;
+    }
+    return m_outputDispositions.find(outputId)->second;
+}
+
+QString
+PluginRDFDescription::getOutputFeatureTypeURI(QString outputId) const
+{
+    if (m_outputFeatureTypeURIMap.find(outputId) ==
+        m_outputFeatureTypeURIMap.end()) {
+        return "";
+    }
+    return m_outputFeatureTypeURIMap.find(outputId)->second;
+}
+
+QString
+PluginRDFDescription::getOutputEventTypeURI(QString outputId) const
+{
+    if (m_outputEventTypeURIMap.find(outputId) ==
+        m_outputEventTypeURIMap.end()) {
+        return "";
+    }
+    return m_outputEventTypeURIMap.find(outputId)->second;
+}
+
+QString
+PluginRDFDescription::getOutputUnit(QString outputId) const
+{
+    if (m_outputUnitMap.find(outputId) == m_outputUnitMap.end()) {
+        return "";
+    }
+    return m_outputUnitMap.find(outputId)->second;
+}
+
+bool
+PluginRDFDescription::indexURL(QString url) 
+{
+    QString type, soname, label;
+    PluginIdentifier::parseIdentifier(m_pluginId, type, soname, label);
+
+    SimpleSPARQLQuery query
+        (QString
+         (
+             " PREFIX vamp: <http://purl.org/ontology/vamp/> "
+
+             " SELECT ?output_id ?output_type ?feature_type ?event_type ?unit "
+             " FROM <%1> "
+
+             " WHERE { "
+
+             "   ?plugin a vamp:Plugin ; "
+             "           vamp:identifier \"%2\" ; "
+             "           vamp:output_descriptor ?output . "
+
+             "   ?output vamp:identifier ?output_id ; "
+             "           a ?output_type . "
+
+             "   OPTIONAL { "
+             "     ?output vamp:computes_feature_type ?feature_type "
+             "   } . "
+
+             "   OPTIONAL { "
+             "     ?output vamp:computes_event_type ?event_type "
+             "   } . "
+
+             "   OPTIONAL { "
+             "     ?output vamp:unit ?unit "
+             "   } . "
+
+             " } "
+             )
+         .arg(url)
+         .arg(label));
+
+    SimpleSPARQLQuery::ResultList results = query.execute();
+
+    if (!query.isOK()) {
+        cerr << "ERROR: PluginRDFDescription::indexURL: ERROR: Failed to query document at <"
+             << url.toStdString() << ">: "
+             << query.getErrorString().toStdString() << endl;
+        return false;
+    }
+
+    if (results.empty()) {
+        cerr << "ERROR: PluginRDFDescription::indexURL: NOTE: Document at <"
+             << url.toStdString()
+             << "> does not appear to describe any plugin outputs" << endl;
+        return false;
+    }
+
+    // Note that an output may appear more than once, if it inherits
+    // more than one type (e.g. DenseOutput and QuantizedOutput).  So
+    // these results must accumulate
+
+    for (int i = 0; i < results.size(); ++i) {
+
+        QString outputId = results[i]["output_id"].value;
+
+        if (m_outputTypes.find(outputId) == m_outputTypes.end()) {
+            m_outputTypes[outputId] = OutputTypeUnknown;
+        }
+
+        QString outputType = results[i]["output_type"].value;
+
+        if (outputType.contains("DenseOutput")) {
+            m_outputDispositions[outputId] = OutputDense;
+        } else if (outputType.contains("SparseOutput")) {
+            m_outputDispositions[outputId] = OutputSparse;
+        } else if (outputType.contains("TrackLevelOutput")) {
+            m_outputDispositions[outputId] = OutputTrackLevel;
+        }
+
+        if (results[i]["feature_type"].type == SimpleSPARQLQuery::URIValue) {
+
+            QString featureType = results[i]["feature_type"].value;
+
+            if (featureType != "") {
+                if (m_outputTypes[outputId] == OutputEvents) {
+                    m_outputTypes[outputId] = OutputFeaturesAndEvents;
+                } else {
+                    m_outputTypes[outputId] = OutputFeatures;
+                }
+                m_outputFeatureTypeURIMap[outputId] = featureType;
+            }
+        }
+
+        if (results[i]["event_type"].type == SimpleSPARQLQuery::URIValue) {
+
+            QString eventType = results[i]["event_type"].value;
+
+            if (eventType != "") {
+                if (m_outputTypes[outputId] == OutputFeatures) {
+                    m_outputTypes[outputId] = OutputFeaturesAndEvents;
+                } else {
+                    m_outputTypes[outputId] = OutputEvents;
+                }
+                m_outputEventTypeURIMap[outputId] = eventType;
+            }
+        }
+            
+        if (results[i]["unit"].type == SimpleSPARQLQuery::LiteralValue) {
+
+            QString unit = results[i]["unit"].value;
+            
+            if (unit != "") {
+                m_outputUnitMap[outputId] = unit;
+            }
+        }
+    }
+
+    return true;
+}
+