Home | History | Annotate | Download | only in common
      1 package autotest.common;
      2 
      3 
      4 import com.google.gwt.http.client.Request;
      5 import com.google.gwt.http.client.RequestBuilder;
      6 import com.google.gwt.http.client.RequestCallback;
      7 import com.google.gwt.http.client.RequestException;
      8 import com.google.gwt.http.client.Response;
      9 import com.google.gwt.json.client.JSONException;
     10 import com.google.gwt.json.client.JSONObject;
     11 import com.google.gwt.json.client.JSONParser;
     12 import com.google.gwt.json.client.JSONValue;
     13 
     14 
     15 /**
     16  * JsonRpcProxy that uses XmlHttpRequests to make requests to the server.  This is the standard
     17  * technique for AJAX and suffers from the usual restrictions -- Same-Origin Policy and a maximum of
     18  * two simultaneous outstanding requests.
     19  */
     20 class XhrJsonRpcProxy extends JsonRpcProxy {
     21     protected RequestBuilder requestBuilder;
     22 
     23     public XhrJsonRpcProxy(String url) {
     24         requestBuilder = new RequestBuilder(RequestBuilder.POST, url);
     25     }
     26 
     27     @Override
     28     protected void sendRequest(JSONObject request, final JsonRpcCallback callback) {
     29         try {
     30           requestBuilder.sendRequest(request.toString(), new RpcHandler(callback));
     31         }
     32         catch (RequestException e) {
     33             notify.showError("Unable to connect to server");
     34             callback.onError(null);
     35             return;
     36         }
     37 
     38         notify.setLoading(true);
     39     }
     40 
     41     private static class RpcHandler implements RequestCallback {
     42         private JsonRpcCallback callback;
     43 
     44         public RpcHandler(JsonRpcCallback callback) {
     45             this.callback = callback;
     46         }
     47 
     48         public void onError(Request request, Throwable exception) {
     49             notify.setLoading(false);
     50             notify.showError("Unable to make RPC call", exception.toString());
     51             callback.onError(null);
     52         }
     53 
     54         public void onResponseReceived(Request request, Response response) {
     55             notify.setLoading(false);
     56 
     57             String responseText = response.getText();
     58             int statusCode = response.getStatusCode();
     59             if (statusCode != 200) {
     60                 notify.showError("Received error " + Integer.toString(statusCode) + " " +
     61                                  response.getStatusText(),
     62                                  response.getHeadersAsString() + "\n\n" + responseText);
     63                 callback.onError(null);
     64                 return;
     65             }
     66 
     67             handleResponseText(responseText, callback);
     68         }
     69     }
     70 
     71     private static void handleResponseText(String responseText, JsonRpcCallback callback) {
     72         JSONValue responseValue = null;
     73         try {
     74             responseValue = JSONParser.parse(responseText);
     75         }
     76         catch (JSONException exc) {
     77             JsonRpcProxy.notify.showError(exc.toString(), responseText);
     78             callback.onError(null);
     79             return;
     80         }
     81 
     82         JSONObject responseObject = responseValue.isObject();
     83         handleResponseObject(responseObject, callback);
     84     }
     85 }
     86