summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeif Åstrand <leif@vaadin.com>2012-06-12 10:41:51 +0300
committerLeif Åstrand <leif@vaadin.com>2012-06-12 10:41:51 +0300
commit3c7f044181e40ebb321f31ee6a84e086b88e1253 (patch)
tree5dc547a4f82e5f9caacee851ae10081ac8b886be
parent234319468901f9b6542215401261099d6f4987ba (diff)
downloadvaadin-framework-3c7f044181e40ebb321f31ee6a84e086b88e1253.tar.gz
vaadin-framework-3c7f044181e40ebb321f31ee6a84e086b88e1253.zip
Add support for simplified RPC communication with JS code (#8888)
-rw-r--r--src/com/vaadin/terminal/AbstractJavascriptExtension.java11
-rw-r--r--src/com/vaadin/terminal/JavascriptRpcHelper.java55
-rw-r--r--src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java29
-rw-r--r--src/com/vaadin/ui/AbstractJavascriptComponent.java11
4 files changed, 101 insertions, 5 deletions
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<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 });
+ }
+
+}
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);
+ }
}