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:29:20 UTC

[40/50] [abbrv] portals-pluto git commit: Added async portlet test filter. Made filter chain work properly for async requests. Refactored portlet servlet and portlet invoker to move bean holder initialization to the front of the execution chain.

Added async portlet test filter. Made filter chain work properly for
async requests. Refactored portlet servlet and portlet invoker to move
bean holder initialization to the front of the execution chain.


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

Branch: refs/heads/master
Commit: 0ff1c51b09f43de2581435142c22c3bdb39a25aa
Parents: 8d98baf
Author: Scott Nicklous <ms...@apache.org>
Authored: Sat Apr 2 23:27:02 2016 +0200
Committer: Scott Nicklous <ms...@apache.org>
Committed: Sat Apr 2 23:27:02 2016 +0200

----------------------------------------------------------------------
 .../portals/samples/AsyncPortletFilter.java     |  64 ++++
 .../pluto/container/driver/PortletServlet3.java |  77 ++++-
 .../bean/processor/PortletInvoker.java          | 334 +++++++------------
 .../processor/PortletSessionBeanHolder.java     |  14 +-
 .../impl/JSR286ConfigurationProcessor.java      |  18 +-
 .../impl/JSR362ConfigurationProcessor.java      |   4 +-
 .../services/container/FilterChainImpl.java     |  12 +
 .../services/container/FilterManagerImpl.java   |   6 +
 8 files changed, 297 insertions(+), 232 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java
new file mode 100644
index 0000000..75c664d
--- /dev/null
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java
@@ -0,0 +1,64 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.portals.samples;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.portlet.PortletException;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.annotations.PortletRequestFilter;
+import javax.portlet.filter.FilterChain;
+import javax.portlet.filter.FilterConfig;
+import javax.portlet.filter.ResourceFilter;
+
+/**
+ * Filter for the async portlet. logs the dispatcher type and sometimes
+ * generates output.
+ * 
+ * @author Scott Nicklous
+ *
+ */
+@PortletRequestFilter(portletNames="AsyncPortlet")
+public class AsyncPortletFilter implements ResourceFilter {
+   private static final Logger LOGGER = Logger.getLogger(AsyncPortletFilter.class.getName());
+
+   @Override
+   public void init(FilterConfig filterConfig) throws PortletException {
+   }
+
+   @Override
+   public void destroy() {
+   }
+
+   @Override
+   public void doFilter(ResourceRequest request, ResourceResponse response, FilterChain chain) throws IOException,
+         PortletException {
+      
+      LOGGER.fine("Entering request. Dispatcher type: " + request.getDispatcherType());
+      
+      chain.doFilter(request, response);
+      
+      LOGGER.fine("Exiting request. Dispatcher type: " + request.getDispatcherType());
+      
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
----------------------------------------------------------------------
diff --git a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
index c831773..b324f57 100644
--- a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
+++ b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
@@ -27,6 +27,7 @@ import javax.portlet.EventRequest;
 import javax.portlet.EventResponse;
 import javax.portlet.HeaderRequest;
 import javax.portlet.HeaderResponse;
+import javax.portlet.PortletConfig;
 import javax.portlet.PortletException;
 import javax.portlet.PortletRequest;
 import javax.portlet.PortletResponse;
@@ -34,6 +35,7 @@ import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
+import javax.portlet.StateAwareResponse;
 import javax.portlet.UnavailableException;
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletConfig;
@@ -48,6 +50,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.pluto.container.FilterManager;
+import org.apache.pluto.container.PortletAsyncContext;
 import org.apache.pluto.container.PortletContainerException;
 import org.apache.pluto.container.PortletInvokerService;
 import org.apache.pluto.container.PortletRequestContext;
@@ -55,7 +58,11 @@ import org.apache.pluto.container.PortletResourceRequestContext;
 import org.apache.pluto.container.PortletResponseContext;
 import org.apache.pluto.container.PortletWindow;
 import org.apache.pluto.container.bean.processor.AnnotatedConfigBean;
+import org.apache.pluto.container.bean.processor.PortletArtifactProducer;
 import org.apache.pluto.container.bean.processor.PortletInvoker;
+import org.apache.pluto.container.bean.processor.PortletRequestScopedBeanHolder;
+import org.apache.pluto.container.bean.processor.PortletSessionBeanHolder;
+import org.apache.pluto.container.bean.processor.PortletStateScopedBeanHolder;
 import org.apache.pluto.container.impl.PortletAsyncRequestWrapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -348,6 +355,8 @@ public class PortletServlet3 extends HttpServlet {
       
       try {
 
+         beforeInvoke(portletRequest, portletResponse, portletConfig);
+         
          // The requested method is RENDER: call Portlet.render(..)
          if (methodId == PortletInvokerService.METHOD_RENDER) {
             RenderRequest renderRequest = (RenderRequest) portletRequest;
@@ -439,10 +448,12 @@ public class PortletServlet3 extends HttpServlet {
 
       } finally {
          
+         requestContext.setExecutingRequestBody(false);
+         afterInvoke(portletResponse);
+         
          // If an async request is running or has been dispatched, resources
          // will be released by the PortletAsyncListener. Otherwise release here.
          
-         requestContext.setExecutingRequestBody(false);
          if (!request.isAsyncStarted()) {
             
             LOG.debug("Async not started, releasing resources. executing req body: " + requestContext.isExecutingRequestBody());
@@ -457,6 +468,24 @@ public class PortletServlet3 extends HttpServlet {
             }
          } else {
             LOG.debug("Async started, not releasing resources. executing req body: " + requestContext.isExecutingRequestBody());
+
+            // Initialize the async context after the request during which async is 
+            // first started.
+            
+            if (request.getDispatcherType() != DispatcherType.ASYNC) {
+               if (requestContext instanceof PortletResourceRequestContext) {
+                  PortletResourceRequestContext resctx = (PortletResourceRequestContext)requestContext;
+                  PortletAsyncContext pac = resctx.getPortletAsyncContext();
+                  if (pac != null) {
+                     pac.init(resctx);
+                  } else {
+                     LOG.warn("Couldn't get portlet async context.");
+                  }
+               } else {
+                  LOG.warn("Wrong kind of request context: " + requestContext.getClass().getCanonicalName());
+               }
+            }            
+            
          }
       }
    }
@@ -474,4 +503,50 @@ public class PortletServlet3 extends HttpServlet {
          }
       }
    }
+
+
+   /**
+    * To be called before bean method invocation begins
+    */
+   private void beforeInvoke(PortletRequest req, PortletResponse resp, PortletConfig config) {
+
+      // Set the portlet session bean holder for the thread & session
+      PortletRequestScopedBeanHolder.setBeanHolder();
+
+      // Set the portlet session bean holder for the thread & session
+      PortletSessionBeanHolder.setBeanHolder(req, acb.getSessionScopedConfig());
+
+      // Set the render state scoped bean holder
+      PortletStateScopedBeanHolder.setBeanHolder(req, acb.getStateScopedConfig());
+
+      // Set up the artifact producer with request, response, and portlet config
+      PortletArtifactProducer.setPrecursors(req, resp, config);
+   }
+
+   /**
+    * must be called after all method invocations have taken place, even if an
+    * exception occurs.
+    */
+   private void afterInvoke(PortletResponse resp) {
+
+      // Remove the portlet session bean holder for the thread
+      PortletRequestScopedBeanHolder.removeBeanHolder();
+
+      // Remove the portlet session bean holder for the thread
+      PortletSessionBeanHolder.removeBeanHolder();
+
+      // Remove the render state bean holder. pass response if we're
+      // dealing with a StateAwareResponse. The response is used for state
+      // storage.
+
+      StateAwareResponse sar = null;
+      if (resp instanceof StateAwareResponse) {
+         sar = (StateAwareResponse) resp;
+      }
+      PortletStateScopedBeanHolder.removeBeanHolder(sar);
+
+      // remove the portlet artifact producer
+      PortletArtifactProducer.remove();
+
+   }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletInvoker.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletInvoker.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletInvoker.java
index 7507f2c..b8b1972 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletInvoker.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletInvoker.java
@@ -36,24 +36,19 @@ import javax.portlet.HeaderResponse;
 import javax.portlet.Portlet;
 import javax.portlet.PortletConfig;
 import javax.portlet.PortletException;
-import javax.portlet.PortletRequest;
 import javax.portlet.PortletRequestDispatcher;
-import javax.portlet.PortletResponse;
 import javax.portlet.RenderRequest;
 import javax.portlet.RenderResponse;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
 import javax.portlet.ResourceServingPortlet;
-import javax.portlet.StateAwareResponse;
 import javax.portlet.annotations.HeaderMethod;
 import javax.portlet.annotations.RenderMethod;
 import javax.portlet.annotations.ServeResourceMethod;
 import javax.servlet.DispatcherType;
 import javax.xml.namespace.QName;
 
-import org.apache.pluto.container.PortletAsyncContext;
 import org.apache.pluto.container.PortletInvokerService;
-import org.apache.pluto.container.PortletResourceRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,13 +59,13 @@ import org.slf4j.LoggerFactory;
  *
  */
 public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPortlet, HeaderPortlet {
-   private static final Logger             LOG     = LoggerFactory.getLogger(PortletInvoker.class);
-   private static final boolean            isDebug = LOG.isDebugEnabled();
+   private static final Logger       LOG     = LoggerFactory.getLogger(PortletInvoker.class);
+   private static final boolean      isDebug = LOG.isDebugEnabled();
 
    private final AnnotatedConfigBean acb;
-   private final String                    portletName;
-   private PortletConfig                   config;
-   
+   private final String              portletName;
+   private PortletConfig             config;
+
    /**
     * Construct for given portlet name.
     */
@@ -101,7 +96,7 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       List<AnnotatedMethod> meths = acb.getMethodStore().getMethods(mi);
       if (meths.isEmpty()) {
          Object id = mi.getId();
-         if ((id != null) && (id instanceof String) && ((String)id).length() > 0) {
+         if ((id != null) && (id instanceof String) && ((String) id).length() > 0) {
             mi.setId("");
             if (isDebug) {
                LOG.debug("Retrying retrieval with method identifier: " + mi.toString());
@@ -114,51 +109,6 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
    }
 
    /**
-    * To be called before bean method invocation begins
-    */
-   private void beforeInvoke(PortletRequest req, PortletResponse resp) {
-
-      // Set the portlet session bean holder for the thread & session
-      PortletRequestScopedBeanHolder.setBeanHolder();
-
-      // Set the portlet session bean holder for the thread & session
-      PortletSessionBeanHolder.setBeanHolder(req, acb.getSessionScopedConfig());
-
-      // Set the render state scoped bean holder
-      PortletStateScopedBeanHolder.setBeanHolder(req, acb.getStateScopedConfig());
-
-      // Set up the artifact producer with request, response, and portlet config
-      PortletArtifactProducer.setPrecursors(req, resp, config);
-   }
-
-   /**
-    * must be called after all method invocations have taken place, even if an
-    * exception occurs.
-    */
-   private void afterInvoke(PortletResponse resp) {
-
-      // Remove the portlet session bean holder for the thread
-      PortletRequestScopedBeanHolder.removeBeanHolder();
-
-      // Remove the portlet session bean holder for the thread
-      PortletSessionBeanHolder.removeBeanHolder();
-
-      // Remove the render state bean holder. pass response if we're
-      // dealing with a StateAwareResponse. The response is used for state
-      // storage.
-
-      StateAwareResponse sar = null;
-      if (resp instanceof StateAwareResponse) {
-         sar = (StateAwareResponse) resp;
-      }
-      PortletStateScopedBeanHolder.removeBeanHolder(sar);
-
-      // remove the portlet artifact producer
-      PortletArtifactProducer.remove();
-
-   }
-
-   /**
     * Invokes the given method, handling exceptions.
     * 
     * @param meth
@@ -227,7 +177,8 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       Object[] args = new Object[] { config };
       try {
          invokePortletMethod(meth, args);
-      } catch (Exception e) {}
+      } catch (Exception e) {
+      }
 
    }
 
@@ -256,7 +207,8 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       Object[] args = new Object[] {};
       try {
          invokePortletMethod(meth, args);
-      } catch (Exception e) {}
+      } catch (Exception e) {
+      }
    }
 
    @Override
@@ -267,14 +219,15 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
 
       List<AnnotatedMethod> meths = new ArrayList<AnnotatedMethod>();
       if (req.getDispatcherType() == DispatcherType.ASYNC) {
-         
+
          // Handle AsyncContest#dispatch() case
-         
-         AnnotatedMethod meth = (AnnotatedMethod) req.getAttribute(PortletInvokerService.ASYNC_METHOD);;
+
+         AnnotatedMethod meth = (AnnotatedMethod) req.getAttribute(PortletInvokerService.ASYNC_METHOD);
+         ;
          if (meth == null) {
             StringBuilder txt = new StringBuilder(128);
-            txt.append("Async processing error. ServeResource method not found for method identifier: ");
-            LOG.warn(txt.toString());
+            txt.append("Async processing error. ServeResource method attribute could not be retrieved.");
+            LOG.error(txt.toString());
             return;
          }
          LOG.debug("Processing async dispatch. method: " + meth.toString());
@@ -282,7 +235,7 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       } else {
          meths = getMethods(mi);
       }
-      
+
       if (meths.size() == 0) {
 
          // If a resource URL was activated, but no resource method could be
@@ -296,87 +249,63 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
 
       // now do the invocation
 
-      try {
-         beforeInvoke(req, resp);
+      for (AnnotatedMethod meth : meths) {
 
-         for (AnnotatedMethod meth : meths) {
+         // Set the character encoding & content type, if available
 
-            // Set the character encoding & content type, if available
-
-            ServeResourceMethod rm = (ServeResourceMethod) meth.getAnnotation();
-            if (rm != null) {
-               if (rm.characterEncoding().length() > 0) {
-                  resp.setCharacterEncoding(rm.characterEncoding());
-               }
-               if (rm.contentType().length() > 0) {
-                  resp.setContentType(rm.contentType());
-               }
+         ServeResourceMethod rm = (ServeResourceMethod) meth.getAnnotation();
+         if (rm != null) {
+            if (rm.characterEncoding().length() > 0) {
+               resp.setCharacterEncoding(rm.characterEncoding());
             }
+            if (rm.contentType().length() > 0) {
+               resp.setContentType(rm.contentType());
+            }
+         }
 
-            // Set up the method arguments based on the signature variant
+         // Set up the method arguments based on the signature variant
 
-            Object[] args = {};
-            Object result;
-            if (meth.getDescription().getVariant() == SignatureVariant.VOID_RESOURCEREQ_RESOURCERESP) {
-               args = new Object[] { req, resp };
-            }
+         Object[] args = {};
+         Object result;
+         if (meth.getDescription().getVariant() == SignatureVariant.VOID_RESOURCEREQ_RESOURCERESP) {
+            args = new Object[] { req, resp };
+         }
 
-            // invoke the resource method
-
-            result = invokePortletMethod(meth, args);
-            
-            if (req.isAsyncStarted()) {
-               
-               // If async processing was started, handle the special case.
-               // It doesn't make sense to write output, as the resource method may
-               // be writing output through an async thread. Set up to process async dispatch.
-               // also, after async is started, no further methods can be invoked.
-               
-               LOG.debug("Async processing was started during method: " + meth.toString());
-               req.setAttribute(PortletInvokerService.ASYNC_METHOD, meth);
-
-               // Initialize the async context after the request during which async is 
-               // first started.
-               
-               if (req.getDispatcherType() != DispatcherType.ASYNC) {
-                  PortletResourceRequestContext reqctx = (PortletResourceRequestContext) req
-                        .getAttribute(PortletInvokerService.REQUEST_CONTEXT);
-                  if (reqctx != null) {
-                     PortletAsyncContext pac = reqctx.getPortletAsyncContext();
-                     if (pac != null) {
-                        pac.init(reqctx);
-                     } else {
-                        LOG.warn("Couldn't get portlet async context.");
-                     }
-                  } else {
-                     LOG.warn("Couldn't get request context.");
-                  }
-               }            
-               
-               break;
-               
-            } else {
-
-               // No async processing.
-               // If output is to be expected, write it to the writer
-
-               if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
-                  if (result != null) {
-                     assert result instanceof String;
-                     resp.getWriter().write((String) result);
-                  }
-               }
+         // invoke the resource method
 
-               // If an include resource is provided, include it
+         result = invokePortletMethod(meth, args);
 
-               if ((rm != null) && (rm.include().length() > 0)) {
-                  PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(rm.include());
-                  prd.include(req, resp);
+         if (req.isAsyncStarted()) {
+
+            // If async processing was started, handle the special case.
+            // It doesn't make sense to write output, as the resource method may
+            // be writing output through an async thread. Set up to process
+            // async dispatch.
+            // also, after async is started, no further methods can be invoked.
+
+            LOG.debug("Async processing was started during method: " + meth.toString());
+            req.setAttribute(PortletInvokerService.ASYNC_METHOD, meth);
+            break;
+
+         } else {
+
+            // No async processing.
+            // If output is to be expected, write it to the writer
+
+            if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
+               if (result != null) {
+                  assert result instanceof String;
+                  resp.getWriter().write((String) result);
                }
             }
+
+            // If an include resource is provided, include it
+
+            if ((rm != null) && (rm.include().length() > 0)) {
+               PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(rm.include());
+               prd.include(req, resp);
+            }
          }
-      } finally {
-         afterInvoke(resp);
       }
    }
 
@@ -388,8 +317,9 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
 
       List<AnnotatedMethod> meths = getMethods(mi);
       if (meths.size() == 0) {
-         
-         // retry with empty string (for portlet class processEvent method, for example)
+
+         // retry with empty string (for portlet class processEvent method, for
+         // example)
          mi.setId("");
          meths = getMethods(mi);
          if (meths.size() == 0) {
@@ -409,12 +339,7 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       // Set up the method arguments and do the incovation
 
       Object[] args = new Object[] { req, resp };
-      try {
-         beforeInvoke(req, resp);
-         invokePortletMethod(meth, args);
-      } finally {
-         afterInvoke(resp);
-      }
+      invokePortletMethod(meth, args);
    }
 
    @Override
@@ -427,7 +352,8 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       List<AnnotatedMethod> meths = getMethods(mi);
       if (meths.size() == 0) {
 
-         // If an action URL was activated, but action method could not be found,
+         // If an action URL was activated, but action method could not be
+         // found,
          // add appropriate error string.
 
          StringBuilder txt = new StringBuilder(128);
@@ -441,12 +367,7 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
       // Set up the method arguments and do the incovation
 
       Object[] args = new Object[] { req, resp };
-      try {
-         beforeInvoke(req, resp);
-         invokePortletMethod(meth, args);
-      } finally {
-         afterInvoke(resp);
-      }
+      invokePortletMethod(meth, args);
 
    }
 
@@ -466,52 +387,44 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
          return;
       }
 
-      try {
-         beforeInvoke(req, resp);
+      for (AnnotatedMethod meth : meths) {
 
-         for (AnnotatedMethod meth : meths) {
+         // Set the content type, if available (determined by first render
+         // method)
 
-            // Set the content type, if available (determined by first render
-            // method)
-
-            RenderMethod rm = (RenderMethod) meth.getAnnotation();
-            if ((rm != null) && rm.contentType().length() > 0) {
-               resp.setContentType(rm.contentType());
-            }
+         RenderMethod rm = (RenderMethod) meth.getAnnotation();
+         if ((rm != null) && rm.contentType().length() > 0) {
+            resp.setContentType(rm.contentType());
+         }
 
-            // Set up the method arguments based on the signature variant
+         // Set up the method arguments based on the signature variant
 
-            Object[] args = {};
-            Object result;
-            if (meth.getDescription().getVariant() == SignatureVariant.VOID_RENDERREQ_RENDERRESP) {
-               args = new Object[] { req, resp };
-            }
+         Object[] args = {};
+         Object result;
+         if (meth.getDescription().getVariant() == SignatureVariant.VOID_RENDERREQ_RENDERRESP) {
+            args = new Object[] { req, resp };
+         }
 
-            // invoke the render method
+         // invoke the render method
 
-            result = invokePortletMethod(meth, args);
+         result = invokePortletMethod(meth, args);
 
-            // If output is to be expected, write it to the writer
+         // If output is to be expected, write it to the writer
 
-            if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
-               if (result != null) {
-                  assert result instanceof String;
-                  resp.getWriter().write((String) result);
-               }
+         if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
+            if (result != null) {
+               assert result instanceof String;
+               resp.getWriter().write((String) result);
             }
+         }
 
-            // If an include resource is provided, include it
+         // If an include resource is provided, include it
 
-            if ((rm != null) && (rm.include().length() > 0)) {
-               PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(rm.include());
-               prd.include(req, resp);
-            }
+         if ((rm != null) && (rm.include().length() > 0)) {
+            PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(rm.include());
+            prd.include(req, resp);
          }
-
-      } finally {
-         afterInvoke(resp);
       }
-
    }
 
    @Override
@@ -530,50 +443,43 @@ public class PortletInvoker implements Portlet, ResourceServingPortlet, EventPor
          return;
       }
 
-      try {
-         beforeInvoke(req, resp);
-
-         for (AnnotatedMethod meth : meths) {
+      for (AnnotatedMethod meth : meths) {
 
-            // Set the content type, if available (determined by first render
-            // method)
+         // Set the content type, if available (determined by first render
+         // method)
 
-            HeaderMethod hm = (HeaderMethod) meth.getAnnotation();
-            if ((hm != null) && hm.contentType().length() > 0) {
-               resp.setContentType(hm.contentType());
-            }
+         HeaderMethod hm = (HeaderMethod) meth.getAnnotation();
+         if ((hm != null) && hm.contentType().length() > 0) {
+            resp.setContentType(hm.contentType());
+         }
 
-            // Set up the method arguments based on the signature variant
+         // Set up the method arguments based on the signature variant
 
-            Object[] args = {};
-            Object result;
-            if (meth.getDescription().getVariant() == SignatureVariant.VOID_HEADERREQ_HEADERRESP) {
-               args = new Object[] { req, resp };
-            }
+         Object[] args = {};
+         Object result;
+         if (meth.getDescription().getVariant() == SignatureVariant.VOID_HEADERREQ_HEADERRESP) {
+            args = new Object[] { req, resp };
+         }
 
-            // invoke the render method
+         // invoke the render method
 
-            result = invokePortletMethod(meth, args);
+         result = invokePortletMethod(meth, args);
 
-            // If output is to be expected, write it to the writer
+         // If output is to be expected, write it to the writer
 
-            if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
-               if (result != null) {
-                  assert result instanceof String;
-                  resp.getWriter().write((String) result);
-               }
+         if (meth.getDescription().getVariant() == SignatureVariant.STRING_VOID) {
+            if (result != null) {
+               assert result instanceof String;
+               resp.getWriter().write((String) result);
             }
+         }
 
-            // If an include resource is provided, include it
+         // If an include resource is provided, include it
 
-            if ((hm != null) && (hm.include().length() > 0)) {
-               PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(hm.include());
-               prd.include(req, resp);
-            }
+         if ((hm != null) && (hm.include().length() > 0)) {
+            PortletRequestDispatcher prd = config.getPortletContext().getRequestDispatcher(hm.include());
+            prd.include(req, resp);
          }
-
-      } finally {
-         afterInvoke(resp);
       }
    }
 

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionBeanHolder.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionBeanHolder.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionBeanHolder.java
index 949610b..6d97539 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionBeanHolder.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletSessionBeanHolder.java
@@ -35,12 +35,12 @@ import org.slf4j.LoggerFactory;
  * 
  */
 public class PortletSessionBeanHolder implements Serializable {
-   private static final Logger                                LOG              = LoggerFactory
-                                                                                     .getLogger(PortletSessionBeanHolder.class);
-   private static final boolean                               isDebug          = LOG.isDebugEnabled();
+   private static final Logger  LOG              = LoggerFactory
+                                                       .getLogger(PortletSessionBeanHolder.class);
+   private static final boolean isTrace          = LOG.isTraceEnabled();
 
-   private static final long                                  serialVersionUID = 4713451590109713169L;
-   private static final String                                ATTRIBNAME       = "portletSessionBeanHolder";
+   private static final long    serialVersionUID = 4713451590109713169L;
+   private static final String  ATTRIBNAME       = "portletSessionBeanHolder";
 
    // The ThreadLocal manages the holders so that there is one holder per thread.
    private static final ThreadLocal<PortletSessionBeanHolder> holders          = new ThreadLocal<PortletSessionBeanHolder>();
@@ -87,7 +87,7 @@ public class PortletSessionBeanHolder implements Serializable {
       PortletSessionBeanHolder holder = new PortletSessionBeanHolder(map, windowId, config);
       holders.set(holder);
 
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder(80);
          txt.append("Set portlet session bean holder.");
          txt.append(" ThreadId: ").append(Thread.currentThread().getId());
@@ -104,7 +104,7 @@ public class PortletSessionBeanHolder implements Serializable {
    public static void removeBeanHolder() {
       holders.remove();
 
-      if (isDebug) {
+      if (isTrace) {
          StringBuilder txt = new StringBuilder(80);
          txt.append("Removed portlet session bean holder.");
          txt.append(" ThreadId=").append(Thread.currentThread().getId());

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR286ConfigurationProcessor.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR286ConfigurationProcessor.java b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR286ConfigurationProcessor.java
index 7cbb18f..eaccf25 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR286ConfigurationProcessor.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR286ConfigurationProcessor.java
@@ -922,14 +922,16 @@ public class JSR286ConfigurationProcessor extends JSR168ConfigurationProcessor {
             LOG.warn(txt.toString());
             pad.removeFilterMapping(fm);
          }
-         for (String pn : fm.getPortletNames()) {
-            if (pad.getMatchingPortlets(pn).isEmpty()) {
-               txt.setLength(0);
-               txt.append("Bad filter mapping definition. Filter name: ").append(fm.getFilterName());
-               txt.append(", Portlet names: ").append(fm.getPortletNames().toString());
-               txt.append(", Portlet definition not found: ").append(pn);
-               LOG.warn(txt.toString());
-               pad.removeFilterMapping(fm);
+         if (pad.getVersion().equals("2.0")) {
+            for (String pn : fm.getPortletNames()) {
+               if (pad.getMatchingPortlets(pn).isEmpty()) {
+                  txt.setLength(0);
+                  txt.append("Bad filter mapping definition. Filter name: ").append(fm.getFilterName());
+                  txt.append(", Portlet names: ").append(fm.getPortletNames().toString());
+                  txt.append(", Portlet definition not found: ").append(pn);
+                  LOG.warn(txt.toString());
+                  pad.removeFilterMapping(fm);
+               }
             }
          }
       }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR362ConfigurationProcessor.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR362ConfigurationProcessor.java b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR362ConfigurationProcessor.java
index eae8230..5cced2e 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR362ConfigurationProcessor.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/om/portlet/impl/JSR362ConfigurationProcessor.java
@@ -460,12 +460,12 @@ public class JSR362ConfigurationProcessor extends JSR286ConfigurationProcessor {
          List<PortletModeType> pmlist = st.getPortletMode();
          if (pmlist.size() == 0) {
             String info = "No portlet modes found in Supports block.";
-            LOG.debug(info);
+            LOG.trace(info);
          }
          List<WindowStateType> wslist = st.getWindowState();
          if (wslist.size() == 0) {
             String info = "No window states found in Supports block.";
-            LOG.debug(info);
+            LOG.trace(info);
          }
 
          // set up Supports

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterChainImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterChainImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterChainImpl.java
index 55c928e..cfc24a6 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterChainImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterChainImpl.java
@@ -71,6 +71,13 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
    public FilterChainImpl(String lifeCycle) {
       this.lifeCycle = lifeCycle;
    }
+   
+   /**
+    * For async processing, the filter chain needs to be executed multiple times.
+    */
+   public void reset() {
+      filterListIndex = 0;
+   }
 
    public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet,
          PortletContext portletContext) throws IOException, PortletException {
@@ -116,6 +123,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
       filterList.add(filter);
    }
 
+   @Override
    public void doFilter(ActionRequest request, ActionResponse response) throws IOException, PortletException {
       if (filterListIndex < filterList.size()) {
          Filter filter = filterList.get(filterListIndex);
@@ -139,6 +147,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
       }
    }
 
+   @Override
    public void doFilter(EventRequest request, EventResponse response) throws IOException, PortletException {
       if (filterListIndex < filterList.size()) {
          Filter filter = filterList.get(filterListIndex);
@@ -162,6 +171,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
       }
    }
 
+   @Override
    public void doFilter(RenderRequest request, RenderResponse response) throws IOException, PortletException {
       if (filterListIndex < filterList.size()) {
          Filter filter = filterList.get(filterListIndex);
@@ -185,6 +195,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
       }
    }
 
+   @Override
    public void doFilter(HeaderRequest request, HeaderResponse response) throws IOException, PortletException {
       if (filterListIndex < filterList.size()) {
          Filter filter = filterList.get(filterListIndex);
@@ -208,6 +219,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
       }
    }
 
+   @Override
    public void doFilter(ResourceRequest request, ResourceResponse response) throws IOException, PortletException {
       if (filterListIndex < filterList.size()) {
          Filter filter = filterList.get(filterListIndex);

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/0ff1c51b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterManagerImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterManagerImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterManagerImpl.java
index 0d28f45..66f6c1d 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterManagerImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/FilterManagerImpl.java
@@ -90,6 +90,7 @@ public class FilterManagerImpl implements FilterManager{
     /**
      * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.EventRequest, javax.portlet.EventResponse, javax.portlet.EventPortlet, javax.portlet.PortletContext)
      */
+    @Override
     public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet,PortletContext portletContext)throws PortletException, IOException{
         filterchain.processFilter(req, res, eventPortlet, portletContext);
     }
@@ -97,13 +98,16 @@ public class FilterManagerImpl implements FilterManager{
     /**
      * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ResourceRequest, javax.portlet.ResourceResponse, javax.portlet.ResourceServingPortlet, javax.portlet.PortletContext)
      */
+    @Override
     public void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet,PortletContext portletContext)throws PortletException, IOException{
+        filterchain.reset();     // for async processing
         filterchain.processFilter(req, res, resourceServingPortlet, portletContext);
     }
 
     /**
      * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.RenderRequest, javax.portlet.RenderResponse, javax.portlet.Portlet, javax.portlet.PortletContext)
      */
+    @Override
     public void processFilter(RenderRequest req, RenderResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
         filterchain.processFilter(req, res, portlet, portletContext);
     }
@@ -111,6 +115,7 @@ public class FilterManagerImpl implements FilterManager{
     /**
      * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.RenderRequest, javax.portlet.HeaderResponse, javax.portlet.HeaderPortlet, javax.portlet.PortletContext)
      */
+    @Override
     public void processFilter(HeaderRequest req, HeaderResponse res, HeaderPortlet portlet,PortletContext portletContext) throws PortletException, IOException{
         filterchain.processFilter(req, res, portlet, portletContext);
     }
@@ -118,6 +123,7 @@ public class FilterManagerImpl implements FilterManager{
     /**
      * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ActionRequest, javax.portlet.ActionResponse, javax.portlet.Portlet, javax.portlet.PortletContext)
      */
+    @Override
     public void processFilter(ActionRequest req, ActionResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
         filterchain.processFilter(req, res, portlet, portletContext);
     }