From: Leif Åstrand Date: Tue, 12 Jun 2012 07:41:51 +0000 (+0300) Subject: Add support for simplified RPC communication with JS code (#8888) X-Git-Tag: 7.0.0.alpha3~116^2~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3c7f044181e40ebb321f31ee6a84e086b88e1253;p=vaadin-framework.git Add support for simplified RPC communication with JS code (#8888) --- diff --git a/src/com/vaadin/terminal/AbstractJavascriptExtension.java b/src/com/vaadin/terminal/AbstractJavascriptExtension.java index c86f69c1be..20e3aa5bfc 100644 --- a/src/com/vaadin/terminal/AbstractJavascriptExtension.java +++ b/src/com/vaadin/terminal/AbstractJavascriptExtension.java @@ -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 index 0000000000..f6607e557f --- /dev/null +++ b/src/com/vaadin/terminal/JavascriptRpcHelper.java @@ -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 callbacks = new HashMap(); + 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 }); + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java b/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java index 633a4bc2c6..f784704036 100644 --- a/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java +++ b/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java @@ -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); + } } }-*/; diff --git a/src/com/vaadin/ui/AbstractJavascriptComponent.java b/src/com/vaadin/ui/AbstractJavascriptComponent.java index 458db29172..19adb308e9 100644 --- a/src/com/vaadin/ui/AbstractJavascriptComponent.java +++ b/src/com/vaadin/ui/AbstractJavascriptComponent.java @@ -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); + } }