/*
* © Copyright IBM Corp. 2012
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.ibm.sbt.services.client;
import java.io.IOException;
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.util.EntityUtils;
import com.ibm.commons.util.AbstractException;
import com.ibm.commons.util.StringUtil;
import com.ibm.sbt.services.client.ClientService.HandlerRaw;
/**
* REST services related exception.
*
* @author Philippe Riand
*/
public class ClientServicesException extends AbstractException {
private int responseStatusCode;
private String reasonPhrase;
private URI requestURI;
private String responseBody;
private HttpResponse response;
private HttpRequestBase request;
// TODO fill more response code from rfc2616, section 10
public static final int BAD_REQUEST = 400;
public static final int UNAUTHORIZED = 401;
public static final int PAYMENT_REQURED = 402;
public static final int FORBIDDEN = 403;
public static final int NOT_FOUND = 404;
public static final int METHOD_NOT_ALLOWED = 405;
public static final int NOT_ACCEPTABLE = 406;
public static final int PROXY_AUTHENTICATION_REQUIRED = 407;
public static final int REQUEST_TIMEOUT = 408;
public static final int CONFLICT = 409;
public static final int GONE = 410;
public static final int LENGTH_REQUIRED = 411;
public static final int PRECONDITION_FAILED = 412;
public static final int REQUEST_URI_TOO_LONG = 413;
public static final int REQUEST_ENTITY_TOO_LARGE = 414;
public static final int UNSUPPORTED_MEDIA_TYPE = 415;
public static final int REQUEST_RANGE_NOT_SATISFIABLE = 416;
public static final int EXPECTATION_FAILED = 416;
private static final long serialVersionUID = 1L;
public ClientServicesException(Throwable nextException) {
super(nextException);
}
public ClientServicesException(Throwable nextException, String msg, Object... params) {
super(nextException, msg, params);
}
public ClientServicesException(Response response) {
this(response.getResponse(), response.getRequest());
}
public ClientServicesException(HttpResponse response, HttpRequestBase request) {
this(null, createMessage(request, response));
this.response = response;
this.request = request;
this.setResponseStatusCode(response.getStatusLine().getStatusCode());
this.setReasonPhrase(response.getStatusLine().getReasonPhrase());
this.setRequestURI(request.getURI());
try {
HttpEntity entity = response.getEntity();
this.responseBody = EntityUtils.toString(entity, "UTF-8");
} catch (IOException ioe) {
}
}
/**
* @return the request
*/
public HttpRequestBase getRequest() {
return request;
}
/**
* @return the response
*/
public HttpResponse getResponse() {
return response;
}
/**
* @return the responseBody
*/
public String getResponseBody() {
return responseBody;
}
public String getReasonPhrase() {
return reasonPhrase;
}
public void setResponseStatusCode(int responseStatusCode) {
this.responseStatusCode = responseStatusCode;
}
public void setRequestURI(URI requestURI) {
this.requestURI = requestURI;
}
public void setReasonPhrase(String reasonPhrase) {
this.reasonPhrase = reasonPhrase;
}
public int getResponseStatusCode() {
return responseStatusCode;
}
public URI getRequestURI() {
return requestURI;
}
public boolean isInformational() {
return responseStatusCode > 99 && responseStatusCode < 200;
}
public boolean isSuccesful() {
return responseStatusCode > 199 && responseStatusCode < 300;
}
public boolean isRedirection() {
return responseStatusCode > 299 && responseStatusCode < 400;
}
public boolean isClientError() {
return responseStatusCode > 399 && responseStatusCode < 500;
}
public boolean isServerError() {
return responseStatusCode > 499 && responseStatusCode < 600;
}
static private String createMessage(HttpRequestBase request, HttpResponse response) {
String msg = null;
int statusCode = response.getStatusLine().getStatusCode();
String reasonPhrase = response.getStatusLine().getReasonPhrase();
URI requestUri = request.getURI();
try {
HandlerRaw handler = new HandlerRaw();
Object data = handler.parseContent(request, response, response.getEntity());
msg = "Request to url {0} returned an error response {1}:{2} {3}";
msg = StringUtil.format(msg, requestUri, statusCode, reasonPhrase, data);
} catch (Exception e) {
msg = "Request to url {0} returned an error response {1}:{2}";
msg = StringUtil.format(msg, requestUri, statusCode, reasonPhrase);
}
return msg;
}
}