changeset 223:a29ce4af17bc

More filling in the RDF type loading code
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 09 Jun 2017 15:18:32 +0100
parents e0e3d9efa774
children 16655424db89
files Makefile vamp-support/RdfTypes.h
diffstat 2 files changed, 94 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Fri Jun 09 13:56:34 2017 +0100
+++ b/Makefile	Fri Jun 09 15:18:32 2017 +0100
@@ -2,11 +2,11 @@
 VAMPSDK_DIR	:= ../vamp-plugin-sdk
 PIPER_DIR	:= ../piper
 
-INCFLAGS	:= -Iext -Iext/sord -Iext/serd -I$(VAMPSDK_DIR) -I. -I/usr/local/include
+INCFLAGS	:= -Iext -I/usr/include/sord-0 -I/usr/include/serd-0 -I$(VAMPSDK_DIR) -I. -I/usr/local/include
 CXXFLAGS	:= -Wall -Wextra -Werror -Wno-error=unused-parameter -g3 -std=c++11 $(INCFLAGS)
 
 #LDFLAGS		:= -L$(VAMPSDK_DIR) -L/usr/local/lib -lvamp-hostsdk -lcapnp -lkj 
-LDFLAGS		:= $(VAMPSDK_DIR)/libvamp-hostsdk.a -lcapnp -lkj 
+LDFLAGS		:= $(VAMPSDK_DIR)/libvamp-hostsdk.a -lcapnp -lkj -lsord-0 -lserd-0
 
 LDFLAGS		+= -ldl
 
@@ -57,7 +57,10 @@
 # DO NOT DELETE
 
 vamp-capnp/piper-capnp.o: vamp-capnp/piper.capnp.c++ vamp-capnp/piper.capnp.h
-vamp-server/convert.o: vamp-json/VampJson.h vamp-support/PluginStaticData.h
+vamp-server/convert.o: vamp-json/VampJson.h
+vamp-server/convert.o: vamp-support/StaticOutputDescriptor.h
+vamp-server/convert.o: vamp-support/PluginStaticData.h
+vamp-server/convert.o: vamp-support/StaticOutputDescriptor.h
 vamp-server/convert.o: vamp-support/PluginConfiguration.h
 vamp-server/convert.o: vamp-support/RequestResponse.h
 vamp-server/convert.o: vamp-support/PluginStaticData.h
@@ -74,7 +77,9 @@
 vamp-server/convert.o: vamp-support/PluginHandleMapper.h
 vamp-server/convert.o: vamp-support/PreservingPluginOutputIdMapper.h
 vamp-server/simple-server.o: vamp-json/VampJson.h
+vamp-server/simple-server.o: vamp-support/StaticOutputDescriptor.h
 vamp-server/simple-server.o: vamp-support/PluginStaticData.h
+vamp-server/simple-server.o: vamp-support/StaticOutputDescriptor.h
 vamp-server/simple-server.o: vamp-support/PluginConfiguration.h
 vamp-server/simple-server.o: vamp-support/RequestResponse.h
 vamp-server/simple-server.o: vamp-support/PluginStaticData.h
@@ -92,6 +97,7 @@
 vamp-server/simple-server.o: vamp-support/AssignedPluginHandleMapper.h
 vamp-server/simple-server.o: vamp-support/DefaultPluginOutputIdMapper.h
 vamp-server/simple-server.o: vamp-support/LoaderRequests.h
+vamp-server/simple-server.o: vamp-support/RdfTypes.h vamp-support/RdfTypes.h
 ext/json11/json11.o: ext/json11/json11.hpp
 ext/json11/test.o: ext/json11/json11.hpp
 test/vamp-client/tst_PluginStub.o: vamp-client/Loader.h
@@ -102,6 +108,7 @@
 test/vamp-client/tst_PluginStub.o: vamp-support/PluginConfiguration.h
 test/vamp-client/tst_PluginStub.o: vamp-client/PiperVampPlugin.h
 test/vamp-client/tst_PluginStub.o: vamp-support/PluginStaticData.h
+test/vamp-client/tst_PluginStub.o: vamp-support/StaticOutputDescriptor.h
 test/vamp-client/tst_PluginStub.o: vamp-client/PluginClient.h
 vamp-client/qt/test.o: vamp-client/qt/ProcessQtTransport.h
 vamp-client/qt/test.o: vamp-client/SynchronousTransport.h
@@ -114,6 +121,7 @@
 vamp-client/qt/test.o: vamp-client/PluginClient.h
 vamp-client/qt/test.o: vamp-client/PiperVampPlugin.h
 vamp-client/qt/test.o: vamp-support/PluginStaticData.h
+vamp-client/qt/test.o: vamp-support/StaticOutputDescriptor.h
 vamp-client/qt/test.o: vamp-support/PluginConfiguration.h
 vamp-client/qt/test.o: vamp-client/SynchronousTransport.h
 vamp-client/qt/test.o: vamp-support/AssignedPluginHandleMapper.h
--- a/vamp-support/RdfTypes.h	Fri Jun 09 13:56:34 2017 +0100
+++ b/vamp-support/RdfTypes.h	Fri Jun 09 15:18:32 2017 +0100
@@ -43,14 +43,94 @@
 
 #include <sord/sord.h>
 
+#include <mutex>
+
 namespace piper_vamp {
 
-// NB not thread-safe
 class RdfTypes
 {
 public:
-    StaticOutputInfo loadStaticOutputInfo(Vamp::HostExt::PluginLoader::PluginKey) {
-        return {};
+    RdfTypes() :
+        m_world(sord_world_new())
+    {}
+
+    ~RdfTypes() {
+        sord_world_free(m_world);
+    }
+    
+    StaticOutputInfo loadStaticOutputInfo(Vamp::HostExt::PluginLoader::PluginKey
+                                          pluginKey) {
+
+        StaticOutputInfo info;
+        SordModel *model = sord_new(m_world, SORD_SPO|SORD_OPS|SORD_POS, false);
+        if (loadRdf(model, candidateRdfFilesFor(pluginKey))) {
+            // we want to find a graph like
+            // :plugin vamp:output :output1
+            // :plugin vamp:output :output2
+            // :plugin vamp:output :output3
+            // :output1 vamp:computes_event_type :event
+            // :output2 vamp:computes_feature :feature
+            // :output3 vamp:computes_signal_type :signal
+        }
+        sord_free(model);
+        return info;
+    }
+
+private:
+    SordWorld *m_world;
+
+    bool loadRdf(SordModel *targetModel, std::vector<std::string> filenames) {
+        for (auto f: filenames) {
+            if (loadRdfFile(targetModel, f)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    bool loadRdfFile(SordModel *targetModel, std::string filename) {
+        std::string base = "file://" + filename;
+        SerdURI bu;
+        if (serd_uri_parse((const uint8_t *)base.c_str(), &bu) !=
+            SERD_SUCCESS) {
+            std::cerr << "Failed to parse base URI " << base << std::endl;
+            return false;
+        }
+        SerdNode bn = serd_node_from_string(SERD_URI,
+                                            (const uint8_t *)base.c_str());
+        SerdEnv *env = serd_env_new(&bn);
+        SerdReader *reader = sord_new_reader(targetModel, env, SERD_TURTLE, 0);
+        SerdStatus rv = serd_reader_read_file
+            (reader, (const uint8_t *)filename.c_str());
+        bool success = (rv == SERD_SUCCESS);
+        if (!success) {
+            std::cerr << "Failed to import RDF from " << filename << std::endl;
+        } else {
+            std::cerr << "Imported RDF from " << filename << std::endl;
+        }
+        serd_reader_free(reader);
+        serd_env_free(env);
+        return success;
+    }
+    
+    std::vector<std::string> candidateRdfFilesFor(Vamp::HostExt::
+                                                  PluginLoader::PluginKey key) {
+
+        std::string library = Vamp::HostExt::PluginLoader::getInstance()->
+            getLibraryPathForPlugin(key);
+	
+        auto li = library.rfind('.');
+        if (li == std::string::npos) return {};
+        auto withoutSuffix = library.substr(0, li);
+
+        std::vector<std::string> suffixes { "ttl", "TTL", "n3", "N3" };
+        std::vector<std::string> candidates;
+
+        for (auto suffix : suffixes) {
+            candidates.push_back(withoutSuffix + "." + suffix);
+        }
+
+        return candidates;
     }
 };