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, "/"); | 
