svn commit: r833701 - in /struts/sandbox/trunk/struts2-portlet2-plugin/src: main/java/org/apache/struts2/components/ main/java/org/apache/struts2/portlet/context/ main/java/org/apache/struts2/portlet/dispatcher/ main/java/org/apache/struts2/portlet/res...

View: New views
1 Messages — Rating Filter:   Alert me  

svn commit: r833701 - in /struts/sandbox/trunk/struts2-portlet2-plugin/src: main/java/org/apache/struts2/components/ main/java/org/apache/struts2/portlet/context/ main/java/org/apache/struts2/portlet/dispatcher/ main/java/org/apache/struts2/portlet/res...

by rgielen-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Author: rgielen
Date: Sat Nov  7 15:58:33 2009
New Revision: 833701

URL: http://svn.apache.org/viewvc?rev=833701&view=rev
Log:
SB-110:
Seperated pure JSR168 functionality from additional JSR286 stuff, using different Dispatcher portlet and automatic API level detection to support both Portlet 1.0 and 2.0 applications from the same plugin

Added:
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelper.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR168.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR286.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponseJSR286.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelperJSR286.java
Modified:
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr286Dispatcher.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
    struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/components/PortletUrlRenderer.java Sat Nov  7 15:58:33 2009
@@ -22,10 +22,13 @@
 
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import com.opensymphony.xwork2.inject.Inject;
 import org.apache.struts2.StrutsException;
 import org.apache.struts2.dispatcher.mapper.ActionMapper;
 import org.apache.struts2.portlet.util.PortletUrlHelper;
+import org.apache.struts2.portlet.util.PortletUrlHelperJSR286;
 import org.apache.struts2.portlet.context.PortletActionContext;
 import org.apache.commons.lang.xwork.StringUtils;
 
@@ -40,13 +43,22 @@
  */
 public class PortletUrlRenderer implements UrlRenderer {
 
+    private static final Logger LOG = LoggerFactory.getLogger(PortletUrlRenderer.class);
+
     /**
      * The servlet renderer used when not executing in a portlet context.
      */
     private UrlRenderer servletRenderer = null;
+    private PortletUrlHelper portletUrlHelper = null;
 
     public PortletUrlRenderer() {
         this.servletRenderer = new ServletUrlRenderer();
+
+        if (PortletActionContext.isJSR268Supported()) {
+            this.portletUrlHelper = new PortletUrlHelperJSR286();
+        } else {
+            this.portletUrlHelper = new PortletUrlHelper();
+        }
     }
 
     @Inject
@@ -66,9 +78,9 @@
 
         String result;
         if (onlyActionSpecified(urlComponent)) {
-                result = PortletUrlHelper.buildUrl(urlComponent.getAction(), urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(), urlComponent.getPortletUrlType(), urlComponent.getPortletMode(), urlComponent.getWindowState());
+                result = portletUrlHelper.buildUrl(urlComponent.getAction(), urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(), urlComponent.getPortletUrlType(), urlComponent.getPortletMode(), urlComponent.getWindowState());
         } else if(onlyValueSpecified(urlComponent)){
-                result = PortletUrlHelper.buildResourceUrl(urlComponent.getValue(), urlComponent.getParameters());
+                result = portletUrlHelper.buildResourceUrl(urlComponent.getValue(), urlComponent.getParameters());
         }
         else {
          result = createDefaultUrl(urlComponent);
@@ -99,7 +111,7 @@
  ActionInvocation ai = (ActionInvocation)urlComponent.getStack().getContext().get(
  ActionContext.ACTION_INVOCATION);
  String action = ai.getProxy().getActionName();
- result = PortletUrlHelper.buildUrl(action, urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(),
+ result = portletUrlHelper.buildUrl(action, urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(),
                 urlComponent.getPortletUrlType(), urlComponent.getPortletMode(), urlComponent.getWindowState());
  return result;
  }
@@ -138,7 +150,7 @@
                 }
             }
             if (action != null) {
-                String result = PortletUrlHelper.buildUrl(action, namespace, null,
+                String result = portletUrlHelper.buildUrl(action, namespace, null,
                         formComponent.getParameters(), type, formComponent.portletMode, formComponent.windowState);
                 formComponent.addParameter("action", result);
 

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java Sat Nov  7 15:58:33 2009
@@ -216,4 +216,13 @@
  return EVENT_PHASE.equals(getPhase());
  }
 
+    /**
+     * Whether JSR286 features are supported.
+     *
+     * @return <code>true</code> if {@link javax.portlet.PortletContext#getMajorVersion()} returns a value greater than 1
+     */
+    public static boolean isJSR268Supported() {
+        return getPortletContext().getMajorVersion() > 1;
+    }
+
 }

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java Sat Nov  7 15:58:33 2009
@@ -412,7 +412,7 @@
         try {
             ServletContext servletContext = new PortletServletContext(getPortletContext());
             HttpServletRequest servletRequest = new PortletServletRequest(request, getPortletContext());
-            HttpServletResponse servletResponse = new PortletServletResponse(response);
+            HttpServletResponse servletResponse = createPortletServletResponse(response);
             if(EVENT_PHASE.equals(phase)) {
              servletRequest = dispatcherUtils.wrapRequest(servletRequest, servletContext);
          if(servletRequest instanceof MultiPartRequestWrapper) {
@@ -448,7 +448,7 @@
         }
     }
 
- /**
+    /**
      * Returns a Map of all application attributes. Copies all attributes from
      * the {@link PortletActionContext}into an {@link ApplicationMap}.
      *
@@ -613,4 +613,15 @@
         this.actionMapper = actionMapper;
     }
 
+    /**
+     * Method to create a PortletServletResponse matching the used Portlet API, to be overridden for JSR286 Dispatcher.
+     *
+     * @param response The Response used for building the wrapper.
+     *
+     * @return The wrapper response for Servlet bound usage.
+     */
+    protected PortletServletResponse createPortletServletResponse( PortletResponse response ) {
+        return new PortletServletResponse(response);
+    }
+
 }

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr286Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr286Dispatcher.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr286Dispatcher.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr286Dispatcher.java Sat Nov  7 15:58:33 2009
@@ -4,6 +4,8 @@
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import static org.apache.struts2.portlet.PortletContstants.SERVE_RESOURCE_PHASE;
+import org.apache.struts2.portlet.servlet.PortletServletResponse;
+import org.apache.struts2.portlet.servlet.PortletServletResponseJSR286;
 
 import javax.portlet.*;
 import java.io.IOException;
@@ -54,4 +56,8 @@
         return super.getDefaultActionPath(portletRequest);
     }
 
+    @Override
+    protected PortletServletResponse createPortletServletResponse( PortletResponse response ) {
+        return new PortletServletResponseJSR286(response);
+    }
 }

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResult.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResult.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResult.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResult.java Sat Nov  7 15:58:33 2009
@@ -24,14 +24,7 @@
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import javax.portlet.PortletContext;
-import javax.portlet.PortletException;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletRequestDispatcher;
-import javax.portlet.PortletRequest;
-import javax.portlet.MimeResponse;
-import javax.portlet.RenderResponse;
-import javax.portlet.StateAwareResponse;
+import javax.portlet.*;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -71,14 +64,26 @@
 
  protected PortletMode portletMode;
 
+    PortletResultHelper resultHelper;
+
  public PortletResult() {
  super();
+        determineResultHelper();
  }
 
  public PortletResult(String location) {
  super(location);
+        determineResultHelper();
  }
 
+    private void determineResultHelper() {
+        if (PortletActionContext.isJSR268Supported()) {
+            this.resultHelper = new PortletResultHelperJSR286();
+        } else {
+            this.resultHelper = new PortletResultHelperJSR168();
+        }
+    }
+
  /**
  * Execute the result. Obtains the
  * {@link javax.portlet.PortletRequestDispatcher}from the
@@ -128,28 +133,28 @@
  protected void executeActionResult(String finalLocation, ActionInvocation invocation) throws Exception {
         String phase = (PortletActionContext.isEvent()) ? "Event" : "Action";
  if (LOG.isDebugEnabled()) LOG.debug("Executing result in "+phase+" phase");
- StateAwareResponse res = (StateAwareResponse)PortletActionContext.getResponse();
  Map sessionMap = invocation.getInvocationContext().getSession();
  if (LOG.isDebugEnabled()) LOG.debug("Setting event render parameter: " + finalLocation);
  if (finalLocation.indexOf('?') != -1) {
- convertQueryParamsToRenderParams(res, finalLocation.substring(finalLocation.indexOf('?') + 1));
+ convertQueryParamsToRenderParams(finalLocation.substring(finalLocation.indexOf('?') + 1));
  finalLocation = finalLocation.substring(0, finalLocation.indexOf('?'));
  }
+        PortletResponse response = PortletActionContext.getResponse();
  if (finalLocation.endsWith(".action")) {
  // View is rendered with a view action...luckily...
  finalLocation = finalLocation.substring(0, finalLocation.lastIndexOf("."));
- res.setRenderParameter(ACTION_PARAM, finalLocation);
+ resultHelper.setRenderParameter(response, ACTION_PARAM, finalLocation);
  } else {
  // View is rendered outside an action...uh oh...
- res.setRenderParameter(ACTION_PARAM, "renderDirect");
+ resultHelper.setRenderParameter(response, ACTION_PARAM, "renderDirect");
  sessionMap.put(RENDER_DIRECT_LOCATION, finalLocation);
  }
  if(portletMode != null) {
- res.setPortletMode(portletMode);
- res.setRenderParameter(PortletActionConstants.MODE_PARAM, portletMode.toString());
+ resultHelper.setPortletMode(response, portletMode);
+ resultHelper.setRenderParameter(response, PortletActionConstants.MODE_PARAM, portletMode.toString());
  }
  else {
- res.setRenderParameter(PortletActionConstants.MODE_PARAM, PortletActionContext.getRequest().getPortletMode()
+ resultHelper.setRenderParameter(response, PortletActionConstants.MODE_PARAM, PortletActionContext.getRequest().getPortletMode()
  .toString());
  }
  }
@@ -160,13 +165,13 @@
  * @param response
  * @param queryParams
  */
- protected static void convertQueryParamsToRenderParams(StateAwareResponse response, String queryParams) {
+ protected void convertQueryParamsToRenderParams(String queryParams) {
  StringTokenizer tok = new StringTokenizer(queryParams, "&");
  while (tok.hasMoreTokens()) {
  String token = tok.nextToken();
  String key = token.substring(0, token.indexOf('='));
  String value = token.substring(token.indexOf('=') + 1);
- response.setRenderParameter(key, value);
+ resultHelper.setRenderParameter(PortletActionContext.getResponse(), key, value);
  }
  }
 
@@ -181,26 +186,26 @@
         if (LOG.isDebugEnabled()) LOG.debug("Executing mime result");
         PortletContext ctx = PortletActionContext.getPortletContext();
         PortletRequest req = PortletActionContext.getRequest();
-        MimeResponse res = (MimeResponse)PortletActionContext.getResponse();
-        res.setContentType(contentType);
+        PortletResponse res = PortletActionContext.getResponse();
+
  if (StringUtils.isNotEmpty(title) && res instanceof RenderResponse) {
     ((RenderResponse)res).setTitle(title);
  }
         if (LOG.isDebugEnabled()) LOG.debug("Location: " + finalLocation);
+        PortletRequestDispatcher dispatcher;
         if (useDispatcherServlet) {
             req.setAttribute(DISPATCH_TO, finalLocation);
-            PortletRequestDispatcher dispatcher = ctx.getNamedDispatcher(dispatcherServletName);
+            dispatcher = ctx.getNamedDispatcher(dispatcherServletName);
             if(dispatcher == null) {
                 throw new PortletException("Could not locate dispatcher servlet \"" + dispatcherServletName + "\". Please configure it in your web.xml file");
             }
-            dispatcher.include(req, res);
         } else {
-            PortletRequestDispatcher dispatcher = ctx.getRequestDispatcher(finalLocation);
+            dispatcher = ctx.getRequestDispatcher(finalLocation);
             if (dispatcher == null) {
                 throw new PortletException("Could not locate dispatcher for '" + finalLocation + "'");
             }
-            dispatcher.include(req, res);
         }
+        resultHelper.include( dispatcher, contentType, req, res );
     }
 
  /**

Added: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelper.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelper.java?rev=833701&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelper.java (added)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelper.java Sat Nov  7 15:58:33 2009
@@ -0,0 +1,41 @@
+package org.apache.struts2.portlet.result;
+
+import javax.portlet.*;
+import java.io.IOException;
+
+/**
+ * PortletResultHelper abstracts Portlet API result functions specific to the used API spec version.
+ *
+ * @author Rene Gielen
+ */
+
+public interface PortletResultHelper {
+
+    /**
+     * Set a render parameter, abstracted from the used Portlet API version
+     *
+     * @param response The response to set the parameter on.
+     * @param key      The parameter key to set.
+     * @param value    The parameter value to set.
+     */
+    void setRenderParameter( PortletResponse response, String key, String value );
+
+    /**
+     * Set a portlet mode, abstracted from the used Portlet API version
+     *
+     * @param response    The response to set the portlet mode on.
+     * @param portletMode The portlet mode to set.
+     */
+    void setPortletMode( PortletResponse response, PortletMode portletMode ) throws PortletModeException;
+
+    /**
+     * Call a dispatcher's include method, abstracted from the used Portlet API version.
+     *
+     * @param dispatcher  The dispatcher to call the include method on.
+     * @param contentType The content type to set for the response.
+     * @param request     The request to use for including
+     * @param response    The response to use for including
+     */
+    void include( PortletRequestDispatcher dispatcher, String contentType, PortletRequest request,
+                  PortletResponse response ) throws IOException, PortletException;
+}

Added: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR168.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR168.java?rev=833701&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR168.java (added)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR168.java Sat Nov  7 15:58:33 2009
@@ -0,0 +1,54 @@
+package org.apache.struts2.portlet.result;
+
+import javax.portlet.*;
+import java.io.IOException;
+
+/**
+ * PortletResultHelperJSR168 implements PortletResultHelper for Portlet 1.0 API (JSR168).
+ *
+ * @author Rene Gielen
+ */
+public class PortletResultHelperJSR168 implements PortletResultHelper {
+
+    /**
+     * Set a render parameter, abstracted from the used Portlet API version. This implementation assumes that the given
+     * response must be a {@link javax.portlet.ActionResponse}, as JSR168 implies.
+     *
+     * @param response The response to set the parameter on.
+     * @param key      The parameter key to set.
+     * @param value    The parameter value to set.
+     */
+    public void setRenderParameter( PortletResponse response, String key, String value ) {
+        ((ActionResponse) response).setRenderParameter(key, value);
+    }
+
+    /**
+     * Set a portlet mode, abstracted from the used Portlet API version. This implementation assumes that the given
+     * response must be a {@link javax.portlet.ActionResponse}, as JSR168 implies.
+     *
+     * @param response    The response to set the portlet mode on.
+     * @param portletMode The portlet mode to set.
+     */
+    public void setPortletMode( PortletResponse response, PortletMode portletMode ) throws PortletModeException {
+        ((ActionResponse) response).setPortletMode(portletMode);
+    }
+
+    /**
+     * Call a dispatcher's include method, abstracted from the used Portlet API version. This implementation assumes
+     * that the given the request must be a {@link javax.portlet.RenderRequest} and the response must be a {@link
+     * javax.portlet.RenderResponse}, as JSR168 implies.
+     *
+     * @param dispatcher  The dispatcher to call the include method on.
+     * @param contentType The content type to set for the response.
+     * @param request     The request to use for including
+     * @param response    The response to use for including
+     */
+    public void include( PortletRequestDispatcher dispatcher, String contentType, PortletRequest request,
+                         PortletResponse response ) throws IOException, PortletException {
+        RenderRequest req = (RenderRequest) request;
+        RenderResponse res = (RenderResponse) response;
+        res.setContentType(contentType);
+        dispatcher.include(req, res);
+    }
+
+}
\ No newline at end of file

Added: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR286.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR286.java?rev=833701&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR286.java (added)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/result/PortletResultHelperJSR286.java Sat Nov  7 15:58:33 2009
@@ -0,0 +1,49 @@
+package org.apache.struts2.portlet.result;
+
+import javax.portlet.*;
+import java.io.IOException;
+
+/**
+ * PortletResultHelperJSR286 implements PortletResultHelper for Portlet 2.0 API (JSR286).
+ *
+ * @author Rene Gielen
+ */
+public class PortletResultHelperJSR286 implements PortletResultHelper {
+
+    /**
+     * Set a render parameter, abstracted from the used Portlet API version
+     *
+     * @param response The response to set the parameter on.
+     * @param key      The parameter key to set.
+     * @param value    The parameter value to set.
+     */
+    public void setRenderParameter( PortletResponse response, String key, String value ) {
+        ((StateAwareResponse) response).setRenderParameter(key, value);
+    }
+
+    /**
+     * Set a portlet mode, abstracted from the used Portlet API version
+     *
+     * @param response    The response to set the portlet mode on.
+     * @param portletMode The portlet mode to set.
+     */
+    public void setPortletMode( PortletResponse response, PortletMode portletMode ) throws PortletModeException {
+        ((StateAwareResponse) response).setPortletMode(portletMode);
+    }
+
+    /**
+     * Call a dispatcher's include method, abstracted from the used Portlet API version.
+     *
+     * @param dispatcher  The dispatcher to call the include method on.
+     * @param contentType The content type to set for the response.
+     * @param request     The request to use for including
+     * @param response    The response to use for including
+     */
+    public void include( PortletRequestDispatcher dispatcher, String contentType, PortletRequest request,
+                         PortletResponse response ) throws IOException, PortletException {
+        MimeResponse res = (MimeResponse) response;
+        res.setContentType(contentType);
+        dispatcher.include(request, res);
+    }
+
+}

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java Sat Nov  7 15:58:33 2009
@@ -24,17 +24,15 @@
 import java.io.PrintWriter;
 import java.util.Locale;
 
-import javax.portlet.MimeResponse;
 import javax.portlet.PortletResponse;
 import javax.portlet.RenderResponse;
-import javax.portlet.ResourceResponse;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 
 public class PortletServletResponse implements HttpServletResponse {
 
- private PortletResponse portletResponse;
+ protected PortletResponse portletResponse;
 
  public PortletServletResponse(PortletResponse portletResponse) {
  this.portletResponse = portletResponse;
@@ -108,134 +106,125 @@
  throw new IllegalStateException("Not allowed in a portlet");
  }
 
- public void flushBuffer() throws IOException {
- if(portletResponse instanceof MimeResponse) {
- ((MimeResponse)portletResponse).flushBuffer();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public int getBufferSize() {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).getBufferSize();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public String getCharacterEncoding() {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).getCharacterEncoding();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public String getContentType() {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).getContentType();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public Locale getLocale() {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).getLocale();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public ServletOutputStream getOutputStream() throws IOException {
- if(portletResponse instanceof MimeResponse) {
- return new PortletServletOutputStream(((MimeResponse)portletResponse).getPortletOutputStream());
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public PrintWriter getWriter() throws IOException {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).getWriter();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public boolean isCommitted() {
- if(portletResponse instanceof MimeResponse) {
- return ((MimeResponse)portletResponse).isCommitted();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public void reset() {
- if(portletResponse instanceof MimeResponse) {
- ((MimeResponse)portletResponse).reset();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public void resetBuffer() {
- if(portletResponse instanceof MimeResponse) {
- ((MimeResponse)portletResponse).resetBuffer();
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public void setBufferSize(int size) {
- if(portletResponse instanceof MimeResponse) {
- ((MimeResponse)portletResponse).setBufferSize(size);
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public void setCharacterEncoding(String charset) {
- if(portletResponse instanceof ResourceResponse) {
- ((ResourceResponse)portletResponse).setCharacterEncoding(charset);
- }
- throw new IllegalStateException("Only allowed in resource phase");
- }
-
- public void setContentLength(int len) {
- if(portletResponse instanceof ResourceResponse) {
- ((ResourceResponse)portletResponse).setContentLength(len);
- }
- throw new IllegalStateException("Only allowed in resource phase");
- }
-
- public void setContentType(String type) {
- if(portletResponse instanceof MimeResponse) {
- ((MimeResponse)portletResponse).setContentType(type);
- }
- else {
- throw new IllegalStateException("Only allowed in render or resource phase");
- }
- }
-
- public void setLocale(Locale loc) {
- if(portletResponse instanceof ResourceResponse) {
- ((ResourceResponse)portletResponse).setLocale(loc);
- }
- throw new IllegalStateException("Only allowed in resource phase");
- }
+    public void flushBuffer() throws IOException {
+        if(portletResponse instanceof RenderResponse) {
+            ((RenderResponse)portletResponse).flushBuffer();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public int getBufferSize() {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).getBufferSize();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public String getCharacterEncoding() {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).getCharacterEncoding();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public String getContentType() {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).getContentType();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public Locale getLocale() {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).getLocale();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public ServletOutputStream getOutputStream() throws IOException {
+        if(portletResponse instanceof RenderResponse) {
+            return new PortletServletOutputStream(((RenderResponse)portletResponse).getPortletOutputStream());
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public PrintWriter getWriter() throws IOException {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).getWriter();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public boolean isCommitted() {
+        if(portletResponse instanceof RenderResponse) {
+            return ((RenderResponse)portletResponse).isCommitted();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public void reset() {
+        if(portletResponse instanceof RenderResponse) {
+            ((RenderResponse)portletResponse).reset();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public void resetBuffer() {
+        if(portletResponse instanceof RenderResponse) {
+            ((RenderResponse)portletResponse).resetBuffer();
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public void setBufferSize(int size) {
+        if(portletResponse instanceof RenderResponse) {
+            ((RenderResponse)portletResponse).setBufferSize(size);
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public void setCharacterEncoding(String charset) {
+        throw new IllegalStateException("Not allowed in a portlet");
+    }
+
+    public void setContentLength(int len) {
+        throw new IllegalStateException("Not allowed in a portlet");
+    }
+
+    public void setContentType(String type) {
+        if(portletResponse instanceof RenderResponse) {
+            ((RenderResponse)portletResponse).setContentType(type);
+        }
+        else {
+            throw new IllegalStateException("Not allowed in event phase");
+        }
+    }
+
+    public void setLocale(Locale loc) {
+        throw new IllegalStateException("Not allowed in a portlet");
+    }
 
  public PortletResponse getPortletResponse() {
  return portletResponse;

Added: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponseJSR286.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponseJSR286.java?rev=833701&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponseJSR286.java (added)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponseJSR286.java Sat Nov  7 15:58:33 2009
@@ -0,0 +1,152 @@
+package org.apache.struts2.portlet.servlet;
+
+import javax.servlet.ServletOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+import javax.portlet.ResourceResponse;
+import javax.portlet.MimeResponse;
+import javax.portlet.PortletResponse;
+
+/**
+ * PortletServletResponseJSR286.
+ *
+ * @author Rene Gielen
+ */
+public class PortletServletResponseJSR286 extends PortletServletResponse {
+
+    public PortletServletResponseJSR286( PortletResponse portletResponse ) {
+        super(portletResponse);
+    }
+
+
+    public void flushBuffer() throws IOException {
+        if(portletResponse instanceof MimeResponse) {
+            ((MimeResponse)portletResponse).flushBuffer();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public int getBufferSize() {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).getBufferSize();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public String getCharacterEncoding() {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).getCharacterEncoding();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public String getContentType() {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).getContentType();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public Locale getLocale() {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).getLocale();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public ServletOutputStream getOutputStream() throws IOException {
+        if(portletResponse instanceof MimeResponse) {
+            return new PortletServletOutputStream(((MimeResponse)portletResponse).getPortletOutputStream());
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public PrintWriter getWriter() throws IOException {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).getWriter();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public boolean isCommitted() {
+        if(portletResponse instanceof MimeResponse) {
+            return ((MimeResponse)portletResponse).isCommitted();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public void reset() {
+        if(portletResponse instanceof MimeResponse) {
+            ((MimeResponse)portletResponse).reset();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public void resetBuffer() {
+        if(portletResponse instanceof MimeResponse) {
+            ((MimeResponse)portletResponse).resetBuffer();
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public void setBufferSize(int size) {
+        if(portletResponse instanceof MimeResponse) {
+            ((MimeResponse)portletResponse).setBufferSize(size);
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public void setCharacterEncoding(String charset) {
+        if(portletResponse instanceof ResourceResponse) {
+            ((ResourceResponse)portletResponse).setCharacterEncoding(charset);
+        }
+        throw new IllegalStateException("Only allowed in resource phase");
+    }
+
+    public void setContentLength(int len) {
+        if(portletResponse instanceof ResourceResponse) {
+            ((ResourceResponse)portletResponse).setContentLength(len);
+        }
+        throw new IllegalStateException("Only allowed in resource phase");
+    }
+
+    public void setContentType(String type) {
+        if(portletResponse instanceof MimeResponse) {
+            ((MimeResponse)portletResponse).setContentType(type);
+        }
+        else {
+            throw new IllegalStateException("Only allowed in render or resource phase");
+        }
+    }
+
+    public void setLocale(Locale loc) {
+        if(portletResponse instanceof ResourceResponse) {
+            ((ResourceResponse)portletResponse).setLocale(loc);
+        }
+        throw new IllegalStateException("Only allowed in resource phase");
+    }
+
+}

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelper.java Sat Nov  7 15:58:33 2009
@@ -29,13 +29,7 @@
 import java.util.Map;
 import java.util.StringTokenizer;
 
-import javax.portlet.BaseURL;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletSecurityException;
-import javax.portlet.PortletURL;
-import javax.portlet.PortletRequest;
-import javax.portlet.MimeResponse;
-import javax.portlet.WindowState;
+import javax.portlet.*;
 
 import org.apache.struts2.StrutsException;
 import org.apache.struts2.portlet.context.PortletActionContext;
@@ -43,6 +37,7 @@
 
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
 /**
  * Helper class for creating Portlet URLs. Portlet URLs are fundamentally different from regular
  * servlet URLs since they never target the application itself; all requests go through the portlet
@@ -68,7 +63,7 @@
      * @param state The WindowState of the URL.
      * @return The URL String.
      */
-    public static String buildUrl(String action, String namespace, String method, Map<String, Object> params,
+    public String buildUrl(String action, String namespace, String method, Map<String, Object> params,
             String type, String mode, String state) {
         return buildUrl(action, namespace, method, params, null, type, mode, state,
                 true, true);
@@ -77,21 +72,19 @@
     /**
      * Create a portlet URL with for the specified action and namespace.
      *
-     * @see #buildUrl(String, String, Map, String, String, String)
+     * @see #buildUrl(String, String, String, java.util.Map, String, String, String)
      */
-    public static String buildUrl(String action, String namespace, String method, Map<String, Object> params,
+    public String buildUrl(String action, String namespace, String method, Map<String, Object> params,
             String scheme, String type, String portletMode, String windowState,
             boolean includeContext, boolean encodeResult) {
      StringBuffer resultingAction = new StringBuffer();
         PortletRequest request = PortletActionContext.getRequest();
-        MimeResponse response = (MimeResponse)PortletActionContext.getResponse();
         LOG.debug("Creating url. Action = " + action + ", Namespace = "
                 + namespace + ", Type = " + type);
         namespace = prependNamespace(namespace, portletMode);
         if (StringUtils.isEmpty(portletMode)) {
             portletMode = PortletActionContext.getRequest().getPortletMode().toString();
         }
-        String result = null;
         int paramStartIndex = action.indexOf('?');
         if (paramStartIndex > 0) {
             String value = action;
@@ -117,31 +110,10 @@
         }
         if (LOG.isDebugEnabled()) LOG.debug("Resulting actionPath: " + resultingAction);
         params.put(ACTION_PARAM, new String[] { resultingAction.toString() });
-
-        BaseURL url = null;
-        if ("action".equalsIgnoreCase(type)) {
-            if (LOG.isDebugEnabled()) LOG.debug("Creating action url");
-            url = response.createActionURL();
-        }
-        else if("resource".equalsIgnoreCase(type)) {
-         if (LOG.isDebugEnabled()) LOG.debug("Creating resource url");
-         url = response.createResourceURL();
-        }
-        else {
-            if (LOG.isDebugEnabled()) LOG.debug("Creating render url");
-            url = response.createRenderURL();
-        }
-
         params.put(MODE_PARAM, new String[]{portletMode});
-        url.setParameters(ensureParamsAreStringArrays(params));
+        final Map<String, String[]> portletParams = ensureParamsAreStringArrays(params);
 
-        if ("HTTPS".equalsIgnoreCase(scheme)) {
-            try {
-                url.setSecure(true);
-            } catch (PortletSecurityException e) {
-                LOG.error("Cannot set scheme to https", e);
-            }
-        }
+        Object url = createUrl(scheme, type, portletParams);
         if(url instanceof PortletURL) {
          try {
                 final PortletURL portletUrl = (PortletURL) url;
@@ -151,7 +123,8 @@
          LOG.error("Unable to set mode or state:" + e.getMessage(), e);
          }
         }
-        result = url.toString();
+
+        String result = url.toString();
         // TEMP BUG-WORKAROUND FOR DOUBLE ESCAPING OF AMPERSAND
         if(result.indexOf("&") >= 0) {
             result = result.replace("&", "&");
@@ -160,6 +133,30 @@
 
     }
 
+    protected Object createUrl( String scheme, String type, Map<String, String[]> portletParams ) {
+        RenderResponse response = PortletActionContext.getRenderResponse();
+        PortletURL url;
+        if ("action".equalsIgnoreCase(type)) {
+            if (LOG.isDebugEnabled()) LOG.debug("Creating action url");
+            url = response.createActionURL();
+        }
+        else {
+            if (LOG.isDebugEnabled()) LOG.debug("Creating render url");
+            url = response.createRenderURL();
+        }
+
+        url.setParameters(portletParams);
+
+        if ("HTTPS".equalsIgnoreCase(scheme)) {
+            try {
+                url.setSecure(true);
+            } catch ( PortletSecurityException e) {
+                LOG.error("Cannot set scheme to https", e);
+            }
+        }
+        return url;
+    }
+
     /**
      *
      * Prepend the namespace configuration for the specified namespace and PortletMode.
@@ -169,7 +166,7 @@
      *
      * @return prepended namespace.
      */
-    private static String prependNamespace(String namespace, String portletMode) {
+    private String prependNamespace(String namespace, String portletMode) {
         StringBuffer sb = new StringBuffer();
         PortletMode mode = PortletActionContext.getRequest().getPortletMode();
         if(StringUtils.isNotEmpty(portletMode)) {
@@ -204,7 +201,7 @@
      * @param value
      * @return encoded url to non Struts action resources.
      */
-    public static String buildResourceUrl(String value, Map params) {
+    public String buildResourceUrl(String value, Map params) {
         StringBuffer sb = new StringBuffer();
         // Relative URLs are not allowed in a portlet
         if (!value.startsWith("/")) {
@@ -229,8 +226,12 @@
                 throw new StrutsException("Encoding "+ENCODING+" not found");
             }
         }
-        MimeResponse resp = (MimeResponse)PortletActionContext.getResponse();
         PortletRequest req = PortletActionContext.getRequest();
+        return encodeUrl(sb, req);
+    }
+
+    protected String encodeUrl( StringBuffer sb, PortletRequest req ) {
+        RenderResponse resp = PortletActionContext.getRenderResponse();
         return resp.encodeURL(req.getContextPath() + sb.toString());
     }
 
@@ -245,14 +246,12 @@
         Map<String, String[]> result = null;
         if (params != null) {
             result = new LinkedHashMap<String, String[]>(params.size());
-            Iterator<String> it = params.keySet().iterator();
-            while (it.hasNext()) {
-                String key = it.next();
+            for ( String key : params.keySet() ) {
                 Object val = params.get(key);
                 if (val instanceof String[]) {
-                    result.put(key, (String[])val);
+                    result.put(key, (String[]) val);
                 } else {
-                    result.put(key, new String[] { val.toString() });
+                    result.put(key, new String[]{val.toString()});
                 }
             }
         }
@@ -267,7 +266,7 @@
      * @return The WindowState that mathces the <tt>windowState</tt> String, or if
      * the String is blank, the current WindowState.
      */
-    private static WindowState getWindowState(PortletRequest portletReq,
+    private WindowState getWindowState(PortletRequest portletReq,
             String windowState) {
         WindowState state = portletReq.getWindowState();
         if (StringUtils.isNotEmpty(windowState)) {
@@ -293,7 +292,7 @@
      * @return The PortletMode that mathces the <tt>portletMode</tt> String, or if
      * the String is blank, the current PortletMode.
      */
-    private static PortletMode getPortletMode(PortletRequest portletReq,
+    private PortletMode getPortletMode(PortletRequest portletReq,
             String portletMode) {
         PortletMode mode = portletReq.getPortletMode();
 

Added: struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelperJSR286.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelperJSR286.java?rev=833701&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelperJSR286.java (added)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/main/java/org/apache/struts2/portlet/util/PortletUrlHelperJSR286.java Sat Nov  7 15:58:33 2009
@@ -0,0 +1,55 @@
+package org.apache.struts2.portlet.util;
+
+import org.apache.struts2.portlet.context.PortletActionContext;
+import javax.portlet.PortletRequest;
+import javax.portlet.MimeResponse;
+import javax.portlet.BaseURL;
+import javax.portlet.PortletSecurityException;
+import java.util.Map;
+
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+/**
+ * PortletUrlJSR286Helper.
+ *
+ * @author Rene Gielen
+ */
+public class PortletUrlHelperJSR286 extends PortletUrlHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PortletUrlHelperJSR286.class);
+
+    protected String encodeUrl( StringBuffer sb, PortletRequest req ) {
+        MimeResponse resp = (MimeResponse) PortletActionContext.getResponse();
+        return resp.encodeURL(req.getContextPath() + sb.toString());
+    }
+
+    protected Object createUrl( String scheme, String type, Map<String, String[]> portletParams ) {
+        MimeResponse response = (MimeResponse) PortletActionContext.getResponse();
+        BaseURL url;
+        if ("action".equalsIgnoreCase(type)) {
+            if (LOG.isDebugEnabled()) LOG.debug("Creating action url");
+            url = response.createActionURL();
+        }
+        else if("resource".equalsIgnoreCase(type)) {
+         if (LOG.isDebugEnabled()) LOG.debug("Creating resource url");
+         url = response.createResourceURL();
+        }
+        else {
+            if (LOG.isDebugEnabled()) LOG.debug("Creating render url");
+            url = response.createRenderURL();
+        }
+
+        url.setParameters(portletParams);
+
+        if ("HTTPS".equalsIgnoreCase(scheme)) {
+            try {
+                url.setSecure(true);
+            } catch ( PortletSecurityException e) {
+                LOG.error("Cannot set scheme to https", e);
+            }
+        }
+        return url;
+    }
+
+}

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java Sat Nov  7 15:58:33 2009
@@ -87,6 +87,7 @@
         Constraint[] params = new Constraint[]{same(req), same(res)};
         mockRd.expects(once()).method("include").with(params);
         mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
         mockResponse.expects(once()).method("setContentType").with(eq("text/html"));
 
         mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
@@ -118,6 +119,7 @@
         params = new Constraint[]{eq(MODE_PARAM), eq(PortletMode.VIEW.toString())};
         mockResponse.expects(once()).method("setRenderParameter").with(params);
         mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
         ActionContext ctx = ActionContext.getContext();
 
         ctx.put(REQUEST, mockRequest.proxy());
@@ -144,7 +146,8 @@
         params = new Constraint[]{eq(MODE_PARAM), eq(PortletMode.VIEW.toString())};
         mockResponse.expects(once()).method("setRenderParameter").with(params);
         mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
-
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
+
         ActionContext ctx = ActionContext.getContext();
 
         Map session = new HashMap();
@@ -178,6 +181,7 @@
         params = new Constraint[]{eq(MODE_PARAM), eq(PortletMode.VIEW.toString())};
         mockResponse.expects(once()).method("setRenderParameter").with(params);
         mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         ActionContext ctx = ActionContext.getContext();
 
@@ -208,6 +212,7 @@
         Constraint[] params = new Constraint[]{same(req), same(res)};
         mockRd.expects(once()).method("include").with(params);
         mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));
 

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/portlet/util/PortletUrlHelperTest.java Sat Nov  7 15:58:33 2009
@@ -83,7 +83,7 @@
         EasyMock.replay(renderRequest);
         EasyMock.replay(renderResponse);
 
-        PortletUrlHelper.buildUrl("testAction", null, null,
+        (new PortletUrlHelper()).buildUrl("testAction", null, null,
                 new HashMap(), null, null, null);
         assertEquals(PortletMode.VIEW, url.getPortletMode());
         assertEquals(WindowState.NORMAL, url.getWindowState());
@@ -97,7 +97,7 @@
         EasyMock.replay(renderRequest);
         EasyMock.replay(renderResponse);
 
-        PortletUrlHelper.buildUrl("testAction", null, null,
+        (new PortletUrlHelper()).buildUrl("testAction", null, null,
                 new HashMap(), null, "edit", null);
         
         assertEquals(PortletMode.EDIT, url.getPortletMode());
@@ -112,7 +112,7 @@
         EasyMock.replay(renderRequest);
         EasyMock.replay(renderResponse);
         
-        PortletUrlHelper.buildUrl("testAction", null, null,
+        (new PortletUrlHelper()).buildUrl("testAction", null, null,
                 new HashMap(), null, null, "maximized");
         
         assertEquals(PortletMode.VIEW, url.getPortletMode());
@@ -127,7 +127,7 @@
         EasyMock.replay(renderResponse);
         EasyMock.replay(renderRequest);
         
-        PortletUrlHelper.buildUrl("testAction", null, null,
+        (new PortletUrlHelper()).buildUrl("testAction", null, null,
                 new HashMap(), "action", null, null);
         
         assertEquals(PortletMode.VIEW, url.getPortletMode());

Modified: struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java
URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java?rev=833701&r1=833700&r2=833701&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java (original)
+++ struts/sandbox/trunk/struts2-portlet2-plugin/src/test/java/org/apache/struts2/views/jsp/PortletUrlTagTest.java Sat Nov  7 15:58:33 2009
@@ -25,13 +25,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import javax.portlet.PortletMode;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletResponse;
-import javax.portlet.PortletURL;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.portlet.WindowState;
+import javax.portlet.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.jsp.PageContext;
@@ -41,6 +35,8 @@
 import org.apache.struts2.dispatcher.Dispatcher;
 import org.apache.struts2.portlet.PortletActionConstants;
 import org.apache.struts2.portlet.util.PortletUrlHelper;
+import org.apache.struts2.StrutsStatics;
+import static org.apache.struts2.StrutsStatics.*;
 import org.jmock.Mock;
 import org.jmock.cglib.MockObjectTestCase;
 import org.jmock.core.Constraint;
@@ -49,6 +45,8 @@
 import com.opensymphony.xwork2.ActionContext;
 import com.opensymphony.xwork2.ActionInvocation;
 import com.opensymphony.xwork2.ActionProxy;
+import static com.opensymphony.xwork2.ActionContext.SESSION;
+import static com.opensymphony.xwork2.ActionContext.PARAMETERS;
 import com.opensymphony.xwork2.util.ValueStack;
 import com.opensymphony.xwork2.util.ValueStackFactory;
 
@@ -73,12 +71,15 @@
 
     MockJspWriter mockJspWriter = null;
 
+    Mock mockCtx = null;
+
     ValueStack stack = null;
 
     public static void main(String[] args) {
         TestRunner.run(PortletUrlTagTest.class);
     }
 
+
     public void setUp() throws Exception {
         super.setUp();
 
@@ -99,6 +100,7 @@
         mockPageCtx = mock(PageContext.class);
         mockPortletUrl = mock(PortletURL.class);
         mockJspWriter = new MockJspWriter();
+        mockCtx = mock(PortletContext.class);
 
         mockPageCtx.stubs().method("getRequest").will(
                 returnValue((HttpServletRequest) mockHttpReq.proxy()));
@@ -133,6 +135,7 @@
         contextMap.put(PortletActionConstants.RESPONSE, mockPortletRes.proxy());
         contextMap.put(PortletActionConstants.PHASE, PortletActionConstants.RENDER_PHASE);
         contextMap.put(PortletActionConstants.MODE_NAMESPACE_MAP, modeMap);
+        contextMap.put(STRUTS_PORTLET_CONTEXT, mockCtx.proxy());
         ActionContext ctx = new ActionContext(contextMap);
         ctx.setValueStack(stack);
         ActionContext.setContext(ctx);
@@ -156,6 +159,7 @@
 
         mockPortletRes.expects(once()).method("createRenderURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         Map paramMap = new HashMap();
         paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"});
@@ -180,6 +184,7 @@
 
         mockPortletRes.expects(once()).method("createRenderURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         Map paramMap = new HashMap();
         paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/help/testAction"});
@@ -203,6 +208,7 @@
 
         mockPortletRes.expects(once()).method("createRenderURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         Map paramMap = new HashMap();
         paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"});
@@ -226,6 +232,7 @@
 
         mockPortletRes.expects(once()).method("createActionURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         Map paramMap = new HashMap();
         paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction"});
@@ -245,6 +252,7 @@
         mockHttpReq.stubs().method("getQueryString").will(returnValue(""));
         mockPortletRes.expects(once()).method("encodeURL").will(returnValue("/contextPath/image.gif"));
         mockJspWriter.setExpectedData("/contextPath/image.gif");
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
         tag.setValue("image.gif");
         tag.doStartTag();
         tag.doEndTag();
@@ -255,6 +263,7 @@
         mockHttpReq.stubs().method("getQueryString").will(returnValue(""));
         mockPortletRes.expects(once()).method("encodeURL").with(eq("/contextPath/image.gif?testParam1=testValue1")).will(returnValue("/contextPath/image.gif?testParam1=testValue1"));
         mockJspWriter.setExpectedData("/contextPath/image.gif?testParam1=testValue1");
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         ParamTag paramTag = new ParamTag();
         paramTag.setPageContext((PageContext)mockPageCtx.proxy());
@@ -273,6 +282,7 @@
         mockHttpReq.stubs().method("getQueryString").will(returnValue(""));
         mockPortletRes.expects(once()).method("encodeURL").with(eq("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2")).will(returnValue("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2"));
         mockJspWriter.setExpectedData("/contextPath/image.gif?testParam1=testValue1&testParam2=testValue2");
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
 
         ParamTag paramTag = new ParamTag();
         paramTag.setPageContext((PageContext)mockPageCtx.proxy());
@@ -299,6 +309,7 @@
      mockHttpReq.stubs().method("getQueryString").will(returnValue(""));
         mockPortletRes.expects(once()).method("createRenderURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
      tag.setAction("testAction");
      Map paramMap = new HashMap();
         paramMap.put(PortletActionConstants.ACTION_PARAM, new String[]{"/view/testAction!input"});
@@ -316,6 +327,7 @@
      mockHttpReq.stubs().method("getQueryString").will(returnValue(""));
         mockPortletRes.expects(once()).method("createRenderURL").will(
                 returnValue((PortletURL) mockPortletUrl.proxy()));
+        mockCtx.expects(atLeastOnce()).method("getMajorVersion").will(returnValue(1));
      Map paramMap = new HashMap();
     
      Mock mockActionProxy = mock(ActionProxy.class);