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),
collectionResponse
)
);
}
else if (401 == statusCode || 0 == statusCode)
{
resultCallback.onFailure(new Exception("Authentication required."));
}
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 Exception("Service temporarily unavailable. Is the server is still booting?"));
}
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 Exception(sb.toString()));
}
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);