package com.datascience.service;
import java.util.NoSuchElementException;
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.apache.log4j.Logger;
/**
* We assume that jersey errors are less important mostly user errors
* @author konrad
*/
@Provider
public class ExceptionMapping implements ExceptionMapper<Exception>{
private static Logger log = Logger.getLogger(ExceptionMapping.class);
@Context
ServletContext context;
protected ResponseBuilder getResponser() {
return (ResponseBuilder) context.getAttribute(Constants.RESPONSER);
}
@Override
public Response toResponse(Exception e) {
if (e instanceof WebApplicationException) {
log.debug("Formating exception", e);
return serviceTechnicalError((WebApplicationException) e);
}
ResponseBuilder responser = getResponser();
Integer status_code = null;
if (e instanceof IllegalArgumentException) {
status_code = Response.Status.BAD_REQUEST.getStatusCode();
} else if (e instanceof NoSuchElementException) {
status_code = Response.Status.NOT_FOUND.getStatusCode();
}
if (status_code != null) {
log.debug("Formating exception", e);
return responser.makeErrorResponse(status_code, e.getMessage());
}
log.fatal("Formating exception into response", e);
return responser.makeExceptionResponse(e);
}
public Response serviceTechnicalError(WebApplicationException e){
Response tmp = e.getResponse();
String message = e.getLocalizedMessage();
if (e instanceof com.sun.jersey.api.NotFoundException) {
com.sun.jersey.api.NotFoundException exp =
(com.sun.jersey.api.NotFoundException) e;
message = "Unknown adress: " + exp.getNotFoundUri();
}
return getResponser().makeErrorResponse(tmp.getStatus(), message);
}
}