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);
}
}
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;
this.connector = connector;
}
- public void registerRpc(JavascriptCallback javascriptCallback,
- String functionName) {
+ public void registerCallback(String functionName,
+ JavascriptCallback javascriptCallback) {
callbacks.put(functionName, javascriptCallback);
ensureRpc();
}
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,
},
'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] = [];
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);
}
}
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;
}
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;
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);
+ }
}
});
}
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)");