示例#1
0
  private Request executeRequest(
      final AsyncCallback<DMRResponse> resultCallback, final ModelNode operation) {
    if (idCounter == Long.MAX_VALUE) {
      idCounter = 0;
    }

    Request request = null;
    try {
      final String id = String.valueOf(idCounter++);
      trace(Type.BEGIN, id, operation);

      final RequestBuilder requestBuilder = chooseRequestBuilder(operation);
      trace(Type.SERIALIZED, id, operation);

      final RequestCallback requestCallback =
          new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
              trace(Type.RECEIVE, id, operation);

              int statusCode = response.getStatusCode();
              if (200 == statusCode) {
                resultCallback.onSuccess(
                    new DMRResponse(
                        requestBuilder.getHTTPMethod(),
                        response.getText(),
                        response.getHeader(HEADER_CONTENT_TYPE)));
              } else if (401 == statusCode || 0 == statusCode) {
                resultCallback.onFailure(new DispatchError("Authentication required.", statusCode));
              } else if (403 == statusCode) {
                resultCallback.onFailure(new DispatchError("Authentication required.", statusCode));
              } else if (307 == statusCode) {
                String location = response.getHeader("Location");
                Log.error("Redirect '" + location + "'. Could not execute " + operation.toString());
                redirect(location);
              } else if (503 == statusCode) {
                resultCallback.onFailure(
                    new DispatchError(
                        "Service temporarily unavailable. Is the server still booting?",
                        statusCode));
              } else {
                StringBuilder sb = new StringBuilder();
                sb.append("Unexpected HTTP response").append(": ").append(statusCode);
                sb.append("\n\n");
                sb.append("Request\n");
                sb.append(operation.toString());
                sb.append("\n\nResponse\n\n");
                sb.append(response.getStatusText()).append("\n");
                String payload =
                    response.getText().equals("")
                        ? "No details"
                        : ModelNode.fromBase64(response.getText()).toString();
                sb.append(payload);
                resultCallback.onFailure(new DispatchError(sb.toString(), statusCode));
              }
              trace(Type.END, id, operation);
            }

            @Override
            public void onError(Request request, Throwable e) {
              trace(Type.RECEIVE, id, operation);
              resultCallback.onFailure(e);
              trace(Type.END, id, operation);
            }
          };
      requestBuilder.setCallback(requestCallback);
      request = requestBuilder.send();
      trace(Type.SEND, id, operation);
    } catch (RequestException e) {
      resultCallback.onFailure(e);
    }
    return request;
  }