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:07 UTC

[26/38] portals-pluto git commit: Integrated latest version of the portlet API 3.0. Made necessary minor adaptations the Pluto code and demo portlets to make the previously available funtionality work. For the partial action request, changed implementati

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/annotations/URLFactory.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/URLFactory.java b/portlet-api/src/main/java/javax/portlet/annotations/URLFactory.java
new file mode 100644
index 0000000..b060750
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/annotations/URLFactory.java
@@ -0,0 +1,197 @@
+/*  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 javax.portlet.annotations;
+
+import javax.portlet.ActionURL;
+import javax.portlet.MimeResponse.Copy;
+import javax.portlet.RenderURL;
+import javax.portlet.ResourceURL;
+
+/**
+ * <div class='changed_added_3_0'>
+ * Interface that allows URLs to be generated. 
+ * The functionality is based on methods from <code>MimeResponse</code>.
+ * <p>
+ * A URLFactory object can only be obtained through injection.
+ * <p>
+ * Example:
+ * <div class='codebox'>      
+ * {@literal @}Inject<br/>   
+ * private URLFactory urlFactory;
+ * </div>                    
+ * </div>
+ * 
+ * @see javax.portlet.MimeResponse MimeResponse
+ */
+public interface URLFactory {
+
+   /**
+    * Creates an action URL targeting the portlet.
+    * Action URLs are used to create forms or links that, when triggered,
+    * update the portlet state in a non-idempotent manner.
+    * <p> 
+    * If a request is triggered by the URL, it results in
+    * an action request.
+    * <p>
+    * The <code>copyParameters</code> argument specifies whether render parameters
+    * from the current request are to be copied to the URL.
+    * <p>
+    * The returned URL can be further extended by adding portlet-specific action
+    * parameters, portlet mode, and window state.
+    * If no additional portlet mode, window
+    * state or security modifier is set on the URL, the values from the
+    * current render or resource request are preserved.
+    * <p>
+    * Public render parameters do not need to be explicitly added to the returned 
+    * action URL, unless the public render parameter value is to be changed. 
+    * Any public render parameters associated with 
+    * the portlet will automatically be available during action request 
+    * processing resulting from activation of the URL. 
+    * <p>
+    * If a public render parameter value is set or removed on an action URL, 
+    * then the public render parameter will be set to the new value or 
+    * removed when the URL is activated.
+    * 
+    * @see javax.portlet.MimeResponse#createActionURL() createActionURL
+    * @see javax.portlet.MimeResponse.Copy
+    * 
+    * @param   copyParameters    Specifies if parameters are to be copied to the URL
+    * 
+    * @return a portlet action URL, or <code>null</code> if the current request
+    * is neither a <code>RenderRequest</code> nor a <code>ResourceRequest</code>
+    */
+   public ActionURL createActionURL(Copy copyParameters);
+
+   
+   /**
+    * Creates a render URL targeting the portlet. 
+    * Render URLs cause idempotent requests that move the portlet to a 
+    * new view state, for example, to view a different page of data. 
+    * <p> 
+    * If a request is triggered by the URL, it results in
+    * a render request.
+    * <p>
+    * The <code>copyParameters</code> argument specifies whether render parameters
+    * from the current request are to be copied to the URL.
+    * <p>
+    * The returned URL can be further extended by adding portlet-specific render
+    * parameters, portlet mode, and window state.
+    * If no portlet mode, window
+    * state or security modifier is set on the URL, the values from the
+    * current render or resource request are preserved.
+    * <p>
+    * Public render parameters do not need to be explicitly added to the returned 
+    * render URL, unless the public render parameter value is to be changed. 
+    * Any public render parameters associated with 
+    * the portlet will automatically be available during render request processing resulting
+    * from activation of the URL.
+    * <p>
+    * If a public render parameter value is set or removed on a render URL, then the public 
+    * render parameter will be set to the new value or removed when the URL is activated.
+    * 
+    * @see javax.portlet.MimeResponse#createRenderURL() createRenderURL
+    * @see javax.portlet.MimeResponse.Copy
+    * 
+    * @param   copyParameters    Specifies if parameters are to be copied to the URL
+    * 
+    * @return a portlet render URL, or <code>null</code> if the current request
+     * is neither a <code>RenderRequest</code> nor a <code>ResourceRequest</code>
+    */
+   public RenderURL createRenderURL(Copy copyParameters);
+   
+   
+   /**
+     * Creates a resource URL targeting the portlet. 
+     * Resource URLs are used to trigger requests for content that applies
+     * to the current portlet view state.
+     * <p>
+     * If a request is triggered by the <code>ResourceURL</code>, it results in a serve
+     * resource request of the <code>ResourceServingPortlet</code> interface.
+     * <p>
+     * The security settings can be changed for the URL. If the security settings are
+     * not explicitly set, the values governing the current request 
+     * are preserved. 
+     * The current
+     * render parameters, portlet mode, and window state are preserved 
+     * depending on the cacheability setting for the returned resource URL.
+     * <p>
+     * If cacheability is set to <code>PORTLET</code> or <code>PAGE</code>, the values of the render
+     * parameters, portlet mode, and window state are preserved. 
+     * Otherwise, they will not be preserved.
+     * <p>
+     * If allowed by the cacheability setting, public and private render 
+     * parameters are added to the URL with their current values.
+     * The render parameter values cannot be changed on the URL. 
+     * <p>
+     * The URL can be further extended by adding portlet-specific resource
+     * parameters. 
+     * <p>
+     * The URL will contain the current 
+     * cacheability setting of the parent resource by default. 
+     * If no parent resource is available, <code>PAGE</code> is the default.
+     * 
+     * @see javax.portlet.MimeResponse#createResourceURL() createResourceURL
+     * 
+     * @return a portlet resource URL, or <code>null</code> if the current request
+     * is neither a <code>RenderRequest</code> nor a <code>ResourceRequest</code>
+     */
+   public ResourceURL createResourceURL();
+
+   /**
+     * Returns the encoded URL of the resource, like servlets, JSPs, images and
+     * other static files, at the given path.
+     * <p>
+     * Portlets should encode all resource URLs pointing to resources in the
+     * portlet application via this method in order to ensure that they get
+     * served via the portal application.
+     * <p>
+     * Some portal/portlet-container implementation may require those URLs to
+     * contain implementation specific data encoded in it. Because of that,
+     * portlets should use this method to create such URLs.
+     * <p>
+     * The <code>encodeURL</code> method may include the session ID and other
+     * portal/portlet-container specific information into the URL. If encoding
+     * is not needed, it returns the URL unchanged.
+     * <p>
+     * Portlet developer should be aware that the returned URL might not be a well formed
+     * URL but a special token at the time the portlet is generating its content. 
+     * Thus portlets should not add additional parameters on the resulting URL or 
+     * expect to be able to parse the URL. As a result, the outcome of the encodeURL 
+     * call may be different than calling encodeURL in the servlet world.
+     * 
+     * @param path
+     *            the URI path to the resource. This must be either an absolute
+     *            URL (e.g.
+     *            <code>http://my.co/myportal/mywebap/myfolder/myresource.gif</code>)
+     *            or a full path URI (e.g.
+     *            <code>/myportal/mywebap/myfolder/myresource.gif</code>).
+     * 
+     * @exception java.lang.IllegalArgumentException
+     *                if path doesn't have a leading slash or is not an absolute
+     *                URL
+     * 
+     * @see javax.portlet.PortletResponse#encodeURL(String) encodeURL(String)
+     * 
+     * @return the encoded resource URL as string, may not be a valid URL
+     */
+
+   public String encodeURL(String path);
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/annotations/UserAttribute.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/UserAttribute.java b/portlet-api/src/main/java/javax/portlet/annotations/UserAttribute.java
new file mode 100644
index 0000000..7ef185c
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/annotations/UserAttribute.java
@@ -0,0 +1,61 @@
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+package javax.portlet.annotations;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+
+/**
+ * <div class='changed_added_3_0'>
+ * This annotation is used within composite portlet configuration annotations to
+ * represent a single user attribute.
+ * It cannot be used as a stand-alone portlet annotation.
+ * </div>
+ */
+@Retention(RUNTIME) @Target({ANNOTATION_TYPE})
+public @interface UserAttribute {
+   
+   /**
+    * <div class='container-change'>
+    * The user attribute name.
+    * </div>
+    * 
+    * @return  The public render parameter identifier
+    */
+   String      name();
+   
+   /**
+    * <div class='container-change'>
+    * Provides locale-specific text describing the user attribute for use by the portal application or by tools.
+    * </div>
+    * 
+    * @return  The user attribute description
+    */
+   LocaleString[]      description() default {};
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/annotations/WindowId.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/WindowId.java b/portlet-api/src/main/java/javax/portlet/annotations/WindowId.java
new file mode 100644
index 0000000..fc5a027
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/annotations/WindowId.java
@@ -0,0 +1,57 @@
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+package javax.portlet.annotations;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+
+/**
+ * <div class='changed_added_3_0'>
+ * Qualifier that specifies the window ID for injection.
+ * <p>
+ * The injection target type must be <code>String</code>.
+ * <p>
+ * This annotation may only be used in <code>{@literal @}RequestScoped</code> or
+ * <code>{@literal @}PortletStateScoped</code> beans.
+ * <p>
+ * Example:
+ * <div class='codebox'>      
+ * {@literal @}Inject {@literal @}WindowId<br/>   
+ * private String windowId;
+ * </div>                    
+ * </div>
+ * 
+ * @see javax.portlet.PortletRequest#getWindowID() getWindowID
+ */
+
+@Qualifier @Retention(RUNTIME) @Target({METHOD, FIELD, PARAMETER})
+public @interface WindowId {
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/annotations/package-info.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/package-info.java b/portlet-api/src/main/java/javax/portlet/annotations/package-info.java
new file mode 100644
index 0000000..aa7cb4c
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/annotations/package-info.java
@@ -0,0 +1,316 @@
+/*  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.
+ */
+
+/**
+ * <span class="changed_added_3_0">
+ * This describes a proposed extension for the JSR 362 Portlet Specification 3.0
+ * public API to exploit CDI capabilities in portlets. 
+ * </span>
+ * <h4>Overview</h4>
+ * <p>
+ * The annotation-oriented API provides new capabilities in several areas.
+ * </p>
+ * <ul class='nospace'>
+ * <li>
+ * It allows portlet configuration declarations to be performed through use of
+ * annotations.
+ * The goal is to reduce or remove the need to write a portlet deployment descriptor 
+ * in most instances.
+ * <p>
+ * The developer can choose between providing configuration data through annotations or 
+ * through the portlet deployment descriptor.
+ * If the same type of information is provided through both annotations and the deployment
+ * descriptor, the information from the deployment descriptor has precedence. 
+ * </li>
+ * <li>
+ * It allows portlets to be written as CDI beans.
+ * Such portlets can make use of standard CDI features such as interceptors, 
+ * decorators, and dependency injection.
+ * <p>
+ * Bean portlet methods must carry with one of the following annotations:
+ * {@link javax.portlet.annotations.ActionMethod}, 
+ * {@link javax.portlet.annotations.EventMethod}, 
+ * {@link javax.portlet.annotations.HeaderMethod}, 
+ * {@link javax.portlet.annotations.RenderMethod}, 
+ * {@link javax.portlet.annotations.ServeResourceMethod}, or 
+ * {@link javax.portlet.annotations.PortletResources}.
+ * <p>
+ * Bean portlet methods can be contained in any valid bean class. 
+ * The class needs not implement any portlet-specific interface or extend a portlet class. 
+ * However, each bean portlet method has method signature requirements that 
+ * must be fulfilled.
+ * Please see the annotation descriptions.
+ * </li>
+ * <li>
+ * It provides new custom scopes for portlet artifacts.
+ * <ul class='nospace'>
+ * <li>
+ * Using the scope annotation
+ * {@link javax.portlet.annotations.PortletSessionScoped} 
+ * associates the bean lifecycle with the portlet session.
+ * </li>
+ * <li>
+ * Using the scope annotation
+ * {@link javax.portlet.annotations.PortletStateScoped} 
+ * associates the bean lifecycle with the portlet state, which conceptually is stored 
+ * on the URL.
+ * If you use PortletStateScoped beans, your bean state will be automatically stored as
+ * render parameters for the portlet setting the state.      
+ * </li>
+ * </ul>
+ * </li>
+ * <li>
+ * It allows portlet artifacts such as portlet request filters, URL generation listeners,
+ * and preference validators to be implemented as CDI beans.
+ * <p>
+ * Please see the following annotation descriptions:
+ * {@link javax.portlet.annotations.PortletRequestFilter},
+ * {@link javax.portlet.annotations.PortletURLGenerationListener}, and
+ * {@link javax.portlet.annotations.PreferencesValidator}.
+ * </ul>
+ * <h4>Injectable Portlet Artifacts</h4>
+ * <p>
+ * In addition to the annotations, this package provides producer methods that allow
+ * many portlet artifacts to be injected into your code as beans.
+ * The following table describes the beans that are available for injection.
+ * </p>
+ * <p>
+ * <span style="font-weight:bold; text-decoration:underline;">Note:</span> 
+ * Most of these beans are dependent on the portlet request being executed, but could not themselves 
+ * be declared as {@literal @}RequestScoped due to technical limitations. 
+ * These beans should be used within enclosing beans that are either
+ * {@literal @}PortletStateScoped or {@literal @}RequestScoped to allow the portlet container to properly manage 
+ * the lifecycle of the injected object.
+ * The required enclosing bean scope is noted in the table.
+ * <table class='ovtable' width='100%'>
+ * <thead>
+ * <tr>
+ * <th width="15%">Object</th>
+ * <th width="40%">Description</th>
+ * <th width="15%">Enclosing Bean Scope</th>
+ * <th width="30%">Annotation Example</th>
+ * </tr>
+ * </thead>
+ * <tbody>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletConfig</td>
+ * <td>The PortletConfig object. Use qualifier {@literal @}BeanPortlet for disambiguation.</td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject {@literal @}BeanPortlet<br/>
+ * private PortletConfig portletConfig;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletRequest</td>
+ * <td>The PortletRequest object.</td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private PortletRequest request;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletResponse</td>
+ * <td>The PortletResponse object.</td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private PortletResponse request;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletPreferences</td>
+ * <td>The PortletPreferences object.</td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private PortletPreferences preferences;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletSession</td>
+ * <td>The PortletSession object.</td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private PortletSession session;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>URLFactory</td>
+ * <td>Provides methods for creating URLs.
+ * See {@link javax.portlet.annotations.URLFactory URLFactory}.
+ * </td>
+ * <td>Any</td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private URLFactory urlFactory;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>PortletMode</td>
+ * <td>The PortletMode object.
+ * </td>
+ * <td>
+ * {@literal @}RequestScoped
+ * or
+ * {@literal @}PortletStateScoped
+ * </td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private PortletMode mode;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>WindowState</td>
+ * <td>The WindowState object.
+ * </td>
+ * <td>
+ * {@literal @}RequestScoped
+ * or
+ * {@literal @}PortletStateScoped
+ * </td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private WindowState windowState;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>Cookies[]</td>
+ * <td>An array of Cookies set for the portlet.
+ * See {@link javax.portlet.PortletRequest#getCookies() getCookies}.
+ * </td>
+ * <td>
+ * {@literal @}RequestScoped
+ * or
+ * {@literal @}PortletStateScoped
+ * </td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private Cookies[] cookies;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>Locale</td>
+ * <td>The Locale object.
+ * See {@link javax.portlet.PortletRequest#getLocale() getLocale}.
+ * </td>
+ * <td>
+ * {@literal @}RequestScoped
+ * or
+ * {@literal @}PortletStateScoped
+ * </td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private Locale locale;
+ * </div>
+ * </td>
+ * </tr>
+ * <!-- ************* -->
+ * <tr>
+ * <td>Locales[]</td>
+ * <td>An array of supported Locales for the portlet.
+ * See {@link javax.portlet.PortletRequest#getLocales() getLocales}.
+ * </td>
+ * <td>
+ * {@literal @}RequestScoped
+ * or
+ * {@literal @}PortletStateScoped
+ * </td>
+ * <td>
+ * <div class='codebox'>
+ * {@literal @}Inject<br/>
+ * private Locales[] locales;
+ * </div>
+ * </td>
+ * </tr>
+ * </tbody>
+ * </table>
+ * <h4>Using the {@literal @}PortletStateScoped Annotation</h4>
+ * <p>
+ * The {@literal @}PortletStateScoped Annotation allows portlet render parameters
+ * to be treated as beans.
+ * The bean state is stored as a portlet render parameter.
+ * The annotation documentation for 
+ * {@link  javax.portlet.annotations.PortletStateScoped PortletStateScoped}
+ * describes the necessary prerequisites.
+ * </p>
+ * <p>
+ * The <code>paramName</code> element in the annotation can be used to provide a 
+ * parameter name for storing the bean.
+ * This element can also be left empty, in which case the portlet container will 
+ * generate a parameter name.
+ * </p>
+ * <p>
+ * When resource URLs are generated, {@literal @}PortletStateScoped beans valid for the
+ * current request are automatically stored on the URL as render parameters.
+ * When creating render or action URLs, {@literal @}PortletStateScoped beans can be
+ * automatically stored on the URL with the state valid for the current request by
+ * using the appropriate option with the <code>URLFactory</code>
+ * {@link  javax.portlet.annotations.URLFactory#createActionURL createActionURL} and
+ * {@link  javax.portlet.annotations.URLFactory#createRenderURL createRenderURL}
+ * methods.
+ * </p>
+ * <p>
+ * However, you might want to set a modified {@literal @}PortletStateScoped bean value
+ * on your URL.
+ * You can do this using the <code>PortletURL</code> interface
+ * {@link  javax.portlet.PortletURL#setBeanParameter setBeanParameter}
+ * method.
+ * You can create a new bean, set the fields as desired, and use the 
+ * <code>setBeanParameter</code> method to set the new bean on the URL.
+ * </p>
+ * <p>
+ * <span style="font-weight:bold; text-decoration:underline;">Tip:</span> 
+ * It might be useful to provide your {@literal @}PortletStateScoped
+ * bean with a copy constructor <b>in addition to</b> the required default constructor.
+ * You could then create a new {@literal @}PortletStateScoped bean based on the 
+ * current state of the injected bean and then update the fields on the new bean as required.
+ * </p>
+ */
+package javax.portlet.annotations;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/ActionRequestWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/ActionRequestWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/ActionRequestWrapper.java
index 41fb116..237cd76 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/ActionRequestWrapper.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/ActionRequestWrapper.java
@@ -1,155 +1,90 @@
-/*  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.
- */
-
-/*
- * This source code implements specifications defined by the Java
- * Community Process. In order to remain compliant with the specification
- * DO NOT add / change / or delete method signatures!
- */
-
-package javax.portlet.filter;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import javax.portlet.ActionParameters;
-import javax.portlet.ActionRequest;
-import javax.portlet.PortletParameters;
-
-/**
- * <span class="changed_modified_3_0">The</span> 
- * <code>ActionRequestWrapper</code> provides a convenient 
- * implementation of the <code>ActionRequest</code> interface 
- * that can be subclassed by developers wishing to adapt the request.
- * This class implements the Wrapper or Decorator pattern. 
- * Methods default to calling through to the wrapped request object.
- *
- * @since 2.0
- * @see ActionRequest
- */
-public class ActionRequestWrapper extends PortletRequestWrapper implements ActionRequest {
-
-    ActionRequest request;
-    
-    /**
-     * Creates an <code>ActionRequest</code> adaptor 
-     * wrapping the given request object.
-     * 
-     * @param request  the action request to wrap
-     * @throws java.lang.IllegalArgumentException if the request is <code>null</code>
-     */
-    public ActionRequestWrapper(ActionRequest request) {
-        super(request);
-        this.request = request;
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getCharacterEncoding()</code> on the wrapped request object.
-     */
-    public String getCharacterEncoding() {      
-        return request.getCharacterEncoding();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getContentLength()</code> on the wrapped request object.
-     */
-    public int getContentLength() {
-        return request.getContentLength();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getContentType()</code> on the wrapped request object.
-     */
-    public String getContentType() {
-        return request.getContentType();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getPortletInputStream()</code> on the wrapped request object.
-     */
-    public InputStream getPortletInputStream() throws IOException {
-        return request.getPortletInputStream();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getReader()</code> on the wrapped request object.
-     */
-    public BufferedReader getReader() throws UnsupportedEncodingException,
-            IOException {
-        return request.getReader();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setCharacterEncoding(String enc)</code> 
-     * on the wrapped request object.
-     */
-    public void setCharacterEncoding(String enc)
-            throws UnsupportedEncodingException {
-       request.setCharacterEncoding(enc);
-    }
-
-
-    /**
-     * Return the wrapped request object.
-     * 
-     * @return the wrapped request
-     */
-    public ActionRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * Sets the request object being wrapped.
-     * 
-     * @param request the request to set
-     * @throws java.lang.IllegalArgumentException   if the request is null.
-     */
-    public void setRequest(ActionRequest request) {
-    	if ( request == null)
-    		throw new java.lang.IllegalArgumentException("Request is null");
-
-        this.request = request;
-    }
-
-    /**
-     *  The default behavior of this method is to call 
-     * <code>getMethod()</code> on the wrapped request object.
-     */
-    public String getMethod() {
-        return request.getMethod();
-    }
-
-    /**
-     * <div class="changed_added_3_0">
-     *  The default behavior of this method is to call 
-     * <code>getActionParameters()</code> on the wrapped request object.
-     * </div>
-     */
-   public ActionParameters getActionParameters() {
-      return request.getActionParameters();
-   }
-
-}
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import javax.portlet.ActionParameters;
+import javax.portlet.ActionRequest;
+
+/**
+ * <span class="changed_modified_3_0">The</span> 
+ * <code>ActionRequestWrapper</code> provides a convenient 
+ * implementation of the <code>ActionRequest</code> interface 
+ * that can be subclassed by developers wishing to adapt the request.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped request object.
+ *
+ * @since 2.0
+ * @see ActionRequest
+ */
+public class ActionRequestWrapper extends ClientDataRequestWrapper implements ActionRequest {
+
+   ActionRequest request;
+
+   /**
+    * Creates an <code>ActionRequest</code> adaptor 
+    * wrapping the given request object.
+    * 
+    * @param request  the action request to wrap
+    * @throws java.lang.IllegalArgumentException if the request is <code>null</code>
+    */
+   public ActionRequestWrapper(ActionRequest request) {
+      super(request);
+      this.request = request;
+   }
+
+   /**
+    * Return the wrapped request object.
+    * 
+    * @return the wrapped request
+    */
+   public ActionRequest getRequest() {
+      return request;
+   }
+
+   /**
+    * Sets the request object being wrapped.
+    * 
+    * @param request the request to set
+    * @throws java.lang.IllegalArgumentException   if the request is null.
+    */
+   public void setRequest(ActionRequest request) {
+      if ( request == null) {
+         throw new java.lang.IllegalArgumentException("Request is null");
+      }
+      super.setRequest(request);
+      this.request = request;
+   }
+
+   /**
+    * <div class="changed_added_3_0">
+    *  The default behavior of this method is to call 
+    * <code>getActionParameters()</code> on the wrapped request object.
+    * </div>
+    */
+   public ActionParameters getActionParameters() {
+      return request.getActionParameters();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/ActionResponseWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/ActionResponseWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/ActionResponseWrapper.java
index 6542d82..4ad1be0 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/ActionResponseWrapper.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/ActionResponseWrapper.java
@@ -1,209 +1,106 @@
-/*  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.
- */
-
-/*
- * This source code implements specifications defined by the Java
- * Community Process. In order to remain compliant with the specification
- * DO NOT add / change / or delete method signatures!
- */
-
-package javax.portlet.filter;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.portlet.ActionResponse;
-import javax.portlet.MutablePortletParameters;
-import javax.portlet.MutableRenderParameters;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletModeException;
-import javax.portlet.WindowState;
-import javax.portlet.WindowStateException;
-import javax.xml.namespace.QName;
-
-/**
- * <span class="changed_modified_3_0">The</span> 
- * <code>ActionResponseWrapper</code> provides a convenient 
- * implementation of the <code>ActionResponse</code> interface 
- * that can be subclassed by developers wishing to adapt the response.
- * This class implements the Wrapper or Decorator pattern. 
- * Methods default to calling through to the wrapped response object.
- *
- * @since 2.0
- * @see ActionResponse
- */
-public class ActionResponseWrapper extends PortletResponseWrapper implements ActionResponse {
-
-   ActionResponse response;
-    
-    /**
-     * Creates an <code>ActionResponse</code> adaptor 
-     * wrapping the given response object.
-     * 
-     * @param response  the action response to wrap
-     * @throws java.lang.IllegalArgumentException if the response is <code>null</code>
-     */
-    public ActionResponseWrapper(ActionResponse response) {
-    	super(response);
-    	this.response = response;
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>sendRedirect(location)</code> on the wrapped response object.
-     */
-    public void sendRedirect(String location) throws IOException {
-        response.sendRedirect(location);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>sendRedirect(location, renderUrlParamName)</code> on the wrapped response object.
-     */
-    public void sendRedirect(String location, String renderUrlParamName) throws IOException {
-        response.sendRedirect(location, renderUrlParamName);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setEvent(name, value)</code> on the wrapped response object.
-     */
-    public void setEvent(QName name, java.io.Serializable value) {
-        response.setEvent(name, value);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setPortletMode(portletMode)</code> on the wrapped response object.
-     */
-    public void setPortletMode(PortletMode portletMode)
-            throws PortletModeException {
-        response.setPortletMode(portletMode);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setRenderParameter(key, value)</code> on the wrapped response object.
-     */
-    @Deprecated
-    public void setRenderParameter(String key, String value) {
-        response.setRenderParameter(key, value);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setRenderParameter(key, value)</code> on the wrapped response object.
-     */
-    @Deprecated
-    public void setRenderParameter(String key, String... values) {
-        response.setRenderParameter(key, values);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setRenderParameters(parameters)</code> on the wrapped response object.
-     */
-    @Deprecated
-    public void setRenderParameters(Map<String, String[]> parameters) {
-        response.setRenderParameters(parameters);
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>setWindowState(windowState)</code> on the wrapped response object.
-     */
-    public void setWindowState(WindowState windowState)
-            throws WindowStateException {
-        response.setWindowState(windowState);
-    }
-
-     /**
-     * Return the wrapped response object.
-     * 
-     * @return the wrapped response
-     */
-    public ActionResponse getResponse() {
-        return response;
-    }
-
-    /**
-     * Sets the response object being wrapped.
-     * 
-     * @param response the response to set
-     * @throws java.lang.IllegalArgumentException   if the response is null.
-     */
-    public void setResponse(ActionResponse response) {
-    	if ( response == null)
-    		throw new java.lang.IllegalArgumentException("Response is null");
-
-    	this.response = response;
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getPortletMode()</code> on the wrapped response object.
-     */
-    public PortletMode getPortletMode() {
-        return response.getPortletMode();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getRenderParameterMap()</code> on the wrapped response object.
-     */
-    @Deprecated
-    public Map<String, String[]> getRenderParameterMap() {
-        return response.getRenderParameterMap();
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getWindowState()</code> on the wrapped response object.
-     */
-    public WindowState getWindowState() {
-        return response.getWindowState();
-    }
-
-    /**
-     *  The default behavior of this method is to call 
-     * <code>setEvent()</code> on the wrapped response object.
-     */
-	public void setEvent(String name, java.io.Serializable value) {
-		response.setEvent(name, value);
-	}
-
-    /**
-     *  The default behavior of this method is to call 
-     * <code>removePublicRenderParameter()</code> on the wrapped response object.
-     */
-	@Deprecated
-	public void removePublicRenderParameter(String name) {
-		response.removePublicRenderParameter(name);		
-	}
-
-   /**
-    * <div class="changed_added_3_0">
-    *  The default behavior of this method is to call 
-    * <code>getRenderParameter()</code> on the wrapped response object.
-    * </div>
-    */
-   public MutableRenderParameters getRenderParameters() {
-      return response.getRenderParameters();
-   }
-
-}
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import java.io.IOException;
+
+import javax.portlet.ActionResponse;
+import javax.portlet.MimeResponse.Copy;
+import javax.portlet.RenderURL;
+
+/**
+ * <span class="changed_modified_3_0">The</span> 
+ * <code>ActionResponseWrapper</code> provides a convenient 
+ * implementation of the <code>ActionResponse</code> interface 
+ * that can be subclassed by developers wishing to adapt the response.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped response object.
+ *
+ * @since 2.0
+ * @see ActionResponse
+ */
+public class ActionResponseWrapper extends StateAwareResponseWrapper implements ActionResponse {
+
+   ActionResponse response;
+
+   /**
+    * Creates an <code>ActionResponse</code> adaptor 
+    * wrapping the given response object.
+    * 
+    * @param response  the action response to wrap
+    * @throws java.lang.IllegalArgumentException if the response is <code>null</code>
+    */
+   public ActionResponseWrapper(ActionResponse response) {
+      super(response);
+      this.response = response;
+   }
+
+   /**
+    * Return the wrapped response object.
+    * 
+    * @return the wrapped response
+    */
+   public ActionResponse getResponse() {
+      return response;
+   }
+
+   /**
+    * Sets the response object being wrapped.
+    * 
+    * @param response the response to set
+    * @throws java.lang.IllegalArgumentException   if the response is null.
+    */
+   public void setResponse(ActionResponse response) {
+      if ( response == null) {
+         throw new java.lang.IllegalArgumentException("Response is null");
+      }
+      super.setResponse(response);
+      this.response = response;
+   }
+
+   /**
+    * The default behavior of this method is to call 
+    * <code>sendRedirect(location)</code> on the wrapped response object.
+    */
+   public void sendRedirect(String location) throws IOException {
+      response.sendRedirect(location);
+   }
+
+   /**
+    * The default behavior of this method is to call 
+    * <code>sendRedirect(location, renderUrlParamName)</code> on the wrapped response object.
+    */
+   public void sendRedirect(String location, String renderUrlParamName) throws IOException {
+      response.sendRedirect(location, renderUrlParamName);
+   }
+
+   /**
+    * call wrapped object.
+    */
+   public RenderURL getRedirectURL(Copy option) throws IllegalStateException {
+      return response.getRedirectURL(option);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/ClientDataRequestWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/ClientDataRequestWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/ClientDataRequestWrapper.java
new file mode 100644
index 0000000..ad0114d
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/filter/ClientDataRequestWrapper.java
@@ -0,0 +1,125 @@
+/*  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 javax.portlet.filter;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+import javax.portlet.ClientDataRequest;
+
+/**
+ * <div class="changed_added_3_0">
+ * The <code>ClientDataRequestWrapper</code> provides a convenient 
+ * implementation of the <code>ClientDataRequest</code> interface 
+ * that can be subclassed by developers wishing to adapt the request.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped request object.
+ * </div>
+ */
+public class ClientDataRequestWrapper extends PortletRequestWrapper implements
+ClientDataRequest {
+
+   ClientDataRequest request;
+
+   /**
+    * @param request
+    */
+   public ClientDataRequestWrapper(ClientDataRequest request) {
+      super(request);
+      this.request = request;
+   }
+
+   /**
+    * Return the wrapped request object.
+    * 
+    * @return the wrapped request
+    */
+   public ClientDataRequest getRequest() {
+      return request;
+   }
+
+   /**
+    * Sets the request object being wrapped.
+    * 
+    * @param request the request to set
+    * @throws java.lang.IllegalArgumentException   if the request is null.
+    */
+   public void setRequest(ClientDataRequest request) {
+      if ( request == null) {
+         throw new java.lang.IllegalArgumentException("Request is null");
+      }
+      super.setRequest(request);
+      this.request = request;
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getPortletInputStream()
+    */
+   public InputStream getPortletInputStream() throws IOException {
+      return request.getPortletInputStream();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#setCharacterEncoding(java.lang.String)
+    */
+   public void setCharacterEncoding(String enc)
+         throws UnsupportedEncodingException {
+      request.setCharacterEncoding(enc);
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getReader()
+    */
+   public BufferedReader getReader() throws UnsupportedEncodingException,
+   IOException {
+      return request.getReader();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getCharacterEncoding()
+    */
+   public String getCharacterEncoding() {
+      return request.getCharacterEncoding();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getContentType()
+    */
+   public String getContentType() {
+      return request.getContentType();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getContentLength()
+    */
+   public int getContentLength() {
+      return request.getContentLength();
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.ClientDataRequest#getMethod()
+    */
+   public String getMethod() {
+      return request.getMethod();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/EventRequestWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/EventRequestWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/EventRequestWrapper.java
index d13b014..d035974 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/EventRequestWrapper.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/EventRequestWrapper.java
@@ -1,96 +1,98 @@
-/*  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.
- */
-
-/*
- * This source code implements specifications defined by the Java
- * Community Process. In order to remain compliant with the specification
- * DO NOT add / change / or delete method signatures!
- */
-
-package javax.portlet.filter;
-
-import javax.portlet.Event;
-import javax.portlet.EventRequest;
-
-/**
- * The <code>EventRequestWrapper</code> provides a convenient 
- * implementation of the <code>EventRequest</code> interface 
- * that can be subclassed by developers wishing to adapt the request.
- * This class implements the Wrapper or Decorator pattern. 
- * Methods default to calling through to the wrapped request object.
- *
- * @since 2.0
- * @see EventRequest
- */
-public class EventRequestWrapper extends PortletRequestWrapper implements EventRequest {
-
-    EventRequest request;
-    
-    
-    /**
-     * Creates an <code>EventRequest</code> adaptor 
-     * wrapping the given request object.
-     * 
-     * @param request  the event request to wrap
-     * @throws java.lang.IllegalArgumentException if the request is <code>null</code>
-     */
-    public EventRequestWrapper(EventRequest request) {
-    	super(request);
-    	this.request = request;
-    }
-
-    /**
-     * Return the wrapped request object.
-     * 
-     * @return the wrapped request
-     */
-    public EventRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * Sets the request object being wrapped.
-     * 
-     * @param request the request to set
-     * @throws java.lang.IllegalArgumentException   if the request is null.
-     */
-    public void setRequest(EventRequest request) {
-    	if ( request == null)
-    		throw new java.lang.IllegalArgumentException("Request is null");
-
-        this.request = request;
-    }
-
-    /**
-     * The default behavior of this method is to call 
-     * <code>getEvent()</code> on the wrapped request object.
-     */
-    public Event getEvent() {
-        return request.getEvent();
-    }
-
-    /**
-     *  The default behavior of this method is to call 
-     * <code>getMethod()</code> on the wrapped request object.
-     */
-    public String getMethod() {
-        return request.getMethod();
-    }
-
-
-}
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import javax.portlet.Event;
+import javax.portlet.EventRequest;
+
+/**
+ * <span class="changed_modified_3_0">The</span> 
+ * <code>EventRequestWrapper</code> provides a convenient 
+ * implementation of the <code>EventRequest</code> interface 
+ * that can be subclassed by developers wishing to adapt the request.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped request object.
+ *
+ * @since 2.0
+ * @see EventRequest
+ */
+public class EventRequestWrapper extends PortletRequestWrapper implements EventRequest {
+
+   EventRequest request;
+
+
+   /**
+    * Creates an <code>EventRequest</code> adaptor 
+    * wrapping the given request object.
+    * 
+    * @param request  the event request to wrap
+    * @throws java.lang.IllegalArgumentException if the request is <code>null</code>
+    */
+   public EventRequestWrapper(EventRequest request) {
+      super(request);
+      this.request = request;
+   }
+
+   /**
+    * Return the wrapped request object.
+    * 
+    * @return the wrapped request
+    */
+   public EventRequest getRequest() {
+      return request;
+   }
+
+   /**
+    * Sets the request object being wrapped.
+    * 
+    * @param request the request to set
+    * @throws java.lang.IllegalArgumentException   if the request is null.
+    */
+   public void setRequest(EventRequest request) {
+      if ( request == null) {
+         throw new java.lang.IllegalArgumentException("Request is null");
+      }
+      super.setRequest(request);
+      this.request = request;
+   }
+
+   /**
+    * The default behavior of this method is to call 
+    * <code>getEvent()</code> on the wrapped request object.
+    */
+   public Event getEvent() {
+      return request.getEvent();
+   }
+
+   /**
+    *  The default behavior of this method is to call 
+    * <code>getMethod()</code> on the wrapped request object.
+    */
+   public String getMethod() {
+      return request.getMethod();
+   }
+
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/EventResponseWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/EventResponseWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/EventResponseWrapper.java
index dc38240..1831a29 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/EventResponseWrapper.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/EventResponseWrapper.java
@@ -1,204 +1,89 @@
-/*  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.
- */
-
-/*
- * This source code implements specifications defined by the Java
- * Community Process. In order to remain compliant with the specification
- * DO NOT add / change / or delete method signatures!
- */
-
-package javax.portlet.filter;
-
-import java.util.Map;
-
-import javax.portlet.EventRequest;
-import javax.portlet.EventResponse;
-import javax.portlet.MutablePortletParameters;
-import javax.portlet.MutableRenderParameters;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletModeException;
-import javax.portlet.WindowState;
-import javax.portlet.WindowStateException;
-import javax.xml.namespace.QName;
-
-/**
- * <span class="changed_modified_3_0">The</span> 
- * <code>EventResponseWrapper</code> provides a convenient 
- * implementation of the <code>EventResponse</code> interface 
- * that can be subclassed by developers wishing to adapt the response.
- * This class implements the Wrapper or Decorator pattern. 
- * Methods default to calling through to the wrapped response object.
- *
- * @since 2.0
- * @see EventResponse
- */
-
-public class EventResponseWrapper extends PortletResponseWrapper implements EventResponse {
-
-    EventResponse response;
-     
-     /**
-      * Creates an <code>EventResponse</code> adaptor 
-      * wrapping the given response object.
-      * 
-      * @param response  the event response to wrap
-      * @throws java.lang.IllegalArgumentException if the response is <code>null</code>
-      */
-     public EventResponseWrapper(EventResponse response) {
-    	 super(response);
-         this.response = response;
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setEvent(name, value)</code> on the wrapped response object.
-      */
-     public void setEvent(QName name, java.io.Serializable value) {
-         response.setEvent(name, value);
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setPortletMode(portletMode)</code> on the wrapped response object.
-      */
-     public void setPortletMode(PortletMode portletMode)
-             throws PortletModeException {
-         response.setPortletMode(portletMode);
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setRenderParameter(key, value)</code> on the wrapped response object.
-      */
-     @Deprecated
-     public void setRenderParameter(String key, String value) {
-         response.setRenderParameter(key, value);
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setRenderParameter(key, value)</code> on the wrapped response object.
-      */
-     
-     @Deprecated
-     public void setRenderParameter(String key, String ... values) {
-         response.setRenderParameter(key, values);
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setRenderParameters(parameters)</code> on the wrapped response object.
-      */
-     @Deprecated
-     public void setRenderParameters(Map<String, String[]> parameters) {
-         response.setRenderParameters(parameters);
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>setWindowState(windowState)</code> on the wrapped response object.
-      */
-     public void setWindowState(WindowState windowState)
-             throws WindowStateException {
-         response.setWindowState(windowState);
-     }
-
-     /**
-      * Return the wrapped response object.
-      * 
-      * @return the wrapped response
-      */
-     public EventResponse getResponse() {
-         return response;
-     }
-
-     /**
-      * Sets the response object being wrapped.
-      * 
-      * @param response the response to set
-      * @throws java.lang.IllegalArgumentException   if the response is null.
-      */
-     public void setResponse(EventResponse response) {
-	    	if ( response == null)
-	    		throw new java.lang.IllegalArgumentException("Response is null");
-
-	    	this.response = response;
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>getPortletMode()</code> on the wrapped response object.
-      */
-     public PortletMode getPortletMode() {
-         return response.getPortletMode();
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>getRenderParameterMap()</code> on the wrapped response object.
-      */
-     @Deprecated
-     public Map<String, String[]> getRenderParameterMap() {
-         return response.getRenderParameterMap();
-     }
-
-     /**
-      * The default behavior of this method is to call 
-      * <code>getWindowState()</code> on the wrapped response object.
-      */
-     public WindowState getWindowState() {
-         return response.getWindowState();
-     }
-
-     /**
-      *  The default behavior of this method is to call 
-      * <code>setRenderParameters()</code> on the wrapped response object.
-      */
-     @Deprecated
-     public void setRenderParameters(EventRequest request) {
-         response.setRenderParameters(request);         
-     }
-
-     /**
-      *  The default behavior of this method is to call 
-      * <code>setEvent()</code> on the wrapped response object.
-      */
- 	public void setEvent(String name, java.io.Serializable value) {
- 		response.setEvent(name, value);
- 	}
- 	
-    /**
-     *  The default behavior of this method is to call 
-     * <code>removePublicRenderParameter()</code> on the wrapped response object.
-     */
- 	@Deprecated
-	public void removePublicRenderParameter(String name) {
-		response.removePublicRenderParameter(name);		
-	}
-
-   /**
-    * <div class="changed_added_3_0">
-    *  The default behavior of this method is to call 
-    * <code>getRenderParameter()</code> on the wrapped response object.
-    * </div>
-    */
-   public MutableRenderParameters getRenderParameters() {
-      return response.getRenderParameters();
-   }
-
-}
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import javax.portlet.EventRequest;
+import javax.portlet.EventResponse;
+
+/**
+ * <span class="changed_modified_3_0">The</span> 
+ * <code>EventResponseWrapper</code> provides a convenient 
+ * implementation of the <code>EventResponse</code> interface 
+ * that can be subclassed by developers wishing to adapt the response.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped response object.
+ *
+ * @since 2.0
+ * @see EventResponse
+ */
+
+public class EventResponseWrapper extends StateAwareResponseWrapper implements EventResponse {
+
+   EventResponse response;
+
+   /**
+    * Creates an <code>EventResponse</code> adaptor 
+    * wrapping the given response object.
+    * 
+    * @param response  the event response to wrap
+    * @throws java.lang.IllegalArgumentException if the response is <code>null</code>
+    */
+   public EventResponseWrapper(EventResponse response) {
+      super(response);
+      this.response = response;
+   }
+
+   /**
+    * Return the wrapped response object.
+    * 
+    * @return the wrapped response
+    */
+   public EventResponse getResponse() {
+      return response;
+   }
+
+   /**
+    * Sets the response object being wrapped.
+    * 
+    * @param response the response to set
+    * @throws java.lang.IllegalArgumentException   if the response is null.
+    */
+   public void setResponse(EventResponse response) {
+      if ( response == null) {
+         throw new java.lang.IllegalArgumentException("Response is null");
+      }
+      super.setResponse(response);
+      this.response = response;
+   }
+
+   /**
+    *  The default behavior of this method is to call 
+    * <code>setRenderParameters()</code> on the wrapped response object.
+    */
+   @Deprecated
+   public void setRenderParameters(EventRequest request) {
+      response.setRenderParameters(request);         
+   }
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/HeaderFilter.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/HeaderFilter.java b/portlet-api/src/main/java/javax/portlet/filter/HeaderFilter.java
new file mode 100644
index 0000000..6e95b60
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/filter/HeaderFilter.java
@@ -0,0 +1,113 @@
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import java.io.IOException;
+
+import javax.portlet.HeaderRequest;
+import javax.portlet.HeaderResponse;
+import javax.portlet.PortletException;
+
+/**
+ * <div class="changed_added_3_0">
+ * The <code>HeaderFilter</code> is an object that performs filtering 
+ * tasks on either the header request to a portlet, or on the header response from 
+ * a portlet, or both.
+ * <p>
+ * Filters perform filtering in the <code>doFilter</code> method. Every Filter has 
+ * access to a <code>FilterConfig</code> object from which it can obtain 
+ * its initialization parameters, a reference to the PortletContext 
+ * which it can use, for example, to load resources needed for filtering tasks.
+ * <p>
+ * Filters are configured in the portlet deployment descriptor of a 
+ * portlet application.
+ * </div> 
+ * 
+ * @since 2.0
+ */
+public interface HeaderFilter extends PortletFilter {
+
+    /**
+     * The <code>doFilter</code> method of the Filter is called by the 
+     * portlet container each time a header request/response pair is passed 
+     * through the chain due to a client request for a portlet method 
+     * at the end of the chain. 
+     * <p>
+     * The <code>FilterChain</code> passed in to this method allows 
+     * the Filter to pass on the header request and response to the next 
+     * component in the chain.
+     * <p>
+     * The <code>doFilter</code> method of a filter will typically be implemented 
+     * following this or some subset of the following pattern:
+     * <ul>
+     *  <li>The method examines the request information.</li>
+     *  <li>The method may wrap the request object passed in to 
+     *      its doFilter method with a customized implementation 
+     *      the request wrapper <code>HeaderRequestWrapper</code> 
+     *      in order to modify request data.</li>
+     *  <li>The method may wrap the response object passed in to its 
+     *      <code>doFilter</code> method with a customized implementation 
+     *      of the response wrapper <code>HeaderResponseWrapper</code> 
+     *      to modify response data.</li>
+     *  <li>The filter may invoke the next component in the filter chain. 
+     *      The next component may be another filter, or if the filter 
+     *      making the invocation is the last filter configured in the 
+     *      deployment descriptor for this chain, the next component 
+     *      is the target method of the portlet. The invocation of the 
+     *      next component is effected by calling the <code>doFilter</code>
+     *      method on the <code>FilterChain</code> object, and passing in 
+     *      the request and response with which it was called or passing 
+     *      in wrapped versions it may have created. 
+     *      The filter chain's implementation of the <code>doFilter</code> 
+     *      method, provided by the portlet container, must locate the 
+     *      next component in the filter chain and invoke its <code>doFilter</code>
+     *      method, passing in the appropriate request and response objects. 
+     *      Alternatively, the filter chain can block the request by not 
+     *      making the call to invoke the next component, leaving the filter 
+     *      responsible for filling out the response object.</li>
+     *  <li>After invocation of the next filter in the chain, the filter 
+     *      may examine the response data.</li>
+     *  <li>Alternatively, the filter may have thrown an exception to 
+     *      indicate an error in processing. If the filter throws an 
+     *      <code>UnavailableException</code> during its <code>doFilter</code> 
+     *      processing, the portlet container must not attempt continued 
+     *      processing down the filter chain. It may choose to retry the 
+     *      whole chain at a later time if the exception is not marked permanent.</li>
+     *  <li>When the last filter in the chain has been invoked, the next 
+     *      component accessed is the target method on the portlet at 
+     *      the end of the chain.</li>
+     * </ul>
+     * 
+     * @param request  the current header request 
+     * @param response  the current header response 
+     * @param chain  the remaining filter chain
+     * @throws IOException  if an IO error occurred in the filter processing
+     * @throws PortletException  if a portlet exception occurred in the filter processing
+     */
+    public void doFilter(HeaderRequest request, HeaderResponse response,
+                         HeaderFilterChain chain)
+     throws IOException, PortletException;
+        
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/HeaderFilterChain.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/HeaderFilterChain.java b/portlet-api/src/main/java/javax/portlet/filter/HeaderFilterChain.java
new file mode 100644
index 0000000..1cb907f
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/filter/HeaderFilterChain.java
@@ -0,0 +1,61 @@
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import java.io.IOException;
+
+import javax.portlet.PortletException;
+import javax.portlet.HeaderRequest;
+import javax.portlet.HeaderResponse;
+
+/**
+ * <div class="changed_added_3_0">
+ * A <code>HeaderFilterChain</code> object is provided by the portlet container 
+ * to give a view into the invocation chain of a 
+ * filtered header request for a portlet. Filters use the <code>HeaderFilterChain</code> 
+ * to invoke the next filter in the chain, or if the calling filter is the 
+ * last filter in the chain, to invoke the portlet at the end of the chain.
+ * </div>
+ *
+ * @since 3.0
+ */
+public interface HeaderFilterChain {
+    
+    /**
+     * Causes the next filter in the chain to be invoked, 
+     * or if the calling filter is the last filter in the chain, 
+     * causes the portlet at the end of the chain to be invoked.
+     * 
+     * @param request  the current header request. 
+     * @param response  the current header response.
+     *  
+     * @throws IOException  if an IO error occurred in the filter processing
+     * @throws PortletException  if a portlet exception occurred in the filter processing
+     */
+    public void doFilter(HeaderRequest request, HeaderResponse response)
+     throws IOException, PortletException;
+
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/HeaderRequestWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/HeaderRequestWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/HeaderRequestWrapper.java
new file mode 100644
index 0000000..5334907
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/filter/HeaderRequestWrapper.java
@@ -0,0 +1,80 @@
+/*  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.
+ */
+
+/*
+ * This source code implements specifications defined by the Java
+ * Community Process. In order to remain compliant with the specification
+ * DO NOT add / change / or delete method signatures!
+ */
+
+package javax.portlet.filter;
+
+import javax.portlet.HeaderRequest;
+
+/**
+ * <div class="changed_added_3_0">
+ * The <code>HeaderRequestWrapper</code> provides a convenient 
+ * implementation of the <code>HeaderRequest</code> interface 
+ * that can be subclassed by developers wishing to adapt the request.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped request object.
+ * </div>
+ *
+ * @since 2.0
+ * @see HeaderRequest
+ */
+public class HeaderRequestWrapper extends RenderRequestWrapper implements HeaderRequest {
+
+    HeaderRequest request;
+    
+    /**
+     * Creates an <code>HeaderRequest</code> adaptor 
+     * wrapping the given request object.
+     * 
+     * @param request  the render request to wrap
+     * @throws java.lang.IllegalArgumentException if the request is <code>null</code>
+     */
+    public HeaderRequestWrapper(HeaderRequest request) {
+    	super(request);
+    	this.request = request;
+    }
+
+    /**
+     * Return the wrapped request object.
+     * 
+     * @return the wrapped request
+     */
+    public HeaderRequest getRequest() {
+       return request;
+    }
+
+    /**
+     * Sets the request object being wrapped.
+     * 
+     * @param request the request to set
+     * @throws java.lang.IllegalArgumentException   if the request is null.
+     */
+    public void setRequest(HeaderRequest request) {
+       if ( request == null) {
+          throw new java.lang.IllegalArgumentException("Request is null");
+       }
+       super.setRequest(request);
+       this.request = request;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/7fb0624d/portlet-api/src/main/java/javax/portlet/filter/HeaderResponseWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/HeaderResponseWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/HeaderResponseWrapper.java
new file mode 100644
index 0000000..bccd50d
--- /dev/null
+++ b/portlet-api/src/main/java/javax/portlet/filter/HeaderResponseWrapper.java
@@ -0,0 +1,76 @@
+/*  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 javax.portlet.filter;
+
+import javax.portlet.HeaderResponse;
+
+/**
+ * <div class="changed_added_3_0">
+ * The <code>HeaderResponseWrapper</code> provides a convenient 
+ * implementation of the <code>HeaderResponse</code> interface 
+ * that can be subclassed by developers wishing to adapt the Response.
+ * This class implements the Wrapper or Decorator pattern. 
+ * Methods default to calling through to the wrapped Response object.
+ * </div>
+ */
+public class HeaderResponseWrapper extends MimeResponseWrapper implements
+HeaderResponse {
+
+   HeaderResponse response;
+
+   /**
+    * @param response
+    */
+   public HeaderResponseWrapper(HeaderResponse response) {
+      super(response);
+      this.response = response;
+   }
+
+   /**
+    * Return the wrapped response object.
+    * 
+    * @return the wrapped response
+    */
+   public HeaderResponse getResponse() {
+      return response;
+   }
+
+   /**
+    * Sets the response object being wrapped.
+    * 
+    * @param response the response to set
+    * @throws java.lang.IllegalArgumentException   if the response is null.
+    */
+   public void setResponse(HeaderResponse response) {
+      if ( response == null) {
+         throw new java.lang.IllegalArgumentException("Response is null");
+      }
+      super.setResponse(response);
+      this.response = response;
+   }
+
+   /* (non-Javadoc)
+    * @see javax.portlet.HeaderResponse#setTitle(java.lang.String)
+    */
+   public void setTitle(String title) {
+      response.setTitle(title);
+   }
+
+}