summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-09-02 01:18:21 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-09-02 01:18:21 +0100
commit1f6a7a550ac37fa21854c9d19d227be584adb7e5 (patch)
tree03f447677bcba49d43d6de7e52558907ad9004f9
parentPass current Core instance to route handlers (diff)
downloadicespider-1f6a7a550ac37fa21854c9d19d227be584adb7e5.tar.bz2
icespider-1f6a7a550ac37fa21854c9d19d227be584adb7e5.tar.xz
icespider-1f6a7a550ac37fa21854c9d19d227be584adb7e5.zip
Initialize proxies once on start up
-rw-r--r--icespider/compile/routeCompiler.cpp51
-rw-r--r--icespider/compile/routeCompiler.h6
-rw-r--r--icespider/core/core.cpp14
-rw-r--r--icespider/core/irouteHandler.cpp4
-rw-r--r--icespider/core/irouteHandler.h6
-rw-r--r--icespider/unittests/Jamfile.jam1
-rw-r--r--icespider/unittests/config/ice.properties1
-rw-r--r--icespider/unittests/testApp.cpp2
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()