summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sca-java-2.x/trunk/distribution/all/src/main/release/bin/LICENSE14
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/META-INF/MANIFEST.MF1
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/pom.xml6
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Request.java13
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Response.java34
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Error.java28
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Request.java16
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Response.java10
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Result.java6
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCReferenceBindingProvider.java2
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceBindingProvider.java4
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java398
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcInvoker.java (renamed from sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCBindingInvoker.java)154
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcServlet.java (renamed from sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpcServlet.java)154
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCExceptionTestCase.java4
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCServiceTestCase.java2
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCBinding.java8
-rw-r--r--sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/impl/JSONRPCBindingImpl.java31
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/META-INF/MANIFEST.MF3
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/pom.xml10
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSON2JavaBean.java72
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSONHelper.java4
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSON.java81
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONObject.java142
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/String2JSON.java4
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/jackson/JacksonHelper.java45
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONTestCase.java179
-rw-r--r--sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/POJOTestCase.java92
-rw-r--r--sca-java-2.x/trunk/modules/implementation-python-runtime/pom.xml7
29 files changed, 391 insertions, 1133 deletions
diff --git a/sca-java-2.x/trunk/distribution/all/src/main/release/bin/LICENSE b/sca-java-2.x/trunk/distribution/all/src/main/release/bin/LICENSE
index 36ba6daabd..48eb152fd4 100644
--- a/sca-java-2.x/trunk/distribution/all/src/main/release/bin/LICENSE
+++ b/sca-java-2.x/trunk/distribution/all/src/main/release/bin/LICENSE
@@ -268,7 +268,6 @@ The following components come under Apache Software License 2.0
hazelcast-client-1.9.2.2.jar
httpclient-4.1.2.jar
httpcore-4.1.3.jar
- jabsorb-1.3.1.jar
jackson-core-asl-1.8.5.jar
jackson-mapper-asl-1.8.5.jar
jackson-xc-1.8.5.jar
@@ -2247,3 +2246,16 @@ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
8. By copying, installing or otherwise using Jython, Licensee agrees to be bound by the terms and conditions of this License Agreement.
========================================================================================================
+The json-20090211.jar includes files under the following licenses:
+========================================================================================================
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+========================================================================================================
+
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/META-INF/MANIFEST.MF b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/META-INF/MANIFEST.MF
index 224c4ec002..38a246997e 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/META-INF/MANIFEST.MF
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/META-INF/MANIFEST.MF
@@ -21,6 +21,7 @@ Import-Package: javax.security.auth.login,
org.apache.tuscany.sca.core;version="2.0.0",
org.apache.tuscany.sca.databinding.javabeans;version="2.0.0",
org.apache.tuscany.sca.databinding.json;version="2.0.0",
+ org.apache.tuscany.sca.databinding.json.jackson;version="2.0.0",
org.apache.tuscany.sca.host.http;version="2.0.0",
org.apache.tuscany.sca.host.http.client;version="2.0.0",
org.apache.tuscany.sca.interfacedef;version="2.0.0",
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/pom.xml b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/pom.xml
index 2b9c2fd0cc..8bdf25b8d8 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/pom.xml
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/pom.xml
@@ -98,9 +98,9 @@
</dependency>
<dependency>
- <groupId>org.jabsorb</groupId>
- <artifactId>jabsorb</artifactId>
- <version>1.3.1</version>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20090211</version>
</dependency>
<!-- Explicitly add slf4j so that jabsorb uses the latest versions -->
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Request.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Request.java
index 769c59827d..e4ae943685 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Request.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Request.java
@@ -19,6 +19,8 @@
package org.apache.tuscany.sca.binding.jsonrpc.protocol;
+import java.util.Arrays;
+
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -66,6 +68,17 @@ public class JsonRpc10Request {
}
+ public JSONObject toJSONObject() throws JSONException {
+ JSONObject req = new JSONObject();
+ req.put("id", id);
+ req.put("method", method);
+ if (params != null) {
+ JSONArray args = new JSONArray(Arrays.asList(params));
+ req.put("params", args);
+ }
+ return req;
+ }
+
public boolean isNotification() {
return id == null;
}
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Response.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Response.java
index 1a37104d6b..7facd2588a 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Response.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc10Response.java
@@ -37,9 +37,17 @@ import org.json.JSONObject;
* </ul>
*/
public class JsonRpc10Response {
+ public static final int REMOTE_EXCEPTION = 490;
private Object id;
private Object result;
private Object error;
+
+ private volatile JSONObject response;
+
+ public JsonRpc10Response(JSONObject response) {
+ super();
+ this.response = response;
+ }
public JsonRpc10Response(Object id, Object result, Object error) {
super();
@@ -51,8 +59,32 @@ public class JsonRpc10Response {
}
}
+ public JsonRpc10Response(Object id, Throwable t) {
+ super();
+ this.id = id;
+ this.result = null;
+ try {
+ JSONObject obj = new JSONObject();
+ // obj.put("msg", t.getMessage());
+ obj.put("code", REMOTE_EXCEPTION);
+ obj.put("message", t.getMessage());
+ JSONObject exception = new JSONObject();
+ exception.put("class", t.getClass().getName());
+ exception.put("message", t.getMessage());
+ exception.put("stackTrace", JsonRpc20Error.stackTrace(t));
+ obj.put("data", exception);
+ this.error = obj;
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ }
+
public JSONObject toJSONObject() throws JSONException {
- JSONObject response = new JSONObject();
+ if (response != null) {
+ return response;
+ }
+ response = new JSONObject();
response.put("id", id);
if (result != null) {
response.put("result", result);
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Error.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Error.java
index d248386909..0205be3d5f 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Error.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Error.java
@@ -59,7 +59,7 @@ public class JsonRpc20Error extends JsonRpc20Result {
super(id);
this.code = INTERNAL_ERROR;
this.messaege = t.getMessage();
- this.data = stackTrace(t);
+ this.data = t;
}
public static String stackTrace(Throwable t) {
@@ -68,14 +68,36 @@ public class JsonRpc20Error extends JsonRpc20Result {
return sw.toString();
}
+ public JsonRpc20Error(JSONObject response) {
+ super(response);
+ this.id = response.opt("id");
+ this.code = response.optInt("code");
+ this.messaege = response.optString("message");
+ this.data = response.opt("data");
+ }
+
public JSONObject toJSONObject() throws JSONException {
- JSONObject response = new JSONObject();
+ if (response != null) {
+ return response;
+ }
+
+ response = new JSONObject();
response.put("jsonrpc", "2.0");
response.put("id", id);
JSONObject error = new JSONObject();
error.put("code", code);
error.put("message", messaege);
- error.put("data", data);
+
+ if (data instanceof Throwable) {
+ Throwable t = (Throwable)data;
+ JSONObject exception = new JSONObject();
+ exception.put("class", t.getClass().getName());
+ exception.put("message", t.getMessage());
+ exception.put("stackTrace", JsonRpc20Error.stackTrace(t));
+ response.put("data", exception);
+ } else {
+ error.put("data", data);
+ }
response.put("error", error);
return response;
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Request.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Request.java
index 1af087aa25..2ee18bcf5a 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Request.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Request.java
@@ -19,6 +19,7 @@
package org.apache.tuscany.sca.binding.jsonrpc.protocol;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -49,6 +50,21 @@ public class JsonRpc20Request {
this.mappedParams = mappedParams;
}
+ public JSONObject toJSONObject() throws JSONException {
+ JSONObject req = new JSONObject();
+ req.put("jsonrpc", "2.0");
+ req.put("id", id);
+ req.put("method", method);
+ if (params != null) {
+ JSONArray args = new JSONArray(Arrays.asList(params));
+ req.put("params", args);
+ } else {
+ JSONObject args = new JSONObject(mappedParams);
+ req.put("params", args);
+ }
+ return req;
+ }
+
public JsonRpc20Request(JSONObject req) throws JSONException {
super();
if (req.has("jsonrpc") && "2.0".equals(req.getString("jsonrpc"))) {
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Response.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Response.java
index df6f1b9f5b..e6f8282faf 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Response.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Response.java
@@ -30,8 +30,16 @@ public class JsonRpc20Response extends JsonRpc20Result {
this.result = result;
}
+ public JsonRpc20Response(JSONObject response) {
+ super(response);
+ this.result = response.opt("result");
+ }
+
public JSONObject toJSONObject() throws JSONException {
- JSONObject response = new JSONObject();
+ if (response != null) {
+ return response;
+ }
+ response = new JSONObject();
response.put("jsonrpc", "2.0");
response.put("id", id);
response.put("result", result);
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Result.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Result.java
index cece8029d6..14f8f444de 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Result.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpc20Result.java
@@ -27,7 +27,13 @@ import org.json.JSONObject;
public abstract class JsonRpc20Result {
protected Object id;
+ protected volatile JSONObject response;
+ protected JsonRpc20Result(JSONObject response) {
+ super();
+ this.response = response;
+ }
+
protected JsonRpc20Result(Object id) {
super();
this.id = id;
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCReferenceBindingProvider.java
index f7fda6e83c..38688a8d34 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCReferenceBindingProvider.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCReferenceBindingProvider.java
@@ -70,7 +70,7 @@ public class JSONRPCReferenceBindingProvider implements ReferenceBindingProvider
public Invoker createInvoker(Operation operation) {
// final Interface intf = reference.getInterfaceContract().getInterface();
- return new JSONRPCBindingInvoker(endpointReference, operation, httpClient);
+ return new JsonRpcInvoker(endpointReference, operation, httpClient);
}
public void start() {
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceBindingProvider.java
index 6fc15d4ec1..82b4c351a3 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceBindingProvider.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceBindingProvider.java
@@ -92,8 +92,8 @@ public class JSONRPCServiceBindingProvider implements ServiceBindingProvider {
Object proxy = component.getComponentContext().getServiceReference(serviceInterface, endpoint).getService();
// Create and register a Servlet for this service
- JSONRPCServiceServlet serviceServlet =
- new JSONRPCServiceServlet(messageFactory, endpoint, serviceInterface, proxy);
+ JsonRpcServlet serviceServlet =
+ new JsonRpcServlet(messageFactory, endpoint, serviceInterface, proxy);
String mapping = registerServlet(serviceServlet);
servletMappings.add(mapping);
}
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java
deleted file mode 100644
index 47f74720a0..0000000000
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCServiceServlet.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.binding.jsonrpc.provider;
-
-import java.io.BufferedReader;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.tuscany.sca.assembly.Binding;
-import org.apache.tuscany.sca.common.http.HTTPUtils;
-import org.apache.tuscany.sca.databinding.json.JSONDataBinding;
-import org.apache.tuscany.sca.interfacedef.Operation;
-import org.apache.tuscany.sca.invocation.Message;
-import org.apache.tuscany.sca.invocation.MessageFactory;
-import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
-import org.jabsorb.JSONRPCBridge;
-import org.jabsorb.JSONRPCResult;
-import org.jabsorb.JSONRPCServlet;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.oasisopen.sca.ServiceRuntimeException;
-
-/**
- * Servlet that handles JSON-RPC requests invoking SCA services.
- *
- * There is an instance of this Servlet for each <binding.jsonrpc>
- *
- * @version $Rev$ $Date$
- */
-public class JSONRPCServiceServlet extends JSONRPCServlet {
- private static final long serialVersionUID = 1L;
-
- transient MessageFactory messageFactory;
-
- transient Binding binding;
- transient String serviceName;
- transient Object serviceInstance;
- transient RuntimeEndpoint endpoint;
- transient Class<?> serviceInterface;
-
- public JSONRPCServiceServlet(MessageFactory messageFactory,
- RuntimeEndpoint endpoint,
- Class<?> serviceInterface,
- Object serviceInstance) {
- this.endpoint = endpoint;
- this.messageFactory = messageFactory;
- this.binding = endpoint.getBinding();
- this.serviceName = binding.getName();
- this.serviceInterface = serviceInterface;
- this.serviceInstance = serviceInstance;
- }
-
- /**
- * Override to do nothing as the JSONRPCServlet is setup by the
- * service method in this class.
- */
- @Override
- public void init(ServletConfig config) {
- }
-
- @Override
- public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
- if ("smd".equals(request.getQueryString())) {
- handleSMDRequest(request, response);
- } else {
- try {
- handleServiceRequest(request, response);
-
- } catch(RuntimeException re) {
- if (re.getCause() instanceof javax.security.auth.login.LoginException) {
- response.setHeader("WWW-Authenticate", "BASIC realm=\"" + "ldap-realm" + "\"");
- response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
- } else {
- re.printStackTrace();
- }
- } finally {
- HttpSession session = request.getSession(false);
- if (session != null) {
- session.removeAttribute("JSONRPCBridge");
- }
- }
- }
- }
-
- private void handleServiceRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
- // Decode using the charset in the request if it exists otherwise
- // use UTF-8 as this is what all browser implementations use.
- // The JSON-RPC-Java JavaScript client is ASCII clean so it
- // although here we can correctly handle data from other clients
- // that do not escape non ASCII data
- String charset = request.getCharacterEncoding();
- if (charset == null) {
- charset = "UTF-8";
- }
-
- CharArrayWriter data = new CharArrayWriter();
- if (request.getMethod().equals("GET")) {
- // if using GET Support (see http://groups.google.com/group/json-rpc/web/json-rpc-over-http)
-
- //parse the GET QueryString
- try {
- String params = new String(Base64.decodeBase64(URLDecoder.decode(request.getParameter("params"),charset).getBytes()));
- StringBuffer sb = new StringBuffer();
- sb.append("{");
- sb.append("\"method\": \"" + request.getParameter("method") + "\",");
- sb.append("\"params\": " + params + ",");
- sb.append("\"id\":" + request.getParameter("id"));
- sb.append("}");
-
- data.write(sb.toString().toCharArray(), 0, sb.length());
- } catch (Exception e) {
- //FIXME Exceptions are not handled correctly here
- // They should be reported to the client JavaScript as proper
- // JavaScript exceptions.
- throw new RuntimeException("Unable to parse request", e);
- }
-
- } else {
- // default POST style
- BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), charset));
-
- // Read the request into charArray
- char[] buf = new char[4096];
- int ret;
- while ((ret = in.read(buf, 0, 4096)) != -1) {
- data.write(buf, 0, ret);
- }
- }
-
- JSONObject jsonReq = null;
- String method = null;
- //parse the JSON payload
- try {
- jsonReq = new JSONObject(data.toString());
- method = jsonReq.getString("method");
- } catch (Exception e) {
- //FIXME Exceptions are not handled correctly here
- // They should be reported to the client JavaScript as proper
- // JavaScript exceptions.
- throw new RuntimeException("Unable to parse request", e);
- }
-
- // check if it's a system request
- // or a method invocation
- byte[] bout;
- try {
- if (method.startsWith("system.")) {
- bout = handleJSONRPCSystemInvocation(request, response, data.toString());
- } else {
- bout = handleJSONRPCMethodInvocation(request, response, jsonReq);
- }
- } catch (JSONException e) {
- throw new RuntimeException(e);
- }
-
- // Send response to client
- // Encode using UTF-8, although We are actually ASCII clean as
- // all unicode data is JSON escaped using backslash u. This is
- // less data efficient for foreign character sets but it is
- // needed to support naughty browsers such as Konqueror and Safari
- // which do not honour the charset set in the response
- response.setContentType("text/plain;charset=utf-8");
-
- //set Cache-Control to no-cache to avoid intermediary
- //proxy/reverse-proxy caches and always hit the server
- //that would identify if the value was current or not
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Expires", new Date(0).toGMTString());
-
- //handle etag if using GET
- if( request.getMethod().equals("GET")) {
- String eTag = HTTPUtils.calculateHashETag(bout);
-
- // Test request for predicates.
- String predicate = request.getHeader( "If-Match" );
- if (( predicate != null ) && ( !predicate.equals(eTag) )) {
- // No match, should short circuit
- response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
- return;
- }
- predicate = request.getHeader( "If-None-Match" );
- if (( predicate != null ) && ( predicate.equals(eTag) )) {
- // Match, should short circuit
- response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
- return;
- }
-
- response.addHeader("ETag", eTag);
- }
-
- OutputStream out = response.getOutputStream();
- out.write(bout);
- out.flush();
- out.close();
- }
-
- /**
- * handles requests for the SMD descriptor for a service
- */
- protected void handleSMDRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, UnsupportedEncodingException {
- String serviceUrl = request.getRequestURL().toString();
- String smd = JavaToSmd.interfaceToSmd(serviceInterface, serviceUrl);
-
- response.setContentType("text/plain;charset=utf-8");
- OutputStream out = response.getOutputStream();
- byte[] bout = smd.getBytes("UTF-8");
- out.write(bout);
- out.flush();
- out.close();
- }
-
- protected byte[] handleJSONRPCSystemInvocation(HttpServletRequest request, HttpServletResponse response, String requestData) throws IOException,
- UnsupportedEncodingException, JSONException {
- /*
- * Create a new bridge for every request to avoid all the problems with
- * JSON-RPC-Java storing the bridge in the session
- */
- HttpSession session = request.getSession();
-
- JSONRPCBridge jsonrpcBridge = new JSONRPCBridge();
- jsonrpcBridge.registerObject("Service", serviceInstance, serviceInterface);
- session.setAttribute("JSONRPCBridge", jsonrpcBridge);
-
- org.json.JSONObject jsonReq = null;
- JSONRPCResult jsonResp = null;
- jsonReq = new org.json.JSONObject(requestData);
-
- String method = jsonReq.getString("method");
- if ((method != null) && (method.indexOf('.') < 0)) {
- jsonReq.putOpt("method", "Service" + "." + method);
- }
-
- // invoke the request
- jsonResp = jsonrpcBridge.call(new Object[] {request}, jsonReq);
-
- return jsonResp.toString().getBytes("UTF-8");
- }
-
- protected byte[] handleJSONRPCMethodInvocation(HttpServletRequest request, HttpServletResponse response, JSONObject jsonReq) throws IOException,
- UnsupportedEncodingException {
-
- String method = null;
- Object[] args = null;
- Object id = null;
- try {
- // Extract the method
- method = jsonReq.getString("method");
- if ((method != null) && (method.indexOf('.') < 0)) {
- jsonReq.putOpt("method", "Service" + "." + method);
- }
-
- // Extract the arguments
- JSONArray array = jsonReq.getJSONArray("params");
- args = new Object[array.length()];
- for (int i = 0; i < args.length; i++) {
- args[i] = array.get(i);
- }
- id = jsonReq.get("id");
-
- } catch (Exception e) {
- throw new RuntimeException("Unable to find json method name", e);
- }
-
- // invoke the request
- Operation jsonOperation = findOperation(method);
- Object result = null;
-
-
- // Invoke the get operation on the service implementation
- Message requestMessage = messageFactory.createMessage();
- requestMessage.setOperation(jsonOperation);
-
- requestMessage.getHeaders().put("RequestMessage", request);
-
- if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
- requestMessage.setBody(new Object[]{jsonReq.toString()});
- } else {
- requestMessage.setBody(args);
- }
-
- //result = wire.invoke(jsonOperation, args);
- Message responseMessage = null;
- try {
- responseMessage = endpoint.getInvocationChain(jsonOperation).getHeadInvoker().invoke(requestMessage);
- } catch (RuntimeException re) {
- if (re.getCause() instanceof javax.security.auth.login.LoginException) {
- throw re;
- } else {
- //some other exception
- JSONRPCResult errorResult = new JSONRPCResult(JSONRPCResult.CODE_REMOTE_EXCEPTION, id, re);
- return errorResult.toString().getBytes("UTF-8");
- }
- }
-
- if (!responseMessage.isFault()) {
- //successful execution of the invocation
- if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
- result = responseMessage.getBody();
- return result.toString().getBytes("UTF-8");
- } else {
- if (jsonOperation.getOutputType().getLogical().size() == 0) {
- // void operation (json-rpc notification)
- try {
- JSONObject jsonResponse = new JSONObject();
- jsonResponse.put("result", "");
- //get response to send to client
- return jsonResponse.toString().getBytes("UTF-8");
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
- }
-
- } else {
- // regular operation returning some value
- try {
- result = responseMessage.getBody();
- JSONObject jsonResponse = new JSONObject();
- //JSONObject put will remove the entry if it's value is null
- //and per javadoc, we should pass JSONObject.NULL
- if(result == null) {
- jsonResponse.put("result", JSONObject.NULL);
- } else {
- jsonResponse.put("result", result);
- }
- jsonResponse.putOpt("id", id);
- //get response to send to client
- return jsonResponse.toString().getBytes("UTF-8");
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
- }
- }
- }
- } else {
- //exception thrown while executing the invocation
- Throwable exception = (Throwable)responseMessage.getBody();
- JSONRPCResult errorResult = new JSONRPCResult(JSONRPCResult.CODE_REMOTE_EXCEPTION, id, exception );
- return errorResult.toString().getBytes("UTF-8");
- }
-
- }
-
- /**
- * Find the operation from the component service contract
- * @param componentService
- * @param method
- * @return
- */
- private Operation findOperation(String method) {
- if (method.contains(".")) {
- method = method.substring(method.lastIndexOf(".") + 1);
- }
-
- List<Operation> operations = endpoint.getComponentServiceInterfaceContract().getInterface().getOperations();
- //endpoint.getComponentTypeServiceInterfaceContract().getInterface().getOperations();
- //componentService.getBindingProvider(binding).getBindingInterfaceContract().getInterface().getOperations();
-
-
- Operation result = null;
- for (Operation o : operations) {
- if (o.isDynamic())
- return o;
- if (o.getName().equalsIgnoreCase(method)) {
- result = o;
- break;
- }
- }
-
- return result;
- }
-}
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCBindingInvoker.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcInvoker.java
index 51311c2da8..b3781d88de 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JSONRPCBindingInvoker.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcInvoker.java
@@ -21,16 +21,11 @@ package org.apache.tuscany.sca.binding.jsonrpc.provider;
import java.io.IOException;
import java.io.OutputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
import java.lang.reflect.Type;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
+import java.util.UUID;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
@@ -42,24 +37,19 @@ import org.apache.http.entity.EntityTemplate;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.binding.jsonrpc.JSONRPCBinding;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc10Request;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20Request;
import org.apache.tuscany.sca.databinding.json.JSONDataBinding;
+import org.apache.tuscany.sca.databinding.json.jackson.JacksonHelper;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
-import org.codehaus.jackson.map.deser.StdDeserializerProvider;
-import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
-import org.codehaus.jackson.map.ser.CustomSerializerFactory;
import org.codehaus.jackson.map.type.TypeFactory;
-import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
-import org.codehaus.jackson.xc.XmlAdapterJsonDeserializer;
-import org.codehaus.jackson.xc.XmlAdapterJsonSerializer;
-import org.json.JSONException;
import org.json.JSONObject;
import org.oasisopen.sca.ServiceRuntimeException;
@@ -68,14 +58,14 @@ import org.oasisopen.sca.ServiceRuntimeException;
*
* @version $Rev$ $Date$
*/
-public class JSONRPCBindingInvoker implements Invoker, DataExchangeSemantics {
+public class JsonRpcInvoker implements Invoker, DataExchangeSemantics {
private EndpointReference endpointReference;
private Operation operation;
private String uri;
private ObjectMapper mapper;
private HttpClient httpClient;
- public JSONRPCBindingInvoker(EndpointReference endpointReference, Operation operation, HttpClient httpClient) {
+ public JsonRpcInvoker(EndpointReference endpointReference, Operation operation, HttpClient httpClient) {
this.endpointReference = endpointReference;
this.operation = operation;
this.uri = endpointReference.getBinding().getURI();
@@ -87,35 +77,36 @@ public class JSONRPCBindingInvoker implements Invoker, DataExchangeSemantics {
HttpPost post = null;
HttpResponse response = null;
try {
- String requestId = "1";
+ String requestId = UUID.randomUUID().toString();
post = new HttpPost(uri);
HttpEntity entity = null;
Object[] args = msg.getBody();
final String db = msg.getOperation().getWrapper().getDataBinding();
if (!db.equals(JSONDataBinding.NAME)) {
-
- // Construct a map to hold JSON-RPC request
- final Map<String, Object> jsonRequest = new HashMap<String, Object>();
- jsonRequest.put("method", "Service" + "." + msg.getOperation().getName());
-
- List<Object> params = null;
+ Object[] params = new Object[0];
// Extract the arguments
args = msg.getBody();
- if (args != null) {
- params = Arrays.asList(args);
- } else {
- params = Collections.emptyList();
+ if (args instanceof Object[]) {
+ params = (Object[])args;
}
- jsonRequest.put("params", params);
- jsonRequest.put("id", requestId);
+ JSONObject jsonReq = null;
+ if (JSONRPCBinding.VERSION_20.equals(((JSONRPCBinding)endpointReference.getBinding()).getVersion())) {
+ JsonRpc20Request req = new JsonRpc20Request(requestId, msg.getOperation().getName(), params);
+ jsonReq = req.toJSONObject();
+ } else {
+ JsonRpc10Request req = new JsonRpc10Request(requestId, msg.getOperation().getName(), params);
+ jsonReq = req.toJSONObject();
+ }
+ final String json = jsonReq.toString(4);
// Create content producer so that we can stream the json result out
ContentProducer cp = new ContentProducer() {
public void writeTo(OutputStream outstream) throws IOException {
- mapper.writeValue(outstream, jsonRequest);
+ // mapper.writeValue(outstream, req.toJSONObject().toString());
+ outstream.write(json.getBytes("UTF-8"));
}
};
entity = new EntityTemplate(cp);
@@ -137,7 +128,7 @@ public class JSONRPCBindingInvoker implements Invoker, DataExchangeSemantics {
if (!db.equals(JSONDataBinding.NAME)) {
JSONObject jsonResponse = new JSONObject(entityResponse);
- if (!jsonResponse.has("result")) {
+ if (!jsonResponse.isNull("error")) {
processException(jsonResponse);
}
DataType<List<DataType>> outputType = operation.getOutputType();
@@ -156,9 +147,6 @@ public class JSONRPCBindingInvoker implements Invoker, DataExchangeSemantics {
}
Object rawResult = jsonResponse.get("result");
- if (rawResult == null) {
- processException(jsonResponse);
- }
Class<?> returnClass = returnType.getPhysical();
Type genericReturnType = returnType.getGenericType();
@@ -182,65 +170,71 @@ public class JSONRPCBindingInvoker implements Invoker, DataExchangeSemantics {
response.getEntity().consumeContent();
throw new ServiceRuntimeException("Abnormal HTTP response: " + response.getStatusLine().toString());
}
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Error e) {
+ throw e;
} catch (Exception e) {
// e.printStackTrace();
msg.setFaultBody(e);
+ } catch (Throwable e) {
+ throw new ServiceRuntimeException(e);
}
return msg;
}
public static ObjectMapper createObjectMapper(Class<?> cls) {
- ObjectMapper mapper = new ObjectMapper();
- if (cls != null) {
- // Workaround for http://jira.codehaus.org/browse/JACKSON-413
- Package pkg = cls.getPackage();
- if (pkg != null) {
- XmlJavaTypeAdapters adapters = pkg.getAnnotation(XmlJavaTypeAdapters.class);
- if (adapters != null) {
- CustomSerializerFactory serializerFactory = new CustomSerializerFactory();
- CustomDeserializerFactory deserializerFactory = new CustomDeserializerFactory();
- for (XmlJavaTypeAdapter a : adapters.value()) {
- XmlAdapter xmlAdapter = null;
- try {
- xmlAdapter = a.value().newInstance();
- } catch (Throwable e) {
- // Ignore
- }
- if (xmlAdapter != null) {
- XmlAdapterJsonDeserializer deserializer = new XmlAdapterJsonDeserializer(xmlAdapter, null);
- XmlAdapterJsonSerializer serializer = new XmlAdapterJsonSerializer(xmlAdapter, null);
- deserializerFactory.addSpecificMapping(a.type(), deserializer);
- serializerFactory.addGenericMapping(a.type(), serializer);
- StdDeserializerProvider deserializerProvider =
- new StdDeserializerProvider(deserializerFactory);
- mapper.setSerializerFactory(serializerFactory);
- mapper.setDeserializerProvider(deserializerProvider);
- }
- }
- }
- }
- }
- AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
- AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
- AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
- mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
- // [rfeng] To avoid complaints about javaClass
- mapper.getDeserializationConfig().set(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, Boolean.FALSE);
- mapper.getSerializationConfig().setAnnotationIntrospector(pair);
- return mapper;
+ return JacksonHelper.createObjectMapper(cls);
}
/**
* Generate and throw exception based on the data in the 'responseMessage'
*/
- protected void processException(JSONObject responseMessage) throws JSONException {
+ protected void processException(JSONObject responseMessage) throws Throwable {
// FIXME: We need to find a way to build Java exceptions out of the json-rpc error
- JSONObject error = (JSONObject)responseMessage.get("error");
+ JSONObject error = (JSONObject)responseMessage.opt("error");
if (error != null) {
+ Object data = error.opt("data");
+ if (data instanceof JSONObject) {
+ JSONObject fault = (JSONObject)data;
+ String javaClass = fault.optString("class");
+ String message = fault.optString("message");
+ String stackTrace = fault.optString("stackTrace");
+ if (javaClass != null) {
+ if (stackTrace != null) {
+ message = message + "\n" + stackTrace;
+ }
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ if (operation instanceof JavaOperation) {
+ Method method = ((JavaOperation)operation).getJavaMethod();
+ classLoader = method.getDeclaringClass().getClassLoader();
+ }
+ Class<? extends Throwable> exceptionClass =
+ (Class<? extends Throwable>)Class.forName(javaClass, false, classLoader);
+ Constructor<? extends Throwable> ctor = null;
+ Throwable ex = null;
+ try {
+ ctor = exceptionClass.getConstructor(String.class, Throwable.class);
+ ex = ctor.newInstance(message, null);
+ } catch (NoSuchMethodException e1) {
+ try {
+ ctor = exceptionClass.getConstructor(String.class);
+ ex = ctor.newInstance(message);
+ } catch (NoSuchMethodException e2) {
+ try {
+ ctor = exceptionClass.getConstructor(Throwable.class);
+ ex = ctor.newInstance(null);
+ } catch (NoSuchMethodException e3) {
+ ctor = exceptionClass.getConstructor();
+ ex = ctor.newInstance();
+ }
+ }
+ }
+ throw ex;
+ }
+ }
throw new ServiceRuntimeException(error.toString());
- } else {
- throw new ServiceRuntimeException(responseMessage.toString());
}
}
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpcServlet.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcServlet.java
index b14803a9eb..9e4ef8168b 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/protocol/JsonRpcServlet.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/provider/JsonRpcServlet.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.tuscany.sca.binding.jsonrpc.protocol;
+package org.apache.tuscany.sca.binding.jsonrpc.provider;
import java.io.BufferedReader;
import java.io.IOException;
@@ -25,15 +25,27 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.util.List;
+import javax.security.auth.login.LoginException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.codec.binary.Base64;
import org.apache.tuscany.sca.assembly.Binding;
-import org.apache.tuscany.sca.binding.jsonrpc.provider.JavaToSmd;
+import org.apache.tuscany.sca.binding.jsonrpc.JSONRPCBinding;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc10Request;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc10Response;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20BatchRequest;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20Error;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20Request;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20Response;
+import org.apache.tuscany.sca.binding.jsonrpc.protocol.JsonRpc20Result;
+import org.apache.tuscany.sca.databinding.json.JSONDataBinding;
+import org.apache.tuscany.sca.databinding.json.jackson.JacksonHelper;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.invocation.Message;
import org.apache.tuscany.sca.invocation.MessageFactory;
@@ -89,6 +101,7 @@ public class JsonRpcServlet extends HttpServlet {
private void handleJsonRpcInvocation(HttpServletRequest request, HttpServletResponse response)
throws UnsupportedEncodingException, IOException, ServletException {
+ StringWriter data = new StringWriter();
// Decode using the charset in the request if it exists otherwise
// use UTF-8 as this is what all browser implementations use.
// The JSON-RPC-Java JavaScript client is ASCII clean so it
@@ -98,17 +111,42 @@ public class JsonRpcServlet extends HttpServlet {
if (charset == null) {
charset = "UTF-8";
}
- // default POST style
- BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), charset));
- StringWriter data = new StringWriter();
- // Read the request into charArray
- char[] buf = new char[4096];
- int ret;
- while ((ret = in.read(buf, 0, 4096)) != -1) {
- data.write(buf, 0, ret);
+
+ if (request.getMethod().equals("GET")) {
+ // if using GET Support (see http://groups.google.com/group/json-rpc/web/json-rpc-over-http)
+
+ //parse the GET QueryString
+ try {
+ String params =
+ new String(Base64.decodeBase64(URLDecoder.decode(request.getParameter("params"), charset)
+ .getBytes()));
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ sb.append("\"method\": \"" + request.getParameter("method") + "\",");
+ sb.append("\"params\": " + params + ",");
+ sb.append("\"id\":" + request.getParameter("id"));
+ sb.append("}");
+
+ data.write(sb.toString());
+ } catch (Throwable e) {
+ JsonRpc10Response error = new JsonRpc10Response(request.getParameter("id"), e);
+ error.write(response.getWriter());
+ return;
+ }
+ } else {
+
+ // default POST style
+ BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), charset));
+ // Read the request into charArray
+ char[] buf = new char[4096];
+ int ret;
+ while ((ret = in.read(buf, 0, 4096)) != -1) {
+ data.write(buf, 0, ret);
+ }
}
String json = data.toString().trim();
+
try {
if (json.startsWith("[")) {
JSONArray input = new JSONArray(json);
@@ -123,7 +161,7 @@ public class JsonRpcServlet extends HttpServlet {
JSONArray responses = batchReq.getBatchResponse().toJSONArray();
responses.write(response.getWriter());
} else {
- JSONObject input = new JSONObject(data.toString());
+ JSONObject input = JacksonHelper.read(json);
if (input.has("jsonrpc")) {
JsonRpc20Request jsonReq = new JsonRpc20Request(input);
JsonRpc20Result jsonResult = invoke(jsonReq);
@@ -139,7 +177,7 @@ public class JsonRpcServlet extends HttpServlet {
}
}
- private JsonRpc20Result invoke(JsonRpc20Request request) {
+ private JsonRpc20Result invoke(JsonRpc20Request request) throws Exception {
// invoke the request
String method = request.getMethod();
@@ -153,6 +191,12 @@ public class JsonRpcServlet extends HttpServlet {
requestMessage.setOperation(jsonOperation);
requestMessage.getHeaders().put("RequestMessage", request);
+
+ if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
+ requestMessage.setBody(new Object[] {JacksonHelper.write(request.toJSONObject())});
+ } else {
+ requestMessage.setBody(params);
+ }
requestMessage.setBody(params);
Message responseMessage = null;
@@ -170,25 +214,29 @@ public class JsonRpcServlet extends HttpServlet {
}
if (!responseMessage.isFault()) {
-
- if (jsonOperation.getOutputType().getLogical().size() == 0) {
- // void operation (json-rpc notification)
- try {
- JsonRpc20Response response = new JsonRpc20Response(request.getId(), null);
- return response;
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
- }
-
+ if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
+ result = responseMessage.getBody();
+ return new JsonRpc20Response(JacksonHelper.read(result.toString()));
} else {
- // regular operation returning some value
- try {
- result = responseMessage.getBody();
- JsonRpc20Response response = new JsonRpc20Response(request.getId(), result);
- //get response to send to client
- return response;
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
+ if (jsonOperation.getOutputType().getLogical().size() == 0) {
+ // void operation (json-rpc notification)
+ try {
+ JsonRpc20Response response = new JsonRpc20Response(request.getId(), null);
+ return response;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException("Unable to create JSON response", e);
+ }
+
+ } else {
+ // regular operation returning some value
+ try {
+ result = responseMessage.getBody();
+ JsonRpc20Response response = new JsonRpc20Response(request.getId(), result);
+ //get response to send to client
+ return response;
+ } catch (Exception e) {
+ throw new ServiceRuntimeException("Unable to create JSON response", e);
+ }
}
}
@@ -202,7 +250,7 @@ public class JsonRpcServlet extends HttpServlet {
}
- private JsonRpc10Response invoke(JsonRpc10Request request) {
+ private JsonRpc10Response invoke(JsonRpc10Request request) throws Exception {
// invoke the request
String method = request.getMethod();
@@ -216,42 +264,42 @@ public class JsonRpcServlet extends HttpServlet {
requestMessage.setOperation(jsonOperation);
requestMessage.getHeaders().put("RequestMessage", request);
- requestMessage.setBody(params);
+ if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
+ requestMessage.setBody(new Object[] {JacksonHelper.write(request.toJSONObject())});
+ } else {
+ requestMessage.setBody(params);
+ }
Message responseMessage = null;
try {
//result = wire.invoke(jsonOperation, args);
responseMessage = endpoint.getInvocationChain(jsonOperation).getHeadInvoker().invoke(requestMessage);
- } catch (RuntimeException re) {
- if (re.getCause() instanceof javax.security.auth.login.LoginException) {
- throw re;
+ } catch (RuntimeException e) {
+ if (e.getCause() instanceof LoginException) {
+ throw e;
} else {
- JsonRpc10Response error = new JsonRpc10Response(request.getId(), null, re.toString());
+ JsonRpc10Response error = new JsonRpc10Response(request.getId(), e);
return error;
}
}
if (!responseMessage.isFault()) {
-
- if (jsonOperation.getOutputType().getLogical().size() == 0) {
- // void operation (json-rpc notification)
- try {
+ if (jsonOperation.getWrapper().getDataBinding().equals(JSONDataBinding.NAME)) {
+ result = responseMessage.getBody();
+ return new JsonRpc10Response(JacksonHelper.read(result.toString()));
+ } else {
+ if (jsonOperation.getOutputType().getLogical().size() == 0) {
+ // void operation (json-rpc notification)
JsonRpc10Response response = new JsonRpc10Response(request.getId(), JSONObject.NULL, null);
return response;
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
- }
- } else {
- // regular operation returning some value
- try {
+ } else {
+ // regular operation returning some value
result = responseMessage.getBody();
JsonRpc10Response response = new JsonRpc10Response(request.getId(), result, null);
//get response to send to client
return response;
- } catch (Exception e) {
- throw new ServiceRuntimeException("Unable to create JSON response", e);
}
}
@@ -259,8 +307,7 @@ public class JsonRpcServlet extends HttpServlet {
//exception thrown while executing the invocation
Throwable exception = (Throwable)responseMessage.getBody();
- JsonRpc10Response error =
- new JsonRpc10Response(request.getId(), null, JsonRpc20Error.stackTrace(exception));
+ JsonRpc10Response error = new JsonRpc10Response(request.getId(), exception);
return error;
}
@@ -300,7 +347,12 @@ public class JsonRpcServlet extends HttpServlet {
protected void handleSMDRequest(HttpServletRequest request, HttpServletResponse response) throws IOException,
UnsupportedEncodingException {
String serviceUrl = request.getRequestURL().toString();
- String smd = JavaToSmd.interfaceToSmd20(serviceInterface, serviceUrl);
+ String smd = null;
+ if (JSONRPCBinding.VERSION_20.equals(((JSONRPCBinding)binding).getVersion())) {
+ smd = JavaToSmd.interfaceToSmd20(serviceInterface, serviceUrl);
+ } else {
+ smd = JavaToSmd.interfaceToSmd(serviceInterface, serviceUrl);
+ }
response.setContentType("application/json;charset=utf-8");
OutputStream out = response.getOutputStream();
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCExceptionTestCase.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCExceptionTestCase.java
index 56080058c8..037c6f3ad0 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCExceptionTestCase.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCExceptionTestCase.java
@@ -75,7 +75,7 @@ public class JSONRPCExceptionTestCase{
JSONObject jsonErr = new JSONObject(response.getText()).getJSONObject("error");
- Assert.assertEquals("Runtime Exception", jsonErr.getString("msg"));
+ Assert.assertEquals("Runtime Exception", jsonErr.getString("message"));
}
@Test
@@ -90,6 +90,6 @@ public class JSONRPCExceptionTestCase{
JSONObject jsonErr = new JSONObject(response.getText()).getJSONObject("error");
- Assert.assertEquals("Business Exception", jsonErr.getString("msg"));
+ Assert.assertEquals("Business Exception", jsonErr.getString("message"));
}
} \ No newline at end of file
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCServiceTestCase.java b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCServiceTestCase.java
index 8b8d689b0e..a0e7af8172 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCServiceTestCase.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc-runtime/src/test/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCServiceTestCase.java
@@ -106,6 +106,6 @@ public class JSONRPCServiceTestCase {
Assert.assertEquals(200, response.getResponseCode());
JSONObject jsonResp = new JSONObject(response.getText());
- Assert.assertEquals(0, jsonResp.getString("result").length());
+ Assert.assertTrue(jsonResp.isNull("result"));
}
} \ No newline at end of file
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCBinding.java b/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCBinding.java
index 1e14502d93..158611b9cf 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCBinding.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/JSONRPCBinding.java
@@ -29,5 +29,11 @@ import org.apache.tuscany.sca.assembly.Binding;
* @version $Rev$ $Date$
*/
public interface JSONRPCBinding extends Binding {
- QName TYPE = new QName(SCA11_TUSCANY_NS, "binding.jsonrpc");
+ QName TYPE = new QName(SCA11_TUSCANY_NS, "binding.jsonrpc");
+ String VERSION_10 = "1.0";
+ String VERSION_20 = "2.0";
+
+ String getVersion();
+
+ void setVersion(String version);
}
diff --git a/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/impl/JSONRPCBindingImpl.java b/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/impl/JSONRPCBindingImpl.java
index 4c1a261e81..88bb4b63c4 100644
--- a/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/impl/JSONRPCBindingImpl.java
+++ b/sca-java-2.x/trunk/modules/binding-jsonrpc/src/main/java/org/apache/tuscany/sca/binding/jsonrpc/impl/JSONRPCBindingImpl.java
@@ -33,11 +33,12 @@ import org.apache.tuscany.sca.binding.jsonrpc.JSONRPCBinding;
public class JSONRPCBindingImpl implements JSONRPCBinding {
private String name;
private String uri;
+ private String version = VERSION_10;
public QName getType() {
- return TYPE;
- }
-
+ return TYPE;
+ }
+
public String getName() {
return name;
}
@@ -67,25 +68,33 @@ public class JSONRPCBindingImpl implements JSONRPCBinding {
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
-
+
public WireFormat getRequestWireFormat() {
return null;
}
-
- public void setRequestWireFormat(WireFormat wireFormat) {
+
+ public void setRequestWireFormat(WireFormat wireFormat) {
}
-
+
public WireFormat getResponseWireFormat() {
return null;
}
-
+
public void setResponseWireFormat(WireFormat wireFormat) {
}
-
+
public OperationSelector getOperationSelector() {
return null;
}
-
+
public void setOperationSelector(OperationSelector operationSelector) {
- }
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/META-INF/MANIFEST.MF b/sca-java-2.x/trunk/modules/databinding-json/META-INF/MANIFEST.MF
index a867f215d1..ec140441af 100644
--- a/sca-java-2.x/trunk/modules/databinding-json/META-INF/MANIFEST.MF
+++ b/sca-java-2.x/trunk/modules/databinding-json/META-INF/MANIFEST.MF
@@ -1,6 +1,7 @@
Manifest-Version: 1.0
Export-Package: org.apache.tuscany.sca.databinding.json;version="2.0.0",
- org.apache.tuscany.sca.databinding.json.axiom;version="2.0.0"
+ org.apache.tuscany.sca.databinding.json.axiom;version="2.0.0",
+ org.apache.tuscany.sca.databinding.json.jackson;version="2.0.0"
SCA-Version: 1.1
Bundle-Name: Apache Tuscany SCA Data Binding for JSON
Bundle-Vendor: The Apache Software Foundation
diff --git a/sca-java-2.x/trunk/modules/databinding-json/pom.xml b/sca-java-2.x/trunk/modules/databinding-json/pom.xml
index d3f191639a..06580aac3d 100644
--- a/sca-java-2.x/trunk/modules/databinding-json/pom.xml
+++ b/sca-java-2.x/trunk/modules/databinding-json/pom.xml
@@ -52,17 +52,17 @@
<artifactId>jackson-xc</artifactId>
<version>1.8.5</version>
</dependency>
- <!--
+
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>jackson-module-json-org</artifactId>
<version>0.9.1</version>
</dependency>
- -->
+
<dependency>
- <groupId>org.jabsorb</groupId>
- <artifactId>jabsorb</artifactId>
- <version>1.3.1</version>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20090211</version>
</dependency>
<dependency>
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSON2JavaBean.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSON2JavaBean.java
deleted file mode 100644
index 5cf48645b8..0000000000
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSON2JavaBean.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.databinding.json;
-
-import org.apache.tuscany.sca.databinding.PullTransformer;
-import org.apache.tuscany.sca.databinding.TransformationContext;
-import org.apache.tuscany.sca.databinding.TransformationException;
-import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;
-import org.jabsorb.JSONSerializer;
-import org.jabsorb.serializer.SerializerState;
-
-/**
- * @version $Rev$ $Date$
- */
-public class JSON2JavaBean implements PullTransformer<Object, Object> {
- private JSONSerializer serializer;
-
- public JSON2JavaBean() {
- super();
- serializer = new JSONSerializer();
- try {
- serializer.registerDefaultSerializers();
- } catch (Exception e) {
- throw new TransformationException(e);
- }
- serializer.setMarshallClassHints(true);
- serializer.setMarshallNullAttributes(false);
- }
-
- public Object transform(Object source, TransformationContext context) {
- if (source == null) {
- return null;
- }
-
- try {
- SerializerState state = new SerializerState();
- return serializer.unmarshall(state, context.getTargetDataType().getPhysical(), source);
- } catch (Exception e) {
- throw new TransformationException(e);
- }
-
- }
-
- public String getSourceDataBinding() {
- return JSONDataBinding.NAME;
- }
-
- public String getTargetDataBinding() {
- return JavaBeansDataBinding.NAME;
- }
-
- public int getWeight() {
- return 5000;
- }
-}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSONHelper.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSONHelper.java
index 028690a789..a17c08ad20 100644
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSONHelper.java
+++ b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JSONHelper.java
@@ -97,8 +97,8 @@ public class JSONHelper {
if (type == JSONArray.class || type.isArray() || Collection.class.isAssignableFrom(type)) {
return new JSONArray(json);
}
- return new org.json.JSONObject(json);
- } catch (org.json.JSONException e) {
+ return JacksonHelper.MAPPER.readValue(json, org.json.JSONObject.class);
+ } catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSON.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSON.java
deleted file mode 100644
index 0c0683b16c..0000000000
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSON.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.databinding.json;
-
-import org.apache.tuscany.sca.databinding.BaseTransformer;
-import org.apache.tuscany.sca.databinding.PullTransformer;
-import org.apache.tuscany.sca.databinding.TransformationContext;
-import org.apache.tuscany.sca.databinding.TransformationException;
-import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;
-import org.jabsorb.JSONSerializer;
-import org.jabsorb.serializer.SerializerState;
-
-public class JavaBean2JSON extends BaseTransformer<Object, Object> implements PullTransformer<Object, Object> {
- private JSONSerializer serializer;
-
- public JavaBean2JSON() {
- serializer = new JSONSerializer();
- try {
- serializer.registerDefaultSerializers();
- } catch (Exception e) {
- throw new TransformationException(e);
- }
- serializer.setMarshallClassHints(true);
- serializer.setMarshallNullAttributes(false);
- }
-
- @Override
- public String getSourceDataBinding() {
- return JavaBeansDataBinding.NAME;
- }
-
- @Override
- protected Class<Object> getSourceType() {
- return Object.class;
- }
-
- @Override
- public String getTargetDataBinding() {
- return JSONDataBinding.NAME;
- }
-
- @Override
- protected Class<Object> getTargetType() {
- return Object.class;
- }
-
- public Object toJSON(Object source) throws Exception {
- if (source == null) {
- return org.json.JSONObject.NULL;
- }
-
- SerializerState state = new SerializerState();
- return serializer.marshall(state, null, source, new Integer(0));
- }
-
- public Object transform(Object source, TransformationContext context) {
- try {
- return toJSON(source);
- } catch (Exception e) {
- throw new TransformationException(e);
- }
- }
-
-}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONObject.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONObject.java
deleted file mode 100644
index 9ec3bd7e19..0000000000
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONObject.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.databinding.json;
-
-import java.beans.BeanInfo;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-
-import org.apache.tuscany.sca.databinding.PullTransformer;
-import org.apache.tuscany.sca.databinding.SimpleTypeMapper;
-import org.apache.tuscany.sca.databinding.TransformationContext;
-import org.apache.tuscany.sca.databinding.TransformationException;
-import org.apache.tuscany.sca.databinding.BaseTransformer;
-import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
-import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding;
-import org.apache.tuscany.sca.interfacedef.util.TypeInfo;
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONObject;
-
-public class JavaBean2JSONObject extends BaseTransformer<Object, Object> implements PullTransformer<Object, Object> {
- private static final SimpleTypeMapper SIMPLE_TYPE_MAPPER = new SimpleTypeMapperImpl();
-
- private static final Comparator<PropertyDescriptor> COMPARATOR = new Comparator<PropertyDescriptor>() {
- public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
- return o1.getName().compareTo(o2.getName());
- }
- };
-
- private static final SimpleTypeMapperImpl MAPPER = new SimpleTypeMapperImpl();
- private static final Object[] NULL = null;
-
- private static String getStringValue(Object o) {
- if (o == null) {
- return null;
- }
- TypeInfo info = SIMPLE_TYPE_MAPPER.getXMLType(o.getClass());
- if (info != null) {
- return MAPPER.toXMLLiteral(info.getQName(), o, null);
- } else {
- return String.valueOf(o);
- }
- }
-
- private static boolean isSimpleType(Class<?> javaType) {
- return SIMPLE_TYPE_MAPPER.getXMLType(javaType) != null;
- }
-
- public JavaBean2JSONObject() {
- }
-
- @Override
- public String getSourceDataBinding() {
- return JavaBeansDataBinding.NAME;
- }
-
- @Override
- protected Class<Object> getSourceType() {
- return Object.class;
- }
-
- @Override
- public String getTargetDataBinding() {
- return JSONDataBinding.NAME;
- }
-
- @Override
- protected Class<Object> getTargetType() {
- return Object.class;
- }
-
- public Object toJSON(Object source) throws Exception {
- if (source == null) {
- return JSONObject.NULL;
- }
- Class<?> type = source.getClass();
- if (isSimpleType(type)) {
- return source;
- } else if (type.isArray()) {
- JSONArray array = new JSONArray();
- int i1 = Array.getLength(source);
- for (int j = 0; j < i1; j++) {
- Object o = Array.get(source, j);
- array.put(toJSON(o));
- }
- return array;
- } else if (Collection.class.isAssignableFrom(type)) {
- Collection c = (Collection)source;
- JSONArray array = new JSONArray();
- for (Object element : c) {
- array.put(toJSON(element));
- }
- return array;
- }
- JSONObject json = new JSONObject();
- BeanInfo beanInfo = Introspector.getBeanInfo(type);
- PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
- Collections.sort(Arrays.asList(propDescs), COMPARATOR);
-
- for (int i = 0; i < propDescs.length; i++) {
- PropertyDescriptor propDesc = propDescs[i];
- Class<?> pType = propDesc.getPropertyType();
- if ("class".equals(propDesc.getName())) {
- continue;
- }
- Object pValue = propDesc.getReadMethod().invoke(source, NULL);
- json.put(propDesc.getName(), toJSON(pValue));
- }
- return json;
-
- }
-
- public Object transform(Object source, TransformationContext context) {
- try {
- return toJSON(source);
- } catch (Exception e) {
- throw new TransformationException(e);
- }
- }
-
-}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/String2JSON.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/String2JSON.java
index 7d89927f51..1b4381970b 100644
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/String2JSON.java
+++ b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/String2JSON.java
@@ -19,10 +19,10 @@
package org.apache.tuscany.sca.databinding.json;
+import org.apache.tuscany.sca.databinding.BaseTransformer;
import org.apache.tuscany.sca.databinding.PullTransformer;
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.databinding.TransformationException;
-import org.apache.tuscany.sca.databinding.BaseTransformer;
/**
* @version $Rev$ $Date$
@@ -41,7 +41,7 @@ public class String2JSON extends BaseTransformer<String, Object> implements Pull
public Object transform(String source, TransformationContext context) {
try {
- Class type = null;
+ Class<?> type = null;
if (context != null && context.getTargetDataType() != null) {
type = context.getTargetDataType().getPhysical();
}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/jackson/JacksonHelper.java b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/jackson/JacksonHelper.java
index 2307150370..efe0bf7560 100644
--- a/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/jackson/JacksonHelper.java
+++ b/sca-java-2.x/trunk/modules/databinding-json/src/main/java/org/apache/tuscany/sca/databinding/json/jackson/JacksonHelper.java
@@ -47,12 +47,15 @@ import org.codehaus.jackson.map.util.StdDateFormat;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
import org.codehaus.jackson.xc.XmlAdapterJsonDeserializer;
import org.codehaus.jackson.xc.XmlAdapterJsonSerializer;
+import org.json.JSONObject;
+
+import com.fasterxml.jackson.module.jsonorg.JsonOrgModule;
/**
*
*/
public class JacksonHelper {
- private final static ObjectMapper MAPPER = createMapper();
+ public final static ObjectMapper MAPPER = createMapper();
private final static JsonFactory FACTORY = new MappingJsonFactory(createMapper());
public static ObjectMapper createMapper() {
@@ -85,6 +88,8 @@ public class JacksonHelper {
StdDeserializerProvider deserializerProvider =
new StdDeserializerProvider(deserializerFactory);
mapper = new ObjectMapper();
+ mapper.registerModule(new JsonOrgModule());
+
mapper.setSerializerFactory(serializerFactory);
mapper.setDeserializerProvider(deserializerProvider);
}
@@ -94,6 +99,7 @@ public class JacksonHelper {
}
if (mapper == null) {
mapper = new ObjectMapper();
+ mapper.registerModule(new JsonOrgModule());
}
AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
@@ -180,4 +186,41 @@ public class JacksonHelper {
}
}
+ public static JSONObject read(InputStream is) throws IOException {
+ try {
+ return MAPPER.readValue(is, JSONObject.class);
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
+ }
+
+ /**
+ * Read from String into a org.json.JSONObject
+ * @param json
+ * @return
+ */
+ public static JSONObject read(String json) {
+ try {
+ return MAPPER.readValue(json, JSONObject.class);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public static void write(JSONObject json, OutputStream out) throws IOException {
+ try {
+ MAPPER.writeValue(out, json);
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
+ }
+
+ public static String write(JSONObject json) throws IOException {
+ try {
+ return MAPPER.writeValueAsString(json);
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
+ }
+
}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONTestCase.java b/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONTestCase.java
deleted file mode 100644
index 9ec9f21d7e..0000000000
--- a/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/JavaBean2JSONTestCase.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.databinding.json;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Assert;
-
-import org.apache.tuscany.sca.databinding.TransformationContext;
-import org.apache.tuscany.sca.databinding.impl.TransformationContextImpl;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
-import org.json.JSONObject;
-import org.junit.Test;
-
-/**
- * @version $Rev$ $Date$
- */
-public class JavaBean2JSONTestCase {
-
- public static class MyBean {
- private String name;
- private int age;
- private boolean vip;
- private String friends[];
- private List<String> books;
- private YourBean you;
- private String note;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public boolean isVip() {
- return vip;
- }
-
- public void setVip(boolean vip) {
- this.vip = vip;
- }
-
- public String[] getFriends() {
- return friends;
- }
-
- public void setFriends(String[] friends) {
- this.friends = friends;
- }
-
- public List<String> getBooks() {
- return books;
- }
-
- public void setBooks(List<String> books) {
- this.books = books;
- }
-
- public YourBean getYou() {
- return you;
- }
-
- public void setYou(YourBean you) {
- this.you = you;
- }
-
- public String getNote() {
- return note;
- }
-
- public void setNote(String note) {
- this.note = note;
- }
-
- }
-
- public static class YourBean {
- private int id;
- private String name;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- }
-
- @Test
- public void testBean2JSON() throws Exception {
- MyBean me = new MyBean();
- me.setAge(30);
- me.setBooks(new ArrayList<String>());
- me.setFriends(new String[] {"John", "Mike"});
- me.setVip(true);
- me.setName("Me");
- YourBean you = new YourBean();
- you.setId(123);
- you.setName(null);
- me.setYou(you);
- JavaBean2JSON t1 = new JavaBean2JSON();
- Object result = t1.transform(me, null);
- System.out.println(result);
- JSON2JavaBean t2 = new JSON2JavaBean();
- TransformationContext context = new TransformationContextImpl();
- context.setTargetDataType(new DataTypeImpl(MyBean.class, null));
- Object v = t2.transform(new JSONObject(result.toString()), context);
- Assert.assertTrue(v instanceof MyBean);
- // String json =
- // "{\"age\":30,\"books\":[],\"friends\":[\"John\",\"Mike\"],\"name\":\"Me\",\"vip\":true,\"you\":{\"id\":123,\"name\":null}}";
- // Assert.assertEquals(json, result.toString());
- }
-
- @Test
- public void testString2JSON() throws Exception {
- JavaBean2JSONObject t1 = new JavaBean2JSONObject();
- Object result = t1.transform("ABC", null);
- System.out.println(result);
- JSON2JavaBean t2 = new JSON2JavaBean();
- TransformationContext context = new TransformationContextImpl();
- context.setTargetDataType(new DataTypeImpl(String.class, null));
- Object v = t2.transform(result, context);
- Assert.assertTrue(v instanceof String);
- Assert.assertEquals("ABC", v);
- }
-
- @Test
- public void testStringArray2JSON() throws Exception {
- JavaBean2JSON t1 = new JavaBean2JSON();
- Object result = t1.transform(new String[] {"ABC", "DF"}, null);
- System.out.println(result);
- JSON2JavaBean t2 = new JSON2JavaBean();
- TransformationContext context = new TransformationContextImpl();
- context.setTargetDataType(new DataTypeImpl(String[].class, null));
- Object v = t2.transform(result, context);
- Assert.assertTrue(v instanceof String[]);
- String[] strs = (String[])v;
- Assert.assertEquals("ABC", strs[0]);
- Assert.assertEquals("DF", strs[1]);
- }
-
-}
diff --git a/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/POJOTestCase.java b/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/POJOTestCase.java
deleted file mode 100644
index fd0557d0a2..0000000000
--- a/sca-java-2.x/trunk/modules/databinding-json/src/test/java/org/apache/tuscany/sca/databinding/json/POJOTestCase.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tuscany.sca.databinding.json;
-
-import java.lang.reflect.Array;
-
-import junit.framework.Assert;
-
-import org.apache.tuscany.sca.databinding.TransformationContext;
-import org.apache.tuscany.sca.databinding.impl.TransformationContextImpl;
-import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
-import org.junit.Test;
-
-public class POJOTestCase {
- public void testPOJO() throws Exception {
- MyBean bean = new MyBean();
- bean.setName("Test");
- bean.setAge(20);
- bean.getNotes().add("1");
- bean.getNotes().add("2");
- bean.getMap().put("1", 1);
- MyInterface service = new MyInterfaceImpl();
- service.setId("ID001");
- bean.setService(service);
- bean.setOtherService(service);
-
- roundTrip(bean);
- }
-
- private <T> void roundTrip(T bean) {
- JavaBean2JSON t1 = new JavaBean2JSON();
-
- Object json = t1.transform(bean, null);
- System.out.println(json);
- JSON2JavaBean t2 = new JSON2JavaBean();
-
- TransformationContext context = new TransformationContextImpl();
- context.setTargetDataType(new DataTypeImpl(bean == null ? Object.class : bean.getClass(), null));
- Object newBean = t2.transform(json, context);
-
- if (newBean != null && newBean.getClass().isArray()) {
- int len = Array.getLength(newBean);
- Assert.assertEquals(Array.getLength(bean), len);
- for (int i = 0; i < len; i++) {
- Assert.assertEquals(Array.get(bean, i), Array.get(newBean, i));
- }
- return;
- }
- Assert.assertEquals(bean, newBean);
- }
-
- @Test
- public void testString() throws Exception {
- roundTrip("ABC");
- }
-
- @Test
- public void testNull() throws Exception {
- roundTrip(null);
- }
-
- @Test
- public void testArray() throws Exception {
- roundTrip(new String[] {"123", "ABC"});
- }
-
- @Test
- public void testByteArray() throws Exception {
- roundTrip("ABC".getBytes());
- }
-
- @Test
- public void testPrimitive() throws Exception {
- roundTrip(123);
- }
-}
diff --git a/sca-java-2.x/trunk/modules/implementation-python-runtime/pom.xml b/sca-java-2.x/trunk/modules/implementation-python-runtime/pom.xml
index 448166350c..677e254677 100644
--- a/sca-java-2.x/trunk/modules/implementation-python-runtime/pom.xml
+++ b/sca-java-2.x/trunk/modules/implementation-python-runtime/pom.xml
@@ -84,6 +84,13 @@
<version>2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.jabsorb</groupId>
+ <artifactId>jabsorb</artifactId>
+ <version>1.3.1</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>