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/08 15:40:38 UTC

[26/34] portals-pluto git commit: Changed FilterChain to instantiate filters through the bean manager when possible in order to enable contextual support in filters. Extended the PortletAsyncFilter to use dependency injection. Structured the PortletServl

Changed FilterChain to instantiate filters through the bean manager when
possible in order to enable contextual support in filters. Extended the
PortletAsyncFilter to use dependency injection. Structured the
PortletServlet3 code to minimize dependency on CDI support.


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

Branch: refs/heads/V3Prototype
Commit: 5c26ec41ce72d9fbcfb542d4fb9215663d76e377
Parents: 0ff1c51
Author: Scott Nicklous <ms...@apache.org>
Authored: Sun Apr 3 18:44:35 2016 +0200
Committer: Scott Nicklous <ms...@apache.org>
Committed: Sun Apr 3 18:44:35 2016 +0200

----------------------------------------------------------------------
 .../apache/portals/samples/AsyncDialogBean.java | 32 ++++++++-
 .../portals/samples/AsyncPortletFilter.java     | 21 +++++-
 .../src/main/webapp/WEB-INF/jsp/asyncDialog.jsp | 12 ++--
 .../src/main/webapp/resources/css/infobox.css   | 14 +++-
 .../apache/pluto/container/FilterManager.java   |  6 ++
 .../pluto/container/driver/PortletServlet3.java |  9 ++-
 .../services/container/FilterChainImpl.java     | 72 +++++++++++++++++---
 .../services/container/FilterManagerImpl.java   | 15 ++++
 8 files changed, 159 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
index 3e1f003..5fa7245 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
@@ -30,6 +30,7 @@ import javax.portlet.annotations.ActionMethod;
 import javax.portlet.annotations.PortletSerializable;
 import javax.portlet.annotations.RenderMethod;
 import javax.portlet.annotations.RenderStateScoped;
+import javax.servlet.DispatcherType;
 
 /**
  * Render state scoped bean. The bean is stored as a render parameter, so it
@@ -48,6 +49,7 @@ public class AsyncDialogBean implements PortletSerializable {
    public static final String PARAM_DELAY    = "delay";
    public static final String PARAM_REPS     = "reps";
    public static final String PARAM_AUTO     = "auto";
+   public static final String PARAM_FILTER   = "filter";
    public static final String PARAM_TYPE     = "type";
    public static final String PARAM_TYPE_TXT = OutputType.TEXT.toString();
    public static final String PARAM_TYPE_INC = OutputType.INC.toString();
@@ -59,6 +61,7 @@ public class AsyncDialogBean implements PortletSerializable {
    private OutputType         type;
    private String             msg;
    private boolean            autoDispatch;
+   private boolean            useFilter;
 
    /**
     * This method is called by the portlet container to initialize the bean at
@@ -72,12 +75,14 @@ public class AsyncDialogBean implements PortletSerializable {
          type = OutputType.TEXT;
          msg = null;
          autoDispatch = true;
+         useFilter = false;
       } else {
          delay = Integer.parseInt(state[0]);
          reps = Integer.parseInt(state[1]);
          type = OutputType.valueOf(state[2]);
          msg = state[3];
          autoDispatch = Boolean.parseBoolean(state[4]);
+         useFilter = Boolean.parseBoolean(state[5]);
       }
       LOGGER.fine("deserialized: " + Arrays.asList(state).toString());
    }
@@ -88,7 +93,7 @@ public class AsyncDialogBean implements PortletSerializable {
     */
    @Override
    public String[] serialize() {
-      String[] state = { "" + delay, "" + reps, type.toString(), msg, "" + autoDispatch };
+      String[] state = { "" + delay, "" + reps, type.toString(), msg, ""+autoDispatch, ""+useFilter };
       LOGGER.fine("serialized: " + Arrays.asList(state).toString());
       return state;
    }
@@ -169,6 +174,20 @@ public class AsyncDialogBean implements PortletSerializable {
    }
 
    /**
+    * @return the useFilter
+    */
+   public boolean isUseFilter() {
+      return useFilter;
+   }
+
+   /**
+    * @param useFilter the useFilter to set
+    */
+   public void setUseFilter(boolean useFilter) {
+      this.useFilter = useFilter;
+   }
+
+   /**
     * Displays the dialog
     * 
     * @return the action form as string
@@ -233,6 +252,17 @@ public class AsyncDialogBean implements PortletSerializable {
          }
       }
 
+      String filter = req.getActionParameters().getValue(PARAM_FILTER);
+      if (filter != null) {
+         useFilter = true;
+         if ((type == OutputType.FWD)) {
+            msg = "Filter can't generate output with forward processing.";
+            useFilter = false;
+         }
+      } else {
+         useFilter = false;
+      }
+
       String[] state = { "" + delay, "" + reps, type.toString(), msg, "" + autoDispatch };
       LOGGER.fine("Resulting params: " + Arrays.asList(state).toString());
    }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/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
index 75c664d..be096c5 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletFilter.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.inject.Inject;
 import javax.portlet.PortletException;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
@@ -29,6 +30,7 @@ import javax.portlet.annotations.PortletRequestFilter;
 import javax.portlet.filter.FilterChain;
 import javax.portlet.filter.FilterConfig;
 import javax.portlet.filter.ResourceFilter;
+import javax.servlet.DispatcherType;
 
 /**
  * Filter for the async portlet. logs the dispatcher type and sometimes
@@ -40,6 +42,9 @@ import javax.portlet.filter.ResourceFilter;
 @PortletRequestFilter(portletNames="AsyncPortlet")
 public class AsyncPortletFilter implements ResourceFilter {
    private static final Logger LOGGER = Logger.getLogger(AsyncPortletFilter.class.getName());
+   
+   @Inject private PortletRequestRandomNumberBean reqnum;
+   @Inject private AsyncDialogBean adb;
 
    @Override
    public void init(FilterConfig filterConfig) throws PortletException {
@@ -53,7 +58,21 @@ public class AsyncPortletFilter implements ResourceFilter {
    public void doFilter(ResourceRequest request, ResourceResponse response, FilterChain chain) throws IOException,
          PortletException {
       
-      LOGGER.fine("Entering request. Dispatcher type: " + request.getDispatcherType());
+      DispatcherType type = request.getDispatcherType();
+      
+      StringBuilder txt = new StringBuilder(128);
+      txt.append("Entering request. Dispatcher type: ").append(type);
+      txt.append(", request #: ").append(reqnum.getRandomNumber());
+      LOGGER.fine(txt.toString());
+      
+      if (type != DispatcherType.ASYNC && adb.isUseFilter()) {
+         txt.setLength(0);
+         txt.append("<div class='msgbox'>");
+         txt.append("Filter: Request number: ").append(reqnum.getRandomNumber());
+         txt.append(", dispatcher type: ").append(request.getDispatcherType());
+         txt.append("</div>");
+         response.getWriter().write(txt.toString());
+      }
       
       chain.doFilter(request, response);
       

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncDialog.jsp
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncDialog.jsp b/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncDialog.jsp
index 9c59c35..fd7e941 100644
--- a/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncDialog.jsp
+++ b/PortletV3AnnotatedDemo/src/main/webapp/WEB-INF/jsp/asyncDialog.jsp
@@ -37,21 +37,23 @@ ${adb.getMsg()}
    </td><td>
    <input id='<portlet:namespace/>-reps' name='<%=PARAM_REPS%>' type='text' value='${adb.getReps() }' size='5' maxlength='5'>
    </td><td>
-   <input name='<%=PARAM_AUTO%>' value='<%=PARAM_AUTO%>' type='checkbox' ${adb.isAutoDispatch() ? "checked" : "" } >recursive
+   <input name='<%=PARAM_AUTO%>' value='<%=PARAM_AUTO%>' type='checkbox' ${adb.isAutoDispatch() ? "checked" : "" } > recursive
 
    </td></tr><tr><td>
    Output type:
    </td><td>
-   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_TXT%>' ${adb.getType() == "TEXT" ? "checked" : "" } >text
+   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_TXT%>' ${adb.getType() == "TEXT" ? "checked" : "" } > text
    </td><td>
-   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_INC%>' ${adb.getType() == "INC" ? "checked" : "" } >include
+   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_INC%>' ${adb.getType() == "INC" ? "checked" : "" } > include
    </td><td>
-   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_FWD%>' ${adb.getType() == "FWD" ? "checked" : "" } >forward
+   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_FWD%>' ${adb.getType() == "FWD" ? "checked" : "" } > forward
    </td><td>
-   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_DIS%>' ${adb.getType() == "DISPATCH" ? "checked" : "" } >dispatch
+   <input type='radio' name='<%=PARAM_TYPE%>' value='<%=PARAM_TYPE_DIS%>' ${adb.getType() == "DISPATCH" ? "checked" : "" } > dispatch
 
    </td></tr><tr><td>
    <INPUT id ='<portlet:namespace/>-send' VALUE='execute' TYPE='submit'>
+   </td><td>
+   <input name='<%=PARAM_FILTER%>' value='<%=PARAM_FILTER%>' type='checkbox' ${adb.isUseFilter() ? "checked" : "" } > show filter
    </td></tr></table>
 </FORM>
 </div>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/PortletV3AnnotatedDemo/src/main/webapp/resources/css/infobox.css
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/webapp/resources/css/infobox.css b/PortletV3AnnotatedDemo/src/main/webapp/resources/css/infobox.css
index 4629532..3cafd6c 100644
--- a/PortletV3AnnotatedDemo/src/main/webapp/resources/css/infobox.css
+++ b/PortletV3AnnotatedDemo/src/main/webapp/resources/css/infobox.css
@@ -2,17 +2,27 @@
    border-style:solid; 
    border-width:2px; 
    padding:4px; 
-   margin-bottom:10px;
+   margin-bottom:4px;
    overflow:auto;
    border-color:#000088; 
    background:#E0E0FF;
 }
 
+.msgbox {
+   border-style:solid; 
+   border-width:2px; 
+   padding:4px; 
+   margin-bottom:4px;
+   overflow:auto;
+   border-color:#800080; 
+   background:#ddaadd;
+}
+
 .parmbox {
    border-style:solid; 
    border-width:2px; 
    padding:4px; 
-   margin:0 0 3px 0;
+   margin:0 0 4px 0;
    overflow:auto;
    border-color:#008800; 
    background:#E0FFE0;

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/pluto-container-api/src/main/java/org/apache/pluto/container/FilterManager.java
----------------------------------------------------------------------
diff --git a/pluto-container-api/src/main/java/org/apache/pluto/container/FilterManager.java b/pluto-container-api/src/main/java/org/apache/pluto/container/FilterManager.java
index bc95ad7..e2fae3d 100644
--- a/pluto-container-api/src/main/java/org/apache/pluto/container/FilterManager.java
+++ b/pluto-container-api/src/main/java/org/apache/pluto/container/FilterManager.java
@@ -18,6 +18,7 @@ package org.apache.pluto.container;
 
 import java.io.IOException;
 
+import javax.enterprise.inject.spi.BeanManager;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventPortlet;
@@ -48,4 +49,9 @@ public interface FilterManager {
     void processFilter(RenderRequest req, RenderResponse res, Portlet portlet, PortletContext portletContext) throws PortletException, IOException;
     void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet, PortletContext portletContext)throws PortletException, IOException;
     void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet, PortletContext portletContext)throws PortletException, IOException;
+
+    /**
+    * To enable contextual support in filters
+    */
+   void setBeanManager(BeanManager bm);
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/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 b324f57..c48ee4d 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
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
@@ -87,8 +88,8 @@ public class PortletServlet3 extends HttpServlet {
 
    // Private Member Variables ------------------------------------------------
    
-   @Inject
-   private AnnotatedConfigBean acb;
+   @Inject private AnnotatedConfigBean acb;
+   @Inject private BeanManager beanmgr;
 
    /**
     * The portlet name as defined in the portlet app descriptor.
@@ -283,6 +284,7 @@ public class PortletServlet3 extends HttpServlet {
 
       final FilterManager filterManager = 
             (FilterManager) request.getAttribute(PortletInvokerService.FILTER_MANAGER);
+      filterManager.setBeanManager(beanmgr);
 
       if (LOG.isTraceEnabled()) {
          StringBuilder txt = new StringBuilder(128);
@@ -521,6 +523,8 @@ public class PortletServlet3 extends HttpServlet {
 
       // Set up the artifact producer with request, response, and portlet config
       PortletArtifactProducer.setPrecursors(req, resp, config);
+      
+      LOG.debug("CDI context is now set up.");
    }
 
    /**
@@ -548,5 +552,6 @@ public class PortletServlet3 extends HttpServlet {
       // remove the portlet artifact producer
       PortletArtifactProducer.remove();
 
+      LOG.debug("CDI context is now deactivated.");
    }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/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 cfc24a6..7d48212 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
@@ -19,7 +19,10 @@ package org.apache.pluto.driver.services.container;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventPortlet;
@@ -45,17 +48,23 @@ import javax.portlet.filter.RenderFilter;
 import javax.portlet.filter.ResourceFilter;
 
 import org.apache.pluto.container.om.portlet.Filter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
- * A <code>FilterChain</code> is an object provided by the portlet container to the developer giving a view into the
- * invocation chain of a filtered request for a portlet. Filters use the <code>FilterChain</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.
+ * A <code>FilterChain</code> is an object provided by the portlet container to
+ * the developer giving a view into the invocation chain of a filtered request
+ * for a portlet. Filters use the <code>FilterChain</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.
  * 
  * @since 29/05/2007
  * @version 2.0
  */
 public class FilterChainImpl implements FilterChain, HeaderFilterChain {
+   private static final Logger LOG = LoggerFactory.getLogger(FilterChainImpl.class);
+   private static final boolean isDebug = LOG.isDebugEnabled();
+   
 
    private List<Filter>   filterList      = new ArrayList<Filter>();
    @SuppressWarnings("unused")
@@ -68,12 +77,53 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
    PortletContext         portletContext;
    int                    filterListIndex = 0;
 
+   private BeanManager    beanmgr;
+
    public FilterChainImpl(String lifeCycle) {
       this.lifeCycle = lifeCycle;
    }
-   
+
+   /** 
+    * enables contextual support
+    */
+   public void setBeanManager(BeanManager bm) {
+      beanmgr = bm;
+   }
+
+   private Object loadFilter(Filter filter) throws InstantiationException, IllegalAccessException,
+         ClassNotFoundException {
+      Object obj = null;
+      Class<?> fcls = loader.loadClass(filter.getFilterClass());
+      if (fcls != null) {
+         if (beanmgr == null) {
+            // CDI is not active
+            obj = fcls.newInstance();
+         } else {
+            // CDI active ... instantiate as bean to enable contextual features
+            Set<Bean<?>> beans = beanmgr.getBeans(fcls);
+            Bean<?> bean = beanmgr.resolve(beans);
+            if (bean != null) {
+               obj = beanmgr.getReference(bean, bean.getBeanClass(), beanmgr.createCreationalContext(bean));
+            } else {
+               LOG.warn("Could not get bean reference: " + filter.getFilterClass());
+               obj = fcls.newInstance();
+            }
+         }
+         if (isDebug) {
+            StringBuilder txt = new StringBuilder();
+            txt.append("Loaded filter for: ").append(fcls.getCanonicalName());
+            txt.append(", bean manager active: ").append(beanmgr != null);
+            LOG.debug(txt.toString());
+         }
+      } else {
+         LOG.error("Could not load class: " + filter.getFilterClass());
+      }
+      return obj;
+   }
+
    /**
-    * For async processing, the filter chain needs to be executed multiple times.
+    * For async processing, the filter chain needs to be executed multiple
+    * times.
     */
    public void reset() {
       filterListIndex = 0;
@@ -129,7 +179,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
          Filter filter = filterList.get(filterListIndex);
          filterListIndex++;
          try {
-            ActionFilter actionFilter = (ActionFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            ActionFilter actionFilter = (ActionFilter) loadFilter(filter);
             FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
                   portletContext);
             actionFilter.init(filterConfig);
@@ -153,7 +203,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
          Filter filter = filterList.get(filterListIndex);
          filterListIndex++;
          try {
-            EventFilter eventFilter = (EventFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            EventFilter eventFilter = (EventFilter) loadFilter(filter);;
             FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
                   portletContext);
             eventFilter.init(filterConfig);
@@ -177,7 +227,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
          Filter filter = filterList.get(filterListIndex);
          filterListIndex++;
          try {
-            RenderFilter renderFilter = (RenderFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            RenderFilter renderFilter = (RenderFilter) loadFilter(filter);;
             FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
                   portletContext);
             renderFilter.init(filterConfig);
@@ -201,7 +251,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
          Filter filter = filterList.get(filterListIndex);
          filterListIndex++;
          try {
-            HeaderFilter headerFilter = (HeaderFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            HeaderFilter headerFilter = (HeaderFilter) loadFilter(filter);;
             FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
                   portletContext);
             headerFilter.init(filterConfig);
@@ -225,7 +275,7 @@ public class FilterChainImpl implements FilterChain, HeaderFilterChain {
          Filter filter = filterList.get(filterListIndex);
          filterListIndex++;
          try {
-            ResourceFilter resourceFilter = (ResourceFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            ResourceFilter resourceFilter = (ResourceFilter) loadFilter(filter);;
             FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
                   portletContext);
             resourceFilter.init(filterConfig);

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/5c26ec41/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 66f6c1d..1b076a3 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
@@ -18,7 +18,10 @@ package org.apache.pluto.driver.services.container;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventPortlet;
@@ -42,6 +45,8 @@ import org.apache.pluto.container.om.portlet.Filter;
 import org.apache.pluto.container.om.portlet.FilterMapping;
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -51,6 +56,8 @@ import org.apache.pluto.container.om.portlet.PortletDefinition;
  * @version 2.0
  */
 public class FilterManagerImpl implements FilterManager{
+   private static final Logger LOG = LoggerFactory.getLogger(FilterManagerImpl.class);
+   
     private FilterChainImpl filterchain;
     private PortletApplicationDefinition portletApp;
     private String portletName;
@@ -64,6 +71,14 @@ public class FilterManagerImpl implements FilterManager{
         filterchain = new FilterChainImpl(lifeCycle);
         initFilterChain();
     }
+    
+    /**
+     * passing thru bean manager to enable contextual support in filters.
+     */
+    @Override
+    public void setBeanManager(BeanManager bm) {
+       filterchain.setBeanManager(bm);
+    }
 
     private void initFilterChain(){
         List<? extends FilterMapping> filterMappingList = portletApp.getFilterMappings();