package autotest.tko;
import autotest.common.JsonRpcCallback;
import autotest.common.JsonRpcProxy;
import autotest.common.Utils;
import autotest.tko.TableView.TableSwitchListener;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
abstract class Plot extends Composite {
private static final String CALLBACK_PREFIX = "__plot_drilldown";
private static int callbackNameCounter = 0;
protected final static JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
private String rpcName;
private HTML plotElement = new HTML();
protected TableSwitchListener listener;
private String callbackName;
private static class DummyRpcCallback extends JsonRpcCallback {
@Override
public void onSuccess(JSONValue result) {}
}
public Plot(String rpcName) {
this.rpcName = rpcName;
this.callbackName = getFreshCallbackName();
initWidget(plotElement);
}
private static String getFreshCallbackName() {
callbackNameCounter++;
return CALLBACK_PREFIX + callbackNameCounter;
}
/**
* This function is called at initialization time and allows the plot to put native
* callbacks in place for drilldown functionality from graphs.
*/
public native void setDrilldownTrigger() /*-{
var instance = this;
var name = this.@autotest.tko.Plot::callbackName;
$wnd[name] = function(drilldownParams) {
instance.@autotest.tko.Plot::showDrilldown(Lcom/google/gwt/core/client/JavaScriptObject;)(drilldownParams);
}
}-*/;
/**
* Get a native JS object that acts as a proxy to this object. Currently the only exposed
* method is refresh(params), where params is a JS object. This is only necessary for allowing
* externally-written native code to use this object without having to write out the full JSNI
* method call syntax.
*/
public native JavaScriptObject getNativeProxy() /*-{
var instance = this;
return {
refresh: function(params) {
jsonObjectParams = @com.google.gwt.json.client.JSONObject::new(Lcom/google/gwt/core/client/JavaScriptObject;)(params);
instance.@autotest.tko.Plot::refresh(Lcom/google/gwt/json/client/JSONObject;)(jsonObjectParams);
}
};
}-*/;
@SuppressWarnings("unused") // called from native code (see setDrilldownTrigger)
private void showDrilldown(JavaScriptObject drilldownParamsJso) {
UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler();
if (handler == null) {
showDrilldownImpl(new JSONObject(drilldownParamsJso));
return;
}
try {
showDrilldownImpl(new JSONObject(drilldownParamsJso));
} catch (Throwable throwable) {
handler.onUncaughtException(throwable);
}
}
protected abstract void showDrilldownImpl(JSONObject drilldownParams);
public void refresh(JSONObject params, final JsonRpcCallback callback) {
params.put("drilldown_callback", new JSONString(callbackName));
rpcProxy.rpcCall(rpcName, params, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
plotElement.setHTML(Utils.jsonToString(result));
callback.onSuccess(result);
}
@Override
public void onError(JSONObject errorObject) {
callback.onError(errorObject);
}
});
}
public void refresh(JSONObject params) {
refresh(params, new DummyRpcCallback());
}
public void setListener(TableSwitchListener listener) {
this.listener = listener;
}
}