package ameba.db;
import ameba.core.Application;
import ameba.message.error.ErrorMessage;
import ameba.message.error.ExceptionMapperUtils;
import ameba.util.Result;
import com.google.common.collect.Lists;
import com.google.common.hash.Hashing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.persistence.PersistenceException;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import java.util.List;
/**
* <p>PersistenceExceptionMapper class.</p>
*
* @author icode
*
*/
@Singleton
public class PersistenceExceptionMapper implements ExceptionMapper<PersistenceException> {
private static final Logger logger = LoggerFactory.getLogger(PersistenceExceptionMapper.class);
@Context
private ResourceInfo resourceInfo;
@Inject
private Application.Mode mode;
/**
* {@inheritDoc}
*/
@Override
public Response toResponse(PersistenceException exception) {
logger.error("Executing SQL error", exception);
ErrorMessage errorMessage = ErrorMessage.fromStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
errorMessage.setThrowable(exception);
errorMessage.setCode(Hashing.murmur3_32().hashUnencodedChars(exception.getClass().getName()).toString());
boolean isDev = mode.isDev();
List<ErrorMessage.Error> errors = Lists.newArrayList();
errors.add(new Result.Error(
errorMessage.getCode(),
exception.getMessage(),
null,
isDev ? ErrorMessage.parseSource(resourceInfo) : null
));
if (isDev) {
errors.addAll(ErrorMessage.parseErrors(exception, errorMessage.getStatus()));
}
errorMessage.setErrors(errors);
return Response.status(errorMessage.getStatus())
.entity(errorMessage)
.type(ExceptionMapperUtils.getResponseType())
.build();
}
}