Author: nilsga Date: Fri Aug 10 07:16:24 2007 New Revision: 564602 URL: http://svn.apache.org/viewvc?view=rev&rev=564602 Log: WW-2053,WW-2101 Removed ServletContextHolder - Using mock servlet object instead. New interceptor for state handling.
Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/interceptor/PortletStateInterceptor.java Removed: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/context/ServletContextHolderListener.java struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/context/ServletContextHolderListenerTest.java Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java struts/struts2/trunk/plugins/portlet/src/main/resources/struts-plugin.xml struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?view=diff&rev=564602&r1=564601&r2=564602 ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java (original) +++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java Fri Aug 10 07:16:24 2007 @@ -21,7 +21,6 @@ package org.apache.struts2.portlet.dispatcher; import java.io.IOException; -import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.Locale; @@ -58,7 +57,6 @@ import org.apache.struts2.portlet.PortletRequestMap; import org.apache.struts2.portlet.PortletSessionMap; import org.apache.struts2.portlet.context.PortletActionContext; -import org.apache.struts2.portlet.context.ServletContextHolderListener; import org.apache.struts2.portlet.servlet.PortletServletContext; import org.apache.struts2.portlet.servlet.PortletServletRequest; import org.apache.struts2.portlet.servlet.PortletServletResponse; @@ -67,13 +65,11 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.ValidationAware; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.util.FileManager; import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.TextUtils; -import com.opensymphony.xwork2.util.ValueStack; /** * <!-- START SNIPPET: javadoc --> @@ -84,7 +80,7 @@ * </p> * <!-- END SNIPPET: javadoc --> * - * @author <a href="[EMAIL PROTECTED]">Nils-Helge Garli </a> + * @author Nils-Helge Garli * @author Rainer Hermanns * * <p><b>Init parameters</b></p> @@ -196,8 +192,7 @@ params.put(name, value); } - Dispatcher.setPortletSupportActive(true); - dispatcherUtils = new Dispatcher(ServletContextHolderListener.getServletContext(), params); + dispatcherUtils = new Dispatcher(new PortletServletContext(cfg.getPortletContext()), params); dispatcherUtils.init(); // For testability @@ -432,26 +427,7 @@ proxy.setMethod(mapping.getMethod()); request.setAttribute("struts.valueStack", proxy.getInvocation() .getStack()); - if (PortletActionConstants.RENDER_PHASE.equals(phase) - && TextUtils.stringSet(request - .getParameter(EVENT_ACTION))) { - Object action = request.getPortletSession() - .getAttribute(EVENT_ACTION); - if (action != null) { - ValueStack stack = proxy.getInvocation().getStack(); - Object top = stack.pop(); - stack.push(action); - stack.push(top); - } - } proxy.execute(); - if (PortletActionConstants.EVENT_PHASE.equals(phase)) { - // Store the executed action in the session for retrieval in the - // render phase. - ActionResponse actionResp = (ActionResponse) response; - request.getPortletSession().setAttribute(EVENT_ACTION, proxy.getAction()); - actionResp.setRenderParameter(EVENT_ACTION, "true"); - } } catch (ConfigurationException e) { LOG.error("Could not find action", e); throw new PortletException("Could not find action " + actionName, e); Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/interceptor/PortletStateInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/interceptor/PortletStateInterceptor.java?view=auto&rev=564602 ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/interceptor/PortletStateInterceptor.java (added) +++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/interceptor/PortletStateInterceptor.java Fri Aug 10 07:16:24 2007 @@ -0,0 +1,64 @@ +package org.apache.struts2.portlet.interceptor; + +import java.util.Map; + +import javax.portlet.ActionResponse; +import javax.portlet.RenderRequest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.portlet.PortletActionConstants; + +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.interceptor.AbstractInterceptor; +import com.opensymphony.xwork2.util.CompoundRoot; +import com.opensymphony.xwork2.util.TextUtils; +import com.opensymphony.xwork2.util.ValueStack; + +public class PortletStateInterceptor extends AbstractInterceptor implements PortletActionConstants { + + private final static Log LOG = LogFactory.getLog(PortletStateInterceptor.class); + + private static final long serialVersionUID = 6138452063353911784L; + + @Override + public String intercept(ActionInvocation invocation) throws Exception { + Integer phase = (Integer) invocation.getInvocationContext().get(PHASE); + if (RENDER_PHASE.equals(phase)) { + restoreStack(invocation); + return invocation.invoke(); + } else if (EVENT_PHASE.equals(phase)) { + try { + return invocation.invoke(); + } finally { + saveStack(invocation); + } + } else { + return invocation.invoke(); + } + } + + private void saveStack(ActionInvocation invocation) { + Map session = invocation.getInvocationContext().getSession(); + session.put("struts.portlet.valueStackFromEventPhase", invocation.getStack()); + ActionResponse actionResponse = (ActionResponse) invocation.getInvocationContext().get(RESPONSE); + actionResponse.setRenderParameter(EVENT_ACTION, "true"); + } + + private void restoreStack(ActionInvocation invocation) { + RenderRequest request = (RenderRequest) invocation.getInvocationContext().get(REQUEST); + if (TextUtils.stringSet(request.getParameter(EVENT_ACTION))) { + LOG.debug("Restoring value stack from event phase"); + ValueStack oldStack = (ValueStack) invocation.getInvocationContext().getSession().get( + "struts.portlet.valueStackFromEventPhase"); + if (oldStack != null) { + CompoundRoot oldRoot = oldStack.getRoot(); + ValueStack currentStack = invocation.getStack(); + CompoundRoot root = currentStack.getRoot(); + root.addAll(oldRoot); + LOG.debug("Restored stack"); + } + } + } + +} Modified: struts/struts2/trunk/plugins/portlet/src/main/resources/struts-plugin.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/resources/struts-plugin.xml?view=diff&rev=564602&r1=564601&r2=564602 ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/main/resources/struts-plugin.xml (original) +++ struts/struts2/trunk/plugins/portlet/src/main/resources/struts-plugin.xml Fri Aug 10 07:16:24 2007 @@ -41,8 +41,9 @@ <interceptors> <interceptor name="portletAware" class="org.apache.struts2.portlet.interceptor.PortletAwareInterceptor"/> - + <interceptor name="portletState" class="org.apache.struts2.portlet.interceptor.PortletStateInterceptor"/> <interceptor-stack name="portletDefaultStack"> + <interceptor-ref name="portletState"/> <interceptor-ref name="defaultStack"/> <interceptor-ref name="portletAware" /> </interceptor-stack> Modified: struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?view=diff&rev=564602&r1=564601&r2=564602 ============================================================================== --- struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java (original) +++ struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java Fri Aug 10 07:16:24 2007 @@ -44,7 +44,6 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.portlet.PortletActionConstants; -import org.apache.struts2.portlet.context.ServletContextHolderListener; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.jmock.core.Constraint; @@ -80,6 +79,7 @@ mockConfig = mock(PortletConfig.class); mockCtx = mock(PortletContext.class); mockConfig.stubs().method(ANYTHING); + mockCtx.stubs().method(ANYTHING); setupStub(initParams, mockConfig, "getInitParameter"); mockCtx.stubs().method("getAttributeNames").will(returnValue(Collections.enumeration(attributes.keySet()))); setupStub(attributes, mockCtx, "getAttribute"); @@ -88,7 +88,6 @@ setupStub(initParams, mockCtx, "getInitParameter"); mockConfig.stubs().method("getInitParameterNames").will(returnValue(Collections.enumeration(initParams.keySet()))); setupStub(initParams, mockConfig, "getInitParameter"); - mockConfig.stubs().method("getResourceBundle").will(returnValue(new ListResourceBundle() { protected Object[][] getContents() { return new String[][]{{"javax.portlet.title", "MyTitle"}}; @@ -116,10 +115,7 @@ public void testRender_ok() { final Mock mockResponse = mock(RenderResponse.class); mockResponse.stubs().method(ANYTHING); - final Mock servletContext = mock(ServletContext.class); - servletContext.stubs().method(ANYTHING); - ServletContextEvent event = new ServletContextEvent((ServletContext)servletContext.proxy()); - new ServletContextHolderListener().contextInitialized(event); + PortletMode mode = PortletMode.VIEW; Map requestParams = new HashMap(); @@ -170,16 +166,6 @@ initPortletConfig(initParams, new HashMap()); initRequest(requestParams, new HashMap(), new HashMap(), new HashMap(), PortletMode.VIEW, WindowState.NORMAL, true, null); setupActionFactory("/view", "testAction", "success", ValueStackFactory.getFactory().createValueStack()); - Constraint[] paramConstraints = new Constraint[] { - eq(PortletActionConstants.EVENT_ACTION), same(mockAction.proxy()) }; - - mockSession.expects(once()).method("setAttribute").with( - paramConstraints); - - mockResponse.expects(once()).method("setRenderParameter").with( - new Constraint[] { eq(PortletActionConstants.EVENT_ACTION), - eq("true") }); - //mockSession.expects(once()).method("setAttribute").with(new Constraint[]{eq(PortletActionConstants.LAST_MODE), eq(PortletMode.VIEW)}); try { dispatcher