You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by ms...@apache.org on 2015/11/27 13:38:11 UTC

[30/38] portals-pluto git commit: Implemented ActionResponse#getRedirectURL() method. Added redirect portlet to the PortletV3Demo for demo and test.

Implemented ActionResponse#getRedirectURL() method. Added redirect portlet
to the PortletV3Demo for demo and test.


Project: http://git-wip-us.apache.org/repos/asf/portals-pluto/repo
Commit: http://git-wip-us.apache.org/repos/asf/portals-pluto/commit/29448a1f
Tree: http://git-wip-us.apache.org/repos/asf/portals-pluto/tree/29448a1f
Diff: http://git-wip-us.apache.org/repos/asf/portals-pluto/diff/29448a1f

Branch: refs/heads/V3Prototype
Commit: 29448a1ff3213be5fcdad5756be95cc0dabe878e
Parents: 7fb0624
Author: Scott Nicklous <ms...@apache.org>
Authored: Thu Nov 19 15:24:41 2015 +0100
Committer: Scott Nicklous <ms...@apache.org>
Committed: Thu Nov 19 15:24:41 2015 +0100

----------------------------------------------------------------------
 PortletV3Demo/pom.xml                           |  12 +-
 .../src/main/java/basic/portlet/Constants.java  |   1 +
 .../java/basic/portlet/RedirectPortlet.java     | 108 ++++++
 .../src/main/webapp/WEB-INF/jsp/view-rdp.jsp    |  64 ++++
 .../src/main/webapp/WEB-INF/portlet.xml         |  18 +
 .../pluto/container/PortletResponseContext.java | 126 +++----
 .../container/impl/ActionResponseImpl.java      | 131 ++++---
 .../pluto/container/impl/BaseURLImpl.java       |   3 +-
 .../pluto/container/impl/PortletURLImpl.java    |   8 +-
 .../pluto/container/impl/RenderURLImpl.java     |   4 +-
 .../container/impl/StateAwareResponseImpl.java  |   3 +-
 .../PortletMimeResponseContextImpl.java         |   7 -
 .../container/PortletResponseContextImpl.java   | 351 ++++++++++---------
 13 files changed, 507 insertions(+), 329 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/PortletV3Demo/pom.xml
----------------------------------------------------------------------
diff --git a/PortletV3Demo/pom.xml b/PortletV3Demo/pom.xml
index 3ff5884..a957244 100644
--- a/PortletV3Demo/pom.xml
+++ b/PortletV3Demo/pom.xml
@@ -18,6 +18,12 @@
         <scope>provided</scope>
       </dependency>
       <dependency>
+         <groupId>org.apache.portals.pluto</groupId>
+         <artifactId>pluto-taglib</artifactId>
+         <version>${project.version}</version>
+         <scope>provided</scope>
+      </dependency>
+      <dependency>
          <groupId>org.apache.tomcat</groupId>
          <artifactId>tomcat-servlet-api</artifactId>
          <scope>provided</scope>
@@ -45,12 +51,6 @@
           <artifactId>taglibs-standard-jstlel</artifactId>
           <scope>provided</scope>
       </dependency>
-      <dependency>
-         <groupId>org.apache.portals.pluto</groupId>
-         <artifactId>pluto-taglib</artifactId>
-         <version>2.1.0-M3</version>
-         <scope>provided</scope>
-      </dependency>
    </dependencies>
 
    <build>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/PortletV3Demo/src/main/java/basic/portlet/Constants.java
----------------------------------------------------------------------
diff --git a/PortletV3Demo/src/main/java/basic/portlet/Constants.java b/PortletV3Demo/src/main/java/basic/portlet/Constants.java
index 32c3b10..25bfec2 100644
--- a/PortletV3Demo/src/main/java/basic/portlet/Constants.java
+++ b/PortletV3Demo/src/main/java/basic/portlet/Constants.java
@@ -40,6 +40,7 @@ public class Constants {
    public final static String PARAM_FG_GREEN = "green";
    public final static String PARAM_FG_BLUE = "blue";
    public final static String PARAM_MSG_INPUT = "imsg";
+   public final static String PARAM_URL_INPUT = "url";
    
    public final static String PARAM_NUM_ACTIONS = "numActions";
 

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/PortletV3Demo/src/main/java/basic/portlet/RedirectPortlet.java
----------------------------------------------------------------------
diff --git a/PortletV3Demo/src/main/java/basic/portlet/RedirectPortlet.java b/PortletV3Demo/src/main/java/basic/portlet/RedirectPortlet.java
new file mode 100644
index 0000000..a983a6e
--- /dev/null
+++ b/PortletV3Demo/src/main/java/basic/portlet/RedirectPortlet.java
@@ -0,0 +1,108 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package basic.portlet;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.portlet.ActionParameters;
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.ActionURL;
+import javax.portlet.GenericPortlet;
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequestDispatcher;
+import javax.portlet.RenderParameters;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.RenderURL;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+
+import static javax.portlet.MimeResponse.Copy.*;
+import static basic.portlet.Constants.*;
+
+/**
+ * Portlet for testing the redirect funtionality, including the new getRedirectURL API.
+ */
+public class RedirectPortlet extends GenericPortlet {
+
+   private static final Logger  LOGGER  = Logger.getLogger(RedirectPortlet.class.getName());
+   private static final boolean isDebug = LOGGER.isLoggable(Level.FINE);
+
+   protected void doView(RenderRequest req, RenderResponse resp) throws PortletException, IOException {
+
+      resp.setContentType("text/html");
+      
+      // provide an action URL to the JSP as a workaround, since the tag library is still JSR 286
+      ActionURL aurl = resp.createActionURL(ALL);
+      req.setAttribute(ATTRIB_ACTURL, aurl.toString());
+
+      PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/view-rdp.jsp");
+      rd.include(req, resp);
+
+   }
+
+   /*
+    * (non-Javadoc)
+    * 
+    * @see javax.portlet.GenericPortlet#serveResource(javax.portlet.ResourceRequest, javax.portlet.ResourceResponse)
+    */
+   @Override
+   public void serveResource(ResourceRequest req, ResourceResponse resp) throws PortletException, IOException {
+   }
+
+   public void processAction(ActionRequest req, ActionResponse resp) throws PortletException, IOException {
+
+      ActionParameters ap = req.getActionParameters();
+      RenderParameters rp = req.getRenderParameters();
+
+      StringBuilder txt = new StringBuilder(128);
+      if (isDebug) {
+         txt.append("Action parms: ").append(ap.getNames());
+         txt.append(", Render parms: ").append(rp.getNames());
+         txt.append(", Color: ").append(rp.getValue(PARAM_COLOR));
+      }
+
+      String color = ap.getValue(PARAM_COLOR);
+      if (color != null && color.length() > 0) {
+         if (!color.matches("^#(?:[A-Fa-f0-9]{3}){1,2}$")) {
+            color = "FDD";
+         }
+      }
+      
+      String url = ap.getValue(PARAM_URL_INPUT);
+      if (url == null || url.length() <= 0) {
+         RenderURL rurl = resp.getRedirectURL(ALL);
+         rurl.getRenderParameters().setValue(PARAM_COLOR, color);
+         url = rurl.toString();
+         if (isDebug) {
+            txt.append(", redirecting to redirect URL with new color=").append(color);
+         }
+      }
+      resp.sendRedirect(url);
+      
+      if (isDebug) {
+         LOGGER.fine(txt.toString());
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/PortletV3Demo/src/main/webapp/WEB-INF/jsp/view-rdp.jsp
----------------------------------------------------------------------
diff --git a/PortletV3Demo/src/main/webapp/WEB-INF/jsp/view-rdp.jsp b/PortletV3Demo/src/main/webapp/WEB-INF/jsp/view-rdp.jsp
new file mode 100644
index 0000000..7e8d59b
--- /dev/null
+++ b/PortletV3Demo/src/main/webapp/WEB-INF/jsp/view-rdp.jsp
@@ -0,0 +1,64 @@
+<%--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed  under the  License is distributed on an "AS IS" BASIS,
+WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+implied.
+
+See the License for the specific language governing permissions and
+limitations under the License.
+--%>
+<%@ page session="false" %>
+<%@ taglib uri="http://xmlns.jcp.org/portlet_3_0"  prefix="portlet" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ page import="static basic.portlet.Constants.*" %>
+
+<portlet:defineObjects />
+
+<% 
+   String clr = renderRequest.getRenderParameters().getValue(PARAM_COLOR);
+   if (clr == null) {
+      clr = "#FFF";
+   }
+%>
+
+<div style='background-color:<%=clr %>; padding:8px;'>
+<h3>V3 Redirect Portlet</h3><hr/>
+<p>
+Portlet to demo the V3 action response redirect functionality. You can enter a redirect that the
+processAction method will redirect to along with a color value. If a redirect URL is entered, the portlet
+will redirect to that URL.
+</p><p> 
+If no URL is entered, the portlet will obtain a redirect URL, which is 
+basically a render URL to itself, and redirect to that URL to refresh the page. If a color 
+value is entered, it will be set as a render parameter on the redirect URL.
+The color will be set as background color for the portlet, so you can see the effect of the
+redirect.
+</p>
+<!-- Note that the action URL is provided to the JSP by the render method as a workaround, 
+     since the tag lib is still at JSR 286 level. -->
+<form method='POST'  enctype='application/x-www-form-urlencoded' action="<%=renderRequest.getAttribute(ATTRIB_ACTURL) %>">
+  <table><tr>
+     <td align='left'>Enter background color :</td>
+     <td>
+        <input id='<portlet:namespace/>-color' name='<%=PARAM_COLOR%>' type='text' value='' size='10' maxlength='10'>
+     </td>
+     <td>
+     <div id='<portlet:namespace/>-putMsgHere'></div>
+   </td></tr><tr><td>
+   Enter URL:
+   </td><td colspan=3>
+   <input id='<portlet:namespace/>-msg' name='<%=PARAM_URL_INPUT%>' type='text' value='' size='50' maxlength='50'>
+   </td></tr><tr><td>
+   <INPUT id ='<portlet:namespace/>-send' VALUE='redirect' TYPE='submit'>
+   </td></tr></table>
+</FORM>
+</div>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/PortletV3Demo/src/main/webapp/WEB-INF/portlet.xml
----------------------------------------------------------------------
diff --git a/PortletV3Demo/src/main/webapp/WEB-INF/portlet.xml b/PortletV3Demo/src/main/webapp/WEB-INF/portlet.xml
index 48462f6..d1217a2 100644
--- a/PortletV3Demo/src/main/webapp/WEB-INF/portlet.xml
+++ b/PortletV3Demo/src/main/webapp/WEB-INF/portlet.xml
@@ -94,6 +94,24 @@
    </portlet>
 
    <portlet>
+      <portlet-name>V3RedirectPortlet</portlet-name>
+      <display-name>Redirect Test Portlet</display-name>
+      
+      <portlet-class>basic.portlet.RedirectPortlet</portlet-class>
+
+      <supports>
+         <mime-type>text/html</mime-type>
+         <portlet-mode>VIEW</portlet-mode>
+      </supports>
+
+      <supported-locale>en</supported-locale>        
+
+      <portlet-info>
+         <title>Redirect Test Portlet</title>
+      </portlet-info>
+   </portlet>
+
+   <portlet>
       <portlet-name>PortletConfigPortlet1</portlet-name>
       <display-name>Portlet Config Portlet #1</display-name>
       

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container-api/src/main/java/org/apache/pluto/container/PortletResponseContext.java
----------------------------------------------------------------------
diff --git a/pluto-container-api/src/main/java/org/apache/pluto/container/PortletResponseContext.java b/pluto-container-api/src/main/java/org/apache/pluto/container/PortletResponseContext.java
index c3718e1..8d48f14 100644
--- a/pluto-container-api/src/main/java/org/apache/pluto/container/PortletResponseContext.java
+++ b/pluto-container-api/src/main/java/org/apache/pluto/container/PortletResponseContext.java
@@ -1,62 +1,64 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pluto.container;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Element;
-
-/**
- * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
- * @version $Id$
- */
-public interface PortletResponseContext
-{
-    void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse);
-    PortletContainer getContainer();
-    HttpServletRequest getContainerRequest();
-    HttpServletResponse getContainerResponse();
-    HttpServletRequest getServletRequest();
-    HttpServletResponse getServletResponse();
-    PortletWindow getPortletWindow();
-    
-    ResourceURLProvider getResourceURLProvider();
-    void addProperty(Cookie cookie);
-    void addProperty(String key, Element element);
-    void addProperty(String key, String value);
-    void setProperty(String key, String value);
-    Element createElement(String tagName) throws DOMException;
-
-    /**
-     * Closing the response context means processing has been completed and
-     * internal storage can be flushed and written out to the Portal.
-     * It is not required for the Portal to do internal buffering, except for
-     * the PortletEventResponseContext as the portlet spec explicitely states that
-     * any changes during a processEvent should be ignored if an exception occurs,
-     * in which case the portlet container should only call release() and not close().
-     */
-    void close();
-    
-    /**
-     * Releasing the response context means its internal storage can be released as well.
-     * If any outstanding changes have not been processed yet, those will be lost.
-     */
-    void release();
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.container;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.pluto.container.PortletURLProvider.TYPE;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+
+/**
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
+ */
+public interface PortletResponseContext
+{
+    void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse);
+    PortletContainer getContainer();
+    HttpServletRequest getContainerRequest();
+    HttpServletResponse getContainerResponse();
+    HttpServletRequest getServletRequest();
+    HttpServletResponse getServletResponse();
+    PortletWindow getPortletWindow();
+    
+    ResourceURLProvider getResourceURLProvider();
+    PortletURLProvider getPortletURLProvider(TYPE type);
+    void addProperty(Cookie cookie);
+    void addProperty(String key, Element element);
+    void addProperty(String key, String value);
+    void setProperty(String key, String value);
+    Element createElement(String tagName) throws DOMException;
+
+    /**
+     * Closing the response context means processing has been completed and
+     * internal storage can be flushed and written out to the Portal.
+     * It is not required for the Portal to do internal buffering, except for
+     * the PortletEventResponseContext as the portlet spec explicitely states that
+     * any changes during a processEvent should be ignored if an exception occurs,
+     * in which case the portlet container should only call release() and not close().
+     */
+    void close();
+    
+    /**
+     * Releasing the response context means its internal storage can be released as well.
+     * If any outstanding changes have not been processed yet, those will be lost.
+     */
+    void release();
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container/src/main/java/org/apache/pluto/container/impl/ActionResponseImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/ActionResponseImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/ActionResponseImpl.java
index a43e309..364cc6b 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/ActionResponseImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/ActionResponseImpl.java
@@ -26,82 +26,69 @@ import org.apache.pluto.container.PortletActionResponseContext;
 import org.apache.pluto.container.ResourceURLProvider;
 import org.apache.pluto.container.util.ArgumentUtility;
 
-public class ActionResponseImpl extends StateAwareResponseImpl implements ActionResponse
-{
-    private boolean stateChanged;
-    protected boolean redirected;
-    
-    public ActionResponseImpl(PortletActionResponseContext responseContext)
-    {
-        super(responseContext);
-    }
+public class ActionResponseImpl extends StateAwareResponseImpl implements ActionResponse {
+   private boolean   stateChanged;
+   protected boolean redirected;
 
-    protected void checkSetRedirected()
-    {
-        if (stateChanged)
-        {
-            throw new IllegalStateException("sendRedirect no longer allowed after navigational state changes");
-        }
-        if (redirected)
-        {
-            throw new IllegalStateException("sendRedirect already called");
-        }
-        redirected = true;
-    }
-    
-    protected void checkSetStateChanged()
-    {
-        if (redirected)
-        {
-            throw new IllegalStateException("State change no longer allowed after a sendRedirect");
-        }
-        stateChanged = true;
-    }
-    
-    protected String getRedirectLocation(String location)
-    {
-        ArgumentUtility.validateNotEmpty("location", location);
-        ResourceURLProvider provider = getResponseContext().getResourceURLProvider();
+   public ActionResponseImpl(PortletActionResponseContext responseContext) {
+      super(responseContext);
+   }
+
+   protected void checkSetRedirected() {
+      if (stateChanged) {
+         throw new IllegalStateException("sendRedirect no longer allowed after navigational state changes");
+      }
+      if (redirected) {
+         throw new IllegalStateException("sendRedirect already called");
+      }
+      redirected = true;
+   }
+
+   protected void checkSetStateChanged() {
+      if (redirected) {
+         throw new IllegalStateException("State change no longer allowed after a sendRedirect");
+      }
+      stateChanged = true;
+   }
+
+   protected String getRedirectLocation(String location) {
+      ArgumentUtility.validateNotEmpty("location", location);
+      ResourceURLProvider provider = getResponseContext().getResourceURLProvider();
 
-        if (location.indexOf("://") != -1)
-        {
-            provider.setAbsoluteURL(location);
-        } 
-        else 
-        {
-            provider.setFullPath(location);
-        }
-        location = getServletResponse().encodeRedirectURL(provider.toString());
-        if (location.indexOf("/") == -1)
-        {
-            throw new IllegalArgumentException("There is a relative path given, an IllegalArgumentException must be thrown.");
-        }
-        return location;
-    }
-    
-    public void sendRedirect(String location) throws IOException
-    {
-        location = getRedirectLocation(location);
-        checkSetRedirected();
-        ((PortletActionResponseContext)getResponseContext()).setRedirect(location);
-    }
-    
-	public void sendRedirect(String location, String renderUrlParamName) throws IOException 
-	{
-        ArgumentUtility.validateNotEmpty("renderUrlParamName", renderUrlParamName);
-        location = getRedirectLocation(location);
-        if (!redirected)
-        {
-            stateChanged = false;
-        }
-        checkSetRedirected();
-        ((PortletActionResponseContext)getResponseContext()).setRedirect(location, renderUrlParamName);
-	}
+      if (location.indexOf("://") != -1) {
+         provider.setAbsoluteURL(location);
+      } else {
+         provider.setFullPath(location);
+      }
+      location = getServletResponse().encodeRedirectURL(provider.toString());
+      if (location.indexOf("/") == -1) {
+         throw new IllegalArgumentException(
+               "There is a relative path given, an IllegalArgumentException must be thrown.");
+      }
+      return location;
+   }
+
+   public void sendRedirect(String location) throws IOException {
+      location = getRedirectLocation(location);
+      checkSetRedirected();
+      ((PortletActionResponseContext) getResponseContext()).setRedirect(location);
+   }
+
+   public void sendRedirect(String location, String renderUrlParamName) throws IOException {
+      ArgumentUtility.validateNotEmpty("renderUrlParamName", renderUrlParamName);
+      location = getRedirectLocation(location);
+      if (!redirected) {
+         stateChanged = false;
+      }
+      checkSetRedirected();
+      ((PortletActionResponseContext) getResponseContext()).setRedirect(location, renderUrlParamName);
+   }
 
    @Override
    public RenderURL getRedirectURL(Copy option) throws IllegalStateException {
-      // TODO: implement
-      //return new RenderURLImpl(responseContext, option);
-      return null;
+      if (stateChanged) {
+         throw new IllegalStateException("sendRedirect no longer allowed after navigational state changes");
+      }
+      return new RenderURLImpl(responseContext, option);
    }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container/src/main/java/org/apache/pluto/container/impl/BaseURLImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/BaseURLImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/BaseURLImpl.java
index b1e2b89..65dbf00 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/BaseURLImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/BaseURLImpl.java
@@ -39,7 +39,6 @@ import javax.portlet.RenderURL;
 import javax.portlet.ResourceURL;
 import javax.portlet.WindowState;
 
-import org.apache.pluto.container.PortletMimeResponseContext;
 import org.apache.pluto.container.PortletResponseContext;
 import org.apache.pluto.container.PortletURLListenerService;
 import org.apache.pluto.container.PortletURLProvider;
@@ -82,7 +81,7 @@ public abstract class BaseURLImpl implements BaseURL {
       }
    }
 
-   public BaseURLImpl(PortletMimeResponseContext responseContext,
+   public BaseURLImpl(PortletResponseContext responseContext,
          PortletURLProvider portletURLProvider, Copy copy) {
       this(responseContext, portletURLProvider);
       

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
index ed76761..8beff45 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
@@ -18,9 +18,6 @@ package org.apache.pluto.container.impl;
 
 import java.util.Enumeration;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import javax.portlet.MimeResponse.Copy;
 import javax.portlet.MutableRenderParameters;
 import javax.portlet.PortletMode;
@@ -30,13 +27,14 @@ import javax.portlet.WindowState;
 import javax.portlet.WindowStateException;
 import javax.portlet.annotations.PortletSerializable;
 
-import org.apache.pluto.container.PortletMimeResponseContext;
 import org.apache.pluto.container.PortletResponseContext;
 import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.om.portlet.CustomPortletMode;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.Supports;
 import org.apache.pluto.container.util.ArgumentUtility;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -62,7 +60,7 @@ public abstract class PortletURLImpl extends BaseURLImpl implements PortletURL {
       super(responseContext, urlProvider);
    }
 
-   public PortletURLImpl(PortletMimeResponseContext responseContext,
+   public PortletURLImpl(PortletResponseContext responseContext,
          PortletURLProvider portletURLProvider, Copy copy) {
       super(responseContext, portletURLProvider, copy);
    }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container/src/main/java/org/apache/pluto/container/impl/RenderURLImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/RenderURLImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/RenderURLImpl.java
index 6f99cec..879a512 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/RenderURLImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/RenderURLImpl.java
@@ -22,7 +22,7 @@ package org.apache.pluto.container.impl;
 import javax.portlet.MimeResponse.Copy;
 import javax.portlet.RenderURL;
 
-import org.apache.pluto.container.PortletMimeResponseContext;
+import org.apache.pluto.container.PortletResponseContext;
 import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.util.ArgumentUtility;
 
@@ -37,7 +37,7 @@ public class RenderURLImpl extends PortletURLImpl implements RenderURL {
     * @param copy 
     * @param urlProvider
     */
-   public RenderURLImpl(PortletMimeResponseContext responseContext, Copy copy) {
+   public RenderURLImpl(PortletResponseContext responseContext, Copy copy) {
       super(responseContext,
             responseContext.getPortletURLProvider(PortletURLProvider.TYPE.RENDER), copy);
    }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
index 78b55c9..e09fb6e 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
@@ -49,7 +49,7 @@ public abstract class StateAwareResponseImpl extends PortletResponseImpl
    @SuppressWarnings("unused")
    private final boolean isDebug = LOGGER.isDebugEnabled();
 
-   private PortletStateAwareResponseContext responseContext;
+   protected PortletStateAwareResponseContext responseContext;
    private final String                     windowId;
 
    public StateAwareResponseImpl(PortletStateAwareResponseContext responseContext) {
@@ -186,6 +186,7 @@ public abstract class StateAwareResponseImpl extends PortletResponseImpl
    }
 
    public MutableRenderParameters getRenderParameters() {
+      checkSetStateChanged();
       return responseContext.getRenderParameters(windowId);
    }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
index a418988..2c458bc 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
@@ -27,9 +27,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.pluto.container.PortletContainer;
 import org.apache.pluto.container.PortletMimeResponseContext;
-import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.PortletWindow;
-import org.apache.pluto.container.PortletURLProvider.TYPE;
 import org.apache.pluto.container.util.PrintWriterServletOutputStream;
 
 /**
@@ -208,9 +206,4 @@ public abstract class PortletMimeResponseContextImpl extends PortletResponseCont
             getServletResponse().setContentType(contentType);
         }
     }
-
-    public PortletURLProvider getPortletURLProvider(TYPE type)
-    {
-        return isClosed() ? null : new PortletURLProviderImpl(getPortalURL(), type, getPortletWindow());
-    }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/29448a1f/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResponseContextImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResponseContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResponseContextImpl.java
index 00a02db..7093bcf 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResponseContextImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResponseContextImpl.java
@@ -1,172 +1,179 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pluto.driver.services.container;
-
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.pluto.container.PortletContainer;
-import org.apache.pluto.container.PortletResponseContext;
-import org.apache.pluto.container.PortletWindow;
-import org.apache.pluto.container.ResourceURLProvider;
-import org.apache.pluto.driver.core.PortalRequestContext;
-import org.apache.pluto.driver.url.PortalURL;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @version $Id$
- *
- */
-public abstract class PortletResponseContextImpl implements PortletResponseContext
-{
-    private PortletContainer container;
-    private HttpServletRequest containerRequest;
-    private HttpServletResponse containerResponse;
-    private HttpServletRequest servletRequest;
-    private HttpServletResponse servletResponse;
-    private PortletWindow window;
-    private PortalURL portalURL;
-    private boolean closed;
-    private boolean released;
-    
-    public PortletResponseContextImpl(PortletContainer container, HttpServletRequest containerRequest,
-                                      HttpServletResponse containerResponse, PortletWindow window)
-    {
-        this.container = container;
-        this.containerRequest = containerRequest;
-        this.containerResponse = containerResponse;
-        this.window = window;
-        this.portalURL = PortalRequestContext.getContext(containerRequest).createPortalURL();
-    }
-    
-    protected PortalURL getPortalURL()
-    {
-        return portalURL;
-    }
-
-    protected boolean isClosed()
-    {
-        return closed;
-    }
-    
-    protected boolean isReleased()
-    {
-        return released;
-    }
-
-    public void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
-    {
-        this.servletRequest = servletRequest;
-        this.servletResponse = servletResponse;
-    }
-    
-    public void addProperty(Cookie cookie)
-    {
-        if (!isClosed())
-        {
-            servletResponse.addCookie(cookie);
-        }
-    }
-
-    public void addProperty(String key, Element element)
-    {
-        // not supported 
-    }
-
-    public void addProperty(String key, String value)
-    {
-        // not supported
-    }
-    
-    public Element createElement(String tagName) throws DOMException
-    {
-        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
-        DocumentBuilder docBuilder;
-        
-        try
-        {
-            docBuilder = dbfac.newDocumentBuilder();
-            Document doc = docBuilder.newDocument();
-            return doc.createElement(tagName);
-        }
-        catch (ParserConfigurationException e)
-        {
-            throw new DOMException((short) 0, "Initialization failure");
-        }
-    }
-
-    public void close()
-    {
-        closed = true;
-    }
-
-    public PortletContainer getContainer()
-    {
-        return container;
-    }
-
-    public PortletWindow getPortletWindow()
-    {
-        return window;
-    }
-
-    public HttpServletRequest getContainerRequest()
-    {
-        return containerRequest;
-    }
-
-    public HttpServletResponse getContainerResponse()
-    {
-        return containerResponse;
-    }
-
-    public HttpServletRequest getServletRequest()
-    {
-        return servletRequest;
-    }
-
-    public HttpServletResponse getServletResponse()
-    {
-        return servletResponse;
-    }
-
-    public void release()
-    {
-        closed = true;
-        released = true;
-        container = null;
-        servletRequest = null;
-        servletResponse = null;
-        window = null;
-    }
-
-    public void setProperty(String key, String value)
-    {
-        // not supported
-    }
-
-    public ResourceURLProvider getResourceURLProvider()
-    {
-        return isReleased() ? null : new ResourceURLProviderImpl(servletRequest,window);
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.driver.services.container;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.pluto.container.PortletContainer;
+import org.apache.pluto.container.PortletResponseContext;
+import org.apache.pluto.container.PortletURLProvider;
+import org.apache.pluto.container.PortletWindow;
+import org.apache.pluto.container.ResourceURLProvider;
+import org.apache.pluto.container.PortletURLProvider.TYPE;
+import org.apache.pluto.driver.core.PortalRequestContext;
+import org.apache.pluto.driver.url.PortalURL;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @version $Id$
+ *
+ */
+public abstract class PortletResponseContextImpl implements PortletResponseContext
+{
+    private PortletContainer container;
+    private HttpServletRequest containerRequest;
+    private HttpServletResponse containerResponse;
+    private HttpServletRequest servletRequest;
+    private HttpServletResponse servletResponse;
+    private PortletWindow window;
+    private PortalURL portalURL;
+    private boolean closed;
+    private boolean released;
+    
+    public PortletResponseContextImpl(PortletContainer container, HttpServletRequest containerRequest,
+                                      HttpServletResponse containerResponse, PortletWindow window)
+    {
+        this.container = container;
+        this.containerRequest = containerRequest;
+        this.containerResponse = containerResponse;
+        this.window = window;
+        this.portalURL = PortalRequestContext.getContext(containerRequest).createPortalURL();
+    }
+    
+    protected PortalURL getPortalURL()
+    {
+        return portalURL;
+    }
+
+    protected boolean isClosed()
+    {
+        return closed;
+    }
+    
+    protected boolean isReleased()
+    {
+        return released;
+    }
+
+    public void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
+    {
+        this.servletRequest = servletRequest;
+        this.servletResponse = servletResponse;
+    }
+    
+    public void addProperty(Cookie cookie)
+    {
+        if (!isClosed())
+        {
+            servletResponse.addCookie(cookie);
+        }
+    }
+
+    public void addProperty(String key, Element element)
+    {
+        // not supported 
+    }
+
+    public void addProperty(String key, String value)
+    {
+        // not supported
+    }
+    
+    public Element createElement(String tagName) throws DOMException
+    {
+        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
+        DocumentBuilder docBuilder;
+        
+        try
+        {
+            docBuilder = dbfac.newDocumentBuilder();
+            Document doc = docBuilder.newDocument();
+            return doc.createElement(tagName);
+        }
+        catch (ParserConfigurationException e)
+        {
+            throw new DOMException((short) 0, "Initialization failure");
+        }
+    }
+
+    public void close()
+    {
+        closed = true;
+    }
+
+    public PortletContainer getContainer()
+    {
+        return container;
+    }
+
+    public PortletWindow getPortletWindow()
+    {
+        return window;
+    }
+
+    public HttpServletRequest getContainerRequest()
+    {
+        return containerRequest;
+    }
+
+    public HttpServletResponse getContainerResponse()
+    {
+        return containerResponse;
+    }
+
+    public HttpServletRequest getServletRequest()
+    {
+        return servletRequest;
+    }
+
+    public HttpServletResponse getServletResponse()
+    {
+        return servletResponse;
+    }
+
+    public void release()
+    {
+        closed = true;
+        released = true;
+        container = null;
+        servletRequest = null;
+        servletResponse = null;
+        window = null;
+    }
+
+    public void setProperty(String key, String value)
+    {
+        // not supported
+    }
+
+    public ResourceURLProvider getResourceURLProvider()
+    {
+        return isReleased() ? null : new ResourceURLProviderImpl(servletRequest,window);
+    }
+
+    public PortletURLProvider getPortletURLProvider(TYPE type)
+    {
+        return isClosed() ? null : new PortletURLProviderImpl(getPortalURL(), type, getPortletWindow());
+    }
+}