/* Copyright 2011-2014 Red Hat, Inc This file is part of PressGang CCMS. PressGang CCMS is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. PressGang CCMS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with PressGang CCMS. If not, see <http://www.gnu.org/licenses/>. */ package org.jboss.pressgang.ccms.server.rest.v1.mapper; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import java.lang.reflect.Method; import java.util.ArrayList; import org.jboss.pressgang.ccms.rest.v1.constants.RESTv1Constants; import org.jboss.pressgang.ccms.rest.v1.jaxrsinterfaces.RESTInterfaceV1; import org.jboss.pressgang.ccms.server.rest.v1.RESTv1; import org.jboss.pressgang.ccms.utils.common.VersionUtilities; import org.jboss.resteasy.core.Headers; import org.jboss.resteasy.core.ServerResponse; import org.jboss.resteasy.spi.interception.AcceptedByMethod; public abstract class BaseExceptionMapper<T extends Throwable> implements ExceptionMapper<T>, AcceptedByMethod { @Context HttpServletResponse servletResponse; protected Response buildPlainTextResponse(final Response.Status status, final T exception) { return buildPlainTextResponse(status.getStatusCode(), exception); } protected Response buildPlainTextResponse(final int status, final T exception) { // Copy any headers over from the original response as resteasy creates a new response for errors. final Headers<Object> headers = new Headers<Object>(); for (final String headerName : servletResponse.getHeaderNames()) { headers.put(headerName, new ArrayList<Object>(servletResponse.getHeaders(headerName))); } // Add the additional required headers headers.putSingle("Content-Type", MediaType.TEXT_PLAIN); headers.putSingle(RESTv1Constants.X_PRESSGANG_VERSION_HEADER, VersionUtilities.getAPIVersion(RESTInterfaceV1.class)); // Create the response return new ServerResponse(exception.getMessage(), status, headers); } @Override public boolean accept(Class declaring, Method method) { // Only use this interceptor for v1 endpoints. return RESTv1.class.equals(declaring); } }