From 12b3fde4e0a27e3e68073cb0f4f7bf0cf769895c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leif=20=C3=85strand?= Date: Tue, 12 Jun 2012 13:03:22 +0300 Subject: [PATCH] Change api to use callback instead or rpc for js callbacks (#8888) Also change JavascriptCallback.call to throw JSONException --- .../terminal/AbstractJavascriptExtension.java | 10 ++++---- .../vaadin/terminal/JavascriptRpcHelper.java | 13 +++++++--- .../gwt/client/JavascriptConnectorHelper.java | 25 ++++++++++++------- .../ui/AbstractJavascriptComponent.java | 10 ++++---- src/com/vaadin/ui/JavascriptCallback.java | 3 ++- src/com/vaadin/ui/JavascriptManager.java | 9 +++++-- .../tests/features/JavascriptManagerTest.java | 20 ++++++--------- 7 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/com/vaadin/terminal/AbstractJavascriptExtension.java b/src/com/vaadin/terminal/AbstractJavascriptExtension.java index 20e3aa5bfc..e741e2af1e 100644 --- a/src/com/vaadin/terminal/AbstractJavascriptExtension.java +++ b/src/com/vaadin/terminal/AbstractJavascriptExtension.java @@ -9,12 +9,12 @@ 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 registerCallback(String functionName, + JavascriptCallback javascriptCallback) { + rpcHelper.registerCallback(functionName, javascriptCallback); } - protected void callRpcFunction(String name, Object... arguments) { - rpcHelper.callRpcFunction(name, arguments); + protected void invokeCallback(String name, Object... arguments) { + rpcHelper.invokeCallback(name, arguments); } } diff --git a/src/com/vaadin/terminal/JavascriptRpcHelper.java b/src/com/vaadin/terminal/JavascriptRpcHelper.java index effab05412..b566462833 100644 --- a/src/com/vaadin/terminal/JavascriptRpcHelper.java +++ b/src/com/vaadin/terminal/JavascriptRpcHelper.java @@ -10,6 +10,7 @@ import java.util.HashMap; import java.util.Map; import com.vaadin.external.json.JSONArray; +import com.vaadin.external.json.JSONException; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.JavascriptCallback; import com.vaadin.ui.JavascriptManager.JavascriptCallbackRpc; @@ -27,8 +28,8 @@ public class JavascriptRpcHelper { this.connector = connector; } - public void registerRpc(JavascriptCallback javascriptCallback, - String functionName) { + public void registerCallback(String functionName, + JavascriptCallback javascriptCallback) { callbacks.put(functionName, javascriptCallback); ensureRpc(); } @@ -38,14 +39,18 @@ public class JavascriptRpcHelper { javascriptCallbackRpc = new JavascriptCallbackRpc() { public void call(String name, JSONArray arguments) { JavascriptCallback callback = callbacks.get(name); - callback.call(arguments); + try { + callback.call(arguments); + } catch (JSONException e) { + throw new IllegalArgumentException(e); + } } }; connector.registerRpc(javascriptCallbackRpc); } } - public void callRpcFunction(String name, Object... arguments) { + public void invokeCallback(String name, Object... arguments) { JSONArray args = new JSONArray(Arrays.asList(arguments)); connector.addMethodInvocationToQueue( JavascriptCallbackRpc.class.getName(), CALL_METHOD, diff --git a/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java b/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java index f784704036..c635c3dc2e 100644 --- a/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java +++ b/src/com/vaadin/terminal/gwt/client/JavascriptConnectorHelper.java @@ -103,17 +103,24 @@ public class JavascriptConnectorHelper { }, 'getRpcProxyFunction': function(iface, method) { return $entry(function() { - 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); + h.@com.vaadin.terminal.gwt.client.JavascriptConnectorHelper::fireRpc(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(iface, method, arguments); }); }, + 'getCallback': function(name) { + return $entry(function() { + var args = [name, Array.prototype.slice.call(arguments, 0)]; + var iface = "com.vaadin.ui.JavascriptManager$JavascriptCallbackRpc"; + var method = "call"; + h.@com.vaadin.terminal.gwt.client.JavascriptConnectorHelper::fireRpc(Ljava/lang/String;Ljava/lang/String;Lcom/google/gwt/core/client/JsArray;)(iface, method, args); + }); + }, + 'registerCallback': function(name, callback) { + //TODO maintain separate map + if (!registeredRpc[name]) { + registeredRpc[name] = []; + } + registeredRpc[name].push(rpcHandler); + }, 'registerRpc': function(iface, rpcHandler) { if (!registeredRpc[iface]) { registeredRpc[iface] = []; diff --git a/src/com/vaadin/ui/AbstractJavascriptComponent.java b/src/com/vaadin/ui/AbstractJavascriptComponent.java index 19adb308e9..0a26c10239 100644 --- a/src/com/vaadin/ui/AbstractJavascriptComponent.java +++ b/src/com/vaadin/ui/AbstractJavascriptComponent.java @@ -8,12 +8,12 @@ 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 registerCallback(String functionName, + JavascriptCallback javascriptCallback) { + rpcHelper.registerCallback(functionName, javascriptCallback); } - protected void callRpcFunction(String name, Object... arguments) { - rpcHelper.callRpcFunction(name, arguments); + protected void invokeCallback(String name, Object... arguments) { + rpcHelper.invokeCallback(name, arguments); } } diff --git a/src/com/vaadin/ui/JavascriptCallback.java b/src/com/vaadin/ui/JavascriptCallback.java index 4a34167256..89700b3faf 100644 --- a/src/com/vaadin/ui/JavascriptCallback.java +++ b/src/com/vaadin/ui/JavascriptCallback.java @@ -7,7 +7,8 @@ package com.vaadin.ui; import java.io.Serializable; import com.vaadin.external.json.JSONArray; +import com.vaadin.external.json.JSONException; public interface JavascriptCallback extends Serializable { - public void call(JSONArray arguments); + public void call(JSONArray arguments) throws JSONException; } diff --git a/src/com/vaadin/ui/JavascriptManager.java b/src/com/vaadin/ui/JavascriptManager.java index e52962f177..72295dce2b 100644 --- a/src/com/vaadin/ui/JavascriptManager.java +++ b/src/com/vaadin/ui/JavascriptManager.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Map; import com.vaadin.external.json.JSONArray; +import com.vaadin.external.json.JSONException; import com.vaadin.terminal.AbstractExtension; import com.vaadin.terminal.gwt.client.communication.ServerRpc; import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavascriptManagerState; @@ -25,8 +26,12 @@ public class JavascriptManager extends AbstractExtension { registerRpc(new JavascriptCallbackRpc() { public void call(String name, JSONArray arguments) { JavascriptCallback callback = callbacks.get(name); - // TODO error handling - callback.call(arguments); + // TODO handle situation if name is not registered + try { + callback.call(arguments); + } catch (JSONException e) { + throw new IllegalArgumentException(e); + } } }); } diff --git a/tests/testbench/com/vaadin/tests/features/JavascriptManagerTest.java b/tests/testbench/com/vaadin/tests/features/JavascriptManagerTest.java index 18abf9f8b8..92f8095698 100644 --- a/tests/testbench/com/vaadin/tests/features/JavascriptManagerTest.java +++ b/tests/testbench/com/vaadin/tests/features/JavascriptManagerTest.java @@ -20,18 +20,14 @@ public class JavascriptManagerTest extends AbstractTestRoot { protected void setup(WrappedRequest request) { addComponent(log); getJavascriptManager().addCallback("testing", new JavascriptCallback() { - public void call(JSONArray arguments) { - try { - log.log("Got " + arguments.length() + " arguments"); - log.log("Argument 1 as a number: " + arguments.getInt(0)); - log.log("Argument 2 as a string: " + arguments.getString(1)); - log.log("Argument 3.p as a boolean: " - + arguments.getJSONObject(2).getBoolean("p")); - log.log("Argument 4 is JSONObject.NULL: " - + (arguments.get(3) == JSONObject.NULL)); - } catch (JSONException e) { - throw new RuntimeException(e); - } + public void call(JSONArray arguments) throws JSONException { + log.log("Got " + arguments.length() + " arguments"); + log.log("Argument 1 as a number: " + arguments.getInt(0)); + log.log("Argument 2 as a string: " + arguments.getString(1)); + log.log("Argument 3.p as a boolean: " + + arguments.getJSONObject(2).getBoolean("p")); + log.log("Argument 4 is JSONObject.NULL: " + + (arguments.get(3) == JSONObject.NULL)); } }); executeJavaScript("window.testing(42, 'text', {p: true}, null)"); -- 2.39.5