| package autotest.common; |
| |
| |
| import com.google.gwt.http.client.Request; |
| import com.google.gwt.http.client.RequestBuilder; |
| import com.google.gwt.http.client.RequestCallback; |
| import com.google.gwt.http.client.RequestException; |
| import com.google.gwt.http.client.Response; |
| import com.google.gwt.json.client.JSONException; |
| import com.google.gwt.json.client.JSONObject; |
| import com.google.gwt.json.client.JSONParser; |
| import com.google.gwt.json.client.JSONValue; |
| |
| |
| /** |
| * JsonRpcProxy that uses XmlHttpRequests to make requests to the server. This is the standard |
| * technique for AJAX and suffers from the usual restrictions -- Same-Origin Policy and a maximum of |
| * two simultaneous outstanding requests. |
| */ |
| class XhrJsonRpcProxy extends JsonRpcProxy { |
| protected RequestBuilder requestBuilder; |
| |
| public XhrJsonRpcProxy(String url) { |
| requestBuilder = new RequestBuilder(RequestBuilder.POST, url); |
| } |
| |
| @Override |
| protected void sendRequest(JSONObject request, final JsonRpcCallback callback) { |
| try { |
| requestBuilder.sendRequest(request.toString(), new RpcHandler(callback)); |
| } |
| catch (RequestException e) { |
| notify.showError("Unable to connect to server"); |
| callback.onError(null); |
| return; |
| } |
| |
| notify.setLoading(true); |
| } |
| |
| private static class RpcHandler implements RequestCallback { |
| private JsonRpcCallback callback; |
| |
| public RpcHandler(JsonRpcCallback callback) { |
| this.callback = callback; |
| } |
| |
| public void onError(Request request, Throwable exception) { |
| notify.setLoading(false); |
| notify.showError("Unable to make RPC call", exception.toString()); |
| callback.onError(null); |
| } |
| |
| public void onResponseReceived(Request request, Response response) { |
| notify.setLoading(false); |
| |
| String responseText = response.getText(); |
| int statusCode = response.getStatusCode(); |
| if (statusCode != 200) { |
| notify.showError("Received error " + Integer.toString(statusCode) + " " + |
| response.getStatusText(), |
| response.getHeadersAsString() + "\n\n" + responseText); |
| callback.onError(null); |
| return; |
| } |
| |
| handleResponseText(responseText, callback); |
| } |
| } |
| |
| private static void handleResponseText(String responseText, JsonRpcCallback callback) { |
| JSONValue responseValue = null; |
| try { |
| responseValue = JSONParser.parse(responseText); |
| } |
| catch (JSONException exc) { |
| JsonRpcProxy.notify.showError(exc.toString(), responseText); |
| callback.onError(null); |
| return; |
| } |
| |
| JSONObject responseObject = responseValue.isObject(); |
| handleResponseObject(responseObject, callback); |
| } |
| } |