You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2016/12/19 17:51:24 UTC

struts git commit: WW-4725 Allows handle all redirection by MessageStoreInterceptor

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 <lu...@apache.org>
Authored: Mon Dec 19 18:51:04 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
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;