Chris@439: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@439: Chris@439: /* Chris@439: Sonic Visualiser Chris@439: An audio file viewer and annotation editor. Chris@439: Centre for Digital Music, Queen Mary, University of London. Chris@439: This file copyright 2008 QMUL. Chris@439: Chris@439: This program is free software; you can redistribute it and/or Chris@439: modify it under the terms of the GNU General Public License as Chris@439: published by the Free Software Foundation; either version 2 of the Chris@439: License, or (at your option) any later version. See the file Chris@439: COPYING included with this distribution for more information. Chris@439: */ Chris@439: Chris@439: #include "RDFTransformFactory.h" Chris@439: Chris@439: #include Chris@439: #include Chris@439: Chris@439: #include Chris@439: #include Chris@439: Chris@439: #include Chris@439: #include Chris@439: Chris@439: #include "SimpleSPARQLQuery.h" Chris@439: #include "PluginRDFIndexer.h" Chris@439: #include "base/ProgressReporter.h" Chris@439: Chris@439: #include "transform/TransformFactory.h" Chris@439: Chris@439: using std::cerr; Chris@439: using std::endl; Chris@439: Chris@439: typedef const unsigned char *STR; // redland's expected string type Chris@439: Chris@439: Chris@439: class RDFTransformFactoryImpl Chris@439: { Chris@439: public: Chris@439: RDFTransformFactoryImpl(QString url); Chris@439: virtual ~RDFTransformFactoryImpl(); Chris@439: Chris@439: bool isOK(); Chris@439: QString getErrorString() const; Chris@439: Chris@439: std::vector getTransforms(ProgressReporter *); Chris@439: Chris@439: protected: Chris@439: QString m_urlString; Chris@439: QString m_errorString; Chris@439: }; Chris@439: Chris@439: Chris@439: QString Chris@439: RDFTransformFactory::getKnownExtensions() Chris@439: { Chris@439: return "*.rdf *.n3 *.ttl"; Chris@439: } Chris@439: Chris@439: RDFTransformFactory::RDFTransformFactory(QString url) : Chris@439: m_d(new RDFTransformFactoryImpl(url)) Chris@439: { Chris@439: } Chris@439: Chris@439: RDFTransformFactory::~RDFTransformFactory() Chris@439: { Chris@439: delete m_d; Chris@439: } Chris@439: Chris@439: bool Chris@439: RDFTransformFactory::isOK() Chris@439: { Chris@439: return m_d->isOK(); Chris@439: } Chris@439: Chris@439: QString Chris@439: RDFTransformFactory::getErrorString() const Chris@439: { Chris@439: return m_d->getErrorString(); Chris@439: } Chris@439: Chris@439: std::vector Chris@439: RDFTransformFactory::getTransforms(ProgressReporter *r) Chris@439: { Chris@439: return m_d->getTransforms(r); Chris@439: } Chris@439: Chris@439: RDFTransformFactoryImpl::RDFTransformFactoryImpl(QString url) : Chris@439: m_urlString(url) Chris@439: { Chris@439: } Chris@439: Chris@439: RDFTransformFactoryImpl::~RDFTransformFactoryImpl() Chris@439: { Chris@439: } Chris@439: Chris@439: bool Chris@439: RDFTransformFactoryImpl::isOK() Chris@439: { Chris@439: return (m_errorString == ""); Chris@439: } Chris@439: Chris@439: QString Chris@439: RDFTransformFactoryImpl::getErrorString() const Chris@439: { Chris@439: return m_errorString; Chris@439: } Chris@439: Chris@439: std::vector Chris@439: RDFTransformFactoryImpl::getTransforms(ProgressReporter *reporter) Chris@439: { Chris@439: std::vector transforms; Chris@439: Chris@439: SimpleSPARQLQuery query Chris@439: (QString Chris@439: ( Chris@439: " PREFIX vamp: " Chris@439: Chris@439: " SELECT ?transform ?plugin ?output ?program " Chris@439: " ?step_size ?block_size ?window_type " Chris@439: " ?sample_rate ?start ?duration " Chris@439: Chris@439: " FROM <%1> " Chris@439: Chris@439: " WHERE { " Chris@439: " ?transform a vamp:Transform ; " Chris@439: " vamp:plugin ?plugin . " Chris@439: " OPTIONAL { ?transform vamp:output ?output } . " Chris@439: " OPTIONAL { ?transform vamp:program ?program } . " Chris@439: " OPTIONAL { ?transform vamp:step_size ?step_size } . " Chris@439: " OPTIONAL { ?transform vamp:block_size ?block_size } . " Chris@439: " OPTIONAL { ?transform vamp:window_type ?window_type } . " Chris@439: " OPTIONAL { ?transform vamp:sample_rate ?sample_rate } . " Chris@439: " OPTIONAL { ?transform vamp:start ?start } . " Chris@439: " OPTIONAL { ?transform vamp:duration ?duration } " Chris@439: " } " Chris@439: ) Chris@439: .arg(m_urlString)); Chris@439: Chris@439: SimpleSPARQLQuery::ResultList results = query.execute(); Chris@439: Chris@439: if (!query.isOK()) { Chris@439: m_errorString = query.getErrorString(); Chris@439: return transforms; Chris@439: } Chris@439: Chris@439: if (query.wasCancelled()) { Chris@439: m_errorString = "Query cancelled"; Chris@439: return transforms; Chris@439: } Chris@439: Chris@439: PluginRDFIndexer *indexer = PluginRDFIndexer::getInstance(); Chris@439: Chris@439: for (int i = 0; i < results.size(); ++i) { Chris@439: Chris@439: SimpleSPARQLQuery::KeyValueMap &result = results[i]; Chris@439: Chris@439: QString transformUri = result["transform"].value; Chris@439: QString pluginUri = result["plugin"].value; Chris@439: Chris@439: QString pluginId = indexer->getIdForPluginURI(pluginUri); Chris@439: Chris@439: if (pluginId == "") { Chris@439: cerr << "RDFTransformFactory: WARNING: Unknown plugin <" Chris@439: << pluginUri.toStdString() << "> for transform <" Chris@439: << transformUri.toStdString() << ">" << endl; Chris@439: continue; Chris@439: } Chris@439: Chris@439: Transform transform; Chris@439: transform.setPluginIdentifier(pluginId); Chris@439: Chris@439: if (result["output"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setOutput(result["output"].value); Chris@439: } Chris@439: Chris@439: if (result["program"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setProgram(result["program"].value); Chris@439: } Chris@439: Chris@439: if (result["step_size"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setStepSize(result["step_size"].value.toUInt()); Chris@439: } Chris@439: Chris@439: if (result["block_size"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setBlockSize(result["block_size"].value.toUInt()); Chris@439: } Chris@439: Chris@439: if (result["window_type"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: cerr << "NOTE: can't handle window type yet (value is \"" Chris@439: << result["window_type"].value.toStdString() << "\")" << endl; Chris@439: } Chris@439: Chris@439: if (result["sample_rate"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setStepSize(result["sample_rate"].value.toFloat()); Chris@439: } Chris@439: Chris@439: if (result["start"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setStartTime(RealTime::fromXsdDuration Chris@439: (result["start"].value.toStdString())); Chris@439: } Chris@439: Chris@439: if (result["duration"].type == SimpleSPARQLQuery::LiteralValue) { Chris@439: transform.setDuration(RealTime::fromXsdDuration Chris@439: (result["duration"].value.toStdString())); Chris@439: } Chris@439: Chris@439: SimpleSPARQLQuery paramQuery Chris@439: (QString Chris@439: ( Chris@439: " PREFIX vamp: " Chris@439: Chris@439: " SELECT ?param_id ?param_value " Chris@439: Chris@439: " FROM <%1> " Chris@439: Chris@439: " WHERE { " Chris@439: " <%2> vamp:parameter ?param . " Chris@439: " ?param vamp:identifier ?param_id ; " Chris@439: " vamp:value ?param_value " Chris@439: " } " Chris@439: ) Chris@439: .arg(m_urlString) Chris@439: .arg(transformUri)); Chris@439: Chris@439: SimpleSPARQLQuery::ResultList paramResults = paramQuery.execute(); Chris@439: Chris@439: if (!paramQuery.isOK()) { Chris@439: m_errorString = paramQuery.getErrorString(); Chris@439: return transforms; Chris@439: } Chris@439: Chris@439: if (paramQuery.wasCancelled()) { Chris@439: m_errorString = "Query cancelled"; Chris@439: return transforms; Chris@439: } Chris@439: Chris@439: for (int j = 0; j < paramResults.size(); ++j) { Chris@439: Chris@439: QString paramId = paramResults[j]["param_id"].value; Chris@439: QString paramValue = paramResults[j]["param_value"].value; Chris@439: Chris@439: if (paramId == "" || paramValue == "") continue; Chris@439: Chris@439: transform.setParameter(paramId, paramValue.toFloat()); Chris@439: } Chris@439: Chris@439: cerr << "RDFTransformFactory: NOTE: Transform is: " << endl; Chris@439: cerr << transform.toXmlString().toStdString() << endl; Chris@439: Chris@439: transforms.push_back(transform); Chris@439: } Chris@439: Chris@439: return transforms; Chris@439: } Chris@439: