From 6305fa44eadb4ade9c4f25e24ab452f6f718fe91 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 8 Oct 2016 21:23:43 +0100 Subject: Add ability to load plugins (such as a session manager service) into the core's communicator --- icespider/core/core.cpp | 27 ++++++++++++++++++++++++++- icespider/core/core.h | 5 +++++ icespider/unittests/config/ice.properties | 1 + icespider/unittests/test-api.ice | 2 ++ icespider/unittests/testApp.cpp | 14 ++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/icespider/core/core.cpp b/icespider/core/core.cpp index 077d481..ab80b90 100644 --- a/icespider/core/core.cpp +++ b/icespider/core/core.cpp @@ -1,7 +1,11 @@ #include "core.h" #include "exceptions.h" #include +#include #include +#include + +INSTANTIATEFACTORY(IceSpider::Plugin, Ice::CommunicatorPtr, Ice::PropertiesPtr); namespace IceSpider { const boost::filesystem::path Core::defaultConfig("config/ice.properties"); @@ -42,16 +46,37 @@ namespace IceSpider { return a->path < b->path; }); } + // Load plugins + auto plugins = AdHoc::PluginManager::getDefault()->getAll(); + if (!plugins.empty()) { + pluginAdapter = communicator->createObjectAdapterWithEndpoints("plugins", "default"); + for (const auto & pf : plugins) { + auto p = pf->implementation()->create(communicator, communicator->getProperties()); + pluginAdapter->add(p, communicator->stringToIdentity(pf->name)); + } + pluginAdapter->activate(); + } } Core::~Core() { - if (communicator) communicator->destroy(); + // Unload plugins + auto plugins = AdHoc::PluginManager::getDefault()->getAll(); + if (!plugins.empty()) { + for (const auto & pf : plugins) { + pluginAdapter->remove(communicator->stringToIdentity(pf->name)); + } + pluginAdapter->deactivate(); + pluginAdapter->destroy(); + } + // Initialize routes for (auto l : routes) { for (auto r : l) { delete r; } } + + if (communicator) communicator->destroy(); } void diff --git a/icespider/core/core.h b/icespider/core/core.h index e37efd3..0627e74 100644 --- a/icespider/core/core.h +++ b/icespider/core/core.h @@ -6,6 +6,7 @@ #include "irouteHandler.h" #include #include +#include namespace IceSpider { class DLL_PUBLIC Core { @@ -29,9 +30,13 @@ namespace IceSpider { Routes routes; Ice::CommunicatorPtr communicator; + Ice::ObjectAdapterPtr pluginAdapter; static const boost::filesystem::path defaultConfig; }; + class DLL_PUBLIC Plugin : public virtual Ice::Object { + }; + typedef AdHoc::Factory PluginFactory; } #endif diff --git a/icespider/unittests/config/ice.properties b/icespider/unittests/config/ice.properties index 737ce9c..0abd51b 100644 --- a/icespider/unittests/config/ice.properties +++ b/icespider/unittests/config/ice.properties @@ -1 +1,2 @@ TestIceSpider.TestApi = Test +TestIceSpider.DummyPlugin = DummyPlugin diff --git a/icespider/unittests/test-api.ice b/icespider/unittests/test-api.ice index 7b81952..53def7d 100644 --- a/icespider/unittests/test-api.ice +++ b/icespider/unittests/test-api.ice @@ -20,5 +20,7 @@ module TestIceSpider { void returnNothing(string s); void complexParam(optional(0) string s, SomeModel m); }; + interface DummyPlugin { + }; }; diff --git a/icespider/unittests/testApp.cpp b/icespider/unittests/testApp.cpp index e19096f..ddf1579 100644 --- a/icespider/unittests/testApp.cpp +++ b/icespider/unittests/testApp.cpp @@ -16,6 +16,7 @@ #include #include #include +#include using namespace IceSpider; @@ -239,6 +240,12 @@ class TestApp : public Core { Ice::ObjectAdapterPtr adp; }; +class Dummy : public IceSpider::Plugin, TestIceSpider::DummyPlugin { + public: + Dummy(Ice::CommunicatorPtr, Ice::PropertiesPtr) { } +}; +NAMEDFACTORY("DummyPlugin", Dummy, IceSpider::PluginFactory); + typedef std::map Headers; Headers parseHeaders(std::istream & strm) @@ -257,6 +264,13 @@ parseHeaders(std::istream & strm) BOOST_FIXTURE_TEST_SUITE(ta, TestApp); +BOOST_AUTO_TEST_CASE( plugins ) +{ + auto prx = this->getProxy(); + BOOST_REQUIRE(prx); + prx->ice_ping(); +} + BOOST_AUTO_TEST_CASE( testCallIndex ) { TestRequest requestGetIndex(this, HttpMethod::GET, "/"); -- cgit v1.2.3