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.slf4j.LoggerFactory.getLogger; 033 034/** 035 * @author cabeer 036 * @since 9/13/14 037 */ 038 039@Provider 040public class RepositoryRuntimeExceptionMapper implements 041 ExceptionMapper<RepositoryRuntimeException>, ExceptionDebugLogging { 042 043 private final Providers providers; 044 045 /** 046 * Get the context Providers so we can rethrow the cause to an appropriate handler 047 * @param providers the providers 048 */ 049 public RepositoryRuntimeExceptionMapper(@Context final Providers providers) { 050 this.providers = providers; 051 } 052 053 private static final Logger LOGGER = getLogger(RepositoryExceptionMapper.class); 054 055 @Override 056 public Response toResponse(final RepositoryRuntimeException e) { 057 final Throwable cause = e.getCause(); 058 @SuppressWarnings("unchecked") 059 final ExceptionMapper<Throwable> exceptionMapper = 060 (ExceptionMapper<Throwable>) providers.getExceptionMapper(cause.getClass()); 061 if (exceptionMapper != null) { 062 return exceptionMapper.toResponse(cause); 063 } 064 LOGGER.error("Caught a repository exception: {}", e.getMessage()); 065 debugException(this, cause, LOGGER); 066 return serverError().entity(getStackTraceAsString(e)).build(); 067 } 068}