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() |