diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-01-30 08:06:07 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-01-30 08:06:07 +0000 |
commit | 8c5172b8ab407b79db53ce46271d72d8a3f9c19f (patch) | |
tree | 7ba77e7709aa09aca0b486dfe7cbba3270950762 | |
parent | c06d7a38b904247917462c3c1a780f95c68e0709 (diff) |
Correctly pass property values to component implementations.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@904734 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | sca-cpp/trunk/modules/java/eval.hpp | 19 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/java/java-test.cpp | 22 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/java/org/apache/tuscany/Service.java | 4 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/java/test/CalcImpl.java | 5 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-cpp/fruits-catalog.cpp | 10 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-java/Makefile.am | 2 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java | 12 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java | 2 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-python/fruits-catalog.py | 8 | ||||
-rw-r--r-- | sca-cpp/trunk/test/store-scheme/fruits-catalog.scm | 8 |
10 files changed, 55 insertions, 37 deletions
diff --git a/sca-cpp/trunk/modules/java/eval.hpp b/sca-cpp/trunk/modules/java/eval.hpp index 9dbb50abb5..4272543506 100644 --- a/sca-cpp/trunk/modules/java/eval.hpp +++ b/sca-cpp/trunk/modules/java/eval.hpp @@ -211,17 +211,15 @@ public: const value operator()(const list<value>& expr) const { const value& op(car(expr)); + if (op == "equals") + return value(cadr(expr) == this); + if (op == "hashCode") + return value((double)(long)this); if (op == "toString") { ostringstream os; os << this; return value(string("org.apache.tuscany.InvocationHandler@") + (c_str(str(os)) + 2)); } - if (op == "hashCode") { - return value((double)(long)this); - } - if (op == "equals") { - return value(cadr(expr) == this); - } return func(expr); } @@ -247,8 +245,9 @@ jobject JNICALL nativeInvoke(JNIEnv* env, jobject self, unused jobject proxy, jo const value func(c); env->ReleaseStringUTFChars(s, c); - // Build the expression to evaluate - const list<value> expr = cons<value>(func, jarrayToValues(jl.jr, args)); + // Build the expression to evaluate, either (func, args[0], args[1], args[2]...) + // or just args[0] for the special eval(...) function + const list<value> expr = func == "eval"? (list<value>)car<value>(jarrayToValues(jl.jr, args)) : cons<value>(func, jarrayToValues(jl.jr, args)); debug(expr, "java::nativeInvoke::expr"); // Invoke the lambda function @@ -401,8 +400,10 @@ const value jobjectToValue(const JavaRuntime& jr, const jobject o) { return value((bool)jr.env->CallBooleanMethod(o, jr.booleanValue)); if (jr.env->IsSameObject(clazz, jr.doubleClass)) return value((double)jr.env->CallDoubleMethod(o, jr.doubleValue)); - if ((jr.env->IsAssignableFrom(clazz, jr.iterableClass))) + if (jr.env->IsAssignableFrom(clazz, jr.iterableClass)) return jiterableToValues(jr, o); + if (jr.env->IsAssignableFrom(clazz, jr.objectArrayClass)) + return jarrayToValues(jr, (jobjectArray)o); return lambda<value(const list<value>&)>(javaCallable(jr, o)); } diff --git a/sca-cpp/trunk/modules/java/java-test.cpp b/sca-cpp/trunk/modules/java/java-test.cpp index da73602f12..d050180be8 100644 --- a/sca-cpp/trunk/modules/java/java-test.cpp +++ b/sca-cpp/trunk/modules/java/java-test.cpp @@ -77,12 +77,22 @@ const value add(const list<value>& args) { bool testEvalLambda() { gc_scoped_pool pool; - const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); - assert(hasContent(obj)); - const value tcel = mklist<value>("add", 3, 4, lambda<value(const list<value>&)>(add)); - const failable<value> r = evalClass(javaRuntime, tcel, content(obj)); - assert(hasContent(r)); - assert(content(r) == value(7)); + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value tcel = mklist<value>("add", 3, 4, lambda<value(const list<value>&)>(add)); + const failable<value> r = evalClass(javaRuntime, tcel, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(7)); + } + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value tcel = mklist<value>("addEval", 3, 4, lambda<value(const list<value>&)>(add)); + const failable<value> r = evalClass(javaRuntime, tcel, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(7)); + } return true; } diff --git a/sca-cpp/trunk/modules/java/org/apache/tuscany/Service.java b/sca-cpp/trunk/modules/java/org/apache/tuscany/Service.java index 6150b7d1cd..eedba5f46f 100644 --- a/sca-cpp/trunk/modules/java/org/apache/tuscany/Service.java +++ b/sca-cpp/trunk/modules/java/org/apache/tuscany/Service.java @@ -56,8 +56,8 @@ public interface Service { boolean deleteall(); /** - * Apply a function. + * Evaluate an expression. */ - <T> T apply(Object... params); + <T> T eval(Object... params); } diff --git a/sca-cpp/trunk/modules/java/test/CalcImpl.java b/sca-cpp/trunk/modules/java/test/CalcImpl.java index 37dc642e75..5337afe460 100644 --- a/sca-cpp/trunk/modules/java/test/CalcImpl.java +++ b/sca-cpp/trunk/modules/java/test/CalcImpl.java @@ -21,6 +21,7 @@ package test; import java.util.List; import java.util.ArrayList; +import org.apache.tuscany.Service; public class CalcImpl { @@ -28,6 +29,10 @@ public class CalcImpl { return adder.add(x, y); } + public Double addEval(Double x, Double y, Service adder) { + return adder.eval("add", x, y); + } + public Double mult(Double x, Double y) { return x * y; } diff --git a/sca-cpp/trunk/test/store-cpp/fruits-catalog.cpp b/sca-cpp/trunk/test/store-cpp/fruits-catalog.cpp index 4c93b2a58e..f0c9472177 100644 --- a/sca-cpp/trunk/test/store-cpp/fruits-catalog.cpp +++ b/sca-cpp/trunk/test/store-cpp/fruits-catalog.cpp @@ -50,8 +50,8 @@ const list<value> mkfruit(const string& name, const string& code, const string& mklist<value>("javaClass", string("services.Item")) + mklist<value>("name", name) + mklist<value>("currencyCode", code) + mklist<value>("currencySymbol", symbol) + mklist<value>("price", price); } -const failable<value> get(const lambda<value(const list<value>&)> converter) { - const string currency("USD"); +const failable<value> get(const lambda<value(const list<value>&)> converter, const lambda<value(const list<value>&)> currencyCode) { + const string currency(currencyCode(list<value>())); const string symbol(converter(mklist<value>("symbol", currency))); const lambda<value(const value&)> conv(convert(converter, currency)); @@ -64,7 +64,7 @@ const failable<value> get(const lambda<value(const list<value>&)> converter) { /** * TODO remove this JSON-RPC specific function. */ -const failable<value> listMethods(unused const lambda<value(const list<value>&)> converter) { +const failable<value> listMethods(unused const lambda<value(const list<value>&)> converter, unused const lambda<value(const list<value>&)> currencyCode) { return value(mklist<value>(string("Service.get"))); } @@ -76,9 +76,9 @@ extern "C" { const tuscany::value apply(const tuscany::list<tuscany::value>& params) { const tuscany::value func(car(params)); if (func == "get") - return tuscany::store::get(cadr(params)); + return tuscany::store::get(cadr(params), caddr(params)); if (func == "listMethods") - return tuscany::store::listMethods(cadr(params)); + return tuscany::store::listMethods(cadr(params), caddr(params)); return tuscany::mkfailure<tuscany::value>(tuscany::string("Function not supported: ") + func); } diff --git a/sca-cpp/trunk/test/store-java/Makefile.am b/sca-cpp/trunk/test/store-java/Makefile.am index a381f0a3fd..80972a0acc 100644 --- a/sca-cpp/trunk/test/store-java/Makefile.am +++ b/sca-cpp/trunk/test/store-java/Makefile.am @@ -19,7 +19,7 @@ JAVAROOT = ${top_builddir}/test/store-java if WANT_JAVA -AM_JAVACFLAGS = -classpath ${top_builddir}/modules/java/libmod-tuscany-java-${PACKAGE_VERSION}.jar +AM_JAVACFLAGS = -cp ${top_builddir}/modules/java/libmod-tuscany-java-${PACKAGE_VERSION}.jar:${JAVAROOT} noinst_JAVA = store/*.java diff --git a/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java b/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java index 3caa785416..bb75926b1f 100644 --- a/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java +++ b/sca-cpp/trunk/test/store-java/store/FruitsCatalogImpl.java @@ -19,6 +19,7 @@ package store; +import org.apache.tuscany.Service; import static org.apache.tuscany.IterableUtil.list; /** @@ -29,15 +30,16 @@ public class FruitsCatalogImpl { /** * Returns the catalog. */ - public Iterable<?> get(final CurrencyConverter converter) { + public Iterable<?> get(final CurrencyConverter converter, final Service currencyCode) { + final String code = currencyCode.eval(); + class Converter { Double convert(Double price) { - return converter.convert("USD", "USD", price); + return converter.convert(code, "USD", price); } }; + Converter c = new Converter(); - - String code = "USD"; String symbol = converter.symbol(code); return list( @@ -50,7 +52,7 @@ public class FruitsCatalogImpl { /** * TODO remove this JSON-RPC specific function. */ - public Iterable<?> listMethods(final CurrencyConverter converter) { + 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 30ee59932a..7937b097ce 100644 --- a/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java +++ b/sca-cpp/trunk/test/store-java/store/ShoppingCartImpl.java @@ -123,7 +123,7 @@ public class ShoppingCartImpl { /** * TODO remove this JSON-RPC specific function. */ - public Iterable<?> listMethods(final CurrencyConverter converter) { + public Iterable<?> listMethods(final Service cache) { return list("Service.gettotal"); } diff --git a/sca-cpp/trunk/test/store-python/fruits-catalog.py b/sca-cpp/trunk/test/store-python/fruits-catalog.py index ea71e93b22..6bc0bca1d7 100644 --- a/sca-cpp/trunk/test/store-python/fruits-catalog.py +++ b/sca-cpp/trunk/test/store-python/fruits-catalog.py @@ -1,9 +1,9 @@ # Catalog implementation -def get(converter): +def get(converter, currencyCode): + code = currencyCode() def convert(price): - return converter("convert", "USD", "USD", price) - code = "USD" + return converter("convert", "USD", code, price) symbol = converter("symbol", code) return ( (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(2.99))), @@ -12,6 +12,6 @@ def get(converter): ) # TODO remove these JSON-RPC specific functions -def listMethods(converter): +def listMethods(converter, currencyCode): return ("Service.get",) diff --git a/sca-cpp/trunk/test/store-scheme/fruits-catalog.scm b/sca-cpp/trunk/test/store-scheme/fruits-catalog.scm index 173bcbe9c0..f299e14650 100644 --- a/sca-cpp/trunk/test/store-scheme/fruits-catalog.scm +++ b/sca-cpp/trunk/test/store-scheme/fruits-catalog.scm @@ -1,8 +1,8 @@ ; Catalog implementation -(define (get converter) - (define (convert price) (converter "convert" "USD" "USD" price)) - (define code "USD") +(define (get converter currencyCode) + (define code (currencyCode)) + (define (convert price) (converter "convert" "USD" code price)) (define symbol (converter "symbol" code)) (list (list (list 'javaClass "services.Item") (list 'name "Apple") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 2.99))) @@ -12,5 +12,5 @@ ) ; TODO remove these JSON-RPC specific functions -(define (listMethods converter) (list "Service.get")) +(define (listMethods converter currencyCode) (list "Service.get")) |