Repository: struts Updated Branches: refs/heads/support-2-3 519c76711 -> 6b497ef8f
WW-4605 Reverts to previous flow when result is created just before executing it Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/6b497ef8 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/6b497ef8 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/6b497ef8 Branch: refs/heads/support-2-3 Commit: 6b497ef8f7091224b4e87a825fdbc50b02a21c3d Parents: 519c767 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Fri Mar 18 20:41:06 2016 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Fri Mar 18 20:41:06 2016 +0100 ---------------------------------------------------------------------- .../MessageStorePreResultListener.java | 8 ++++++- .../MessageStorePreResultListenerTest.java | 22 ++++++++++++++++---- .../apache/struts2/views/jsp/ActionTagTest.java | 3 +-- .../xwork2/DefaultActionInvocation.java | 4 ++-- 4 files changed, 28 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/6b497ef8/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java b/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java index d78313c..5415a73 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java +++ b/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java @@ -21,10 +21,12 @@ package org.apache.struts2.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ValidationAware; +import com.opensymphony.xwork2.config.entities.ResultConfig; import com.opensymphony.xwork2.interceptor.PreResultListener; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import org.apache.struts2.ServletActionContext; +import org.apache.struts2.dispatcher.ServletActionRedirectResult; import org.apache.struts2.dispatcher.ServletRedirectResult; import java.util.Map; @@ -68,7 +70,11 @@ class MessageStorePreResultListener implements PreResultListener { boolean isRedirect = false; try { - isRedirect = invocation.getResult() instanceof ServletRedirectResult; + ResultConfig resultConfig = invocation.getProxy().getConfig().getResults().get(resultCode); + if (resultConfig != null) { + isRedirect = ServletRedirectResult.class.getName().equals(resultConfig.getClassName()) + || ServletActionRedirectResult.class.getName().equals(resultConfig.getClassName()); + } } catch (Exception e) { LOG.warn("Cannot read result!", e); } http://git-wip-us.apache.org/repos/asf/struts/blob/6b497ef8/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java b/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java index 599ab09..0b4340b 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java @@ -4,9 +4,13 @@ import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.config.entities.ActionConfig; +import com.opensymphony.xwork2.config.entities.ResultConfig; +import com.opensymphony.xwork2.mock.MockActionProxy; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.dispatcher.ServletActionRedirectResult; +import org.apache.struts2.dispatcher.ServletRedirectResult; import org.easymock.EasyMock; import javax.servlet.http.HttpServletRequest; @@ -138,8 +142,13 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { EasyMock.expectLastCall().andReturn(action); EasyMock.expectLastCall().anyTimes(); - mockActionInvocation.getResult(); - EasyMock.expectLastCall().andReturn(new ServletActionRedirectResult()); + mockActionInvocation.getProxy(); + MockActionProxy actionProxy = new MockActionProxy(); + ResultConfig resultConfig = new ResultConfig.Builder(Action.SUCCESS, ServletRedirectResult.class.getName()).build(); + ActionConfig actionConfig = new ActionConfig.Builder("", "test", action.getClass().getName()).addResultConfig(resultConfig).build(); + actionProxy.setConfig(actionConfig); + EasyMock.expectLastCall().andReturn(actionProxy); + EasyMock.expectLastCall().anyTimes(); EasyMock.replay(mockActionInvocation); @@ -213,8 +222,13 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { mockActionInvocation.getAction(); EasyMock.expectLastCall().andReturn(action); - mockActionInvocation.getResult(); - EasyMock.expectLastCall().andReturn(new ServletActionRedirectResult()); + mockActionInvocation.getProxy(); + MockActionProxy actionProxy = new MockActionProxy(); + ResultConfig resultConfig = new ResultConfig.Builder(Action.SUCCESS, ServletRedirectResult.class.getName()).build(); + ActionConfig actionConfig = new ActionConfig.Builder("", "test", action.getClass().getName()).addResultConfig(resultConfig).build(); + actionProxy.setConfig(actionConfig); + EasyMock.expectLastCall().andReturn(actionProxy); + EasyMock.expectLastCall().anyTimes(); EasyMock.replay(mockActionInvocation); http://git-wip-us.apache.org/repos/asf/struts/blob/6b497ef8/core/src/test/java/org/apache/struts2/views/jsp/ActionTagTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ActionTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ActionTagTest.java index f7d8a3b..d31e498 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ActionTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ActionTagTest.java @@ -179,8 +179,7 @@ public class ActionTagTest extends AbstractTagTest { assertTrue(stack.getContext().containsKey(ServletActionContext.PAGE_CONTEXT)); assertTrue(stack.getContext().get(ServletActionContext.PAGE_CONTEXT)instanceof PageContext); - assertNotNull(result); - assertFalse(result.isExecuted()); + assertNull(result); // result is never executed, hence never set into invocation } public void testExecuteButResetReturnSameInvocation() throws Exception { http://git-wip-us.apache.org/repos/asf/struts/blob/6b497ef8/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 b82efaf..fcf397e 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java @@ -254,8 +254,6 @@ public class DefaultActionInvocation implements ActionInvocation { // this is needed because the result will be executed, then control will return to the Interceptor, which will // return above and flow through again if (!executed) { - result = createResult(); - if (preResultListeners != null) { LOG.trace("Executing PreResultListeners for result [#0]", result); @@ -365,6 +363,8 @@ public class DefaultActionInvocation implements ActionInvocation { * @throws ConfigurationException If not result can be found with the returned code */ private void executeResult() throws Exception { + result = createResult(); + String timerKey = "executeResult: " + getResultCode(); try { UtilTimerStack.push(timerKey);