Author: lukaszlenart
Date: Fri May 17 12:38:42 2013
New Revision: 1483773

URL: http://svn.apache.org/r1483773
Log:
WW-4028 Extends ActionInvocation interface to support serialisation and 
deserialisation

Added:
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockContainer.java
Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/InvocationSessionStore.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/util/InvocationSessionStoreTest.java
    
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
    
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java
    
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/interceptor/TestActionInvocation.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenSessionStoreInterceptor.java
 Fri May 17 12:38:42 2013
@@ -137,7 +137,6 @@ public class TokenSessionStoreIntercepto
             if (savedInvocation != null) {
                 // set the valuestack to the request scope
                 ValueStack stack = savedInvocation.getStack();
-                Map context = stack.getContext();
                 
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
 
                 ActionContext savedContext = 
savedInvocation.getInvocationContext();

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/InvocationSessionStore.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/InvocationSessionStore.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/InvocationSessionStore.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/util/InvocationSessionStore.java
 Fri May 17 12:38:42 2013
@@ -21,14 +21,14 @@
 
 package org.apache.struts2.util;
 
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.util.ValueStack;
 
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
 
 /**
  * InvocationSessionStore
@@ -62,7 +62,7 @@ public class InvocationSessionStore {
         ValueStack stack = invocationContext.invocation.getStack();
         ActionContext.getContext().setValueStack(stack);
 
-        return invocationContext.invocation;
+        return 
invocationContext.invocation.deserialize(ActionContext.getContext());
     }
 
     /**
@@ -73,7 +73,7 @@ public class InvocationSessionStore {
      * @param invocation
      */
     public static void storeInvocation(String key, String token, 
ActionInvocation invocation) {
-        InvocationContext invocationContext = new 
InvocationContext(invocation, token);
+        InvocationContext invocationContext = new 
InvocationContext(invocation.serialize(), token);
         Map invocationMap = getInvocationMap();
         invocationMap.put(key, invocationContext);
         setInvocationMap(invocationMap);

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/util/InvocationSessionStoreTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/util/InvocationSessionStoreTest.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/util/InvocationSessionStoreTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/util/InvocationSessionStoreTest.java
 Fri May 17 12:38:42 2013
@@ -21,17 +21,15 @@
 
 package org.apache.struts2.util;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.struts2.StrutsTestCase;
-
 import com.mockobjects.dynamic.Mock;
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ActionProxy;
 import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.util.ValueStackFactory;
+import org.apache.struts2.StrutsTestCase;
+
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
@@ -79,6 +77,8 @@ public class InvocationSessionStoreTest 
 
         invocationMock = new Mock(ActionInvocation.class);
         invocation = (ActionInvocation) invocationMock.proxy();
+        invocationMock.matchAndReturn("serialize", invocation);
+        invocationMock.matchAndReturn("deserialize", actionContext, 
invocation);
 
         actionContext.setValueStack(stack);
         invocationMock.matchAndReturn("getStack", stack);

Modified: 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java
 (original)
+++ 
struts/struts2/trunk/plugins/sitemesh/src/main/java/org/apache/struts2/sitemesh/OldDecorator2NewStrutsDecorator.java
 Fri May 17 12:38:42 2013
@@ -198,6 +198,15 @@ public abstract class OldDecorator2NewSt
 
         public void init(ActionProxy proxy) {
         }
+
+        public ActionInvocation serialize() {
+            return null;
+        }
+
+        public ActionInvocation deserialize(ActionContext actionContext) {
+            return null;
+        }
+
     }
 
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ActionInvocation.java
 Fri May 17 12:38:42 2013
@@ -160,4 +160,20 @@ public interface ActionInvocation extend
 
     void init(ActionProxy proxy) ;
 
+    /**
+     * Prepares instance of ActionInvocation to be serializable,
+     * which simple means removing all unserializable fields, eg. Container
+     *
+     * @return ActionInvocation which can be serialize (eg. into HttpSession)
+     */
+    ActionInvocation serialize();
+
+    /**
+     * Performs opposite process to restore back ActionInvocation after 
deserialisation
+     *
+     * @param actionContext current {@link ActionContext}
+     * @return fully operational ActionInvocation
+     */
+    ActionInvocation deserialize(ActionContext actionContext);
+
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java
 Fri May 17 12:38:42 2013
@@ -77,8 +77,8 @@ public class DefaultActionInvocation imp
     protected UnknownHandlerManager unknownHandlerManager;
 
     public DefaultActionInvocation(final Map<String, Object> extraContext, 
final boolean pushAction) {
-        DefaultActionInvocation.this.extraContext = extraContext;
-        DefaultActionInvocation.this.pushAction = pushAction;
+        this.extraContext = extraContext;
+        this.pushAction = pushAction;
     }
 
     @Inject
@@ -491,4 +491,27 @@ public class DefaultActionInvocation imp
         }
     }
 
+    /**
+     * Version ready to be serialize
+     *
+     * @return instance without reference to {@link Container}
+     */
+    public ActionInvocation serialize() {
+        DefaultActionInvocation that = this;
+        that.container = null;
+        return that;
+    }
+
+    /**
+     * Restoring Container
+     *
+     * @param actionContext current {@link ActionContext}
+     * @return instance which can be used to invoke action
+     */
+    public ActionInvocation deserialize(ActionContext actionContext) {
+        DefaultActionInvocation that = this;
+        that.container = actionContext.getContainer();
+        return that;
+    }
+
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockActionInvocation.java
 Fri May 17 12:38:42 2013
@@ -122,4 +122,12 @@ public class MockActionInvocation implem
     public void init(ActionProxy proxy) {
     }
 
+    public ActionInvocation serialize() {
+        return this;
+    }
+
+    public ActionInvocation deserialize(ActionContext actionContext) {
+        return this;
+    }
+
 }

Added: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockContainer.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockContainer.java?rev=1483773&view=auto
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockContainer.java
 (added)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/mock/MockContainer.java
 Fri May 17 12:38:42 2013
@@ -0,0 +1,41 @@
+package com.opensymphony.xwork2.mock;
+
+import com.opensymphony.xwork2.inject.Container;
+import com.opensymphony.xwork2.inject.Scope;
+
+import java.util.Set;
+
+/**
+ * Mock implementation to be used in unittests
+ */
+public class MockContainer implements Container {
+
+    public void inject(Object o) {
+
+    }
+
+    public <T> T inject(Class<T> implementation) {
+        return null;
+    }
+
+    public <T> T getInstance(Class<T> type, String name) {
+        return null;
+    }
+
+    public <T> T getInstance(Class<T> type) {
+        return null;
+    }
+
+    public Set<String> getInstanceNames(Class<?> type) {
+        return null;
+    }
+
+    public void setScopeStrategy(Scope.Strategy scopeStrategy) {
+
+    }
+
+    public void removeScopeStrategy() {
+
+    }
+
+}

Modified: 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java
 Fri May 17 12:38:42 2013
@@ -2,6 +2,7 @@ package com.opensymphony.xwork2;
 
 import com.opensymphony.xwork2.config.entities.InterceptorMapping;
 import com.opensymphony.xwork2.mock.MockActionProxy;
+import com.opensymphony.xwork2.mock.MockContainer;
 import com.opensymphony.xwork2.mock.MockInterceptor;
 
 import java.util.ArrayList;
@@ -44,16 +45,43 @@ public class DefaultActionInvocationTest
         assertTrue(mockInterceptor3.isExecuted());
     }
 
+    public void testSerialization() throws Exception {
+        // given
+        DefaultActionInvocation actionInvocation = new 
DefaultActionInvocation(new HashMap<String, Object>(), false);
+        actionInvocation.setContainer(new MockContainer());
+
+        // when
+        DefaultActionInvocation serializable = (DefaultActionInvocation) 
actionInvocation.serialize();
+
+        // then
+        assertNull(actionInvocation.container);
+        assertNull(serializable.container);
+    }
 
-    class DefaultActionInvocationTester extends DefaultActionInvocation {
-        DefaultActionInvocationTester(List<InterceptorMapping> 
interceptorMappings) {
-            super(new HashMap<String, Object>(), false);
-            interceptors = interceptorMappings.iterator();
-            MockActionProxy actionProxy = new MockActionProxy();
-            actionProxy.setMethod("execute");
-            proxy = actionProxy;
-            action = new ActionSupport();
-        }
+    public void testDeserialization() throws Exception {
+        // given
+        DefaultActionInvocation actionInvocation = new 
DefaultActionInvocation(new HashMap<String, Object>(), false);
+        MockContainer mockContainer = new MockContainer();
+        ActionContext.getContext().setContainer(mockContainer);
+
+        // when
+        DefaultActionInvocation deserializable = (DefaultActionInvocation) 
actionInvocation.deserialize(ActionContext.getContext());
+
+        // then
+        assertNotNull(actionInvocation.container);
+        assertNotNull(deserializable.container);
+        assertEquals(mockContainer, deserializable.container);
     }
 
-}
\ No newline at end of file
+}
+
+class DefaultActionInvocationTester extends DefaultActionInvocation {
+    DefaultActionInvocationTester(List<InterceptorMapping> 
interceptorMappings) {
+        super(new HashMap<String, Object>(), false);
+        interceptors = interceptorMappings.iterator();
+        MockActionProxy actionProxy = new MockActionProxy();
+        actionProxy.setMethod("execute");
+        proxy = actionProxy;
+        action = new ActionSupport();
+    }
+}

Modified: 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/interceptor/TestActionInvocation.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/interceptor/TestActionInvocation.java?rev=1483773&r1=1483772&r2=1483773&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/interceptor/TestActionInvocation.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/interceptor/TestActionInvocation.java
 Fri May 17 12:38:42 2013
@@ -70,4 +70,13 @@ public class TestActionInvocation implem
 
     public void init(ActionProxy proxy)  {
     }
+
+    public ActionInvocation serialize() {
+        return this;
+    }
+
+    public ActionInvocation deserialize(ActionContext actionContext) {
+        return this;
+    }
+
 }


Reply via email to