You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by fm...@apache.org on 2011/07/08 06:22:43 UTC

svn commit: r1144153 - in /tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime: CometCallbackInvoker.java JSONUtil.java handler/CometBindingHandler.java

Author: fmoga
Date: Fri Jul  8 04:22:43 2011
New Revision: 1144153

URL: http://svn.apache.org/viewvc?rev=1144153&view=rev
Log:
Push fix for JSON array parser to comet binding. Refactor data conversion in the comet binding.

Added:
    tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/JSONUtil.java
Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometCallbackInvoker.java
    tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java

Modified: tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometCallbackInvoker.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometCallbackInvoker.java?rev=1144153&r1=1144152&r2=1144153&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometCallbackInvoker.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/CometCallbackInvoker.java Fri Jul  8 04:22:43 2011
@@ -29,19 +29,11 @@ import org.apache.tuscany.sca.invocation
 import org.apache.tuscany.sca.invocation.Message;
 import org.atmosphere.cpr.Broadcaster;
 
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
 /**
  * Receives callback invocations and sends messages back to the browser.
  */
 public class CometCallbackInvoker implements Invoker {
 
-    /**
-     * JSON converter
-     */
-    private static Gson gson = new GsonBuilder().serializeNulls().create();
-
     protected Operation operation;
     protected EndpointReference endpoint;
 
@@ -68,7 +60,7 @@ public class CometCallbackInvoker implem
         } else {
             String callbackMethod = msg.getTo().getURI();
             Object[] body = msg.getBody();
-            broadcaster.broadcast(callbackMethod + "($.secureEvalJSON('" + gson.toJson(body[0]) + "'))");
+            broadcaster.broadcast(callbackMethod + "($.secureEvalJSON('" + JSONUtil.encodeResponse(body[0]) + "'))");
             response.setBody(Status.OK);
         }
         return response;

Added: tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/JSONUtil.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/JSONUtil.java?rev=1144153&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/JSONUtil.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/JSONUtil.java Fri Jul  8 04:22:43 2011
@@ -0,0 +1,127 @@
+package org.apache.tuscany.sca.binding.comet.runtime;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Operation;
+
+import com.google.gson.Gson;
+
+/**
+ * Helper class to facilitate JSON convertions.
+ */
+public class JSONUtil {
+
+    private static Gson gson = new Gson();
+
+    /**
+     * Convert request parameters from JSON to operation parameter types.
+     * 
+     * @param jsonData
+     *            parameters in JSON array format
+     * @param operation
+     *            the operation to invoke
+     * @return an array of objects
+     */
+    public static Object[] decodeJsonParamsForOperation(String jsonData, Operation operation) {
+        Object[] args = new Object[operation.getInputType().getLogical().size()];
+        final String[] json = parseArray(jsonData);
+        int index = 0;
+        for (final DataType<?> dataType : operation.getInputType().getLogical()) {
+            args[index] = gson.fromJson(json[index], dataType.getPhysical());
+            index++;
+        }
+        return args;
+    }
+
+    /**
+     * Split the JSON array containing the arguments for the method call in
+     * order to avoid converting JSON to Object[]. Converting each object
+     * separately to it's corresponding type avoids type mismatch problems at
+     * service invocation.
+     * 
+     * @param jsonArray
+     *            the JSON array
+     * @return an array of JSON formatted strings
+     */
+    private static String[] parseArray(String jsonArray) {
+        List<String> objects = new ArrayList<String>();
+        int bracketNum = 0;
+        int parNum = 0;
+        int quoteNum = 0;
+        int startPos = 1;
+        for (int i = 0; i < jsonArray.length(); i++) {
+            switch (jsonArray.charAt(i)) {
+            case '{':
+                bracketNum++;
+                break;
+            case '}':
+                bracketNum--;
+                break;
+            case '[':
+                parNum++;
+                break;
+            case ']':
+                parNum--;
+                break;
+            case '\"':
+                quoteNum++;
+                break;
+            case ',':
+                if ((bracketNum == 0) && (parNum == 1) && quoteNum % 2 == 0) {
+                    objects.add(jsonArray.substring(startPos, i));
+                    startPos = i + 1;
+                }
+            }
+        }
+        objects.add(jsonArray.substring(startPos, jsonArray.length() - 1));
+        return objects.toArray(new String[] {});
+    }
+
+    private JSONUtil() {
+    }
+
+    /**
+     * Converts a Java object to JSON format.
+     * 
+     * @param response
+     *            the response to convert
+     * @return the object in JSON format
+     */
+    public static String encodeResponse(Object response) {
+        return gson.toJson(response);
+    }
+
+    /**
+     * Convert request parameters as JSON array.
+     * 
+     * @param params
+     *            request parameters
+     * @return request parameters as JSON array
+     */
+    public static String encodeRequestParams(Object[] params) {
+        StringBuilder builder = new StringBuilder();
+        for (int index = 0; index < params.length; index++) {
+            Object param = params[index];
+            builder.append(index == 0 ? "[" : ",");
+            builder.append(gson.toJson(param));
+        }
+        builder.append("]");
+        return builder.toString();
+    }
+
+    /**
+     * Decode JSON to a given Java type.
+     * 
+     * @param responseJSON
+     *            the json to convert
+     * @param returnType
+     *            the return type to convert to
+     * @return the converted object
+     */
+    public static Object decodeResponse(String responseJSON, Class<?> returnType) {
+        return gson.fromJson(responseJSON, returnType);
+    }
+
+}

Modified: tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java?rev=1144153&r1=1144152&r2=1144153&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-comet-runtime/src/main/java/org/apache/tuscany/sca/binding/comet/runtime/handler/CometBindingHandler.java Fri Jul  8 04:22:43 2011
@@ -20,8 +20,6 @@
 package org.apache.tuscany.sca.binding.comet.runtime.handler;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
@@ -31,6 +29,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
 
 import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.binding.comet.runtime.JSONUtil;
 import org.apache.tuscany.sca.binding.comet.runtime.manager.CometEndpointManager;
 import org.apache.tuscany.sca.binding.comet.runtime.manager.CometOperationManager;
 import org.apache.tuscany.sca.binding.comet.runtime.manager.CometSessionManager;
@@ -38,20 +37,16 @@ import org.apache.tuscany.sca.core.assem
 import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl;
 import org.apache.tuscany.sca.core.invocation.Constants;
 import org.apache.tuscany.sca.core.invocation.impl.MessageImpl;
-import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.invocation.Message;
 import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
 import org.atmosphere.cpr.Broadcaster;
 import org.atmosphere.cpr.BroadcasterLifeCyclePolicy;
-import org.atmosphere.cpr.BroadcasterLifeCyclePolicyListener;
 import org.atmosphere.cpr.BroadcasterLifeCyclePolicy.ATMOSPHERE_RESOURCE_POLICY;
+import org.atmosphere.cpr.BroadcasterLifeCyclePolicyListener;
 import org.atmosphere.jersey.JerseyBroadcaster;
 import org.atmosphere.jersey.SuspendResponse;
 
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
 /**
  * Handles requests for comet services and for creating a persistent connection.
  */
@@ -59,11 +54,6 @@ import com.google.gson.GsonBuilder;
 public class CometBindingHandler {
 
     /**
-     * JSON converter
-     */
-    private static Gson gson = new GsonBuilder().serializeNulls().create();
-
-    /**
      * Suspends the current HTTP connection.
      * 
      * @param sessionId
@@ -111,14 +101,15 @@ public class CometBindingHandler {
         RuntimeEndpoint wire = CometEndpointManager.get(url);
         Operation operation = CometOperationManager.get(url);
 
-        final Object[] args = decodeJsonDataForOperation(jsonData, operation);
+        final Object[] args = JSONUtil.decodeJsonParamsForOperation(jsonData, operation);
         Message msg = createMessageWithMockedCometReference(args, sessionId, callbackMethod);
         boolean isVoidReturnType = operation.getOutputType().getLogical().isEmpty();
         if (!isVoidReturnType) {
             Object response = wire.invoke(operation, args);
             Broadcaster broadcaster = CometSessionManager.get(sessionId);
             if (broadcaster != null) {
-                broadcaster.broadcast(callbackMethod + "($.secureEvalJSON('" + gson.toJson(response) + "'))");
+                broadcaster.broadcast(callbackMethod + "($.secureEvalJSON('" + JSONUtil.encodeResponse(response)
+                        + "'))");
             }
         } else {
             wire.invoke(operation, msg);
@@ -151,66 +142,6 @@ public class CometBindingHandler {
         return msg;
     }
 
-    /**
-     * Convert request parameters from JSON to operation parameter types.
-     * 
-     * @param jsonData
-     *            parameters in JSON array format
-     * @param operation
-     *            the operation to invoke
-     * @return an array of objects
-     */
-    private Object[] decodeJsonDataForOperation(String jsonData, Operation operation) {
-        Object[] args = new Object[operation.getInputType().getLogical().size()];
-        final String[] json = this.parseArray(jsonData);
-        int index = 0;
-        for (final DataType<?> dataType : operation.getInputType().getLogical()) {
-            args[index] = gson.fromJson(json[index], dataType.getPhysical());
-            index++;
-        }
-        return args;
-    }
-
-    /**
-     * Split the JSON array containing the arguments for the method call in
-     * order to avoid converting JSON to Object[]. Converting each object
-     * separately to it's corresponding type avoids type mismatch problems at
-     * service invocation.
-     * 
-     * @param jsonArray
-     *            the JSON array
-     * @return an array of JSON formatted strings
-     */
-    private String[] parseArray(String jsonArray) {
-        List<String> objects = new ArrayList<String>();
-        int bracketNum = 0;
-        int parNum = 0;
-        int startPos = 1;
-        for (int i = 0; i < jsonArray.length(); i++) {
-            switch (jsonArray.charAt(i)) {
-            case '{':
-                bracketNum++;
-                break;
-            case '}':
-                bracketNum--;
-                break;
-            case '[':
-                parNum++;
-                break;
-            case ']':
-                parNum--;
-                break;
-            case ',':
-                if ((bracketNum == 0) && (parNum == 1)) {
-                    objects.add(jsonArray.substring(startPos, i));
-                    startPos = i + 1;
-                }
-            }
-        }
-        objects.add(jsonArray.substring(startPos, jsonArray.length() - 1));
-        return objects.toArray(new String[] {});
-    }
-
     public class CometBroadcasterLifeCyclePolicyListener implements BroadcasterLifeCyclePolicyListener {
 
         private String sessionId;