diff options
| -rw-r--r-- | icespider/compile/routeCompiler.cpp | 51 | ||||
| -rw-r--r-- | icespider/compile/routeCompiler.h | 6 | ||||
| -rw-r--r-- | icespider/core/core.cpp | 14 | ||||
| -rw-r--r-- | icespider/core/irouteHandler.cpp | 4 | ||||
| -rw-r--r-- | icespider/core/irouteHandler.h | 6 | ||||
| -rw-r--r-- | icespider/unittests/Jamfile.jam | 1 | ||||
| -rw-r--r-- | icespider/unittests/config/ice.properties | 1 | ||||
| -rw-r--r-- | icespider/unittests/testApp.cpp | 2 | 
8 files changed, 52 insertions, 33 deletions
| diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index 99771aa..7f8fb38 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -294,8 +294,9 @@ namespace IceSpider {  				fprintbf(1, output, "//       path: %s\n", r->path);  				fprintbf(1, output, "class %s : public IceSpider::IRouteHandler {\n", r->name);  				fprintbf(2, output, "public:\n"); -				fprintbf(3, output, "%s(const IceSpider::Core *) :\n", r->name); +				fprintbf(3, output, "%s(const IceSpider::Core * core) :\n", r->name);  				fprintbf(4, output, "IceSpider::IRouteHandler(IceSpider::HttpMethod::%s, \"%s\")", methodName, r->path); +				auto proxies = initializeProxies(output, r);  				for (const auto & p : r->params) {  					if (p->hasUserSource) {  						fprintf(output, ",\n"); @@ -357,10 +358,11 @@ namespace IceSpider {  					addSingleOperation(output, r, findOperation(*r->operation, units));  				}  				else { -					addMashupOperations(output, r, units); +					addMashupOperations(output, r, proxies, units);  				}  				fprintbf(3, output, "}\n\n");  				fprintbf(2, output, "private:\n"); +				declareProxies(output, proxies);  				for (const auto & p : r->params) {  					if (p->hasUserSource) {  						if (p->source == ParameterSource::URL) { @@ -387,18 +389,40 @@ namespace IceSpider {  			fprintf(output, "\n// End generated code.\n");  		} +		RouteCompiler::Proxies +		RouteCompiler::initializeProxies(FILE * output, RoutePtr r) const +		{ +			Proxies proxies; +			int n = 0; +			for (const auto & o : r->operations) { +				auto proxyName = o.second->operation.substr(0, o.second->operation.find_last_of('.')); +				if (proxies.find(proxyName) == proxies.end()) { +					proxies[proxyName] = n; +					fprintf(output, ",\n"); +					fprintbf(4, output, "prx%d(getProxy<%s>(core))", n, boost::algorithm::replace_all_copy(proxyName, ".", "::")); +					n += 1; +				} +			}	 +			return proxies; +		} + +		void +		RouteCompiler::declareProxies(FILE * output, const Proxies & proxies) const +		{ +			for (const auto & p : proxies) { +				fprintbf(3, output, "const %sPrx prx%d;\n", boost::algorithm::replace_all_copy(p.first, ".", "::"), p.second); +			} +		} +  		void  		RouteCompiler::addSingleOperation(FILE * output, RoutePtr r, Slice::OperationPtr o) const  		{ -			auto proxyName = r->operation->substr(0, r->operation->find_last_of('.'));  			auto operation = r->operation->substr(r->operation->find_last_of('.') + 1); -			boost::algorithm::replace_all(proxyName, ".", "::"); -			fprintbf(4, output, "auto prx = getProxy<%s>(request);\n", proxyName);  			if (o->returnsData()) { -				fprintbf(4, output, "request->response(this, prx->%s(", operation); +				fprintbf(4, output, "request->response(this, prx0->%s(", operation);  			}  			else { -				fprintbf(4, output, "prx->%s(", operation); +				fprintbf(4, output, "prx0->%s(", operation);  			}  			for (const auto & p : o->parameters()) {  				auto rp = *std::find_if(r->params.begin(), r->params.end(), [p](const auto & rp) { @@ -422,19 +446,8 @@ namespace IceSpider {  		}  		void -		RouteCompiler::addMashupOperations(FILE * output, RoutePtr r, const Units & us) const +		RouteCompiler::addMashupOperations(FILE * output, RoutePtr r, const Proxies & proxies, const Units & us) const  		{ -			int n = 0; -			typedef std::map<std::string, int> Proxies; -			Proxies proxies; -			for (const auto & o : r->operations) { -				auto proxyName = o.second->operation.substr(0, o.second->operation.find_last_of('.')); -				if (proxies.find(proxyName) == proxies.end()) { -					proxies[proxyName] = n; -					fprintbf(4, output, "auto prx%d = getProxy<%s>(request);\n", n, boost::algorithm::replace_all_copy(proxyName, ".", "::")); -					n += 1; -				} -			}	  			for (const auto & o : r->operations) {  				auto proxyName = o.second->operation.substr(0, o.second->operation.find_last_of('.'));  				auto operation = o.second->operation.substr(o.second->operation.find_last_of('.') + 1); diff --git a/icespider/compile/routeCompiler.h b/icespider/compile/routeCompiler.h index f0da545..1f107fe 100644 --- a/icespider/compile/routeCompiler.h +++ b/icespider/compile/routeCompiler.h @@ -25,11 +25,15 @@ namespace IceSpider {  				std::vector<boost::filesystem::path> searchPath;  			private: +				typedef std::map<std::string, int> Proxies; +  				void processConfiguration(FILE * output, RouteConfigurationPtr, const Units &) const;  				void registerOutputSerializers(FILE * output, RoutePtr) const;  				void releaseOutputSerializers(FILE * output, RoutePtr) const; +				Proxies initializeProxies(FILE * output, RoutePtr) const; +				void declareProxies(FILE * output, const Proxies &) const;  				void addSingleOperation(FILE * output, RoutePtr, Slice::OperationPtr) const; -				void addMashupOperations(FILE * output, RoutePtr, const Units &) const; +				void addMashupOperations(FILE * output, RoutePtr, const Proxies &, const Units &) const;  				typedef std::map<std::string, Slice::ParamDeclPtr> ParameterMap;  				static ParameterMap findParameters(RoutePtr, const Units &);  				static Slice::OperationPtr findOperation(const std::string &, const Units &); diff --git a/icespider/core/core.cpp b/icespider/core/core.cpp index 6a44523..646ac57 100644 --- a/icespider/core/core.cpp +++ b/icespider/core/core.cpp @@ -7,6 +7,13 @@ namespace IceSpider {  	Core::Core(int argc, char ** argv)  	{ +		Ice::InitializationData id; +		id.properties = Ice::createProperties(argc, argv); +		if (boost::filesystem::exists(defaultConfig)) { +			id.properties->load(defaultConfig.string()); +		} +		communicator = Ice::initialize(id); +  		// Big enough to map all the request methods (an empty of zero lenght routes as default)  		routes.resize(HttpMethod::OPTIONS + 1, {{ }});  		// Initialize routes @@ -18,13 +25,6 @@ namespace IceSpider {  			}  			mroutes[r->pathElementCount()].push_back(r);  		} - -		Ice::InitializationData id; -		id.properties = Ice::createProperties(argc, argv); -		if (boost::filesystem::exists(defaultConfig)) { -			id.properties->load(defaultConfig.string()); -		} -		communicator = Ice::initialize(id);  	}  	Core::~Core() diff --git a/icespider/core/irouteHandler.cpp b/icespider/core/irouteHandler.cpp index ca9cb94..2c33258 100644 --- a/icespider/core/irouteHandler.cpp +++ b/icespider/core/irouteHandler.cpp @@ -21,9 +21,9 @@ namespace IceSpider {  	}  	Ice::ObjectPrx -	IRouteHandler::getProxy(IHttpRequest * request, const char * type) const +	IRouteHandler::getProxy(const Core * core, const char * type) const  	{ -		return request->core->getProxy(type); +		return core->getProxy(type);  	}  	ContentTypeSerializer diff --git a/icespider/core/irouteHandler.h b/icespider/core/irouteHandler.h index ffbde36..7a1635a 100644 --- a/icespider/core/irouteHandler.h +++ b/icespider/core/irouteHandler.h @@ -35,12 +35,12 @@ namespace IceSpider {  						boost::lexical_cast<std::string>(key));  			} -			Ice::ObjectPrx getProxy(IHttpRequest *, const char *) const; +			Ice::ObjectPrx getProxy(const Core *, const char *) const;  			template<typename Interface> -			typename Interface::ProxyType getProxy(IHttpRequest * request) const +			typename Interface::ProxyType getProxy(const Core * core) const  			{ -				return Interface::ProxyType::uncheckedCast(getProxy(request, typeid(Interface).name())); +				return Interface::ProxyType::uncheckedCast(getProxy(core, typeid(Interface).name()));  			}  			void addRouteSerializer(const MimeType &, StreamSerializerFactoryPtr); diff --git a/icespider/unittests/Jamfile.jam b/icespider/unittests/Jamfile.jam index 779aed7..52e2c25 100644 --- a/icespider/unittests/Jamfile.jam +++ b/icespider/unittests/Jamfile.jam @@ -60,6 +60,7 @@ run  	testApp.cpp  	testRoutes.json  	: : +	config/ice.properties  	xslt/transform.xslt  	:  	<define>BOOST_TEST_DYN_LINK diff --git a/icespider/unittests/config/ice.properties b/icespider/unittests/config/ice.properties new file mode 100644 index 0000000..237a838 --- /dev/null +++ b/icespider/unittests/config/ice.properties @@ -0,0 +1 @@ +TestIceSpider::TestApi = Test diff --git a/icespider/unittests/testApp.cpp b/icespider/unittests/testApp.cpp index 0266226..eec91a6 100644 --- a/icespider/unittests/testApp.cpp +++ b/icespider/unittests/testApp.cpp @@ -183,7 +183,7 @@ class TestApp : public Core {  			adp(communicator->createObjectAdapterWithEndpoints("test", "default"))  		{  			adp->activate(); -			communicator->getProperties()->setProperty("TestIceSpider::TestApi", communicator->proxyToString(adp->addWithUUID(new TestSerice()))); +			communicator->proxyToString(adp->add(new TestSerice(), communicator->stringToIdentity("Test")));  		}  		~TestApp() | 
