diff options
22 files changed, 175 insertions, 174 deletions
diff --git a/sca-cpp/trunk/components/cache/mcache.cpp b/sca-cpp/trunk/components/cache/mcache.cpp index 50b642106f..782de605c6 100644 --- a/sca-cpp/trunk/components/cache/mcache.cpp +++ b/sca-cpp/trunk/components/cache/mcache.cpp @@ -125,7 +125,7 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); - if (func == "start" || func == "restart") + if (func == "start") return tuscany::mcache::start(cdr(params)); return tuscany::mkfailure<tuscany::value>(); } diff --git a/sca-cpp/trunk/components/chat/chat.composite b/sca-cpp/trunk/components/chat/chat.composite index f02eed1418..569dbfc4b2 100644 --- a/sca-cpp/trunk/components/chat/chat.composite +++ b/sca-cpp/trunk/components/chat/chat.composite @@ -46,7 +46,7 @@ <service name="print"> <t:binding.http uri="print"/> </service> - <reference name="report" target="print-sender"/> + <reference name="report" target="print-chatter"/> </component> </composite> diff --git a/sca-cpp/trunk/components/chat/chatter.cpp b/sca-cpp/trunk/components/chat/chatter.cpp index 5a6d4909df..95f2d40077 100644 --- a/sca-cpp/trunk/components/chat/chatter.cpp +++ b/sca-cpp/trunk/components/chat/chatter.cpp @@ -110,7 +110,7 @@ public: // Disconnect and shutdown the worker thread disconnect(const_cast<XMPPClient&>(xc)); - shutdown(const_cast<worker&>(w)); + cancel(const_cast<worker&>(w)); debug("chat::chatter::stopped"); return failable<value>(value(lambda<value(const list<value>&)>())); @@ -154,7 +154,7 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); - if (func == "start" || func == "restart") + if (func == "start") return tuscany::chat::start(cdr(params)); return tuscany::mkfailure<tuscany::value>(); } diff --git a/sca-cpp/trunk/components/chat/xmpp.hpp b/sca-cpp/trunk/components/chat/xmpp.hpp index 0f84d5ec4a..34ab13ed98 100644 --- a/sca-cpp/trunk/components/chat/xmpp.hpp +++ b/sca-cpp/trunk/components/chat/xmpp.hpp @@ -318,7 +318,8 @@ const failable<bool> listen(const lambda<failable<bool>(const value&, const valu debug("chat::listen"); xc.listener = listener; xmpp_handler_add(xc.conn, messageHandler, NULL, "message", NULL, &xc); - while(xc.connected && !isNil(xc.listener)) + xc.ctx->loop_status = XMPP_LOOP_RUNNING; + while(xc.connected && !isNil(xc.listener) && xc.ctx->loop_status == XMPP_LOOP_RUNNING) xmpp_run_once(xc.ctx, 1000L); return true; } diff --git a/sca-cpp/trunk/components/queue/queue-listener.cpp b/sca-cpp/trunk/components/queue/queue-listener.cpp index 57a63b620c..d714101583 100644 --- a/sca-cpp/trunk/components/queue/queue-listener.cpp +++ b/sca-cpp/trunk/components/queue/queue-listener.cpp @@ -100,9 +100,9 @@ public: debug("queue::listener::stop"); // TODO check why stop() and close() hang in child processes - //stop(const_cast<QpidSubscription&>(qsub)); - //close(const_cast<QpidSession&>(qs)); - //close(const_cast<QpidConnection&>(qc)); + stop(const_cast<QpidSubscription&>(qsub)); + close(const_cast<QpidSession&>(qs)); + close(const_cast<QpidConnection&>(qc)); cancel(const_cast<worker&>(w)); debug("queue::listener::stopped"); @@ -150,7 +150,7 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); - if (func == "start" || func == "restart") + if (func == "start") return tuscany::queue::start(cdr(params)); return tuscany::mkfailure<tuscany::value>(); } diff --git a/sca-cpp/trunk/components/webservice/webservice-client.cpp b/sca-cpp/trunk/components/webservice/webservice-client.cpp index cb756c015e..06db6c01b8 100644 --- a/sca-cpp/trunk/components/webservice/webservice-client.cpp +++ b/sca-cpp/trunk/components/webservice/webservice-client.cpp @@ -57,7 +57,7 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); - if (func == "start" || func == "restart") + if (func == "start") return tuscany::mkfailure<tuscany::value>(); return tuscany::webservice::apply(func, cdr(params)); } diff --git a/sca-cpp/trunk/kernel/value.hpp b/sca-cpp/trunk/kernel/value.hpp index 1aafbe6d38..87d80a3e2a 100644 --- a/sca-cpp/trunk/kernel/value.hpp +++ b/sca-cpp/trunk/kernel/value.hpp @@ -557,6 +557,15 @@ template<typename T> const list<value> mkvalues(const list<T>& l) { } /** + * Convert a list of values to a list of other things. + */ +template<typename T> const list<T> convertValues(const list<value>& l) { + if (isNil(l)) + return list<T>(); + return cons<T>(car(l), convertValues<T>(cdr(l))); +} + +/** * Convert a path string value to a list of values. */ const list<string> pathTokens(const char* p) { diff --git a/sca-cpp/trunk/modules/java/eval.hpp b/sca-cpp/trunk/modules/java/eval.hpp index 58a1ab5ff9..741dda52ca 100644 --- a/sca-cpp/trunk/modules/java/eval.hpp +++ b/sca-cpp/trunk/modules/java/eval.hpp @@ -501,7 +501,7 @@ const failable<value> evalClass(const JavaRuntime& jr, const value& expr, const // The start, stop, and restart functions are optional const value fn = car<value>(expr); - if (fn == "start" || fn == "restart" || "stop") + if (fn == "start" || fn == "stop") return value(lambda<value(const list<value>&)>()); return mkfailure<value>(string("Couldn't find function: ") + car<value>(expr) + " : " + lastException(jr)); diff --git a/sca-cpp/trunk/modules/java/org/apache/tuscany/ClassLoader.java b/sca-cpp/trunk/modules/java/org/apache/tuscany/ClassLoader.java index 78b9ec7d90..7fb6519472 100644 --- a/sca-cpp/trunk/modules/java/org/apache/tuscany/ClassLoader.java +++ b/sca-cpp/trunk/modules/java/org/apache/tuscany/ClassLoader.java @@ -19,8 +19,6 @@ package org.apache.tuscany; -import static org.apache.tuscany.ClassLoader.Test.*; - import java.io.File; import java.net.MalformedURLException; import java.net.URL; @@ -36,7 +34,7 @@ class ClassLoader extends URLClassLoader { } /** - * Create a class loader for an SCA contribution path. + * Create a class loader for an SCA contribution path. */ static java.lang.ClassLoader valueOf(final String path) throws MalformedURLException { return new ClassLoader(new File(path).toURI().toURL()); diff --git a/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java b/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java index ef18b856db..85872cba72 100644 --- a/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java +++ b/sca-cpp/trunk/modules/java/org/apache/tuscany/IterableUtil.java @@ -20,7 +20,6 @@ package org.apache.tuscany; import static java.util.Arrays.*; -import static org.apache.tuscany.IterableUtil.Test.*; import java.util.AbstractList; import java.util.ArrayList; @@ -369,10 +368,10 @@ public class IterableUtil { public static void main(final String[] args) { System.out.println("Testing..."); - + Test.class.getClassLoader().setDefaultAssertionStatus(true); new Test().testList(); - + System.out.println("OK"); } diff --git a/sca-cpp/trunk/modules/java/test/CalcImpl.java b/sca-cpp/trunk/modules/java/test/CalcImpl.java index 5337afe460..5bea01a43f 100644 --- a/sca-cpp/trunk/modules/java/test/CalcImpl.java +++ b/sca-cpp/trunk/modules/java/test/CalcImpl.java @@ -19,33 +19,34 @@ package test; -import java.util.List; import java.util.ArrayList; +import java.util.List; + import org.apache.tuscany.Service; public class CalcImpl { - - public Double add(Double x, Double y, Adder adder) { + + public Double add(final Double x, final Double y, final Adder adder) { return adder.add(x, y); } - - public Double addEval(Double x, Double y, Service adder) { + + public Double addEval(final Double x, final Double y, final Service adder) { return adder.eval("add", x, y); } - - public Double mult(Double x, Double y) { + + public Double mult(final Double x, final Double y) { return x * y; } - - public Boolean even(Double x) { - return (double)(((int)(double)x / 2) * 2) == (double)x; + + public Boolean even(final Double x) { + return (double)((int)(double)x / 2 * 2) == (double)x; } - - public Iterable<Double> square(Iterable<Double> l) { - List r = new ArrayList(); - for (Double x: l) + + public Iterable<Double> square(final Iterable<Double> l) { + final List<Double> r = new ArrayList<Double>(); + for(final Double x : l) r.add(x * x); return r; } - + } diff --git a/sca-cpp/trunk/modules/python/eval.hpp b/sca-cpp/trunk/modules/python/eval.hpp index 136ecf6499..855804a5ae 100644 --- a/sca-cpp/trunk/modules/python/eval.hpp +++ b/sca-cpp/trunk/modules/python/eval.hpp @@ -241,7 +241,7 @@ const failable<value> evalScript(const value& expr, PyObject* script) { // The start, stop, and restart functions are optional const value fn = car<value>(expr); - if (fn == "start" || fn == "restart" || fn == "stop") { + if (fn == "start" || fn == "stop") { PyErr_Clear(); return value(lambda<value(const list<value>&)>()); } diff --git a/sca-cpp/trunk/modules/scheme/primitive.hpp b/sca-cpp/trunk/modules/scheme/primitive.hpp index e911c76f6c..fd5f3e9755 100644 --- a/sca-cpp/trunk/modules/scheme/primitive.hpp +++ b/sca-cpp/trunk/modules/scheme/primitive.hpp @@ -179,10 +179,6 @@ const value stopProc(unused const list<value>& args) { return lambda<value(const list<value>&)>(); } -const value restartProc(unused const list<value>& args) { - return lambda<value(const list<value>&)>(); -} - const value applyPrimitiveProcedure(const value& proc, list<value>& args) { const lambda<value(const list<value>&)> func(cadr((list<value>)proc)); return func(args); @@ -236,8 +232,7 @@ const list<value> primitiveProcedureNames() { + "log" + "uuid" + "start" - + "stop" - + "restart"; + + "stop"; } const list<value> primitiveProcedureObjects() { @@ -262,8 +257,7 @@ const list<value> primitiveProcedureObjects() { + primitiveProcedure(logProc) + primitiveProcedure(uuidProc) + primitiveProcedure(startProc) - + primitiveProcedure(stopProc) - + primitiveProcedure(restartProc); + + primitiveProcedure(stopProc); } const bool isFalse(const value& exp) { diff --git a/sca-cpp/trunk/modules/server/impl-test.cpp b/sca-cpp/trunk/modules/server/impl-test.cpp index 3fa1d65323..1bd0843745 100644 --- a/sca-cpp/trunk/modules/server/impl-test.cpp +++ b/sca-cpp/trunk/modules/server/impl-test.cpp @@ -34,7 +34,7 @@ namespace tuscany { namespace server { const failable<value> get(unused const list<value>& params) { - return value(string("Hey")); + return value(mklist<value>("text/html", mklist<value>("Hey"))); } const failable<value> post(unused const list<value>& params) { diff --git a/sca-cpp/trunk/modules/server/mod-cpp.hpp b/sca-cpp/trunk/modules/server/mod-cpp.hpp index 23b4941c26..b3828dd7d2 100644 --- a/sca-cpp/trunk/modules/server/mod-cpp.hpp +++ b/sca-cpp/trunk/modules/server/mod-cpp.hpp @@ -50,10 +50,10 @@ const list<value> failableResult(const value& func, const list<value>& 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 + // Except for the start, and stop functions, which are optional const value reason = cadr(v); if (length(reason) == 0) { - if (func == "start" || func == "restart" || func == "stop") + if (func == "start" || func == "stop") return mklist<value>(lambda<value(const list<value>&)>()); return mklist<value>(value(), string("Function not supported: ") + func); } diff --git a/sca-cpp/trunk/modules/server/mod-eval.hpp b/sca-cpp/trunk/modules/server/mod-eval.hpp index 03cce5aeb4..f319942f8d 100644 --- a/sca-cpp/trunk/modules/server/mod-eval.hpp +++ b/sca-cpp/trunk/modules/server/mod-eval.hpp @@ -104,15 +104,22 @@ const failable<int> get(request_rec* r, const lambda<value(const list<value>&)>& return httpd::writeResult(json::jsonResult(id, content(val), cx), "application/json-rpc", r); } - // Evaluate the GET expression and return an ATOM entry or feed representing a resource + // Evaluate the GET expression const list<value> path(pathValues(r->uri)); const failable<value> val = failableResult(impl(cons<value>("get", mklist<value>(cddr(path))))); if (!hasContent(val)) return mkfailure<int>(reason(val)); + const value c = content(val); + + // Write returned content-type / content-list pair + if (isList(cadr<value>(c))) + return httpd::writeResult(convertValues<string>(cadr<value>(c)), car<value>(c), r); + + // Write returned ATOM feed or entry if (isNil(cddr(path))) - return httpd::writeResult(atom::writeATOMFeed(atom::feedValuesToElements(content(val))), "application/atom+xml;type=feed", r); + return httpd::writeResult(atom::writeATOMFeed(atom::feedValuesToElements(c)), "application/atom+xml;type=feed", r); else - return httpd::writeResult(atom::writeATOMEntry(atom::entryValuesToElements(content(val))), "application/atom+xml;type=entry", r); + return httpd::writeResult(atom::writeATOMEntry(atom::entryValuesToElements(c)), "application/atom+xml;type=entry", r); } /** @@ -375,7 +382,7 @@ const failable<list<value> > applyLifecycleExpr(const list<value>& impls, const /** * Configure the components declared in the deployed composite. */ -const failable<bool> confComponents(const string& lifecycle, ServerConf& sc, server_rec& server) { +const failable<bool> confComponents(ServerConf& sc, server_rec& server) { if (sc.contributionPath == "" || sc.compositeName == "") return false; @@ -383,20 +390,29 @@ const failable<bool> confComponents(const string& lifecycle, ServerConf& sc, ser const failable<list<value> > comps = readComponents(sc.contributionPath + sc.compositeName); if (!hasContent(comps)) return mkfailure<bool>(reason(comps)); - const list<value> starts = componentToImplementationAssoc(sc, server, content(comps)); + sc.implementations = componentToImplementationAssoc(sc, server, content(comps)); + debug(sc.implementations, "modeval::confComponents::implementations"); + + // Store the implementation lambda functions in a tree for fast retrieval + sc.implTree = mkbtree(sort(sc.implementations)); + return true; +} + +/** + * Start the components declared in the deployed composite. + */ +const failable<bool> startComponents(ServerConf& sc) { - // Start or restart the component implementations - // Record the returned lambda functions - debug(starts, "modeval::confComponents::start"); - const failable<list<value> > impls = applyLifecycleExpr(starts, mklist<value>(c_str(lifecycle))); + // Start the components and record the returned implementation lambda functions + debug(sc.implementations, "modeval::startComponents::start"); + const failable<list<value> > impls = applyLifecycleExpr(sc.implementations, mklist<value>("start")); if (!hasContent(impls)) return mkfailure<bool>(reason(impls)); sc.implementations = content(impls); - debug(sc.implementations, "modeval::confComponents::implementations"); + debug(sc.implementations, "modeval::startComponents::implementations"); // Store the implementation lambda functions in a tree for fast retrieval sc.implTree = mkbtree(sort(sc.implementations)); - return true; } @@ -458,7 +474,7 @@ int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, 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); + const failable<bool> res = confComponents(sc, *s); if (!hasContent(res)) { cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl; return -1; @@ -481,6 +497,13 @@ void childInit(apr_pool_t* p, server_rec* s) { exit(APEXIT_CHILDFATAL); } + // Start the components in the child process + const failable<bool> res = startComponents(*sc); + if (!hasContent(res)) { + cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl; + exit(APEXIT_CHILDFATAL); + } + // Register a cleanup callback, called when the child is stopped or restarted apr_pool_pre_cleanup_register(p, (void*)sc, serverCleanup); } diff --git a/sca-cpp/trunk/modules/server/server-test.scm b/sca-cpp/trunk/modules/server/server-test.scm index 490f168170..7efb6ffeed 100644 --- a/sca-cpp/trunk/modules/server/server-test.scm +++ b/sca-cpp/trunk/modules/server/server-test.scm @@ -31,11 +31,11 @@ '("Item" "111" ((javaClass "services.Item") (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))) ) -(define (post coll entry) +(define (post collection item) '("123456789") ) -(define (put id entry) +(define (put id item) true ) diff --git a/sca-cpp/trunk/test/store-cpp/shopping-cart.cpp b/sca-cpp/trunk/test/store-cpp/shopping-cart.cpp index 5dcbc88ee9..eaad0d3c77 100644 --- a/sca-cpp/trunk/test/store-cpp/shopping-cart.cpp +++ b/sca-cpp/trunk/test/store-cpp/shopping-cart.cpp @@ -41,7 +41,7 @@ const string cartId("1234"); * cart if not found. */ const list<value> getcart(const value& id, const lambda<value(const list<value>&)> cache) { - const value cart = cache(mklist<value>("get", id)); + const value cart = cache(mklist<value>("get", mklist<value>(id))); if (isNil(cart)) return value(list<value>()); return (list<value>)cart; @@ -61,19 +61,12 @@ const value uuid() { /** * Post a new item to the cart. Create a new cart if necessary. */ -const failable<value> post(const value& item, const lambda<value(const list<value>&)> cache) { +const failable<value> post(unused const list<value>& collection, const value& item, const lambda<value(const list<value>&)> cache) { const value id(uuid()); const list<value> newItem(mklist<value>(car<value>(item), id, caddr<value>(item))); const list<value> cart(cons<value>(newItem, getcart(cartId, cache))); - cache(mklist<value>("put", cartId, cart)); - return id; -} - -/** - * Return the contents of the cart. - */ -const failable<value> getall(const lambda<value(const list<value>&)> cache) { - return value(append(mklist<value>(string("Your Cart"), cartId), getcart(cartId, cache))); + cache(mklist<value>("put", mklist<value>(cartId), cart)); + return value(mklist<value>(id)); } /** @@ -87,21 +80,21 @@ const value find(const value& id, const list<value>& cart) { return find(id, cdr(cart)); } -const failable<value> get(const value& id, const lambda<value(const list<value>&)> cache) { - return find(id, getcart(cartId, cache)); -} - /** - * Delete the whole cart. + * Return items from the cart. */ -const failable<value> delall(const lambda<value(const list<value>&)> cache) { - return cache(mklist<value>("delete", cartId)); +const failable<value> get(const list<value>& id, const lambda<value(const list<value>&)> cache) { + if (isNil(id)) + return value(append(mklist<value>(string("Your Cart"), cartId), getcart(cartId, cache))); + return find(car(id), getcart(cartId, cache)); } /** - * Delete an item from the cart. + * Delete items from the cart. */ -const failable<value> del(unused const value& id, unused const lambda<value(const list<value>&)> cache) { +const failable<value> del(const list<value>& id, unused const lambda<value(const list<value>&)> cache) { + if (isNil(id)) + return cache(mklist<value>("delete", mklist<value>(cartId))); return value(true); } @@ -144,13 +137,9 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); if (func == "post") - return tuscany::store::post(cadr(params), caddr(params)); - if (func == "getall") - return tuscany::store::getall(cadr(params)); + return tuscany::store::post(cadr(params), caddr(params), cadddr(params)); if (func == "get") return tuscany::store::get(cadr(params), caddr(params)); - if (func == "deleteall") - return tuscany::store::delall(cadr(params)); if (func == "delete") return tuscany::store::del(cadr(params), caddr(params)); if (func == "gettotal") diff --git a/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java b/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java index bb75926b1f..2904bbd8a1 100644 --- a/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java +++ b/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java @@ -19,34 +19,33 @@ package store; +import static org.apache.tuscany.IterableUtil.*; + import org.apache.tuscany.Service; -import static org.apache.tuscany.IterableUtil.list; /** * Catalog component implementation. */ public class FruitsCatalogImpl { - + /** * Returns the catalog. */ public Iterable<?> get(final CurrencyConverter converter, final Service currencyCode) { final String code = currencyCode.eval(); - + class Converter { - Double convert(Double price) { + Double convert(final Double price) { return converter.convert(code, "USD", price); } - }; + } - Converter c = new Converter(); - String symbol = converter.symbol(code); - - return list( - list(list("'javaClass", "services.Item"), list("'name", "Apple"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(2.99))), + final Converter c = new Converter(); + final String symbol = converter.symbol(code); + + return list(list(list("'javaClass", "services.Item"), list("'name", "Apple"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(2.99))), list(list("'javaClass", "services.Item"), list("'name", "Orange"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(3.55))), - list(list("'javaClass", "services.Item"), list("'name", "Pear"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(1.55))) - ); + list(list("'javaClass", "services.Item"), list("'name", "Pear"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(1.55)))); } /** @@ -55,5 +54,5 @@ public class FruitsCatalogImpl { public Iterable<?> listMethods(final CurrencyConverter converter, final Service currencyCode) { return list("Service.get"); } - + } diff --git a/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java b/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java index 7937b097ce..6620cbbbb0 100644 --- a/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java +++ b/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java @@ -19,25 +19,26 @@ package store; -import org.apache.tuscany.Service; -import java.lang.System; -import java.util.UUID; import static org.apache.tuscany.IterableUtil.*; +import java.util.UUID; + +import org.apache.tuscany.Service; + /** * Shopping cart component implementation. */ public class ShoppingCartImpl { - + static String cartId = "1234"; - + /** - * Get the shopping cart from the cache. Return an empty - * cart if not found. + * Get the shopping cart from the cache. Return an empty cart if not found. */ - public Iterable<?> getcart(String id, Service cache) { - Iterable<?> cart = cache.get(id); - if (cart == null) + public Iterable<?> getcart(final String id, final Service cache) { + final Iterable<String> iid = list(id); + final Iterable<?> cart = cache.get(iid); + if(cart == null) return list(); return cart; } @@ -52,72 +53,68 @@ public class ShoppingCartImpl { /** * Post a new item to the cart. Create a new cart if necessary. */ - public String post(Iterable<?> item, Service cache) { - String id = uuid(); - Iterable<?> newItem = list(car(item), id, caddr(item)); - Iterable<?> cart = cons(newItem, getcart(cartId, cache)); - cache.put(cartId, cart); - return id; - } - - /** - * Return the contents of the cart. - */ - public Iterable<?> getall(Service cache) { - return cons("Your Cart", cons(cartId, getcart(cartId, cache))); + public Iterable<String> post(final Iterable<String> collection, final Iterable<?> item, final Service cache) { + final String id = this.uuid(); + final Iterable<?> newItem = list(car(item), id, caddr(item)); + final Iterable<?> cart = cons(newItem, this.getcart(cartId, cache)); + final Iterable<String> iid = list(cartId); + cache.put(iid, cart); + return list(id); } /** * Find an item in the cart. */ - public Iterable<?> find(String id, Iterable<?> cart) { - if (isNil(cart)) + public Iterable<?> find(final String id, final Iterable<?> cart) { + if(isNil(cart)) return cons("Item", list("0", list())); - if (id.equals(cadr(car(cart)))) + if(id.equals(cadr(car(cart)))) return car(cart); - return find(id, cdr(cart)); - } - - public Iterable<?> get(String id, Service cache) { - return find(id, getcart(cartId, cache)); + return this.find(id, cdr(cart)); } /** - * Delete the whole cart. + * Return items from the cart. */ - public Boolean deleteall(Service cache) { - return cache.delete(cartId); + public Iterable<?> get(final Iterable<String> id, final Service cache) { + if(isNil(id)) + return cons("Your Cart", cons(cartId, this.getcart(cartId, cache))); + return this.find((String)car(id), this.getcart(cartId, cache)); } /** - * Delete an item from the cart. + * Delete items from the cart. */ - public Boolean delete(String id, Service cache) { + public Boolean delete(final Iterable<String> id, final Service cache) { + if(isNil(id)) { + final Iterable<String> iid = list(cartId); + return cache.delete(iid); + } return true; } /** * Return the price of an item. */ - Double price(Iterable<?> item) { + Double price(final Iterable<?> item) { return Double.valueOf((String)cadr(assoc("'price", caddr(item)))); } /** * Sum the prices of a list of items. */ - Double sum(Iterable<?> items) { - if (isNil(items)) + Double sum(final Iterable<?> items) { + if(isNil(items)) return 0.0; - return price((Iterable<?>)car(items)) + sum(cdr(items)); + return this.price((Iterable<?>)car(items)) + this.sum(cdr(items)); } /** * Return the total price of the items in the cart. */ - public Double gettotal(Service cache) { - Iterable<?> cart = getcart(cartId, cache); - return sum(cart); + public Double gettotal(final Service cache) { + final Iterable<?> cart = this.getcart(cartId, cache); + return this.sum(cart); } /** @@ -126,5 +123,5 @@ public class ShoppingCartImpl { public Iterable<?> listMethods(final Service cache) { return list("Service.gettotal"); } - + } diff --git a/sca-cpp/trunk/test/store-python/shopping-cart.py b/sca-cpp/trunk/test/store-python/shopping-cart.py index 083cd94fe0..988fe7bea6 100644 --- a/sca-cpp/trunk/test/store-python/shopping-cart.py +++ b/sca-cpp/trunk/test/store-python/shopping-cart.py @@ -24,21 +24,18 @@ cartId = "1234" # Get the shopping cart from the cache # Return an empty cart if not found def getcart(id, cache): - cart = cache("get", id) + cart = cache("get", (id,)) if cart is None: return () return cart # Post a new item to the cart, create a new cart if necessary -def post(item, cache): +def post(collection, item, cache): id = str(uuid.uuid1()) cart = ((item[0], id, item[2]),) + getcart(cartId, cache) - cache("put", cartId, cart) - return id + cache("put", (cartId,), cart) + return (id,) -# Return the content of the cart -def getall(cache): - return ("Your Cart", cartId) + getcart(cartId, cache) # Find an item in the cart def find(id, cart): @@ -49,16 +46,16 @@ def find(id, cart): else: return find(id, cart[1:]) -# Get an item from the cart +# Get items from the cart def get(id, cache): - return find(id, getcart(cartId, cache)) + if id == (): + return ("Your Cart", cartId) + getcart(cartId, cache) + return find(id[0], getcart(cartId, cache)) -# Delete the whole cart -def deleteall(cache): - return cache("delete", cartId) - -# Delete an item from the cart +# Delete items from the cart def delete(id, cache): + if id == (): + return cache("delete", (cartId,)) return true # Return the price of an item @@ -79,4 +76,3 @@ def gettotal(cache): # TODO remove these JSON-RPC specific functions def listMethods(cache): return ("Service.gettotal",) - diff --git a/sca-cpp/trunk/test/store-scheme/shopping-cart.scm b/sca-cpp/trunk/test/store-scheme/shopping-cart.scm index f6a4cd3cfa..484044d420 100644 --- a/sca-cpp/trunk/test/store-scheme/shopping-cart.scm +++ b/sca-cpp/trunk/test/store-scheme/shopping-cart.scm @@ -22,24 +22,19 @@ ; Get the shopping cart from the cache ; Return an empty cart if not found (define (getcart id cache) - (define cart (cache "get" id)) + (define cart (cache "get" (list id))) (if (nul cart) (list) cart) ) ; Post a new item to the cart, create a new cart if necessary -(define (post item cache) +(define (post collection item cache) (define id (uuid)) (define newItem (list (car item) id (caddr item))) (define cart (cons newItem (getcart cartId cache))) - (cache "put" cartId cart) - id -) - -; Return the content of the cart -(define (getall cache) - (cons "Your Cart" (cons cartId (getcart cartId cache))) + (cache "put" (list cartId) cart) + (list id) ) ; Find an item in the cart @@ -51,19 +46,20 @@ (find id (cdr cart)))) ) -; Get an item from the cart +; Get items from the cart (define (get id cache) - (find id (getcart cartId cache)) + (if (nul id) + (cons "Your Cart" (cons cartId (getcart cartId cache))) + (find (car id) (getcart cartId cache)) + ) ) -; Delete the whole cart -(define (deleteall cache) - (cache "delete" cartId) -) - -; Delete an item from the cart +; Delete items from the cart (define (delete id cache) - true + (if (nul id) + (cache "delete" (list cartId)) + true + ) ) ; Return the price of an item @@ -86,4 +82,3 @@ ; TODO remove these JSON-RPC specific functions (define (listMethods cache) (list "Service.gettotal")) - |