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 2016/04/14 14:28:59 UTC

[19/50] [abbrv] portals-pluto git commit: Added methods for asynchronous processing on ResourceRequest. Added async configuration items on @PortletConfiguration and @ServeResourceMethod annotations. Added async-supported item to portlet deployment descri

Added methods for asynchronous processing on ResourceRequest. Added async
configuration items on @PortletConfiguration and @ServeResourceMethod
annotations. Added async-supported item to portlet deployment descriptor
XSD. Added method stubs on ResourceRequestImpl.


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

Branch: refs/heads/master
Commit: e14ab8607cb720e10152c1354b3b51345aa9aec6
Parents: c19723e
Author: Scott Nicklous <ms...@apache.org>
Authored: Fri Mar 11 14:55:08 2016 +0100
Committer: Scott Nicklous <ms...@apache.org>
Committed: Fri Mar 11 14:55:08 2016 +0100

----------------------------------------------------------------------
 .../container/impl/ResourceRequestImpl.java     |  33 +++
 .../pluto/container/impl/portlet-app_3_0.xsd    |  16 +-
 .../fixtures/mocks/MockResourceRequest.java     |  33 +++
 .../java/javax/portlet/ResourceRequest.java     | 204 +++++++++++++++++++
 .../annotations/PortletConfiguration.java       |  11 +
 .../annotations/ServeResourceMethod.java        |  11 +
 .../javax/portlet/filter/ResourceFilter.java    |  26 ++-
 .../portlet/filter/ResourceRequestWrapper.java  |  33 +++
 portlet-api/src/main/javadoc/overview.html      |  16 ++
 portlet-api/src/main/javadoc/portlet-api.css    |   1 +
 10 files changed, 380 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceRequestImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceRequestImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceRequestImpl.java
index e09ce3a..96aa81e 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceRequestImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceRequestImpl.java
@@ -23,6 +23,9 @@ import javax.portlet.CacheControl;
 import javax.portlet.PortletRequest;
 import javax.portlet.ResourceParameters;
 import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 
 import org.apache.pluto.container.PortletResourceRequestContext;
 import org.apache.pluto.container.PortletResourceResponseContext;
@@ -107,4 +110,34 @@ public class ResourceRequestImpl extends ClientDataRequestImpl implements Resour
    public ResourceParameters getResourceParameters() {
       return requestContext.getResourceParameters();
    }
+
+   @Override
+   public AsyncContext startAsync() throws IllegalStateException {
+      return null;
+   }
+
+   @Override
+   public AsyncContext startAsync(ResourceRequest request, ResourceResponse response) throws IllegalStateException {
+      return null;
+   }
+
+   @Override
+   public boolean isAsyncStarted() {
+      return false;
+   }
+
+   @Override
+   public boolean isAsyncSupported() {
+      return false;
+   }
+
+   @Override
+   public AsyncContext getAsyncContext() {
+      return null;
+   }
+
+   @Override
+   public DispatcherType getDispatcherType() {
+      return null;
+   }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/pluto-container/src/main/resources/org/apache/pluto/container/impl/portlet-app_3_0.xsd
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/resources/org/apache/pluto/container/impl/portlet-app_3_0.xsd b/pluto-container/src/main/resources/org/apache/pluto/container/impl/portlet-app_3_0.xsd
index fc0f672..8d97be1 100644
--- a/pluto-container/src/main/resources/org/apache/pluto/container/impl/portlet-app_3_0.xsd
+++ b/pluto-container/src/main/resources/org/apache/pluto/container/impl/portlet-app_3_0.xsd
@@ -142,7 +142,8 @@
 			<element name="default-namespace" type="xs:anyURI" minOccurs="0"/>
 			<element name="event-definition" type="portlet:event-definitionType" minOccurs="0" maxOccurs="unbounded"/>
 			<element name="public-render-parameter" type="portlet:public-render-parameterType" minOccurs="0" maxOccurs="unbounded"/>
-			<element name="listener" type="portlet:listenerType" minOccurs="0" maxOccurs="unbounded"/>
+			<element name="listener" type="portlet:listenerType" minOccurs="0" maxOccurs="unbounded"/>
+
 			<element name="container-runtime-option" type="portlet:container-runtime-optionType" minOccurs="0" maxOccurs="unbounded"/>
 		</sequence>
 		<attribute name="version" type="portlet:string" use="required"/>
@@ -305,7 +306,15 @@
 			<element name="supported-publishing-event" type="portlet:event-definition-referenceType" minOccurs="0" maxOccurs="unbounded"/>
 			<element name="supported-public-render-parameter" type="portlet:string" minOccurs="0" maxOccurs="unbounded"/>
 			<element name="container-runtime-option" type="portlet:container-runtime-optionType" minOccurs="0" maxOccurs="unbounded"/>
-			<element name="dependency" type="portlet:dependencyType" minOccurs="0" maxOccurs="unbounded"/>
+			<element name="dependency" type="portlet:dependencyType" minOccurs="0" maxOccurs="unbounded"/>
+            <element name="async-supported" type="boolean" minOccurs="0" maxOccurs="1">
+               <annotation>
+                  <documentation>
+                     If set to 'true', the portlet will support
+                     asynchronous processing in resource requests.
+                  </documentation>
+               </annotation>
+            </element>
 		</sequence>
 		<attribute name="id" type="portlet:string" use="optional"/>
 	</complexType>
@@ -425,7 +434,8 @@
 			<element name="name" type="xs:NCName"/>
 		</choice>
 		<attribute name="id" type="portlet:string" use="optional"/>
-	</complexType>
+	</complexType>
+
 	<complexType name="listenerType">
 		<annotation>
 			<documentation>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/mocks/MockResourceRequest.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/mocks/MockResourceRequest.java b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/mocks/MockResourceRequest.java
index 6a36ed5..2b4d1a2 100644
--- a/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/mocks/MockResourceRequest.java
+++ b/pluto-container/src/test/java/org/apache/pluto/container/bean/processor/fixtures/mocks/MockResourceRequest.java
@@ -23,6 +23,9 @@ import java.util.Map;
 
 import javax.portlet.ResourceParameters;
 import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 
 /**
  * @author Scott Nicklous
@@ -86,4 +89,34 @@ public class MockResourceRequest extends MockClientDataRequest implements Resour
       return null;
    }
 
+   @Override
+   public AsyncContext startAsync() throws IllegalStateException {
+      return null;
+   }
+
+   @Override
+   public AsyncContext startAsync(ResourceRequest request, ResourceResponse response) throws IllegalStateException {
+      return null;
+   }
+
+   @Override
+   public boolean isAsyncStarted() {
+      return false;
+   }
+
+   @Override
+   public boolean isAsyncSupported() {
+      return false;
+   }
+
+   @Override
+   public AsyncContext getAsyncContext() {
+      return null;
+   }
+
+   @Override
+   public DispatcherType getDispatcherType() {
+      return null;
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/java/javax/portlet/ResourceRequest.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/ResourceRequest.java b/portlet-api/src/main/java/javax/portlet/ResourceRequest.java
index 7863897..24177a8 100644
--- a/portlet-api/src/main/java/javax/portlet/ResourceRequest.java
+++ b/portlet-api/src/main/java/javax/portlet/ResourceRequest.java
@@ -24,6 +24,9 @@
 
 package javax.portlet;
 
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
+
 /**
  * <span class="changed_modified_3_0">The</span>
  * <code>ResourceRequest</code> interface represents the request
@@ -234,4 +237,205 @@ public interface ResourceRequest extends ClientDataRequest {
 
    public WindowState getWindowState ();
 
+
+   /**
+    * <div class="changed_added_3_0">
+    * Puts this request into asynchronous mode and initializes the <code>AsyncContext</code>
+    * object.
+    * <p>
+    * Calling this method will cause committal of the associated response to be delayed until 
+    * <code>AsyncContext#complete</code> is called on the returned <code>AsyncContext</code>,
+    * or the asynchronous operation has timed out.
+    * <p>
+    * This method clears the list of <code>AsyncListener</code> instances (if any) that were
+    * registered with the <code>AsyncContext</code> returned by the previous call to one of the
+    * <code>startAsync</code> methods, after calling each <code>AsyncListener</code> at 
+    * its <code>onStartAsync</code> method.
+    * <p>
+    * Subsequent invocations of this method, or its overloaded variant, will return
+    * the same <code>AsyncContext</code> instance, reinitialized as appropriate.
+    * <p> 
+    * The <code>AsyncContext</code> object can be used as described by the servlet
+    * specification. The <code>ServletRequest</code> and <code>ServletResponse</code> 
+    * objects obtained from the <code>AsyncContext</code> will provide functionality 
+    * appropriate for the portlet environment.
+    * <p>
+    * The original <code>ResourceRequest</code> and <code>ResourceResponse</code> objects
+    * will be made available as request attributes on the code>ServletRequest</code> object 
+    * obtained from the <code>AsyncContext</code> under the names 
+    * <code>javax.portlet.request</code>
+    * and <code>javax.portlet.response</code>, respectively.
+    * The <code>PortletConfig</code> object will be made available on the 
+    * <code>ServletRequest</code> under the name 
+    * <code>javax.portlet.config</code>.
+    * <p>
+    * The <code>AsyncContext#dispatch()</code> method will cause the portlet resource
+    * method to be invoked with the <code>ResourceRequest</code> and <code>ResourceResponse</code>
+    * objects available as attributes on the <code>ServletRequest</code> object obtained from
+    * the <code>AsyncContext</code>.
+    * In this case, the <code>ResourceRequest#isAsyncStarted()</code> method will return 
+    * <code>false</code> and the <code>ResourceRequest#getDispatcherType()</code> method
+    * will return <code>DispatcherType#ASYNC</code>.
+    * <p>
+    * A portlet <code>ResourceFilter</code> that allocates resources and attaches them to the 
+    * <code>ResourceRequest</code> or that wraps the <code>ResourceRequest</code> or
+    * <code>ResourceResponse</code> should not release resources in the outbound direction
+    * if asynchronous mode has been started.
+    * A portlet <code>ResourceFilter</code> can use the values provided by the 
+    * <code>ResourceRequest#isAsyncStarted()</code> and the
+    * <code>ResourceRequest#getDispatcherType()</code> methods to determine when to
+    * allocate and release resources.
+    * </div>
+    * 
+    * @return  the (re)initialized AsyncContext 
+    * @since   3.0
+    * @see     javax.servlet.ServletRequest#startAsync()
+    * @see     javax.servlet.AsyncContext
+    * @see     #isAsyncStarted() 
+    * @see     #getDispatcherType()
+    * @see     javax.portlet.filter.ResourceFilter
+    */
+
+   public AsyncContext startAsync() throws IllegalStateException;
+
+
+   /**
+    * <div class="changed_added_3_0">
+    * Puts this request into asynchronous mode and initializes the <code>AsyncContext</code>
+    * object.
+    * <p>
+    * Calling this method will cause committal of the associated response to be delayed until 
+    * <code>AsyncContext#complete</code> is called on the returned <code>AsyncContext</code>,
+    * or the asynchronous operation has timed out.
+    * <p>
+    * This method clears the list of <code>AsyncListener</code> instances (if any) that were
+    * registered with the <code>AsyncContext</code> returned by the previous call to one of the
+    * <code>startAsync</code> methods, after calling each <code>AsyncListener</code> at 
+    * its <code>onStartAsync</code> method.
+    * <p> 
+    * The <code>AsyncContext</code> object can be used as described by the servlet
+    * specification. The <code>ServletRequest</code> and <code>ServletResponse</code> 
+    * objects obtained from the <code>AsyncContext</code> will provide functionality 
+    * appropriate for the portlet environment.
+    * <p>
+    * The <code>ResourceRequest</code> and <code>ResourceResponse</code> objects
+    * passed as arguments to this method
+    * will be made available as request attributes on the code>ServletRequest</code> object 
+    * obtained from the <code>AsyncContext</code> under the names 
+    * <code>javax.portlet.request</code>
+    * and <code>javax.portlet.response</code>, respectively.
+    * The <code>PortletConfig</code> object will be made available on the 
+    * <code>ServletRequest</code> under the name 
+    * <code>javax.portlet.config</code>.
+    * <p>
+    * Subsequent invocations of this method, or its zero-argument variant, will return
+    * the same <code>AsyncContext</code> instance, reinitialized as appropriate.
+    * If a call to this method is followed by a call to its zero-argument variant, 
+    * the specified (and possibly wrapped) <code>ResourceRequest</code> and 
+    * <code>ResourceResponse</code> objects will remain available  
+    * as request attributes on the <code>ServletRequest</code> object 
+    * obtained from the <code>AsyncContext</code>.
+    * <p>
+    * The <code>AsyncContext#dispatch()</code> method will cause the portlet resource
+    * method to be invoked with the <code>ResourceRequest</code> and <code>ResourceResponse</code>
+    * objects available as attributes on the <code>ServletRequest</code> object obtained from
+    * the <code>AsyncContext</code>.
+    * In this case, the <code>ResourceRequest#isAsyncStarted()</code> method will return 
+    * <code>false</code> and the <code>ResourceRequest#getDispatcherType()</code> method
+    * will return <code>DispatcherType#ASYNC</code>.
+    * <p>
+    * A portlet <code>ResourceFilter</code> that allocates resources and attaches them to the 
+    * <code>ResourceRequest</code> or that wraps the <code>ResourceRequest</code> or
+    * <code>ResourceResponse</code> should not release resources in the outbound direction
+    * if asynchronous mode has been started.
+    * A portlet <code>ResourceFilter</code> can use the values provided by the 
+    * <code>ResourceRequest#isAsyncStarted()</code> and the
+    * <code>ResourceRequest#getDispatcherType()</code> methods to determine when to
+    * allocate and release resources.
+    * </div>
+    * 
+    * @return  the (re)initialized AsyncContext 
+    * @since   3.0
+    * @see     javax.servlet.ServletRequest#startAsync()
+    * @see     javax.servlet.AsyncContext 
+    * @see     #isAsyncStarted() 
+    * @see     #getDispatcherType()
+    * @see     javax.portlet.filter.ResourceFilter
+    */
+
+   public AsyncContext startAsync(ResourceRequest request, ResourceResponse response) throws IllegalStateException;
+
+
+   /**
+    * <div class="changed_added_3_0">
+    * Checks if this request has been put into asynchronous mode. 
+    * <p>
+    * A <code>ResourceRequest</code> is put into asynchronous mode by calling 
+    * <code>startAsync()</code> or <code>startAsync(ResourceRequest,ResourceResponse)</code>
+    * on it. 
+    * <p>
+    * This method returns <code>false</code> if this request was put into asynchronous mode, 
+    * but has since been dispatched using one of the <code>AsyncContext#dispatch</code> 
+    * methods or released from asynchronous mode via a call to <code>AsyncContext#complete</code>. 
+    * </div>
+    * 
+    * @return   <code>true</code> if asynchronous mode has been started
+    * @since    3.0
+    * @see      #startAsync()
+    * @see      #startAsync(ResourceRequest, ResourceResponse)
+    */
+
+   public boolean isAsyncStarted();
+   
+
+   /**
+    * <div class="changed_added_3_0">
+    * Checks if this request supports asynchronous operation. 
+    * <p>
+    * Asynchronous operation is disabled for this request if this request is within 
+    * the scope of a filter or servlet that has not been annotated or flagged in 
+    * the portlet configuration as being able to support asynchronous handling. 
+    * </div>
+    * 
+    * @return   <code>true</code> if this request supports asynchronous operation
+    * @since    3.0
+    */
+
+   public boolean isAsyncSupported();
+
+
+   /**
+    * <div class="changed_added_3_0">
+    * Gets the <code>AsyncContext</code> that was created or reinitialized by the most 
+    * recent invocation of <code>startAsync()</code> or 
+    * <code>startAsync(ResourceRequest,ResourceResponse)</code> on this request. 
+    * </div>
+    * 
+    * @return   the <code>AsyncContext</code> (re)initialized by the most recent <code>startAsync</code> method invocation 
+    * @since    3.0
+    * @see      javax.servlet.ServletRequest#startAsync()
+    * @see      javax.servlet.AsyncContext 
+    */
+   
+   public AsyncContext getAsyncContext();
+
+
+   /**
+    * <div class="changed_added_3_0">
+    * Gets the dispatcher type of this request. 
+    * <p>
+    * The initial dispatcher type of a request is defined as <code>DispatcherType.REQUEST</code>.
+    * The dispatcher type of a request dispatched via a <code>RequestDispatcher</code>
+    * is given as <code>DispatcherType.FORWARD</code> or <code>DispatcherType.INCLUDE</code>, 
+    * while the dispatcher type of an asynchronous request dispatched via one of the
+    * <code>AsyncContext#dispatch</code> methods is given as <code>DispatcherType.ASYNC</code>.
+    * </div>
+    * 
+    * @return   the dispatcher type of this request
+    * @since    3.0
+    * @see      javax.servlet.DispatcherType
+    */
+
+   public DispatcherType getDispatcherType();
+
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/java/javax/portlet/annotations/PortletConfiguration.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/PortletConfiguration.java b/portlet-api/src/main/java/javax/portlet/annotations/PortletConfiguration.java
index 7508094..140993f 100644
--- a/portlet-api/src/main/java/javax/portlet/annotations/PortletConfiguration.java
+++ b/portlet-api/src/main/java/javax/portlet/annotations/PortletConfiguration.java
@@ -223,4 +223,15 @@ public @interface PortletConfiguration {
     * @return  The security role references
     */
    SecurityRoleRef[]   roleRefs() default {};
+   
+   /**
+    * Declares whether the portlet supports asynchronous operation mode.
+    * <p>
+    * If this flag is set, any resource method used by this portlet will
+    * be marked as supporting asynchronous operation.
+    * Asynchronous support applies to resource methods only.
+    *  
+    * @return  <code>true</code> if the method supports asynchronous mode.
+    */
+   boolean asyncSupported() default false;
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/java/javax/portlet/annotations/ServeResourceMethod.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/annotations/ServeResourceMethod.java b/portlet-api/src/main/java/javax/portlet/annotations/ServeResourceMethod.java
index af64501..4a05b2c 100644
--- a/portlet-api/src/main/java/javax/portlet/annotations/ServeResourceMethod.java
+++ b/portlet-api/src/main/java/javax/portlet/annotations/ServeResourceMethod.java
@@ -154,4 +154,15 @@ public @interface ServeResourceMethod {
     * @return     The ordinal number
     */
    int        ordinal() default 0;
+   
+   /**
+    * Declares whether the serve resource method supports asynchronous operation mode.
+    * <p>
+    * If this flag is set, any portlet to which this annotated method applies will
+    * be marked as supporting asynchronous operation.
+    * Asynchronous support applies to resource methods only.
+    *  
+    * @return  <code>true</code> if the method supports asynchronous mode.
+    */
+   boolean asyncSupported() default false;
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/java/javax/portlet/filter/ResourceFilter.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/ResourceFilter.java b/portlet-api/src/main/java/javax/portlet/filter/ResourceFilter.java
index 96babc3..94ae61d 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/ResourceFilter.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/ResourceFilter.java
@@ -31,7 +31,8 @@ import javax.portlet.ResourceResponse;
 import javax.portlet.PortletException;
 
 /**
- * The <code>ResourceFilter</code> is an object that performs filtering 
+ * <span class="changed_modified_3_0">The</span>
+ * <code>ResourceFilter</code> is an object that performs filtering 
  * tasks on either the resource request to a portlet, or on the resource response from 
  * a portlet, or both.
  * <p>
@@ -42,6 +43,29 @@ import javax.portlet.PortletException;
  * <p>
  * Filters are configured in the portlet deployment descriptor of a 
  * portlet application. 
+ * <p>
+ * <div class="changed_added_3_0">
+ * <strong>Asynchronous Processing Considerations</strong>
+ * <p>
+ * If the <code>ResourceFilter</code> is to support asynchronous mode, care must be taken
+ * regarding resource allocation and release.
+ * Any resources attached to the <code>ResourceRequest</code> during the inbound portion
+ * of the <code>doFilter</code> invocation
+ * and needed during asynchronous processing should not be released during outbound processing
+ * if asynchronous mode has been started.
+ * <p>
+ * If resources must be allocated in this way during inbound processing, the portlet should
+ * use the <code>AsyncContext#dispatch()</code> method at the end of asynchronous processing
+ * in order to cause the portlet resource method to be invoked again with the same
+ * <code>ResourceRequest</code> and <code>ResourceResponse</code> objects.
+ * The resources can be released during asynchronous dispatch outbound processing.
+ * <p>
+ * The <code>ResourceRequest#isAsyncStarted()</code> method will return <code>true</code>
+ * if the portlet is currently in asynchronous mode.
+ * The <code>ResourceRequest#igetDispatcherType()</code> method will return 
+ * <code>DispatcherType#REQUEST</code> during initial request processing and
+ * <code>DipatcherType#ASYNC</code> during processing resulting from an asynchronous dispatch.
+ * </div>
  * 
  * @since 2.0
  */

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/java/javax/portlet/filter/ResourceRequestWrapper.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/filter/ResourceRequestWrapper.java b/portlet-api/src/main/java/javax/portlet/filter/ResourceRequestWrapper.java
index 5ce2388..406a8c7 100644
--- a/portlet-api/src/main/java/javax/portlet/filter/ResourceRequestWrapper.java
+++ b/portlet-api/src/main/java/javax/portlet/filter/ResourceRequestWrapper.java
@@ -28,6 +28,9 @@ import java.util.Map;
 
 import javax.portlet.ResourceParameters;
 import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
 
 /**
  * <span class="changed_modified_3_0">The</span>  
@@ -115,4 +118,34 @@ public class ResourceRequestWrapper extends ClientDataRequestWrapper implements
       return ((ResourceRequest)wrapped).getResourceParameters();
    }
 
+   @Override
+   public AsyncContext startAsync() throws IllegalStateException {
+      return ((ResourceRequest)wrapped).startAsync();
+   }
+
+   @Override
+   public AsyncContext startAsync(ResourceRequest request, ResourceResponse response) throws IllegalStateException {
+      return ((ResourceRequest)wrapped).startAsync(request, response);
+   }
+
+   @Override
+   public boolean isAsyncStarted() {
+      return ((ResourceRequest)wrapped).isAsyncStarted();
+   }
+
+   @Override
+   public boolean isAsyncSupported() {
+      return ((ResourceRequest)wrapped).isAsyncSupported();
+   }
+
+   @Override
+   public AsyncContext getAsyncContext() {
+      return ((ResourceRequest)wrapped).getAsyncContext();
+   }
+
+   @Override
+   public DispatcherType getDispatcherType() {
+      return ((ResourceRequest)wrapped).getDispatcherType();
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/javadoc/overview.html b/portlet-api/src/main/javadoc/overview.html
index 4c1eaf7..ade4007 100644
--- a/portlet-api/src/main/javadoc/overview.html
+++ b/portlet-api/src/main/javadoc/overview.html
@@ -21,6 +21,22 @@
     <div class="indexContainer-not">
     <ul>
     <li>
+    20160316:
+    Added new methods, configuration elements, and documentation to implement 
+    <a href="https://java.net/jira/browse/PORTLETSPEC3-68">PORTLETSPEC3-68 Add Async Support</a>:
+    {@link javax.portlet.annotations.PortletConfiguration#asyncSupported() PortletConfiguration#asyncSupported()}, 
+    {@link javax.portlet.annotations.ServeResourceMethod#asyncSupported() ServeResourceMethod#asyncSupported()}, 
+    {@link javax.portlet.ResourceRequest#startAsync() ResourceRequest#startAsync()}, 
+    {@link javax.portlet.ResourceRequest#startAsync(ResourceRequest, ResourceResponse) ResourceRequest#startAsync(ResourceRequest, ResourceResponse)}, 
+    {@link javax.portlet.ResourceRequest#isAsyncStarted() ResourceRequest#isAsyncStarted()}, 
+    {@link javax.portlet.ResourceRequest#isAsyncSupported() ResourceRequest#isAsyncSupported()}, 
+    {@link javax.portlet.ResourceRequest#getAsyncContext() ResourceRequest#getAsyncContext()}, and 
+    {@link javax.portlet.ResourceRequest#getDispatcherType() ResourceRequest#getDispatcherType()}.
+    Added appropriate documentation to 
+    {@link javax.portlet.filter.ResourceFilter ResourceFilter}.
+    Updated affected wrapper classes accordingly.
+    </li>
+    <li>
     20160315:
     Added new methods to implement 
     <a href="https://java.net/jira/browse/PORTLETSPEC3-63">PORTLETSPEC3-63</a>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/e14ab860/portlet-api/src/main/javadoc/portlet-api.css
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/javadoc/portlet-api.css b/portlet-api/src/main/javadoc/portlet-api.css
index 3a84aa1..14cc9ea 100644
--- a/portlet-api/src/main/javadoc/portlet-api.css
+++ b/portlet-api/src/main/javadoc/portlet-api.css
@@ -529,6 +529,7 @@ h1.hidden {
 .indexContainer a[href*="StateAwareResponse.html"],
 .indexContainer a[href*="EventResponse.html"],
 .indexContainer a[href*="MimeResponse.html"],
+.indexContainer a[href*="ResourceFilter.html"],
 .indexContainer a[href*="ResourceURL.html"],
 .indexContainer a[href*="ResourceResponse.html"],
 .indexContainer a[href*="ActionRequestWrapper.html"],