Adds additional use cases and fixes some minor issues
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/70273869 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/70273869 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/70273869 Branch: refs/heads/master Commit: 702738693ce9206f3023903d73094fe1522cb91c Parents: 61ab813 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Sun Dec 21 20:46:40 2014 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Sun Dec 21 20:46:40 2014 +0100 ---------------------------------------------------------------------- .../xwork2/DefaultActionInvocation.java | 11 +- .../xwork2/DefaultActionInvocationTest.java | 175 ++++++++++++++++++- .../com/opensymphony/xwork2/SimpleAction.java | 3 + 3 files changed, 176 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/70273869/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java ---------------------------------------------------------------------- diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java index f2c28ea..1bf7ccf 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java @@ -426,10 +426,10 @@ public class DefaultActionInvocation implements ActionInvocation { if (e.getReason() instanceof NoSuchMethodException) { try { String altMethodName = "do" + methodName.substring(0, 1).toUpperCase() + methodName.substring(1) + "()"; - methodResult = ognlUtil.getValue(altMethodName, ActionContext.getContext().getContextMap(), action); + methodResult = ognlUtil.getValue(altMethodName, getStack().getContext(), action); } catch (MethodFailedException e1) { // if still method doesn't exist, try checking UnknownHandlers - if (e.getReason() instanceof NoSuchMethodException) { + if (e1.getReason() instanceof NoSuchMethodException) { if (unknownHandlerManager.hasUnknownHandlers()) { try { methodResult = unknownHandlerManager.handleUnknownMethod(action, methodName); @@ -438,6 +438,7 @@ public class DefaultActionInvocation implements ActionInvocation { throw e; } } else { + // throw the original one throw e; } // throw the original exception as UnknownHandlers weren't able to handle invocation as well @@ -445,12 +446,12 @@ public class DefaultActionInvocation implements ActionInvocation { throw e; } } else { - // exception isn't related to missing action method - throw e; + // exception isn't related to missing action method, throw it + throw e1; } } } else { - // exception isn't related to missing action method + // exception isn't related to missing action method, throw it throw e; } } http://git-wip-us.apache.org/repos/asf/struts/blob/70273869/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java ---------------------------------------------------------------------- diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java index d0ff2b5..4291538 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java @@ -106,6 +106,28 @@ public class DefaultActionInvocationTest extends XWorkTestCase { assertEquals("success", result); } + public void testInvokingExistingDoInputMethod() throws Exception { + // given + DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) { + public ValueStack getStack() { + return new StubValueStack(); + } + }; + + SimpleAction action = new SimpleAction(); + MockActionProxy proxy = new MockActionProxy(); + proxy.setMethod("with"); + + dai.proxy = proxy; + dai.ognlUtil = new OgnlUtil(); + + // when + String result = dai.invokeAction(action, null); + + // then + assertEquals("with", result); + } + public void testInvokingMissingMethod() throws Exception { // given DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) { @@ -135,16 +157,16 @@ public class DefaultActionInvocationTest extends XWorkTestCase { dai.unknownHandlerManager = uhm; // when - Throwable expected = null; + Throwable actual = null; try { dai.invokeAction(action, null); } catch (Exception e) { - expected = e; + actual = e; } // then - assertNotNull(expected); - assertTrue(expected instanceof NoSuchMethodException); + assertNotNull(actual); + assertTrue(actual instanceof NoSuchMethodException); } public void testInvokingExistingMethodThatThrowsException() throws Exception { @@ -168,17 +190,154 @@ public class DefaultActionInvocationTest extends XWorkTestCase { dai.ognlUtil = new OgnlUtil(); // when + Throwable actual = null; + try { + dai.invokeAction(action, null); + } catch (Exception e) { + actual = e; + } + + // then + assertNotNull(actual); + assertTrue(actual instanceof IllegalArgumentException); + } + + public void testInvokingExistingDoMethodThatThrowsException() throws Exception { + // given + DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) { + public ValueStack getStack() { + return new StubValueStack(); + } + }; + + UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() { + @Override + public boolean hasUnknownHandlers() { + return false; + } + }; + + SimpleAction action = new SimpleAction() { + @Override + public String doWith() throws Exception { + throw new IllegalArgumentException(); + } + }; + MockActionProxy proxy = new MockActionProxy(); + proxy.setMethod("with"); + + dai.proxy = proxy; + dai.ognlUtil = new OgnlUtil(); + dai.unknownHandlerManager = uhm; + + // when + // when + Throwable actual = null; + try { + dai.invokeAction(action, null); + } catch (Exception e) { + actual = e; + } + + // then + assertNotNull(actual); + assertTrue(actual instanceof IllegalArgumentException); + } + + @Deprecated + public void testUnknownHandlerManagerThatThrowsException() throws Exception { + // given + DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) { + public ValueStack getStack() { + return new StubValueStack(); + } + }; + + UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() { + @Override + public boolean hasUnknownHandlers() { + return true; + } + + @Override + public Object handleUnknownMethod(Object action, String methodName) throws NoSuchMethodException { + throw new NoSuchMethodException(); + } + }; + + SimpleAction action = new SimpleAction() { + @Override + public String doWith() throws Exception { + throw new IllegalArgumentException(); + } + }; + MockActionProxy proxy = new MockActionProxy(); + proxy.setMethod("notExists"); + + dai.proxy = proxy; + dai.ognlUtil = new OgnlUtil(); + dai.unknownHandlerManager = uhm; + + // when + // when + Throwable actual = null; + try { + dai.invokeAction(action, null); + } catch (Exception e) { + actual = e; + } + + // then + assertNotNull(actual); + assertTrue(actual instanceof NoSuchMethodException); + } + + @Deprecated + public void testUnknownHandlerManagerThatReturnsNull() throws Exception { + // given + DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) { + public ValueStack getStack() { + return new StubValueStack(); + } + }; + + UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() { + @Override + public boolean hasUnknownHandlers() { + return true; + } + + @Override + public Object handleUnknownMethod(Object action, String methodName) throws NoSuchMethodException { + return null; + } + }; + + SimpleAction action = new SimpleAction() { + @Override + public String doWith() throws Exception { + throw new IllegalArgumentException(); + } + }; + MockActionProxy proxy = new MockActionProxy(); + proxy.setMethod("notExists"); + + dai.proxy = proxy; + dai.ognlUtil = new OgnlUtil(); + dai.unknownHandlerManager = uhm; + + // when // when - Throwable expected = null; + Throwable actual = null; try { dai.invokeAction(action, null); } catch (Exception e) { - expected = e; + actual = e; } // then - assertNotNull(expected); - assertTrue(expected instanceof IllegalArgumentException); + assertNotNull(actual); + assertTrue(actual instanceof NoSuchMethodException); } } http://git-wip-us.apache.org/repos/asf/struts/blob/70273869/xwork-core/src/test/java/com/opensymphony/xwork2/SimpleAction.java ---------------------------------------------------------------------- diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/SimpleAction.java b/xwork-core/src/test/java/com/opensymphony/xwork2/SimpleAction.java index d22d231..6a180a1 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/SimpleAction.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/SimpleAction.java @@ -249,6 +249,9 @@ public class SimpleAction extends ActionSupport { return INPUT; } + public String doWith() throws Exception { + return "with"; + } public long getLongFoo() { return longFoo;