Author: rgielen
Date: Thu Aug 23 01:57:36 2007
New Revision: 568895

URL: http://svn.apache.org/viewvc?rev=568895&view=rev
Log:
WW-1989, WW-2052, WW-2053, WW-2101, WW-2105:
Backporting portlet servlet wrapping, portlet redirect/redirectAction result 
and related issues to 2.0.x

Modified:
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml
    
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
    
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java
 Thu Aug 23 01:57:36 2007
@@ -341,7 +341,7 @@
         this.windowState = windowState;
     }
 
-    @StrutsTagAttribute(description="Specifies if this should be a portlet 
render or action URL")
+    @StrutsTagAttribute(description="Specifies if this should be a portlet 
render or action URL. Default is \"render\". To create an action URL, use 
\"action\".")
     public void setPortletUrlType(String portletUrlType) {
         this.portletUrlType = portletUrlType;
     }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java
 Thu Aug 23 01:57:36 2007
@@ -103,4 +103,24 @@
      * [EMAIL PROTECTED] 
org.apache.struts2.portlet.context.PortletActionContext}.
      */
     String DEFAULT_ACTION_FOR_MODE = "struts.portlet.defaultActionForMode";
+
+    /**
+     * Key for request attribute indicating if the action has been reset.
+     */
+    String ACTION_RESET = "struts.portlet.actionReset";
+
+    /**
+     * Key for session attribute indicating the location of the render direct 
action.
+     */
+    String RENDER_DIRECT_LOCATION = "struts.portlet.renderDirectLocation";
+
+    /**
+     * Session key where the value stack from the event phase is stored.
+     */
+    String STACK_FROM_EVENT_PHASE = "struts.portlet.valueStackFromEventPhase";
+
+    /**
+     * Default name of dispatcher servlet in web.xml
+     */
+    String DEFAULT_DISPATCHER_SERVLET_NAME = "Struts2PortletDispatcherServlet";
 }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
 Thu Aug 23 01:57:36 2007
@@ -22,16 +22,11 @@
 
 import java.util.Map;
 
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletResponse;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
+import javax.portlet.*;
 
 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 import org.apache.struts2.portlet.PortletActionConstants;
+import org.apache.struts2.StrutsStatics;
 
 import com.opensymphony.xwork2.ActionContext;
 
@@ -192,6 +187,14 @@
      */
     public static Map getModeNamespaceMap() {
         return (Map)getContext().get(MODE_NAMESPACE_MAP);
+    }
+
+    /**
+     * Get the portlet context.
+     * @return The portlet context.
+     */
+    public static PortletContext getPortletContext() {
+       return 
(PortletContext)getContext().get(StrutsStatics.STRUTS_PORTLET_CONTEXT);
     }
 
 }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java
 Thu Aug 23 01:57:36 2007
@@ -23,6 +23,10 @@
 import com.opensymphony.xwork2.Action;
 
 import java.io.Serializable;
+import java.util.Map;
+
+import org.apache.struts2.interceptor.SessionAware;
+import org.apache.struts2.portlet.PortletActionConstants;
 
 /**
  * When a portlet is targetted for an <code>event</code>, the portlet will 
receive two
@@ -38,7 +42,7 @@
  * specifying this action and the location of the view, which then will be 
executed in the
  * following render request.
  */
-public class DirectRenderFromEventAction implements Action, Serializable {
+public class DirectRenderFromEventAction implements SessionAware, 
PortletActionConstants, Action, Serializable {
 
     private static final long serialVersionUID = -1814807772308405785L;
 
@@ -54,20 +58,15 @@
     }
 
     /**
-     * Set the location of the view.
-     *
-     * @param location The location to set.
-     */
-    public void setLocation(String location) {
-        this.location = location;
-    }
-
-    /**
      * Always return success.
      *
      * @return SUCCESS
      */
     public String execute() throws Exception {
         return SUCCESS;
+    }
+
+    public void setSession(Map session) {
+        location = (String)session.get(RENDER_DIRECT_LOCATION);
     }
 }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
 Thu Aug 23 01:57:36 2007
@@ -20,23 +20,14 @@
  */
 package org.apache.struts2.portlet.dispatcher;
 
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.GenericPortlet;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletException;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletResponse;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionProxy;
+import com.opensymphony.xwork2.ActionProxyFactory;
+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 org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.struts2.StrutsConstants;
@@ -53,19 +44,20 @@
 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.util.HttpServletRequestMock;
+import org.apache.struts2.portlet.servlet.PortletServletContext;
+import org.apache.struts2.portlet.servlet.PortletServletRequest;
+import org.apache.struts2.portlet.servlet.PortletServletResponse;
 import org.apache.struts2.util.AttributeMap;
 
-import com.opensymphony.xwork2.util.FileManager;
-import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.ActionProxy;
-import com.opensymphony.xwork2.ActionProxyFactory;
-import com.opensymphony.xwork2.config.ConfigurationException;
-import com.opensymphony.xwork2.inject.Container;
-import com.opensymphony.xwork2.util.LocalizedTextUtil;
-import com.opensymphony.xwork2.util.TextUtils;
+import javax.portlet.*;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
 
 /**
  * <!-- START SNIPPET: javadoc -->
@@ -76,7 +68,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>
@@ -187,9 +179,10 @@
             String value = cfg.getInitParameter(name);
             params.put(name, value);
         }
-        
+
+        // TODO: CHECK IF NEEDED (RG Portlet Refactoring Backports)
         Dispatcher.setPortletSupportActive(true);
-        dispatcherUtils = new 
Dispatcher(ServletContextHolderListener.getServletContext(), params);
+        dispatcherUtils = new Dispatcher(new 
PortletServletContext(cfg.getPortletContext()), params);
         dispatcherUtils.init();
         
         // For testability
@@ -336,11 +329,22 @@
      */
     public HashMap createContextMap(Map requestMap, Map parameterMap,
             Map sessionMap, Map applicationMap, PortletRequest request,
-            PortletResponse response, PortletConfig portletConfig, Integer 
phase) {
+            PortletResponse response, PortletConfig portletConfig, Integer 
phase) throws IOException {
 
         // TODO Must put http request/response objects into map for use with
         // ServletActionContext
+        HttpServletResponse dummyResponse = new 
PortletServletResponse(response);
+        HttpServletRequest dummyRequest = new PortletServletRequest(request, 
getPortletContext());
+        ServletContext dummyServletContext = new 
PortletServletContext(getPortletContext());
+        if(EVENT_PHASE.equals(phase)) {
+            dummyRequest = dispatcherUtils.wrapRequest(dummyRequest, 
dummyServletContext);
+        }
         HashMap<String,Object> extraContext = new HashMap<String,Object>();
+        // The dummy servlet objects. Eases reuse of existing interceptors 
that uses the servlet objects.
+        extraContext.put(StrutsStatics.HTTP_REQUEST, dummyRequest);
+        extraContext.put(StrutsStatics.HTTP_RESPONSE, dummyResponse);
+        extraContext.put(StrutsStatics.SERVLET_CONTEXT, dummyServletContext);
+        // End dummy servlet objects
         extraContext.put(ActionContext.PARAMETERS, parameterMap);
         extraContext.put(ActionContext.SESSION, sessionMap);
         extraContext.put(ActionContext.APPLICATION, applicationMap);
@@ -397,13 +401,13 @@
             Map sessionMap, Map applicationMap, String portletNamespace,
             Integer phase) throws PortletException {
         LOG.debug("serviceAction");
-        HashMap extraContext = createContextMap(requestMap, parameterMap,
-                sessionMap, applicationMap, request, response,
-                getPortletConfig(), phase);
         String actionName = mapping.getName();
         String namespace = mapping.getNamespace();
         Dispatcher.setInstance(dispatcherUtils);
         try {
+            HashMap extraContext = createContextMap(requestMap, parameterMap,
+                    sessionMap, applicationMap, request, response,
+                    getPortletConfig(), phase);
             LOG.debug("Creating action proxy for name = " + actionName
                     + ", namespace = " + namespace);
             ActionProxy proxy = factory.createActionProxy(namespace,
@@ -411,27 +415,7 @@
             proxy.setMethod(mapping.getMethod());
             request.setAttribute("struts.valueStack", proxy.getInvocation()
                     .getStack());
-            if (PortletActionConstants.RENDER_PHASE.equals(phase)
-                    && TextUtils.stringSet(request
-                            .getParameter(EVENT_ACTION))) {
-
-                ActionProxy action = (ActionProxy) request.getPortletSession()
-                        .getAttribute(EVENT_ACTION);
-                if (action != null) {
-                    ValueStack stack = proxy.getInvocation().getStack();
-                    Object top = stack.pop();
-                    stack.push(action.getInvocation().getAction());
-                    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);
-                actionResp.setRenderParameter(EVENT_ACTION, "true");
-            }
         } catch (ConfigurationException e) {
             LOG.error("Could not find action", e);
             throw new PortletException("Could not find action " + actionName, 
e);
@@ -467,20 +451,18 @@
         ActionMapping mapping = null;
         String actionPath = null;
         if (resetAction(request)) {
-            mapping = (ActionMapping) actionMap.get(request.getPortletMode());
+            mapping = actionMap.get(request.getPortletMode());
         } else {
             actionPath = request.getParameter(ACTION_PARAM);
             if (!TextUtils.stringSet(actionPath)) {
-                mapping = (ActionMapping) actionMap.get(request
+                mapping = actionMap.get(request
                         .getPortletMode());
             } else {
                 
                 // Use the usual action mapper, but it is expecting an action 
extension
                 // on the uri, so we add the default one, which should be ok 
as the
                 // portlet is a portlet first, a servlet second
-                HttpServletRequestMock httpRequest = new 
HttpServletRequestMock()
-                    .setServletPath(actionPath + ".action")
-                    .setParameterMap(request.getParameterMap());
+                PortletServletRequest httpRequest = new 
PortletServletRequest(request, getPortletContext());
                 mapping = actionMapper.getMapping(httpRequest, 
dispatcherUtils.getConfigurationManager());
             }
         }
@@ -583,6 +565,12 @@
             if (!currentMode.equals(originatingMode)) {
                 reset = true;
             }
+        }
+        if(reset) {
+               request.setAttribute(ACTION_RESET, Boolean.TRUE);
+        }
+        else {
+               request.setAttribute(ACTION_RESET, Boolean.FALSE);
         }
         return reset;
     }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
 Thu Aug 23 01:57:36 2007
@@ -20,20 +20,8 @@
  */
 package org.apache.struts2.portlet.result;
 
-import java.io.IOException;
-import java.util.StringTokenizer;
-
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletException;
-import javax.portlet.PortletRequestDispatcher;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.util.TextUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.struts2.ServletActionContext;
@@ -41,14 +29,20 @@
 import org.apache.struts2.portlet.PortletActionConstants;
 import org.apache.struts2.portlet.context.PortletActionContext;
 
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.util.TextUtils;
+import javax.portlet.*;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.StringTokenizer;
+import java.util.Map;
 
 /**
  * Result type that includes a JSP to render.
  *
  */
-public class PortletResult extends StrutsResultSupport {
+public class PortletResult extends StrutsResultSupport implements 
PortletActionConstants {
 
     private static final long serialVersionUID = 434251393926178567L;
 
@@ -116,28 +110,26 @@
      * @param finalLocation
      * @param invocation
      */
-    protected void executeActionResult(String finalLocation,
-            ActionInvocation invocation) {
+    protected void executeActionResult(String finalLocation, ActionInvocation 
invocation) {
         LOG.debug("Executing result in Event phase");
         ActionResponse res = PortletActionContext.getActionResponse();
+        Map sessionMap = invocation.getInvocationContext().getSession();
         LOG.debug("Setting event render parameter: " + finalLocation);
         if (finalLocation.indexOf('?') != -1) {
-            convertQueryParamsToRenderParams(res, finalLocation
-                    .substring(finalLocation.indexOf('?') + 1));
-            finalLocation = finalLocation.substring(0, finalLocation
-                    .indexOf('?'));
+            convertQueryParamsToRenderParams(res, 
finalLocation.substring(finalLocation.indexOf('?') + 1));
+            finalLocation = finalLocation.substring(0, 
finalLocation.indexOf('?'));
         }
         if (finalLocation.endsWith(".action")) {
             // View is rendered with a view action...luckily...
             finalLocation = finalLocation.substring(0, finalLocation
                     .lastIndexOf("."));
-            res.setRenderParameter(PortletActionConstants.ACTION_PARAM, 
finalLocation);
+            res.setRenderParameter(ACTION_PARAM, finalLocation);
         } else {
             // View is rendered outside an action...uh oh...
             res.setRenderParameter(PortletActionConstants.ACTION_PARAM, 
"renderDirect");
-            res.setRenderParameter("location", finalLocation);
+            sessionMap.put(RENDER_DIRECT_LOCATION, finalLocation);
         }
-        res.setRenderParameter(PortletActionConstants.MODE_PARAM, 
PortletActionContext
+        res.setRenderParameter(MODE_PARAM, PortletActionContext
                 .getRequest().getPortletMode().toString());
     }
 
@@ -178,20 +170,6 @@
             res.setTitle(title);
         }
         LOG.debug("Location: " + finalLocation);
-        PortletRequestDispatcher preparator = cfg.getPortletContext()
-                .getNamedDispatcher("preparator");
-        if(preparator == null) {
-            throw new PortletException("Cannot look up 'preparator' servlet. 
Make sure that you" +
-                    "have configured it correctly in the web.xml file.");
-        }
-        new IncludeTemplate() {
-            protected void when(PortletException e) {
-                LOG.error("PortletException while dispatching to 'preparator' 
servlet", e);
-            }
-            protected void when(IOException e) {
-                LOG.error("IOException while dispatching to 'preparator' 
servlet", e);
-            }
-        }.include(preparator, req, res);
         PortletRequestDispatcher dispatcher = 
cfg.getPortletContext().getRequestDispatcher(finalLocation);
         if(dispatcher == null) {
             throw new PortletException("Could not locate dispatcher for '" + 
finalLocation + "'");

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java
 Thu Aug 23 01:57:36 2007
@@ -20,20 +20,10 @@
  */
 package org.apache.struts2.portlet.result;
 
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletException;
-import javax.portlet.PortletRequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.ValueStack;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.struts2.ServletActionContext;
@@ -47,10 +37,15 @@
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.context.Context;
 
-import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.util.ValueStack;
+import javax.portlet.ActionResponse;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 
 /**
  * <!-- START SNIPPET: description -->
@@ -160,7 +155,6 @@
      */
     public void executeRenderResult(String finalLocation,
             ActionInvocation invocation) throws Exception {
-        prepareServletActionContext();
         ValueStack stack = ActionContext.getContext().getValueStack();
 
         HttpServletRequest request = ServletActionContext.getRequest();
@@ -192,7 +186,7 @@
             if (encoding != null) {
                 contentType = contentType + ";charset=" + encoding;
             }
-
+            response.setContentType(contentType);
             Template t = getTemplate(stack,
                     velocityManager.getVelocityEngine(), invocation,
                     finalLocation, encoding);
@@ -202,8 +196,6 @@
             Writer writer = new OutputStreamWriter(response.getOutputStream(),
                     encoding);
 
-            response.setContentType(contentType);
-
             t.merge(context, writer);
 
             // always flush the writer (we used to only flush it if this was a
@@ -294,14 +286,4 @@
         return velocityManager.createContext(stack, request, response);
     }
 
-    /**
-     *  Prepares the servlet action context for this request
-     */
-    private void prepareServletActionContext() throws PortletException,
-            IOException {
-        PortletRequestDispatcher disp = PortletActionContext.getPortletConfig()
-                .getPortletContext().getNamedDispatcher("preparator");
-        disp.include(PortletActionContext.getRenderRequest(),
-                PortletActionContext.getRenderResponse());
-    }
 }

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java
 Thu Aug 23 01:57:36 2007
@@ -20,33 +20,24 @@
  */
 package org.apache.struts2.views.freemarker;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Locale;
-
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletException;
-import javax.portlet.PortletRequestDispatcher;
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.ValueStack;
+import freemarker.template.*;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.dispatcher.StrutsResultSupport;
 import org.apache.struts2.portlet.PortletActionConstants;
 import org.apache.struts2.portlet.context.PortletActionContext;
 import org.apache.struts2.views.util.ResourceUtil;
 
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.util.ValueStack;
-
-import freemarker.template.Configuration;
-import freemarker.template.ObjectWrapper;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
+import javax.portlet.ActionResponse;
+import javax.portlet.PortletException;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Locale;
 
 /**
  */
@@ -136,7 +127,6 @@
     private void executeRenderResult(String location,
                                      ActionInvocation invocation) throws 
TemplateException, IOException,
             TemplateModelException, PortletException {
-        prepareServletActionContext();
         this.location = location;
         this.invocation = invocation;
         this.configuration = getConfiguration();
@@ -162,17 +152,6 @@
                 postTemplateProcess(template, model);
             }
         }
-    }
-
-    /**
-     *
-     */
-    private void prepareServletActionContext() throws PortletException,
-            IOException {
-        PortletRequestDispatcher disp = PortletActionContext.getPortletConfig()
-                .getPortletContext().getNamedDispatcher("preparator");
-        disp.include(PortletActionContext.getRenderRequest(),
-                PortletActionContext.getRenderResponse());
     }
 
     /**

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml
 Thu Aug 23 01:57:36 2007
@@ -22,37 +22,49 @@
  */
 -->
 <!DOCTYPE struts PUBLIC
-    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-    "http://struts.apache.org/dtds/struts-2.0.dtd";>
-    
+        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+        "http://struts.apache.org/dtds/struts-2.0.dtd";>
+
 <struts>
     <package name="struts-portlet-default" extends="struts-default">
 
-          <result-types>
-                       <result-type name="dispatcher" 
class="org.apache.struts2.portlet.result.PortletResult" default="true"/>
-                       <result-type name="freemarker" 
class="org.apache.struts2.views.freemarker.PortletFreemarkerResult"/>
-                       <result-type name="velocity" 
class="org.apache.struts2.portlet.result.PortletVelocityResult"/>
-          </result-types>
-       
-       <interceptors>
-        <interceptor name="portlet-preferences" 
class="org.apache.struts2.portlet.interceptor.PortletPreferencesInterceptor"/>
-        <interceptor-stack name="portletDefaultStack">
-            <interceptor-ref name="defaultStack"/>
-            <interceptor-ref name="portlet-preferences" />
-        </interceptor-stack>
-        
-       </interceptors>
-       
-       <default-interceptor-ref name="portletDefaultStack"/>
-       
-          <action name="renderDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
-                       <result name="success">${location}</result>
-          </action>
-          <action name="freemarkerDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
-                       <result type="freemarker" 
name="success">${location}</result>
-          </action>
-          <action name="velocityDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
-                       <result type="velocity" 
name="success">${location}</result>
-          </action>
-       </package>
+        <result-types>
+            <result-type name="dispatcher" 
class="org.apache.struts2.portlet.result.PortletResult" default="true"/>
+            <result-type name="redirect" 
class="org.apache.struts2.portlet.result.PortletResult"/>
+                   <result-type name="redirectAction" 
class="org.apache.struts2.portlet.result.PortletActionRedirectResult"/>
+            <result-type name="freemarker" 
class="org.apache.struts2.views.freemarker.PortletFreemarkerResult"/>
+            <result-type name="velocity" 
class="org.apache.struts2.portlet.result.PortletVelocityResult"/>
+        </result-types>
+
+        <interceptors>
+            <interceptor name="portletAware" 
class="org.apache.struts2.portlet.interceptor.PortletAwareInterceptor"/>
+            <interceptor name="portletState" 
class="org.apache.struts2.portlet.interceptor.PortletStateInterceptor"/>
+            <!-- Default stack for operating in portlet environment -->
+            <interceptor-stack name="portletDefaultStack">
+                <interceptor-ref name="portletState"/>
+                <interceptor-ref name="defaultStack"/>
+                <interceptor-ref name="portletAware"/>
+            </interceptor-stack>
+            <!-- Extension of the default portlet stack which also includes 
the token interceptor -->
+            <interceptor-stack name="portletDefaultStackWithToken">
+                <interceptor-ref name="portletState"/>
+                <interceptor-ref name="token"/>
+                <interceptor-ref name="defaultStack"/>
+                <interceptor-ref name="portletAware"/>
+            </interceptor-stack>
+
+        </interceptors>
+
+        <default-interceptor-ref name="portletDefaultStack"/>
+
+        <action name="renderDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
+            <result name="success">${location}</result>
+        </action>
+        <action name="freemarkerDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
+            <result type="freemarker" name="success">${location}</result>
+        </action>
+        <action name="velocityDirect" 
class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction">
+            <result type="velocity" name="success">${location}</result>
+        </action>
+    </package>
 </struts>

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
 Thu Aug 23 01:57:36 2007
@@ -20,41 +20,21 @@
  */
 package org.apache.struts2.portlet.dispatcher;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.ListResourceBundle;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletContext;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletSession;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.portlet.WindowState;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.ActionProxy;
+import com.opensymphony.xwork2.ActionProxyFactory;
+import com.opensymphony.xwork2.util.ValueStack;
+import com.opensymphony.xwork2.util.ValueStackFactory;
 import junit.textui.TestRunner;
-
 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;
 
-import com.opensymphony.xwork2.Action;
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.ActionProxy;
-import com.opensymphony.xwork2.ActionProxyFactory;
-import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.util.ValueStackFactory;
+import javax.portlet.*;
+import java.util.*;
 
 /**
  * Jsr168DispatcherTest. Insert description.
@@ -80,6 +60,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 +69,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 +96,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 +147,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(mockActionProxy.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

Modified: 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java?rev=568895&r1=568894&r2=568895&view=diff
==============================================================================
--- 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
 (original)
+++ 
struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
 Thu Aug 23 01:57:36 2007
@@ -46,7 +46,7 @@
  * PortletResultTest. Insert description.
  *
  */
-public class PortletResultTest extends MockObjectTestCase {
+public class PortletResultTest extends MockObjectTestCase implements 
PortletActionConstants {
 
     Mock mockInvocation = null;
     Mock mockConfig = null;
@@ -79,7 +79,6 @@
         Mock mockRequest = mock(RenderRequest.class);
         Mock mockResponse = mock(RenderResponse.class);
         Mock mockRd = mock(PortletRequestDispatcher.class);
-        Mock mockPrep = mock(PortletRequestDispatcher.class);
 
         RenderRequest req = (RenderRequest)mockRequest.proxy();
         RenderResponse res = (RenderResponse)mockResponse.proxy();
@@ -90,9 +89,7 @@
 
         Constraint[] params = new Constraint[]{same(req), same(res)};
         mockRd.expects(once()).method("include").with(params);
-        mockPrep.expects(once()).method("include").with(params);
         
mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd));
-        
mockCtx.expects(once()).method("getNamedDispatcher").with(eq("preparator")).will(returnValue(mockPrep.proxy()));
         
mockResponse.expects(once()).method("setContentType").with(eq("text/html"));
         
mockConfig.expects(once()).method("getPortletContext").will(returnValue(ctx));
 
@@ -148,26 +145,27 @@
 
         Constraint[] params = new 
Constraint[]{eq(PortletActionConstants.ACTION_PARAM), eq("renderDirect")};
         mockResponse.expects(once()).method("setRenderParameter").with(params);
-        params = new Constraint[]{eq("location"), 
eq("/WEB-INF/pages/testJsp.jsp")};
-        mockResponse.expects(once()).method("setRenderParameter").with(params);
         params = new Constraint[]{eq(PortletActionConstants.MODE_PARAM), 
eq(PortletMode.VIEW.toString())};
         mockResponse.expects(once()).method("setRenderParameter").with(params);
         
mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
 
         ActionContext ctx = ActionContext.getContext();
 
+        Map session = new HashMap();
+
         ctx.put(PortletActionConstants.REQUEST, mockRequest.proxy());
         ctx.put(PortletActionConstants.RESPONSE, mockResponse.proxy());
         ctx.put(PortletActionConstants.PHASE, 
PortletActionConstants.EVENT_PHASE);
+        ctx.put(ActionContext.SESSION, session);
 
         PortletResult result = new PortletResult();
         try {
             result.doExecute("/WEB-INF/pages/testJsp.jsp", 
(ActionInvocation)mockInvocation.proxy());
-        }
-        catch(Exception e) {
+        } catch(Exception e) {
             e.printStackTrace();
             fail("Error occured!");
         }
+        assertEquals("/WEB-INF/pages/testJsp.jsp", 
session.get(RENDER_DIRECT_LOCATION));
     }
 
     public void testDoExecute_event_locationHasQueryParams() {
@@ -204,7 +202,6 @@
         Mock mockRequest = mock(RenderRequest.class);
         Mock mockResponse = mock(RenderResponse.class);
         Mock mockRd = mock(PortletRequestDispatcher.class);
-        Mock mockPrep = mock(PortletRequestDispatcher.class);
 
         RenderRequest req = (RenderRequest)mockRequest.proxy();
         RenderResponse res = (RenderResponse)mockResponse.proxy();
@@ -214,9 +211,7 @@
 
         Constraint[] params = new Constraint[]{same(req), same(res)};
         mockRd.expects(once()).method("include").with(params);
-        mockPrep.expects(once()).method("include").with(params);
         
mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd));
-        
mockCtx.expects(once()).method("getNamedDispatcher").with(eq("preparator")).will(returnValue(mockPrep.proxy()));
         
mockConfig.expects(once()).method("getPortletContext").will(returnValue(ctx));
 
         
mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));


Reply via email to