Repository: struts Updated Branches: refs/heads/master 4727265e5 -> 7e4d1b45e
WW-4725 Allows handle all redirection by MessageStoreInterceptor Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/7e4d1b45 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/7e4d1b45 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/7e4d1b45 Branch: refs/heads/master Commit: 7e4d1b45ea9d349d22a9995dd38c8a21f0321ef0 Parents: 4727265 Author: Lukasz Lenart <[email protected]> Authored: Mon Dec 19 18:51:04 2016 +0100 Committer: Lukasz Lenart <[email protected]> Committed: Mon Dec 19 18:51:04 2016 +0100 ---------------------------------------------------------------------- .../interceptor/MessageStoreInterceptor.java | 9 +++- .../MessageStorePreResultListener.java | 46 ++++++++++++-------- .../org/apache/struts2/result/Redirectable.java | 8 ++++ .../result/ServletActionRedirectResult.java | 2 +- .../struts2/result/ServletRedirectResult.java | 2 +- .../MessageStorePreResultListenerTest.java | 12 +++-- .../struts2/json/JSONActionRedirectResult.java | 3 +- 7 files changed, 57 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java index f3e8cb5..5052df7 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java @@ -203,7 +203,10 @@ public class MessageStoreInterceptor extends AbstractInterceptor { before(invocation); LOG.trace("Registering listener to store messages before result will be executed"); - invocation.addPreResultListener(new MessageStorePreResultListener(this)); + MessageStorePreResultListener preResultListener = createPreResultListener(invocation); + preResultListener.init(this); + + invocation.addPreResultListener(preResultListener); String result = invocation.invoke(); @@ -212,6 +215,10 @@ public class MessageStoreInterceptor extends AbstractInterceptor { return result; } + protected MessageStorePreResultListener createPreResultListener(ActionInvocation invocation) { + return new MessageStorePreResultListener(); + } + /** * Handle the retrieving of field errors / action messages / field errors, which is * done before action invocation, and the <code>operationMode</code> is 'RETRIEVE'. http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/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 9b313a8..4df6591 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java +++ b/core/src/main/java/org/apache/struts2/interceptor/MessageStorePreResultListener.java @@ -26,8 +26,7 @@ import com.opensymphony.xwork2.interceptor.ValidationAware; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.ServletActionContext; -import org.apache.struts2.result.ServletActionRedirectResult; -import org.apache.struts2.result.ServletRedirectResult; +import org.apache.struts2.result.Redirectable; import java.util.Map; @@ -36,26 +35,25 @@ import java.util.Map; * just before result will be executed. It must be done that way as after result will be executed * HttpSession cannot be modified (response was already sent to browser). */ -class MessageStorePreResultListener implements PreResultListener { +public class MessageStorePreResultListener implements PreResultListener { private static final Logger LOG = LogManager.getLogger(MessageStorePreResultListener.class); - private MessageStoreInterceptor interceptor; + protected MessageStoreInterceptor interceptor; - public MessageStorePreResultListener(MessageStoreInterceptor interceptor) { + public void init(MessageStoreInterceptor interceptor) { this.interceptor = interceptor; } - @Override public void beforeResult(ActionInvocation invocation, String resultCode) { - boolean isCommitted = ServletActionContext.getResponse().isCommitted(); + boolean isCommitted = isCommitted(); if (isCommitted) { LOG.trace("Response was already committed, cannot store messages!"); return; } - boolean isInvalidated = ServletActionContext.getRequest().getSession(false) == null; + boolean isInvalidated = isInvalidated(); if (isInvalidated) { LOG.trace("Session was invalidated or never created, cannot store messages!"); return; @@ -69,15 +67,7 @@ class MessageStorePreResultListener implements PreResultListener { String reqOperationMode = interceptor.getRequestOperationMode(invocation); - boolean isRedirect = false; - try { - ResultConfig resultConfig = invocation.getProxy().getConfig().getResults().get(resultCode); - if (resultConfig != null) { - isRedirect = ServletRedirectResult.class.isAssignableFrom(Class.forName(resultConfig.getClassName())); - } - } catch (Exception e) { - LOG.warn("Cannot read result!", e); - } + boolean isRedirect = isRedirect(invocation, resultCode); if (MessageStoreInterceptor.STORE_MODE.equalsIgnoreCase(reqOperationMode) || MessageStoreInterceptor.STORE_MODE.equalsIgnoreCase(interceptor.getOperationModel()) || @@ -97,4 +87,26 @@ class MessageStorePreResultListener implements PreResultListener { } } } + + protected boolean isCommitted() { + return ServletActionContext.getResponse().isCommitted(); + } + + protected boolean isInvalidated() { + return ServletActionContext.getRequest().getSession(false) == null; + } + + protected boolean isRedirect(ActionInvocation invocation, String resultCode) { + boolean isRedirect = false; + try { + ResultConfig resultConfig = invocation.getProxy().getConfig().getResults().get(resultCode); + if (resultConfig != null) { + isRedirect = Redirectable.class.isAssignableFrom(Class.forName(resultConfig.getClassName())); + } + } catch (Exception e) { + LOG.warn("Cannot read result!", e); + } + return isRedirect; + } + } http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/core/src/main/java/org/apache/struts2/result/Redirectable.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/result/Redirectable.java b/core/src/main/java/org/apache/struts2/result/Redirectable.java new file mode 100644 index 0000000..54fdf65 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/result/Redirectable.java @@ -0,0 +1,8 @@ +package org.apache.struts2.result; + +/** + * Marking interface for results which perform browser redirection + */ +public interface Redirectable { + +} http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/core/src/main/java/org/apache/struts2/result/ServletActionRedirectResult.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/result/ServletActionRedirectResult.java b/core/src/main/java/org/apache/struts2/result/ServletActionRedirectResult.java index 798e809..5a4528e 100644 --- a/core/src/main/java/org/apache/struts2/result/ServletActionRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/result/ServletActionRedirectResult.java @@ -123,7 +123,7 @@ import java.util.List; * * @see ActionMapper */ -public class ServletActionRedirectResult extends ServletRedirectResult implements ReflectionExceptionHandler { +public class ServletActionRedirectResult extends ServletRedirectResult implements ReflectionExceptionHandler, Redirectable { private static final long serialVersionUID = -9042425229314584066L; http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/core/src/main/java/org/apache/struts2/result/ServletRedirectResult.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/struts2/result/ServletRedirectResult.java b/core/src/main/java/org/apache/struts2/result/ServletRedirectResult.java index e804416..552ee04 100644 --- a/core/src/main/java/org/apache/struts2/result/ServletRedirectResult.java +++ b/core/src/main/java/org/apache/struts2/result/ServletRedirectResult.java @@ -98,7 +98,7 @@ import static javax.servlet.http.HttpServletResponse.SC_FOUND; * </pre> * */ -public class ServletRedirectResult extends StrutsResultSupport implements ReflectionExceptionHandler { +public class ServletRedirectResult extends StrutsResultSupport implements ReflectionExceptionHandler, Redirectable { private static final long serialVersionUID = 6316947346435301270L; http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/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 e888a55..9074bcb 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/MessageStorePreResultListenerTest.java @@ -54,7 +54,8 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { // when MessageStoreInterceptor msi = new MessageStoreInterceptor(); - MessageStorePreResultListener listener = new MessageStorePreResultListener(msi); + MessageStorePreResultListener listener = new MessageStorePreResultListener(); + listener.init(msi); listener.beforeResult(mockActionInvocation, Action.SUCCESS); // then @@ -86,7 +87,8 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { // when MessageStoreInterceptor msi = new MessageStoreInterceptor(); - MessageStorePreResultListener listener = new MessageStorePreResultListener(msi); + MessageStorePreResultListener listener = new MessageStorePreResultListener(); + listener.init(msi); listener.beforeResult(mockActionInvocation, Action.SUCCESS); // then @@ -98,7 +100,8 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { MessageStoreInterceptor interceptor = new MessageStoreInterceptor(); interceptor.setOperationMode(MessageStoreInterceptor.AUTOMATIC_MODE); - MessageStorePreResultListener listener = new MessageStorePreResultListener(interceptor); + MessageStorePreResultListener listener = new MessageStorePreResultListener(); + listener.init(interceptor); Map sessionMap = new LinkedHashMap(); @@ -178,7 +181,8 @@ public class MessageStorePreResultListenerTest extends StrutsInternalTestCase { interceptor.setAllowRequestParameterSwitch(true); interceptor.setOperationMode(MessageStoreInterceptor.STORE_MODE); - MessageStorePreResultListener listener = new MessageStorePreResultListener(interceptor); + MessageStorePreResultListener listener = new MessageStorePreResultListener(); + listener.init(interceptor); Map sessionMap = new LinkedHashMap(); http://git-wip-us.apache.org/repos/asf/struts/blob/7e4d1b45/plugins/json/src/main/java/org/apache/struts2/json/JSONActionRedirectResult.java ---------------------------------------------------------------------- diff --git a/plugins/json/src/main/java/org/apache/struts2/json/JSONActionRedirectResult.java b/plugins/json/src/main/java/org/apache/struts2/json/JSONActionRedirectResult.java index 4b8b948..c3a9268 100644 --- a/plugins/json/src/main/java/org/apache/struts2/json/JSONActionRedirectResult.java +++ b/plugins/json/src/main/java/org/apache/struts2/json/JSONActionRedirectResult.java @@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; +import org.apache.struts2.result.Redirectable; import org.apache.struts2.result.ServletActionRedirectResult; /** @@ -24,7 +25,7 @@ import org.apache.struts2.result.ServletActionRedirectResult; * </p> * */ -public class JSONActionRedirectResult extends ServletActionRedirectResult { +public class JSONActionRedirectResult extends ServletActionRedirectResult implements Redirectable { private static final long serialVersionUID = 3107276294073879542L;
