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; }