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; + } + }