diff options
-rw-r--r-- | icespider/core/core.cpp | 27 | ||||
-rw-r--r-- | icespider/core/core.h | 5 | ||||
-rw-r--r-- | icespider/unittests/config/ice.properties | 1 | ||||
-rw-r--r-- | icespider/unittests/test-api.ice | 2 | ||||
-rw-r--r-- | icespider/unittests/testApp.cpp | 14 |
5 files changed, 48 insertions, 1 deletions
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 <Ice/Initialize.h> +#include <Ice/ObjectAdapter.h> #include <boost/filesystem/convenience.hpp> +#include <factory.impl.h> + +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<PluginFactory>(); + 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<PluginFactory>(); + 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 <Ice/Communicator.h> #include <boost/filesystem/path.hpp> +#include <plugins.h> 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<Plugin, Ice::CommunicatorPtr, Ice::PropertiesPtr> 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 <xml/serializer.h> #include <json/serializer.h> #include <libxml++/parsers/domparser.h> +#include <factory.impl.h> 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<std::string, std::string> 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<TestIceSpider::DummyPlugin>(); + BOOST_REQUIRE(prx); + prx->ice_ping(); +} + BOOST_AUTO_TEST_CASE( testCallIndex ) { TestRequest requestGetIndex(this, HttpMethod::GET, "/"); |