package br.com.caelum.vraptor.observer;
import static org.slf4j.LoggerFactory.getLogger;
import org.slf4j.Logger;
import br.com.caelum.vraptor.core.ReflectionProviderException;
import br.com.caelum.vraptor.interceptor.ApplicationLogicException;
import br.com.caelum.vraptor.validator.ValidationException;
import com.google.common.base.Throwables;
/**
* Handles exceptions thrown by a controller method
*
* @author Chico Sokol
*/
public class ExecuteMethodExceptionHandler {
private final static Logger log = getLogger(ExecuteMethodExceptionHandler.class);
public void handle(Exception exception) {
if (exception instanceof ReflectionProviderException) {
throwIfNotValidationException(exception, exception.getCause());
}
throwIfNotValidationException(exception, exception);
}
private void throwIfNotValidationException(Throwable original, Throwable alternativeCause) {
Throwable cause = original.getCause();
if (original instanceof ValidationException || cause instanceof ValidationException) {
// fine... already parsed
log.trace("swallowing {}", cause);
} else {
Throwables.propagateIfPossible(alternativeCause);
throw new ApplicationLogicException(alternativeCause);
}
}
}