]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add support for simplified RPC communication with JS code (#8888)
authorLeif Åstrand <leif@vaadin.com>
Tue, 12 Jun 2012 07:41:51 +0000 (10:41 +0300)
committerLeif Åstrand <leif@vaadin.com>
Tue, 12 Jun 2012 07:41:51 +0000 (10:41 +0300)
src/com/vaadin/terminal/AbstractJavascriptExtension.java
src/com/vaadin/terminal/JavascriptRpcHelper.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java
src/com/vaadin/ui/AbstractJavascriptComponent.java

index c86f69c1beaa8493c9684089cffd28dbcf00c1b7..20e3aa5bfc26ed5f24f956c8f37aa9eb860531c0 100644 (file)
@@ -4,6 +4,17 @@
 
 package com.vaadin.terminal;
 
+import com.vaadin.ui.JavascriptCallback;
+
 public class AbstractJavascriptExtension extends AbstractExtension {
+    private JavascriptRpcHelper rpcHelper = new JavascriptRpcHelper(this);
+
+    protected void registerRpc(JavascriptCallback javascriptCallback,
+            String functionName) {
+        rpcHelper.registerRpc(javascriptCallback, functionName);
+    }
 
+    protected void callRpcFunction(String name, Object... arguments) {
+        rpcHelper.callRpcFunction(name, arguments);
+    }
 }
diff --git a/src/com/vaadin/terminal/JavascriptRpcHelper.java b/src/com/vaadin/terminal/JavascriptRpcHelper.java
new file mode 100644 (file)
index 0000000..f6607e5
--- /dev/null
@@ -0,0 +1,55 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vaadin.external.json.JSONArray;
+import com.vaadin.tools.ReflectTools;
+import com.vaadin.ui.JavascriptCallback;
+import com.vaadin.ui.JavascriptManager.JavascriptCallbackRpc;
+
+public class JavascriptRpcHelper {
+
+    private static final Method CALL_METHOD = ReflectTools.findMethod(
+            JavascriptCallbackRpc.class, "call", String.class, JSONArray.class);
+    private AbstractClientConnector connector;
+
+    private Map<String, JavascriptCallback> callbacks = new HashMap<String, JavascriptCallback>();
+    private JavascriptCallbackRpc javascriptCallbackRpc;
+
+    public JavascriptRpcHelper(AbstractClientConnector connector) {
+        this.connector = connector;
+    }
+
+    public void registerRpc(JavascriptCallback javascriptCallback,
+            String functionName) {
+        callbacks.put(functionName, javascriptCallback);
+        ensureRpc();
+    }
+
+    private void ensureRpc() {
+        if (javascriptCallbackRpc == null) {
+            javascriptCallbackRpc = new JavascriptCallbackRpc() {
+                public void call(String name, JSONArray arguments) {
+                    JavascriptCallback callback = callbacks.get(name);
+                    callback.call(arguments);
+                }
+            };
+            connector.registerRpc(javascriptCallbackRpc);
+        }
+    }
+
+    public void callRpcFunction(String name, Object... arguments) {
+        JSONArray args = new JSONArray(Arrays.asList(arguments));
+        connector.addMethodInvocationToQueue(
+                JavascriptCallbackRpc.class.getName(), CALL_METHOD,
+                new Object[] { name, args });
+    }
+
+}
index 633a4bc2c648bdbcb2f48cec4ce8b8a5cbc2572f..f784704036f43a150245a19e694b49371edfe3c3 100644 (file)
@@ -103,7 +103,15 @@ public class JavascriptConnectorHelper {
             },
             'getRpcProxyFunction': function(iface, method) {
                     return $entry(function() {
-                        h.@com.vaadin.terminal.gwt.client.JavascriptConnectorHelper::fireRpc(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(iface, method, arguments);
+                        if (method == undefined) {
+                            var args = [iface, Array.prototype.slice.call(arguments, 0)];
+                            iface = "com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc";
+                            method = "call";
+                        } else {
+                            var args = arguments;
+                        }
+                        
+                        h.@com.vaadin.terminal.gwt.client.JavascriptConnectorHelper::fireRpc(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(iface, method, args);
                     });
             },
             'registerRpc': function(iface, rpcHandler) {
@@ -158,9 +166,16 @@ public class JavascriptConnectorHelper {
 
     public void invokeJsRpc(MethodInvocation invocation,
             JSONArray parametersJson) {
-        invokeJsRpc(rpcMap, invocation.getInterfaceName(),
-                invocation.getMethodName(),
-                parametersJson.getJavaScriptObject());
+        if ("com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc"
+                .equals(invocation.getInterfaceName())
+                && "call".equals(invocation.getMethodName())) {
+            invokeJsRpc(rpcMap, parametersJson.get(0).isString().stringValue(),
+                    null, parametersJson.get(1).isArray().getJavaScriptObject());
+        } else {
+            invokeJsRpc(rpcMap, invocation.getInterfaceName(),
+                    invocation.getMethodName(),
+                    parametersJson.getJavaScriptObject());
+        }
     }
 
     private static native void invokeJsRpc(JavaScriptObject rpcMap,
@@ -172,7 +187,11 @@ public class JavascriptConnectorHelper {
         }
         for(var i = 0; i < targets.length; i++) {
             var target = targets[i];
-            target[methodName].apply(target, parameters);
+            if (methodName === null && typeof target === 'function') {
+                target.apply($wnd, parameters);
+            } else {
+                target[methodName].apply(target, parameters);
+            }
         }
     }-*/;
 
index 458db29172fa903d805619a36e4df3683f6d4de9..19adb308e99426d2dfc28c02e29e210e3a295bab 100644 (file)
@@ -3,6 +3,17 @@
  */
 package com.vaadin.ui;
 
+import com.vaadin.terminal.JavascriptRpcHelper;
+
 public class AbstractJavascriptComponent extends AbstractComponent {
+    private JavascriptRpcHelper rpcHelper = new JavascriptRpcHelper(this);
+
+    protected void registerRpc(JavascriptCallback javascriptCallback,
+            String functionName) {
+        rpcHelper.registerRpc(javascriptCallback, functionName);
+    }
 
+    protected void callRpcFunction(String name, Object... arguments) {
+        rpcHelper.callRpcFunction(name, arguments);
+    }
 }