WW-4134 Checks if Response wasn't committed to allow store messages

Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/09580777
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/09580777
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/09580777

Branch: refs/heads/support-2-3
Commit: 095807776288ce982ee064f820de428cd3969761
Parents: 7848534
Author: Lukasz Lenart <lukasz.len...@gmail.com>
Authored: Tue Oct 27 09:01:09 2015 +0100
Committer: Lukasz Lenart <lukasz.len...@gmail.com>
Committed: Tue Oct 27 09:01:09 2015 +0100

----------------------------------------------------------------------
 .../interceptor/MessageStoreInterceptor.java      | 18 ++++++++++++------
 .../interceptor/MessageStoreInterceptorTest.java  | 15 +++++++++++++++
 2 files changed, 27 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/09580777/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 b7509f0..f34cee0 100644
--- 
a/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
+++ 
b/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
@@ -26,6 +26,7 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.dispatcher.ServletRedirectResult;
 
 import com.opensymphony.xwork2.ActionContext;
@@ -273,14 +274,16 @@ public class MessageStoreInterceptor extends 
AbstractInterceptor {
 
         String reqOperationMode = getRequestOperationMode(invocation);
         boolean isRedirect = invocation.getResult() instanceof 
ServletRedirectResult;
+        boolean isCommitted = ServletActionContext.getResponse().isCommitted();
+
         if (STORE_MODE.equalsIgnoreCase(reqOperationMode) ||
                 STORE_MODE.equalsIgnoreCase(operationMode) ||
                 (AUTOMATIC_MODE.equalsIgnoreCase(operationMode) && 
isRedirect)) {
 
             Object action = invocation.getAction();
-            if (action instanceof ValidationAware) {
+            if (action instanceof ValidationAware && !isCommitted) {
                 // store error / messages into session
-                Map session = (Map) 
invocation.getInvocationContext().get(ActionContext.SESSION);
+                Map<String, Object> session = 
invocation.getInvocationContext().getSession();
 
                 if (session == null) {
                     if (LOG.isDebugEnabled()) {
@@ -297,14 +300,17 @@ public class MessageStoreInterceptor extends 
AbstractInterceptor {
                 session.put(actionErrorsSessionKey, 
validationAwareAction.getActionErrors());
                 session.put(actionMessagesSessionKey, 
validationAwareAction.getActionMessages());
                 session.put(fieldErrorsSessionKey, 
validationAwareAction.getFieldErrors());
-            }
-            else if(LOG.isDebugEnabled()) {
-               LOG.debug("Action ["+action+"] is not ValidationAware, no 
message / error that are storeable");
+
+            } else if(LOG.isDebugEnabled()) {
+                if (isCommitted) {
+                    LOG.debug("Response was already committed, cannot store 
messages!");
+                } else {
+                    LOG.debug("Action [" + action + "] is not ValidationAware, 
no message / error that are storeable");
+                }
             }
         }
     }
 
-
     /**
      * Get the operationMode through request paramter, if 
<code>allowRequestParameterSwitch</code>
      * is 'true', else it simply returns 'NONE', meaning its neither in the 
'STORE_MODE' nor

http://git-wip-us.apache.org/repos/asf/struts/blob/09580777/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
 
b/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
index 3ba76c2..d5e339a 100644
--- 
a/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
+++ 
b/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
@@ -27,6 +27,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.StrutsInternalTestCase;
 import org.apache.struts2.dispatcher.ServletActionRedirectResult;
 import org.easymock.EasyMock;
@@ -36,6 +37,8 @@ import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ActionSupport;
 
+import javax.servlet.http.HttpServletResponse;
+
 
 /**
  * Test case for MessageStoreInterceptor.
@@ -44,6 +47,18 @@ import com.opensymphony.xwork2.ActionSupport;
  */
 public class MessageStoreInterceptorTest extends StrutsInternalTestCase {
 
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        HttpServletResponse response = 
EasyMock.createNiceControl().createMock(HttpServletResponse.class);
+        response.isCommitted();
+        EasyMock.expectLastCall().andReturn(Boolean.FALSE);
+        EasyMock.replay(response);
+
+        ServletActionContext.setResponse(response);
+    }
+
     public void testStoreMessage() throws Exception {
         MessageStoreInterceptor interceptor = new MessageStoreInterceptor();
         interceptor.setAllowRequestParameterSwitch(true);

Reply via email to