summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/server
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsca-cpp/trunk/modules/server/httpd-test7
-rw-r--r--sca-cpp/trunk/modules/server/impl-test.cpp2
-rw-r--r--sca-cpp/trunk/modules/server/mod-cpp.hpp29
-rw-r--r--sca-cpp/trunk/modules/server/mod-eval.cpp27
-rw-r--r--sca-cpp/trunk/modules/server/mod-eval.hpp141
-rw-r--r--sca-cpp/trunk/modules/server/mod-scheme.hpp4
-rw-r--r--sca-cpp/trunk/modules/server/mod-wiring.cpp86
-rwxr-xr-xsca-cpp/trunk/modules/server/server-test7
-rwxr-xr-xsca-cpp/trunk/modules/server/wiring-test7
9 files changed, 200 insertions, 110 deletions
diff --git a/sca-cpp/trunk/modules/server/httpd-test b/sca-cpp/trunk/modules/server/httpd-test
index 79651c8351..86718f96c5 100755
--- a/sca-cpp/trunk/modules/server/httpd-test
+++ b/sca-cpp/trunk/modules/server/httpd-test
@@ -24,14 +24,11 @@ echo "Testing..."
./server-conf tmp
./scheme-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-
-<Location />
SCAContribution `pwd`/
SCAComposite domain-test.composite
-</Location>
EOF
-apachectl -k start -d `pwd`/tmp
+../http/httpd-start tmp
sleep 2
# Test HTTP GET
@@ -71,7 +68,7 @@ if [ "$rc" = "0" ]; then
fi
# Cleanup
-apachectl -k stop -d `pwd`/tmp
+../http/httpd-stop tmp
sleep 2
if [ "$rc" = "0" ]; then
echo "OK"
diff --git a/sca-cpp/trunk/modules/server/impl-test.cpp b/sca-cpp/trunk/modules/server/impl-test.cpp
index 748e5f3837..51162d070d 100644
--- a/sca-cpp/trunk/modules/server/impl-test.cpp
+++ b/sca-cpp/trunk/modules/server/impl-test.cpp
@@ -70,7 +70,7 @@ const tuscany::value apply(const tuscany::list<tuscany::value>& params) {
return tuscany::server::del(cdr(params));
if (func == "echo")
return tuscany::server::echo(cdr(params));
- return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func);
+ return tuscany::mkfailure<tuscany::value>();
}
}
diff --git a/sca-cpp/trunk/modules/server/mod-cpp.hpp b/sca-cpp/trunk/modules/server/mod-cpp.hpp
index f10b91dc28..19ba938034 100644
--- a/sca-cpp/trunk/modules/server/mod-cpp.hpp
+++ b/sca-cpp/trunk/modules/server/mod-cpp.hpp
@@ -37,7 +37,7 @@
#include "monad.hpp"
#include "dynlib.hpp"
#include "../scheme/driver.hpp"
-#include "../http/httpd.hpp"
+#include "mod-eval.hpp"
namespace tuscany {
namespace server {
@@ -46,6 +46,21 @@ namespace modcpp {
/**
* Apply a C++ component implementation function.
*/
+const list<value> failableResult(const value& func, const list<value>& v) {
+ if (isNil(cdr(v)))
+ return v;
+
+ // Report a failure with an empty reason as 'function not supported'
+ // Except for the start, stop, and restart functions, which are optional
+ const value reason = cadr(v);
+ if (length(reason) == 0) {
+ if (func == "start" || func == "stop" || func == "restart")
+ return mklist<value>(false);
+ return mklist<value>(value(), string("Function not supported: ") + func);
+ }
+ return v;
+}
+
struct applyImplementation {
const lib ilib;
const lambda<value(const list<value>&)> impl;
@@ -54,7 +69,10 @@ struct applyImplementation {
}
const value operator()(const list<value>& params) const {
debug(params, "modeval::cpp::applyImplementation::input");
- const value val = impl(append(params, px));
+
+ // Apply the component implementation function
+ const value val = failableResult(car(params), impl(append(params, px)));
+
debug(val, "modeval::cpp::applyImplementation::result");
return val;
}
@@ -64,7 +82,9 @@ struct applyImplementation {
* Evaluate a C++ component implementation and convert it to
* an applicable lambda function.
*/
-const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) {
+const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, unused modeval::ServerConf& sc) {
+
+ // Configure the implementation's lambda function
const value ipath(attributeValue("path", impl));
const value iname(attributeValue("library", impl));
const string fpath(isNil(ipath)? path + iname : path + ipath + "/" + iname);
@@ -72,7 +92,8 @@ const failable<lambda<value(const list<value>&)> > evalImplementation(const stri
const failable<lambda<value(const list<value>&)> > evalf(dynlambda<value(const list<value>&)>("apply", ilib));
if (!hasContent(evalf))
return evalf;
- return lambda<value(const list<value>&)>(applyImplementation(ilib, content(evalf), px));
+ const lambda<value(const list<value>&)> l(applyImplementation(ilib, content(evalf), px));
+ return l;
}
}
diff --git a/sca-cpp/trunk/modules/server/mod-eval.cpp b/sca-cpp/trunk/modules/server/mod-eval.cpp
index 54ca171ec4..5a9b87ca2f 100644
--- a/sca-cpp/trunk/modules/server/mod-eval.cpp
+++ b/sca-cpp/trunk/modules/server/mod-eval.cpp
@@ -37,15 +37,36 @@ namespace server {
namespace modeval {
/**
+ * Start the module.
+ */
+const failable<bool> start(unused ServerConf& sc) {
+ return true;
+}
+
+/**
+ * Stop the module.
+ */
+const failable<bool> stop(unused ServerConf& sc) {
+ return true;
+}
+
+/**
+ * Restart the module.
+ */
+const failable<bool> restart(unused ServerConf& sc) {
+ return true;
+}
+
+/**
* Evaluate a Scheme or C++ component implementation and convert it to an
* applicable lambda function.
*/
-const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) {
+const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, ServerConf& sc) {
const string itype(elementName(impl));
if (contains(itype, ".scheme"))
- return modscheme::evalImplementation(path, impl, px);
+ return modscheme::evalImplementation(path, impl, px, sc);
if (contains(itype, ".cpp"))
- return modcpp::evalImplementation(path, impl, px);
+ return modcpp::evalImplementation(path, impl, px, sc);
return mkfailure<lambda<value(const list<value>&)> >(string("Unsupported implementation type: ") + itype);
}
diff --git a/sca-cpp/trunk/modules/server/mod-eval.hpp b/sca-cpp/trunk/modules/server/mod-eval.hpp
index b622283fed..0e68e63016 100644
--- a/sca-cpp/trunk/modules/server/mod-eval.hpp
+++ b/sca-cpp/trunk/modules/server/mod-eval.hpp
@@ -19,6 +19,9 @@
/* $Rev$ $Date$ */
+#ifndef tuscany_modeval_hpp
+#define tuscany_modeval_hpp
+
/**
* HTTPD module used to eval component implementations.
*/
@@ -50,22 +53,13 @@ namespace modeval {
*/
class ServerConf {
public:
- ServerConf(server_rec* s) : s(s), home(""), wiringServerName("") {
+ ServerConf(server_rec* s) : s(s), moduleConf(NULL), home(""), wiringServerName(""), contributionPath(""), compositeName("") {
}
const server_rec* s;
+ void* moduleConf;
string home;
string wiringServerName;
-};
-
-/**
- * Directory configuration.
- */
-class DirConf {
-public:
- DirConf(char* dirspec) : dirspec(dirspec), contributionPath(""), compositeName("") {
- }
- const char* dirspec;
string contributionPath;
string compositeName;
list<value> implementations;
@@ -262,9 +256,9 @@ int handler(request_rec *r) {
httpdDebugRequest(r, "modeval::handler::input");
// Get the component implementation lambda
- DirConf& dc = httpd::dirConf<DirConf>(r, &mod_tuscany_eval);
+ const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_eval);
const list<value> path(httpd::pathValues(r->uri));
- const list<value> impl(assoctree<value>(cadr(path), dc.implementations));
+ const list<value> impl(assoctree<value>(cadr(path), sc.implementations));
if (isNil(impl))
return HTTP_NOT_FOUND;
@@ -322,8 +316,8 @@ const list<value> propProxies(const list<value>& props) {
/**
* Evaluate a component and convert it to an applicable lambda function.
*/
-const value evalComponent(DirConf& dc, ServerConf& sc, server_rec& server, const value& comp) {
- extern const failable<lambda<value(const list<value>&)> > evalImplementation(const string& cpath, const value& impl, const list<value>& px);
+const value evalComponent(ServerConf& sc, server_rec& server, const value& comp) {
+ extern const failable<lambda<value(const list<value>&)> > evalImplementation(const string& cpath, const value& impl, const list<value>& px, ServerConf& sc);
const value impl = scdl::implementation(comp);
@@ -342,23 +336,19 @@ const value evalComponent(DirConf& dc, ServerConf& sc, server_rec& server, const
const list<value> ppx(propProxies(scdl::properties(comp)));
// Evaluate the component implementation and convert it to an applicable lambda function
- const failable<lambda<value(const list<value>&)> > cimpl(evalImplementation(dc.contributionPath, impl, append(rpx, ppx)));
+ const failable<lambda<value(const list<value>&)> > cimpl(evalImplementation(sc.contributionPath, impl, append(rpx, ppx), sc));
if (!hasContent(cimpl))
return reason(cimpl);
return content(cimpl);
}
/**
- * Return a tree of component-name + configured-implementation pairs.
+ * Return a list of component-name + configured-implementation pairs.
*/
-const list<value> componentToImplementationAssoc(DirConf& dc, ServerConf& sc, server_rec& server, const list<value>& c) {
+const list<value> componentToImplementationAssoc(ServerConf& sc, server_rec& server, const list<value>& c) {
if (isNil(c))
return c;
- return cons<value>(mklist<value>(scdl::name(car(c)), evalComponent(dc, sc, server, car(c))), componentToImplementationAssoc(dc, sc, server, cdr(c)));
-}
-
-const list<value> componentToImplementationTree(DirConf& dc, ServerConf& sc, server_rec& server, const list<value>& c) {
- return mkbtree(sort(componentToImplementationAssoc(dc, sc, server, c)));
+ return cons<value>(mklist<value>(scdl::name(car(c)), evalComponent(sc, server, car(c))), componentToImplementationAssoc(sc, server, cdr(c)));
}
/**
@@ -372,48 +362,73 @@ const failable<list<value> > readComponents(const string& path) {
}
/**
- * Configure the components declared in the deployed composite.
+ * Apply a list of component implementations to a (start, stop or restart) lifecycle expression.
*/
-const bool confComponents(DirConf& dc, ServerConf& sc, server_rec& server) {
- if (dc.contributionPath == "" || dc.compositeName == "")
+const failable<bool> applyLifecycleExpr(const list<value> impls, const list<value>& expr) {
+ if (isNil(impls))
return true;
- const failable<list<value> > comps = readComponents(dc.contributionPath + dc.compositeName);
+
+ // Evaluate lifecycle expression against a component implementation lambda
+ const lambda<value(const list<value>&)> l(cadr<value>(car(impls)));
+ const failable<value> r = failableResult(l(expr));
+ if (!hasContent(r))
+ return mkfailure<bool>(reason(r));
+
+ return applyLifecycleExpr(cdr(impls), expr);
+}
+
+/**
+ * Configure the components declared in the deployed composite.
+ */
+const failable<bool> confComponents(const string& lifecycle, ServerConf& sc, server_rec& server) {
+ if (sc.contributionPath == "" || sc.compositeName == "")
+ return false;
+
+ // Read the components and get their implementation lambda functions
+ const failable<list<value> > comps = readComponents(sc.contributionPath + sc.compositeName);
if (!hasContent(comps))
- return true;
- dc.implementations = componentToImplementationTree(dc, sc, server, content(comps));
- debug(dc.implementations, "modeval::confComponents::implementations");
- return true;
+ return mkfailure<bool>(reason(comps));
+ const list<value> impls = componentToImplementationAssoc(sc, server, content(comps));
+
+ // Store the implementation lambda functions in a tree for fast retrieval
+ sc.implementations = mkbtree(sort(impls));
+ debug(sc.implementations, "modeval::confComponents::implementations");
+
+ // Start or restart the component implementations
+ return applyLifecycleExpr(impls, mklist<value>(lifecycle));
}
/**
* Configuration commands.
*/
-const char *confHome(cmd_parms *cmd, unused void *c, const char *arg) {
+const char* confHome(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval);
sc.home = arg;
return NULL;
}
-const char *confWiringServerName(cmd_parms *cmd, unused void *c, const char *arg) {
+const char* confWiringServerName(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval);
sc.wiringServerName = arg;
return NULL;
}
-const char *confContribution(cmd_parms *cmd, void *c, const char *arg) {
+const char* confContribution(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval);
- DirConf& dc = *(DirConf*)c;
- dc.contributionPath = arg;
- confComponents(dc, sc, *cmd->server);
+ sc.contributionPath = arg;
return NULL;
}
-const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
+const char* confComposite(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval);
- DirConf& dc = *(DirConf*)c;
- dc.compositeName = arg;
- confComponents(dc, sc, *cmd->server);
+ sc.compositeName = arg;
+ return NULL;
+}
+
+const char* confEnv(unused cmd_parms *cmd, unused void *c, const char *name, const char *value) {
+ gc_scoped_pool pool(cmd->pool);
+ setenv(name, value != NULL? value : "", 1);
return NULL;
}
@@ -423,15 +438,49 @@ const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
const command_rec commands[] = {
AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"),
AP_INIT_TAKE1("SCAWiringServerName", (const char*(*)())confWiringServerName, NULL, RSRC_CONF, "SCA wiring server name"),
- AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, ACCESS_CONF, "SCA contribution location"),
- AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, ACCESS_CONF, "SCA composite location"),
+ AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, RSRC_CONF, "SCA contribution location"),
+ AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, RSRC_CONF, "SCA composite location"),
+ AP_INIT_TAKE12("SetEnv", (const char*(*)())confEnv, NULL, OR_FILEINFO, "Environment variable name and optional value"),
{NULL, NULL, NULL, 0, NO_ARGS, NULL}
};
-int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, unused server_rec *s) {
+int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, server_rec *s) {
+ extern const failable<bool> start(ServerConf& sc);
+ extern const failable<bool> restart(ServerConf& sc);
+ gc_scoped_pool pool(p);
+ ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_eval);
+
+ // Count the calls to post config
+ const string k("tuscany::modeval::postConfig");
+ const int count = httpd::userData(k, s);
+ httpd::putUserData(k, count +1, s);
+
+ // Count == 0, do nothing as post config is always called twice,
+ // count == 1 is the first start, count > 1 is a restart
+ if (count == 0)
+ return OK;
+ if (count == 1) {
+ debug("modeval::postConfig::start");
+ start(sc);
+ }
+ if (count > 1) {
+ debug("modeval::postConfig::restart");
+ restart(sc);
+ }
+
+ // Configure the components deployed to the server
+ debug(sc.wiringServerName, "modeval::postConfig::wiringServerName");
+ debug(sc.contributionPath, "modeval::postConfig::contributionPath");
+ debug(sc.compositeName, "modeval::postConfig::compositeName");
+ const failable<bool> res = confComponents(count > 1? "restart" : "start", sc, *s);
+ if (!hasContent(res))
+ return -1;
return OK;
}
+/**
+ * Child process initialization.
+ */
void childInit(apr_pool_t* p, server_rec* svr_rec) {
gc_scoped_pool pool(p);
ServerConf* c = (ServerConf*)ap_get_module_config(svr_rec->module_config, &mod_tuscany_eval);
@@ -457,7 +506,7 @@ extern "C" {
module AP_MODULE_DECLARE_DATA mod_tuscany_eval = {
STANDARD20_MODULE_STUFF,
// dir config and merger
- tuscany::httpd::makeDirConf<tuscany::server::modeval::DirConf>, NULL,
+ NULL, NULL,
// server config and merger
tuscany::httpd::makeServerConf<tuscany::server::modeval::ServerConf>, NULL,
// commands and hooks
@@ -465,3 +514,5 @@ module AP_MODULE_DECLARE_DATA mod_tuscany_eval = {
};
}
+
+#endif
diff --git a/sca-cpp/trunk/modules/server/mod-scheme.hpp b/sca-cpp/trunk/modules/server/mod-scheme.hpp
index fd03ebb43e..e18eececf6 100644
--- a/sca-cpp/trunk/modules/server/mod-scheme.hpp
+++ b/sca-cpp/trunk/modules/server/mod-scheme.hpp
@@ -34,7 +34,7 @@
#include "value.hpp"
#include "monad.hpp"
#include "../scheme/eval.hpp"
-#include "../http/httpd.hpp"
+#include "../server/mod-eval.hpp"
namespace tuscany {
namespace server {
@@ -73,7 +73,7 @@ struct applyImplementation {
* Evaluate a Scheme component implementation and convert it to an
* applicable lambda function.
*/
-const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) {
+const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, unused modeval::ServerConf& sc) {
const string fpath(path + attributeValue("script", impl));
ifstream is(fpath);
if (fail(is))
diff --git a/sca-cpp/trunk/modules/server/mod-wiring.cpp b/sca-cpp/trunk/modules/server/mod-wiring.cpp
index aef2f00c83..e21f8be773 100644
--- a/sca-cpp/trunk/modules/server/mod-wiring.cpp
+++ b/sca-cpp/trunk/modules/server/mod-wiring.cpp
@@ -48,11 +48,16 @@ namespace modwiring {
*/
class ServerConf {
public:
- ServerConf(server_rec* s) : s(s), home(""), wiringServerName("") {
+ ServerConf(server_rec* s) : s(s), start(false), home(""), wiringServerName(""), contributionPath(""), compositeName("") {
}
const server_rec* s;
+ bool start;
string home;
string wiringServerName;
+ string contributionPath;
+ string compositeName;
+ list<value> references;
+ list<value> services;
};
/**
@@ -61,20 +66,6 @@ public:
const bool useModProxy = true;
/**
- * Directory configuration.
- */
-class DirConf {
-public:
- DirConf(char* dirspec) : dirspec(dirspec), contributionPath(""), compositeName("") {
- }
- const char* dirspec;
- string contributionPath;
- string compositeName;
- list<value> references;
- list<value> services;
-};
-
-/**
* Returns true if a URI is absolute.
*/
const bool isAbsolute(const string& uri) {
@@ -90,9 +81,9 @@ int translateReference(request_rec *r) {
debug(r->uri, "modwiring::translateReference::uri");
// Find the requested component
- DirConf& dc = httpd::dirConf<DirConf>(r, &mod_tuscany_wiring);
+ const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_wiring);
const list<value> rpath(httpd::pathValues(r->uri));
- const list<value> comp(assoctree(cadr(rpath), dc.references));
+ const list<value> comp(assoctree(cadr(rpath), sc.references));
if (isNil(comp))
return HTTP_NOT_FOUND;
@@ -155,9 +146,9 @@ int translateService(request_rec *r) {
debug(r->uri, "modwiring::translateService::uri");
// Find the requested component
- DirConf& dc = httpd::dirConf<DirConf>(r, &mod_tuscany_wiring);
+ const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_wiring);
const list<value> path(httpd::pathValues(r->uri));
- const list<value> svc(assocPath(path, dc.services));
+ const list<value> svc(assocPath(path, sc.services));
if (isNil(svc))
return DECLINED;
debug(svc, "modwiring::translateService::service");
@@ -282,16 +273,19 @@ const list<value> uriToComponentTree(const list<value>& c) {
/**
* Configure the components declared in the server's deployment composite.
*/
-const bool confComponents(DirConf& dc) {
- if (dc.contributionPath == "" || dc.compositeName == "")
+const bool confComponents(ServerConf& sc) {
+ if (sc.contributionPath == "" || sc.compositeName == "")
return true;
- const failable<list<value> > comps = readComponents(dc.contributionPath + dc.compositeName);
+
+ // Read the component configuration and store the references and service
+ // URIs in trees for fast retrieval later
+ const failable<list<value> > comps = readComponents(sc.contributionPath + sc.compositeName);
if (!hasContent(comps))
return true;
- dc.references = componentReferenceToTargetTree(content(comps));
- debug(dc.references, "modwiring::confComponents::references");
- dc.services = uriToComponentTree(content(comps));
- debug(dc.services, "modwiring::confComponents::services");
+ sc.references = componentReferenceToTargetTree(content(comps));
+ debug(sc.references, "modwiring::confComponents::references");
+ sc.services = uriToComponentTree(content(comps));
+ debug(sc.services, "modwiring::confComponents::services");
return true;
}
@@ -310,18 +304,16 @@ const char *confWiringServerName(cmd_parms *cmd, unused void *c, const char *arg
sc.wiringServerName = arg;
return NULL;
}
-const char *confContribution(cmd_parms *cmd, void *c, const char *arg) {
+const char *confContribution(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
- DirConf& dc = *(DirConf*)c;
- dc.contributionPath = arg;
- confComponents(dc);
+ ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring);
+ sc.contributionPath = arg;
return NULL;
}
-const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
+const char *confComposite(cmd_parms *cmd, unused void *c, const char *arg) {
gc_scoped_pool pool(cmd->pool);
- DirConf& dc = *(DirConf*)c;
- dc.compositeName = arg;
- confComponents(dc);
+ ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring);
+ sc.compositeName = arg;
return NULL;
}
@@ -330,14 +322,28 @@ const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
*/
const command_rec commands[] = {
AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"),
- AP_INIT_TAKE1("SCAWiringServerName", (const char*(*)())confWiringServerName, NULL, ACCESS_CONF, "SCA wiring server name"),
- AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, ACCESS_CONF, "SCA contribution location"),
- AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, ACCESS_CONF, "SCA composite location"),
+ AP_INIT_TAKE1("SCAWiringServerName", (const char*(*)())confWiringServerName, NULL, RSRC_CONF, "SCA wiring server name"),
+ AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, RSRC_CONF, "SCA contribution location"),
+ AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, RSRC_CONF, "SCA composite location"),
{NULL, NULL, NULL, 0, NO_ARGS, NULL}
};
-int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, unused server_rec *s) {
- return OK;
+int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, server_rec *s) {
+ // Count the calls to post config, skip the first one as
+ // postConfig is always called twice
+ const string k("tuscany::modwiring::postConfig");
+ const int count = httpd::userData(k, s);
+ httpd::putUserData(k, count +1, s);
+ if (count == 0)
+ return OK;
+
+ // Configure the wiring for the deployed components
+ ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_wiring);
+ debug(sc.wiringServerName, "modwiring::postConfig::wiringServerName");
+ debug(sc.contributionPath, "modwiring::postConfig::contributionPath");
+ debug(sc.compositeName, "modwiring::postConfig::compositeName");
+ confComponents(sc);
+ return OK;
}
void childInit(apr_pool_t* p, server_rec* svr_rec) {
@@ -365,7 +371,7 @@ extern "C" {
module AP_MODULE_DECLARE_DATA mod_tuscany_wiring = {
STANDARD20_MODULE_STUFF,
// dir config and merger
- tuscany::httpd::makeDirConf<tuscany::server::modwiring::DirConf>, NULL,
+ NULL, NULL,
// server config and merger
tuscany::httpd::makeServerConf<tuscany::server::modwiring::ServerConf>, NULL,
// commands and hooks
diff --git a/sca-cpp/trunk/modules/server/server-test b/sca-cpp/trunk/modules/server/server-test
index 97b3fd919b..e1d9932a5d 100755
--- a/sca-cpp/trunk/modules/server/server-test
+++ b/sca-cpp/trunk/modules/server/server-test
@@ -22,14 +22,11 @@
./server-conf tmp
./scheme-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-
-<Location />
SCAContribution `pwd`/
SCAComposite domain-test.composite
-</Location>
EOF
-apachectl -k start -d `pwd`/tmp
+../http/httpd-start tmp
sleep 2
# Test
@@ -37,6 +34,6 @@ sleep 2
rc=$?
# Cleanup
-apachectl -k stop -d `pwd`/tmp
+../http/httpd-stop tmp
sleep 2
return $rc
diff --git a/sca-cpp/trunk/modules/server/wiring-test b/sca-cpp/trunk/modules/server/wiring-test
index 29eef996e6..0deab33d68 100755
--- a/sca-cpp/trunk/modules/server/wiring-test
+++ b/sca-cpp/trunk/modules/server/wiring-test
@@ -24,14 +24,11 @@ echo "Testing..."
./server-conf tmp
./scheme-conf tmp
cat >>tmp/conf/httpd.conf <<EOF
-
-<Location />
SCAContribution `pwd`/
SCAComposite domain-test.composite
-</Location>
EOF
-apachectl -k start -d `pwd`/tmp
+../http/httpd-start tmp
sleep 2
# Test HTTP GET
@@ -71,7 +68,7 @@ if [ "$rc" = "0" ]; then
fi
# Cleanup
-apachectl -k stop -d `pwd`/tmp
+../http/httpd-stop tmp
sleep 2
if [ "$rc" = "0" ]; then
echo "OK"