diff options
author | Leif Åstrand <leif@vaadin.com> | 2012-06-12 10:41:51 +0300 |
---|---|---|
committer | Leif Åstrand <leif@vaadin.com> | 2012-06-12 10:41:51 +0300 |
commit | 3c7f044181e40ebb321f31ee6a84e086b88e1253 (patch) | |
tree | 5dc547a4f82e5f9caacee851ae10081ac8b886be /src/com/vaadin/terminal/JavascriptRpcHelper.java | |
parent | 234319468901f9b6542215401261099d6f4987ba (diff) | |
download | vaadin-framework-3c7f044181e40ebb321f31ee6a84e086b88e1253.tar.gz vaadin-framework-3c7f044181e40ebb321f31ee6a84e086b88e1253.zip |
Add support for simplified RPC communication with JS code (#8888)
Diffstat (limited to 'src/com/vaadin/terminal/JavascriptRpcHelper.java')
-rw-r--r-- | src/com/vaadin/terminal/JavascriptRpcHelper.java | 55 |
1 files changed, 55 insertions, 0 deletions
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 }); + } + +} |