/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.common.exceptions.mappers;
import org.candlepin.common.util.VersionUtil;
import com.google.inject.Inject;
import java.util.Map;
import javax.persistence.RollbackException;
import javax.validation.ValidationException;
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;
/**
* When validation fails, Hibernate can throw RollbackExceptions. This mapper takes
* those exceptions, opens them up, and if the cause is a ValidationException, it
* delegates to the ValidationExceptionMapper.
*/
@Provider
public class RollbackExceptionMapper extends CandlepinExceptionMapper
implements ExceptionMapper<RollbackException> {
private javax.inject.Provider<ValidationExceptionMapper> exceptionMapperProvider;
@Inject
public RollbackExceptionMapper(javax.inject.Provider<ValidationExceptionMapper> mapper) {
this.exceptionMapperProvider = mapper;
}
@Override
public Response toResponse(RollbackException exception) {
Map<String, String> map = VersionUtil.getVersionMap();
ResponseBuilder bldr = Response.status(Status.BAD_REQUEST).type(
determineBestMediaType()).header(VersionUtil.VERSION_HEADER,
map.get("version") + "-" + map.get("release"));
Throwable cause = exception.getCause();
if (ValidationException.class.isAssignableFrom(cause.getClass())) {
return exceptionMapperProvider.get().toResponse((ValidationException) cause);
}
else {
getDefaultBuilder(exception, Response.Status.BAD_REQUEST, determineBestMediaType());
}
return bldr.build();
}
}