/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.wui.api.exceptions; import javax.inject.Inject; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; import org.glassfish.jersey.server.ContainerRequest; import org.roda.core.data.exceptions.AlreadyExistsException; import org.roda.core.data.exceptions.AuthorizationDeniedException; import org.roda.core.data.exceptions.GenericException; import org.roda.core.data.exceptions.JobAlreadyStartedException; import org.roda.core.data.exceptions.NotFoundException; import org.roda.core.data.exceptions.NotImplementedException; import org.roda.core.data.exceptions.RODAException; import org.roda.core.data.exceptions.RequestNotValidException; import org.roda.wui.api.v1.utils.ApiResponseMessage; import org.roda.wui.api.v1.utils.ApiUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Provider public class RodaExceptionMapper implements ExceptionMapper<RODAException> { private static final Logger LOGGER = LoggerFactory.getLogger(RodaExceptionMapper.class); @Inject private javax.inject.Provider<ContainerRequest> containerRequestProvider; @Override public Response toResponse(RODAException e) { ContainerRequest containerRequest = containerRequestProvider.get(); String parameter = containerRequest.getProperty("acceptFormat") != null ? (String) containerRequest.getProperty("acceptFormat") : ""; String header = containerRequest.getHeaderString("Accept"); String mediaType = ApiUtils.getMediaType(parameter, header); ResponseBuilder responseBuilder; String message = e.getClass().getSimpleName() + ": " + e.getMessage(); if (e.getCause() != null) { message += ", caused by " + e.getCause().getClass().getName() + ": " + e.getCause().getMessage(); } LOGGER.debug("Creating error response. MediaType: {}; Message: {}", mediaType, message, e); if (e instanceof AuthorizationDeniedException) { responseBuilder = Response.status(Status.UNAUTHORIZED) .entity(new ApiResponseMessage(ApiResponseMessage.ERROR, message)); } else if (e instanceof NotImplementedException) { responseBuilder = Response.serverError() .entity(new ApiResponseMessage(ApiResponseMessage.ERROR, "Not yet implemented")); } else if (e instanceof RequestNotValidException) { responseBuilder = Response.status(Status.BAD_REQUEST) .entity(new ApiResponseMessage(ApiResponseMessage.ERROR, message)); } else if (e instanceof GenericException) { responseBuilder = Response.serverError().entity(new ApiResponseMessage(ApiResponseMessage.ERROR, message)); } else if (e instanceof NotFoundException) { responseBuilder = Response.status(Status.NOT_FOUND) .entity(new ApiResponseMessage(ApiResponseMessage.ERROR, message)); } else if (e instanceof AlreadyExistsException || e instanceof JobAlreadyStartedException) { responseBuilder = Response.status(Status.CONFLICT) .entity(new ApiResponseMessage(ApiResponseMessage.ERROR, message)); } else { responseBuilder = Response.serverError().entity(new ApiResponseMessage(ApiResponseMessage.ERROR, e.getMessage())); } return responseBuilder.type(mediaType).build(); } }