summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-10-08 21:23:43 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-10-08 21:23:43 +0100
commit6305fa44eadb4ade9c4f25e24ab452f6f718fe91 (patch)
tree0e8fae5ec031092aa74d1be192bb7dde7d3e74f1
parentImrpove ability to load/parse properties (diff)
downloadicespider-6305fa44eadb4ade9c4f25e24ab452f6f718fe91.tar.bz2
icespider-6305fa44eadb4ade9c4f25e24ab452f6f718fe91.tar.xz
icespider-6305fa44eadb4ade9c4f25e24ab452f6f718fe91.zip
Add ability to load plugins (such as a session manager service) into the core's communicator
-rw-r--r--icespider/core/core.cpp27
-rw-r--r--icespider/core/core.h5
-rw-r--r--icespider/unittests/config/ice.properties1
-rw-r--r--icespider/unittests/test-api.ice2
-rw-r--r--icespider/unittests/testApp.cpp14
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, "/");