package autotest.common; import autotest.common.ui.NotifyManager; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONNull; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import java.util.HashMap; import java.util.Map; import java.util.Set; public abstract class JsonRpcProxy { public static final String AFE_BASE_URL = "/afe/server/"; public static final String TKO_BASE_URL = "/new_tko/server/"; private static final String RPC_URL_SUFFIX = "rpc/"; private static final String JSON_RPC_URL_SUFFIX = "jsonp_rpc/"; private static String defaultBaseUrl; private static final Map instanceMap = new HashMap(); protected static final NotifyManager notify = NotifyManager.getInstance(); public static void setDefaultBaseUrl(String baseUrl) { defaultBaseUrl = baseUrl; } public static JsonRpcProxy createProxy(String baseUrl, boolean isPaddedJson) { if (isPaddedJson) { return new PaddedJsonRpcProxy(baseUrl + JSON_RPC_URL_SUFFIX); } return new XhrJsonRpcProxy(baseUrl + RPC_URL_SUFFIX); } public static JsonRpcProxy getProxy(String baseUrl) { if (!instanceMap.containsKey(baseUrl)) { instanceMap.put(baseUrl, createProxy(baseUrl, false)); } return instanceMap.get(baseUrl); } public static JsonRpcProxy getProxy() { assert defaultBaseUrl != null; return getProxy(defaultBaseUrl); } public static void setProxy(String baseUrl, JsonRpcProxy proxy) { instanceMap.put(baseUrl, proxy); } /** * Make an RPC call. * @param method name of the method to call * @param params dictionary of parameters to pass * @param callback callback to be notified of RPC call results */ public void rpcCall(String method, JSONObject params, final JsonRpcCallback callback) { JSONObject request = buildRequestObject(method, params); sendRequest(request, callback); } protected abstract void sendRequest(JSONObject request, final JsonRpcCallback callback); public static JSONObject buildRequestObject(String method, JSONObject params) { JSONObject request = new JSONObject(); request.put("method", new JSONString(method)); request.put("params", processParams(params)); request.put("id", new JSONNumber(0)); return request; } private static JSONArray processParams(JSONObject params) { JSONArray result = new JSONArray(); JSONObject newParams = new JSONObject(); if (params != null) { Set keys = params.keySet(); for (String key : keys) { if (params.get(key) != JSONNull.getInstance()) newParams.put(key, params.get(key)); } } result.set(0, newParams); return result; } protected static void handleResponseObject(JSONObject responseObject, JsonRpcCallback callback) { JSONValue error = responseObject.get("error"); if (error == null) { notify.showError("Bad JSON response", responseObject.toString()); callback.onError(null); return; } else if (error.isObject() != null) { callback.onError(error.isObject()); return; } JSONValue result = responseObject.get("result"); callback.onSuccess(result); } }