package me.moodcat.core.mappers; import com.google.inject.Inject; import com.google.inject.ProvisionException; import javax.ws.rs.NotAuthorizedException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.Provider; import java.util.UUID; /** * This ExceptionMapper maps {@link ProvisionException ProvisionExceptions} in * such a way that the client receives a descriptive JSON response and HTTP * status code. */ @Provider public class GuiceProvisionExceptionMapper extends AbstractExceptionMapper<ProvisionException> { private final NotAuthorizedExceptionMapper notAuthorizedExceptionMapper; @Inject public GuiceProvisionExceptionMapper( final NotAuthorizedExceptionMapper notAuthorizedExceptionMapper) { this.notAuthorizedExceptionMapper = notAuthorizedExceptionMapper; } @Override protected Response createResponse(final Throwable exception, final UUID id) { Throwable cause = exception; while (cause != null) { if (cause instanceof NotAuthorizedException) { return notAuthorizedExceptionMapper.createResponse(cause, id); } cause = cause.getCause(); } return super.createResponse(exception, id); } @Override public Status getStatusCode() { return Status.INTERNAL_SERVER_ERROR; } }