From 4a9c6bb9bb3c3b43d475d8cb3655c1d6ada14d61 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Tue, 17 Feb 2015 13:18:37 -0200 Subject: [PATCH 1/6] propagating alternative cause if it's not checked --- .../vraptor/observer/ExecuteMethodExceptionHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java index 550cfe664..b3654f06f 100644 --- a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java @@ -4,8 +4,11 @@ import br.com.caelum.vraptor.core.ReflectionProviderException; import br.com.caelum.vraptor.interceptor.ApplicationLogicException; import br.com.caelum.vraptor.validator.ValidationException; + import org.slf4j.Logger; +import com.google.common.base.Throwables; + import static org.slf4j.LoggerFactory.getLogger; /** @@ -33,6 +36,7 @@ private void throwIfNotValidationException(Throwable original, Throwable alterna // fine... already parsed log.trace("swallowing {}", cause); } else { + Throwables.propagateIfPossible(alternativeCause); throw new ApplicationLogicException(alternativeCause); } } From b2075a0549ce5c062053bf814d423c3f7f0aa757 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Tue, 17 Feb 2015 13:48:08 -0200 Subject: [PATCH 2/6] checking for IllegalStateException too --- .../caelum/vraptor/observer/ExecuteMethodExceptionHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java index b3654f06f..cf5663dc1 100644 --- a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java @@ -20,7 +20,8 @@ public class ExecuteMethodExceptionHandler { private final static Logger log = getLogger(ExecuteMethodExceptionHandler.class); public void handle(Exception exception) { - if (exception instanceof IllegalArgumentException) { + if (exception instanceof IllegalArgumentException + || exception instanceof IllegalStateException) { throw new InterceptionException(exception); } if (exception instanceof ReflectionProviderException) { From 5e969de57be42fadba5ea538e3940d01b8a90904 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Tue, 17 Feb 2015 13:48:36 -0200 Subject: [PATCH 3/6] fixing tests --- .../vraptor/observer/ExecuteMethodTest.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java b/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java index deaf8eca4..15111a487 100644 --- a/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java +++ b/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java @@ -31,6 +31,7 @@ import br.com.caelum.vraptor.validator.Messages; import br.com.caelum.vraptor.validator.ValidationException; import br.com.caelum.vraptor.validator.Validator; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -39,6 +40,7 @@ import org.mockito.MockitoAnnotations; import javax.enterprise.event.Event; + import java.lang.reflect.Method; import java.util.Collections; @@ -138,17 +140,27 @@ public void shouldThrowExceptionIfYouHaventSpecifiedWhereToGoOnValidationError() } @Test - public void shouldThrowApplicationLogicExceptionIfItsABusinessException() throws Exception { + public void shouldThrowApplicationLogicExceptionIfItsACheckedException() throws Exception { Method method = AnyController.class.getDeclaredMethod("throwException"); ControllerMethod controllerMethod = instanceFor(AnyController.class, method); AnyController controller = new AnyController(validator); expected.expect(ApplicationLogicException.class); - expected.expectCause(any(TestException.class)); + expected.expectCause(any(TestCheckedException.class)); + observer.execute(new InterceptorsExecuted(controllerMethod, controller)); + verify(messages).assertAbsenceOfErrors(); + } + + @Test + public void shouldThrowTheBusinessExceptionIfItsUnChecked() throws Exception { + Method method = AnyController.class.getDeclaredMethod("throwUnCheckedException"); + ControllerMethod controllerMethod = instanceFor(AnyController.class, method); + AnyController controller = new AnyController(validator); + + expected.expect(TestException.class); observer.execute(new InterceptorsExecuted(controllerMethod, controller)); verify(messages).assertAbsenceOfErrors(); } - public static class AnyController { private final Validator validator; @@ -162,10 +174,14 @@ public void didntSpecifyWhereToGo() { public void specifiedWhereToGo() { this.validator.onErrorUse(nothing()); } - public void throwException() { + public void throwException() throws Exception { + throw new TestCheckedException(); + } + public void throwUnCheckedException() { throw new TestException(); } } private static class TestException extends RuntimeException {} + private static class TestCheckedException extends Exception {} } \ No newline at end of file From dd953c44dcfc96c21f5a67ef4b6ef7342a6b7ef5 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Sat, 21 Feb 2015 10:47:25 -0200 Subject: [PATCH 4/6] new ValidationFailedException --- .../validator/ValidationFailedException.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 vraptor-core/src/main/java/br/com/caelum/vraptor/validator/ValidationFailedException.java diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/ValidationFailedException.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/ValidationFailedException.java new file mode 100644 index 000000000..2313292ba --- /dev/null +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/ValidationFailedException.java @@ -0,0 +1,15 @@ +package br.com.caelum.vraptor.validator; + +import javax.enterprise.inject.Vetoed; + +import br.com.caelum.vraptor.VRaptorException; + +@Vetoed +public class ValidationFailedException extends VRaptorException { + + private static final long serialVersionUID = 3495204717080278982L; + + public ValidationFailedException(String message) { + super(message); + } +} From c41f28435e02661b3a233b85514d54fc594997b4 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Sat, 21 Feb 2015 10:49:57 -0200 Subject: [PATCH 5/6] removing wrap and throwing ValidationFailedException instead --- .../observer/ExecuteMethodExceptionHandler.java | 13 ++++--------- .../br/com/caelum/vraptor/validator/Messages.java | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java index cf5663dc1..7a5d937df 100644 --- a/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/observer/ExecuteMethodExceptionHandler.java @@ -1,16 +1,15 @@ package br.com.caelum.vraptor.observer; -import br.com.caelum.vraptor.InterceptionException; +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 org.slf4j.Logger; - import com.google.common.base.Throwables; -import static org.slf4j.LoggerFactory.getLogger; - /** * Handles exceptions thrown by a controller method * @@ -20,10 +19,6 @@ public class ExecuteMethodExceptionHandler { private final static Logger log = getLogger(ExecuteMethodExceptionHandler.class); public void handle(Exception exception) { - if (exception instanceof IllegalArgumentException - || exception instanceof IllegalStateException) { - throw new InterceptionException(exception); - } if (exception instanceof ReflectionProviderException) { throwIfNotValidationException(exception, exception.getCause()); } diff --git a/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/Messages.java b/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/Messages.java index 759f8af31..6fd47e208 100644 --- a/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/Messages.java +++ b/vraptor-core/src/main/java/br/com/caelum/vraptor/validator/Messages.java @@ -105,7 +105,7 @@ public void assertAbsenceOfErrors() { if (hasUnhandledErrors()) { log.debug("Some validation errors occured: {}", getErrors()); - throw new IllegalStateException( + throw new ValidationFailedException( "There are validation errors and you forgot to specify where to go. Please add in your method " + "something like:\n" + "validator.onErrorUse(page()).of(AnyController.class).anyMethod();\n" From c92a1a30dfa2dce149b6d893041c77e5f5b6ebb0 Mon Sep 17 00:00:00 2001 From: Rodrigo Turini Date: Sat, 21 Feb 2015 10:59:19 -0200 Subject: [PATCH 6/6] fixing executeMethod and messages tests --- .../br/com/caelum/vraptor/observer/ExecuteMethodTest.java | 6 ++++-- .../java/br/com/caelum/vraptor/validator/MessagesTest.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java b/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java index 15111a487..aeece0827 100644 --- a/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java +++ b/vraptor-core/src/test/java/br/com/caelum/vraptor/observer/ExecuteMethodTest.java @@ -29,7 +29,9 @@ import br.com.caelum.vraptor.interceptor.DogAlike; import br.com.caelum.vraptor.validator.Message; import br.com.caelum.vraptor.validator.Messages; +import br.com.caelum.vraptor.validator.ValidationFailedException; import br.com.caelum.vraptor.validator.ValidationException; +import br.com.caelum.vraptor.validator.ValidationFailedException; import br.com.caelum.vraptor.validator.Validator; import org.junit.Before; @@ -128,12 +130,12 @@ public void shouldBeOkIfThereIsValidationErrorsAndYouSpecifiedWhereToGo() throws @Test public void shouldThrowExceptionIfYouHaventSpecifiedWhereToGoOnValidationError() throws Exception { - exception.expect(InterceptionException.class); + exception.expect(ValidationFailedException.class); Method didntSpecifyWhereToGo = AnyController.class.getMethod("didntSpecifyWhereToGo"); final ControllerMethod method = DefaultControllerMethod.instanceFor(AnyController.class, didntSpecifyWhereToGo); final AnyController controller = new AnyController(validator); - doThrow(new IllegalStateException()).when(messages).assertAbsenceOfErrors(); + doThrow(new ValidationFailedException("")).when(messages).assertAbsenceOfErrors(); when(methodInfo.getParametersValues()).thenReturn(new Object[0]); observer.execute(new InterceptorsExecuted(method, controller)); diff --git a/vraptor-core/src/test/java/br/com/caelum/vraptor/validator/MessagesTest.java b/vraptor-core/src/test/java/br/com/caelum/vraptor/validator/MessagesTest.java index 9eae53e06..93ce912b6 100644 --- a/vraptor-core/src/test/java/br/com/caelum/vraptor/validator/MessagesTest.java +++ b/vraptor-core/src/test/java/br/com/caelum/vraptor/validator/MessagesTest.java @@ -36,7 +36,7 @@ public void setUp() { @Test public void shouldThrowExceptionIfMessagesHasUnhandledErrors() { - exception.expect(IllegalStateException.class); + exception.expect(ValidationFailedException.class); exception.expectMessage(containsString("There are validation errors and you forgot to specify where to go.")); messages.add(new SimpleMessage("Test", "Test message"));