001/* 002 * Licensed to DuraSpace under one or more contributor license agreements. 003 * See the NOTICE file distributed with this work for additional information 004 * regarding copyright ownership. 005 * 006 * DuraSpace licenses this file to you under the Apache License, 007 * Version 2.0 (the "License"); you may not use this file except in 008 * compliance with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.fcrepo.http.commons.exceptionhandlers; 019 020import org.fcrepo.kernel.api.exception.RepositoryRuntimeException; 021 022import org.slf4j.Logger; 023 024import javax.ws.rs.core.Context; 025import javax.ws.rs.core.Response; 026import javax.ws.rs.ext.ExceptionMapper; 027import javax.ws.rs.ext.Provider; 028import javax.ws.rs.ext.Providers; 029 030import static com.google.common.base.Throwables.getStackTraceAsString; 031import static javax.ws.rs.core.Response.serverError; 032import static org.fcrepo.http.commons.domain.RDFMediaType.TEXT_PLAIN_WITH_CHARSET; 033import static org.slf4j.LoggerFactory.getLogger; 034 035/** 036 * @author cabeer 037 * @since 9/13/14 038 */ 039 040@Provider 041public class RepositoryRuntimeExceptionMapper implements 042 ExceptionMapper<RepositoryRuntimeException>, ExceptionDebugLogging { 043 044 private final Providers providers; 045 046 /** 047 * Get the context Providers so we can rethrow the cause to an appropriate handler 048 * @param providers the providers 049 */ 050 public RepositoryRuntimeExceptionMapper(@Context final Providers providers) { 051 this.providers = providers; 052 } 053 054 private static final Logger LOGGER = getLogger(RepositoryExceptionMapper.class); 055 056 @Override 057 public Response toResponse(final RepositoryRuntimeException e) { 058 final Throwable cause = e.getCause(); 059 @SuppressWarnings("unchecked") 060 final ExceptionMapper<Throwable> exceptionMapper = 061 (ExceptionMapper<Throwable>) providers.getExceptionMapper(cause.getClass()); 062 if (exceptionMapper != null) { 063 return exceptionMapper.toResponse(cause); 064 } 065 LOGGER.error("Caught a repository exception: {}", e.getMessage()); 066 debugException(this, cause, LOGGER); 067 return serverError().entity(getStackTraceAsString(e)).type(TEXT_PLAIN_WITH_CHARSET).build(); 068 } 069}