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

[31/38] portals-pluto git commit: First step in implementation of header phase support. Initial, incomplete implementation of HeaderRequestImpl, HeaderResponseImpl and th associated contexts. Completed invocation path.

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/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 1fb7746..55c928e 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
@@ -1,189 +1,233 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pluto.driver.services.container;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.EventPortlet;
-import javax.portlet.EventRequest;
-import javax.portlet.EventResponse;
-import javax.portlet.Portlet;
-import javax.portlet.PortletContext;
-import javax.portlet.PortletException;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.portlet.ResourceRequest;
-import javax.portlet.ResourceResponse;
-import javax.portlet.ResourceServingPortlet;
-import javax.portlet.filter.ActionFilter;
-import javax.portlet.filter.EventFilter;
-import javax.portlet.filter.FilterChain;
-import javax.portlet.filter.RenderFilter;
-import javax.portlet.filter.ResourceFilter;
-
-import org.apache.pluto.container.om.portlet.Filter;
-
-/**
- * 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 {
-
-    private List<Filter> filterList = new ArrayList<Filter>();
-    private String lifeCycle;
-    Portlet portlet;
-    EventPortlet eventPortlet;
-    ResourceServingPortlet resourceServingPortlet;
-    ClassLoader loader;
-    PortletContext portletContext;
-    int filterListIndex = 0;
-
-    public FilterChainImpl(String lifeCycle){
-        this.lifeCycle = lifeCycle;
-    }
-    public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet, PortletContext portletContext) throws IOException, PortletException{
-        this.eventPortlet = eventPortlet;
-        this.loader = Thread.currentThread().getContextClassLoader();
-        this.portletContext = portletContext;
-        doFilter(req,res);
-    }
-    public void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet, PortletContext portletContext) throws IOException, PortletException{
-        this.resourceServingPortlet = resourceServingPortlet;
-        this.loader = Thread.currentThread().getContextClassLoader();
-        this.portletContext = portletContext;
-        doFilter(req,res);
-    }
-
-    public void processFilter(ActionRequest req, ActionResponse res, Portlet portlet, PortletContext portletContext) throws IOException, PortletException{
-        this.portlet = portlet;
-        this.loader = Thread.currentThread().getContextClassLoader();
-        this.portletContext = portletContext;
-        doFilter(req,res);
-    }
-
-    public void processFilter(RenderRequest req, RenderResponse res, Portlet portlet, PortletContext portletContext) throws IOException, PortletException{
-        this.portlet = portlet;
-        this.loader = Thread.currentThread().getContextClassLoader();
-        this.portletContext = portletContext;
-        doFilter(req, res);
-    }
-
-    public void addFilter(Filter filter){
-        filterList.add(filter);
-    }
-
-    public void doFilter(ActionRequest request, ActionResponse response) throws IOException, PortletException {
-        if (filterListIndex <filterList.size()){
-            Filter filter = filterList.get(filterListIndex);
-            filterListIndex++;
-            try {
-                ActionFilter actionFilter = (ActionFilter) loader.loadClass(filter.getFilterClass()).newInstance();
-                FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(),filter.getInitParams(),portletContext);
-                actionFilter.init(filterConfig);
-                actionFilter.doFilter(request, response, this);
-                actionFilter.destroy();
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            }
-        }
-        else{
-            portlet.processAction(request, response);
-        }
-    }
-
-    public void doFilter(EventRequest request, EventResponse response) throws IOException, PortletException {
-        if (filterListIndex <filterList.size()){
-            Filter filter = filterList.get(filterListIndex);
-            filterListIndex++;
-            try {
-                EventFilter eventFilter = (EventFilter) loader.loadClass(filter.getFilterClass()).newInstance();
-                FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(),filter.getInitParams(),portletContext);
-                eventFilter.init(filterConfig);
-                eventFilter.doFilter(request, response, this);
-                eventFilter.destroy();
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            }
-        }
-        else{
-            eventPortlet.processEvent(request, response);
-        }
-    }
-
-    public void doFilter(RenderRequest request, RenderResponse response) throws IOException, PortletException {
-        if (filterListIndex <filterList.size()){
-            Filter filter = filterList.get(filterListIndex);
-            filterListIndex++;
-            try {
-                RenderFilter renderFilter = (RenderFilter) loader.loadClass(filter.getFilterClass()).newInstance();
-                FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(),filter.getInitParams(),portletContext);
-                renderFilter.init(filterConfig);
-                renderFilter.doFilter(request, response, this);
-                renderFilter.destroy();
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            }
-        }
-        else{
-            portlet.render(request, response);
-        }
-    }
-
-    public void doFilter(ResourceRequest request, ResourceResponse response) throws IOException, PortletException {
-        if (filterListIndex <filterList.size()){
-            Filter filter = filterList.get(filterListIndex);
-            filterListIndex++;
-            try {
-                ResourceFilter resourceFilter = (ResourceFilter) loader.loadClass(filter.getFilterClass()).newInstance();
-                FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(),filter.getInitParams(),portletContext);
-                resourceFilter.init(filterConfig);
-                resourceFilter.doFilter(request, response, this);
-                resourceFilter.destroy();
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            }
-        }
-        else{
-            resourceServingPortlet.serveResource(request, response);
-        }
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.driver.services.container;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.EventPortlet;
+import javax.portlet.EventRequest;
+import javax.portlet.EventResponse;
+import javax.portlet.HeaderPortlet;
+import javax.portlet.HeaderRequest;
+import javax.portlet.HeaderResponse;
+import javax.portlet.Portlet;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletException;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.ResourceServingPortlet;
+import javax.portlet.filter.ActionFilter;
+import javax.portlet.filter.EventFilter;
+import javax.portlet.filter.FilterChain;
+import javax.portlet.filter.HeaderFilter;
+import javax.portlet.filter.HeaderFilterChain;
+import javax.portlet.filter.RenderFilter;
+import javax.portlet.filter.ResourceFilter;
+
+import org.apache.pluto.container.om.portlet.Filter;
+
+/**
+ * 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 List<Filter>   filterList      = new ArrayList<Filter>();
+   @SuppressWarnings("unused")
+   private String         lifeCycle;
+   Portlet                portlet;
+   EventPortlet           eventPortlet;
+   ResourceServingPortlet resourceServingPortlet;
+   HeaderPortlet          headerPortlet;
+   ClassLoader            loader;
+   PortletContext         portletContext;
+   int                    filterListIndex = 0;
+
+   public FilterChainImpl(String lifeCycle) {
+      this.lifeCycle = lifeCycle;
+   }
+
+   public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet,
+         PortletContext portletContext) throws IOException, PortletException {
+      this.eventPortlet = eventPortlet;
+      this.loader = Thread.currentThread().getContextClassLoader();
+      this.portletContext = portletContext;
+      doFilter(req, res);
+   }
+
+   public void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet,
+         PortletContext portletContext) throws IOException, PortletException {
+      this.resourceServingPortlet = resourceServingPortlet;
+      this.loader = Thread.currentThread().getContextClassLoader();
+      this.portletContext = portletContext;
+      doFilter(req, res);
+   }
+
+   public void processFilter(ActionRequest req, ActionResponse res, Portlet portlet, PortletContext portletContext)
+         throws IOException, PortletException {
+      this.portlet = portlet;
+      this.loader = Thread.currentThread().getContextClassLoader();
+      this.portletContext = portletContext;
+      doFilter(req, res);
+   }
+
+   public void processFilter(RenderRequest req, RenderResponse res, Portlet portlet, PortletContext portletContext)
+         throws IOException, PortletException {
+      this.portlet = portlet;
+      this.loader = Thread.currentThread().getContextClassLoader();
+      this.portletContext = portletContext;
+      doFilter(req, res);
+   }
+
+   public void processFilter(HeaderRequest req, HeaderResponse res, HeaderPortlet portlet, PortletContext portletContext)
+         throws IOException, PortletException {
+      this.headerPortlet = portlet;
+      this.loader = Thread.currentThread().getContextClassLoader();
+      this.portletContext = portletContext;
+      doFilter(req, res);
+   }
+
+   public void addFilter(Filter filter) {
+      filterList.add(filter);
+   }
+
+   public void doFilter(ActionRequest request, ActionResponse response) throws IOException, PortletException {
+      if (filterListIndex < filterList.size()) {
+         Filter filter = filterList.get(filterListIndex);
+         filterListIndex++;
+         try {
+            ActionFilter actionFilter = (ActionFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
+                  portletContext);
+            actionFilter.init(filterConfig);
+            actionFilter.doFilter(request, response, this);
+            actionFilter.destroy();
+         } catch (InstantiationException e) {
+            e.printStackTrace();
+         } catch (IllegalAccessException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else {
+         portlet.processAction(request, response);
+      }
+   }
+
+   public void doFilter(EventRequest request, EventResponse response) throws IOException, PortletException {
+      if (filterListIndex < filterList.size()) {
+         Filter filter = filterList.get(filterListIndex);
+         filterListIndex++;
+         try {
+            EventFilter eventFilter = (EventFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
+                  portletContext);
+            eventFilter.init(filterConfig);
+            eventFilter.doFilter(request, response, this);
+            eventFilter.destroy();
+         } catch (InstantiationException e) {
+            e.printStackTrace();
+         } catch (IllegalAccessException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else {
+         eventPortlet.processEvent(request, response);
+      }
+   }
+
+   public void doFilter(RenderRequest request, RenderResponse response) throws IOException, PortletException {
+      if (filterListIndex < filterList.size()) {
+         Filter filter = filterList.get(filterListIndex);
+         filterListIndex++;
+         try {
+            RenderFilter renderFilter = (RenderFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
+                  portletContext);
+            renderFilter.init(filterConfig);
+            renderFilter.doFilter(request, response, this);
+            renderFilter.destroy();
+         } catch (InstantiationException e) {
+            e.printStackTrace();
+         } catch (IllegalAccessException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else {
+         portlet.render(request, response);
+      }
+   }
+
+   public void doFilter(HeaderRequest request, HeaderResponse response) throws IOException, PortletException {
+      if (filterListIndex < filterList.size()) {
+         Filter filter = filterList.get(filterListIndex);
+         filterListIndex++;
+         try {
+            HeaderFilter headerFilter = (HeaderFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
+                  portletContext);
+            headerFilter.init(filterConfig);
+            headerFilter.doFilter(request, response, this);
+            headerFilter.destroy();
+         } catch (InstantiationException e) {
+            e.printStackTrace();
+         } catch (IllegalAccessException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else {
+         headerPortlet.renderHeaders(request, response);
+      }
+   }
+
+   public void doFilter(ResourceRequest request, ResourceResponse response) throws IOException, PortletException {
+      if (filterListIndex < filterList.size()) {
+         Filter filter = filterList.get(filterListIndex);
+         filterListIndex++;
+         try {
+            ResourceFilter resourceFilter = (ResourceFilter) loader.loadClass(filter.getFilterClass()).newInstance();
+            FilterConfigImpl filterConfig = new FilterConfigImpl(filter.getFilterName(), filter.getInitParams(),
+                  portletContext);
+            resourceFilter.init(filterConfig);
+            resourceFilter.doFilter(request, response, this);
+            resourceFilter.destroy();
+         } catch (InstantiationException e) {
+            e.printStackTrace();
+         } catch (IllegalAccessException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else {
+         resourceServingPortlet.serveResource(request, response);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/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 49f0acb..0d28f45 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
@@ -1,146 +1,156 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.pluto.driver.services.container;
-
-import java.io.IOException;
-import java.util.List;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.EventPortlet;
-import javax.portlet.EventRequest;
-import javax.portlet.EventResponse;
-import javax.portlet.Portlet;
-import javax.portlet.PortletContext;
-import javax.portlet.PortletException;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.portlet.ResourceRequest;
-import javax.portlet.ResourceResponse;
-import javax.portlet.ResourceServingPortlet;
-
-import org.apache.pluto.container.FilterManager;
-import org.apache.pluto.container.PortletWindow;
-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;
-
-
-/**
- * Manage the initialization and doFilter {@link FilterChainImpl} for the filter which are
- * declareted in the deployment descriptor.
- * @since 05/29/2007
- * @version 2.0
- */
-public class FilterManagerImpl implements FilterManager{
-    private FilterChainImpl filterchain;
-    private PortletApplicationDefinition portletApp;
-    private String portletName;
-    private String lifeCycle;
-
-    public FilterManagerImpl(PortletWindow portletWindow, String lifeCycle) {
-        final PortletDefinition pd = portletWindow.getPortletDefinition();
-        this.portletApp = pd.getApplication();
-        this.portletName =  pd.getPortletName();
-        this.lifeCycle = lifeCycle;
-        filterchain = new FilterChainImpl(lifeCycle);
-        initFilterChain();
-    }
-
-    private void initFilterChain(){
-        List<? extends FilterMapping> filterMappingList = portletApp.getFilterMappings();
-        if (filterMappingList!= null){
-            for (FilterMapping filterMapping : filterMappingList) {
-                if (isFilter(filterMapping, portletName)){
-                    //the filter is specified for the portlet, check the filter for the lifecycle
-                    List<? extends Filter> filterList = portletApp.getFilters();
-                    for (Filter filter : filterList) {
-                        //search for the filter in the filter
-                        if (filter.getFilterName().equals(filterMapping.getFilterName())){
-                            //check the lifecycle
-                            if (isLifeCycle(filter, lifeCycle)){
-                                //the filter match to the portlet and has the specified lifecycle -> add to chain
-                                filterchain.addFilter(filter);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.EventRequest, javax.portlet.EventResponse, javax.portlet.EventPortlet, javax.portlet.PortletContext)
-     */
-    public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet,PortletContext portletContext)throws PortletException, IOException{
-        filterchain.processFilter(req, res, eventPortlet, portletContext);
-    }
-
-    /**
-     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ResourceRequest, javax.portlet.ResourceResponse, javax.portlet.ResourceServingPortlet, javax.portlet.PortletContext)
-     */
-    public void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet,PortletContext portletContext)throws PortletException, IOException{
-        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)
-     */
-    public void processFilter(RenderRequest req, RenderResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
-        filterchain.processFilter(req, res, portlet, portletContext);
-    }
-
-    /**
-     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ActionRequest, javax.portlet.ActionResponse, javax.portlet.Portlet, javax.portlet.PortletContext)
-     */
-    public void processFilter(ActionRequest req, ActionResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
-        filterchain.processFilter(req, res, portlet, portletContext);
-    }
-
-    private boolean isLifeCycle(Filter filter, String lifeCycle){
-        List <String> lifeCyclesList = filter.getLifecycles();
-        for (String string : lifeCyclesList) {
-            if (string.equals(lifeCycle))
-                return true;
-        }
-        return false;
-    }
-
-    private boolean isFilter(FilterMapping filterMapping,String portletName){
-        List <String> portletNamesList = filterMapping.getPortletNames();
-        for (String portletNameFromFilterList : portletNamesList) {
-            if (portletNameFromFilterList.endsWith("*")){
-                if (portletNameFromFilterList.length()==1){
-                    //if name contains only *
-                    return true;
-                }
-                portletNameFromFilterList = portletNameFromFilterList.substring(0, portletNameFromFilterList.length()-1);
-                if (portletName.length()>= portletNameFromFilterList.length()){
-                    if (portletName.substring(0, portletNameFromFilterList.length()).equals(portletNameFromFilterList)){
-                        return true;
-                    }
-                }
-            }
-            else if (portletNameFromFilterList.equals(portletName))
-                return true;
-        }
-        return false;
-    }
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.driver.services.container;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.EventPortlet;
+import javax.portlet.EventRequest;
+import javax.portlet.EventResponse;
+import javax.portlet.HeaderPortlet;
+import javax.portlet.HeaderRequest;
+import javax.portlet.HeaderResponse;
+import javax.portlet.Portlet;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletException;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.ResourceServingPortlet;
+
+import org.apache.pluto.container.FilterManager;
+import org.apache.pluto.container.PortletWindow;
+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;
+
+
+/**
+ * Manage the initialization and doFilter {@link FilterChainImpl} for the filter which are
+ * declared in the deployment descriptor.
+ * @since 05/29/2007
+ * @version 2.0
+ */
+public class FilterManagerImpl implements FilterManager{
+    private FilterChainImpl filterchain;
+    private PortletApplicationDefinition portletApp;
+    private String portletName;
+    private String lifeCycle;
+
+    public FilterManagerImpl(PortletWindow portletWindow, String lifeCycle) {
+        final PortletDefinition pd = portletWindow.getPortletDefinition();
+        this.portletApp = pd.getApplication();
+        this.portletName =  pd.getPortletName();
+        this.lifeCycle = lifeCycle;
+        filterchain = new FilterChainImpl(lifeCycle);
+        initFilterChain();
+    }
+
+    private void initFilterChain(){
+        List<? extends FilterMapping> filterMappingList = portletApp.getFilterMappings();
+        if (filterMappingList!= null){
+            for (FilterMapping filterMapping : filterMappingList) {
+                if (isFilter(filterMapping, portletName)){
+                    //the filter is specified for the portlet, check the filter for the lifecycle
+                    List<? extends Filter> filterList = portletApp.getFilters();
+                    for (Filter filter : filterList) {
+                        //search for the filter in the filter
+                        if (filter.getFilterName().equals(filterMapping.getFilterName())){
+                            //check the lifecycle
+                            if (isLifeCycle(filter, lifeCycle)){
+                                //the filter match to the portlet and has the specified lifecycle -> add to chain
+                                filterchain.addFilter(filter);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.EventRequest, javax.portlet.EventResponse, javax.portlet.EventPortlet, javax.portlet.PortletContext)
+     */
+    public void processFilter(EventRequest req, EventResponse res, EventPortlet eventPortlet,PortletContext portletContext)throws PortletException, IOException{
+        filterchain.processFilter(req, res, eventPortlet, portletContext);
+    }
+
+    /**
+     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ResourceRequest, javax.portlet.ResourceResponse, javax.portlet.ResourceServingPortlet, javax.portlet.PortletContext)
+     */
+    public void processFilter(ResourceRequest req, ResourceResponse res, ResourceServingPortlet resourceServingPortlet,PortletContext portletContext)throws PortletException, IOException{
+        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)
+     */
+    public void processFilter(RenderRequest req, RenderResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
+        filterchain.processFilter(req, res, portlet, portletContext);
+    }
+
+    /**
+     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.RenderRequest, javax.portlet.HeaderResponse, javax.portlet.HeaderPortlet, javax.portlet.PortletContext)
+     */
+    public void processFilter(HeaderRequest req, HeaderResponse res, HeaderPortlet portlet,PortletContext portletContext) throws PortletException, IOException{
+        filterchain.processFilter(req, res, portlet, portletContext);
+    }
+
+    /**
+     * @see org.apache.pluto.container.FilterManager#processFilter(javax.portlet.ActionRequest, javax.portlet.ActionResponse, javax.portlet.Portlet, javax.portlet.PortletContext)
+     */
+    public void processFilter(ActionRequest req, ActionResponse res, Portlet portlet,PortletContext portletContext) throws PortletException, IOException{
+        filterchain.processFilter(req, res, portlet, portletContext);
+    }
+
+    private boolean isLifeCycle(Filter filter, String lifeCycle){
+        List <String> lifeCyclesList = filter.getLifecycles();
+        for (String string : lifeCyclesList) {
+            if (string.equals(lifeCycle))
+                return true;
+        }
+        return false;
+    }
+
+    private boolean isFilter(FilterMapping filterMapping,String portletName){
+        List <String> portletNamesList = filterMapping.getPortletNames();
+        for (String portletNameFromFilterList : portletNamesList) {
+            if (portletNameFromFilterList.endsWith("*")){
+                if (portletNameFromFilterList.length()==1){
+                    //if name contains only *
+                    return true;
+                }
+                portletNameFromFilterList = portletNameFromFilterList.substring(0, portletNameFromFilterList.length()-1);
+                if (portletName.length()>= portletNameFromFilterList.length()){
+                    if (portletName.substring(0, portletNameFromFilterList.length()).equals(portletNameFromFilterList)){
+                        return true;
+                    }
+                }
+            }
+            else if (portletNameFromFilterList.equals(portletName))
+                return true;
+        }
+        return false;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletHeaderResponseContextImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletHeaderResponseContextImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletHeaderResponseContextImpl.java
new file mode 100644
index 0000000..5825be5
--- /dev/null
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletHeaderResponseContextImpl.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pluto.driver.services.container;
+
+import java.util.Collection;
+
+import javax.portlet.PortletMode;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.pluto.container.PortletContainer;
+import org.apache.pluto.container.PortletHeaderResponseContext;
+import org.apache.pluto.container.PortletWindow;
+import org.apache.pluto.driver.AttributeKeys;
+
+/**
+ * @version $Id$
+ *
+ */
+public class PortletHeaderResponseContextImpl extends PortletMimeResponseContextImpl implements
+                PortletHeaderResponseContext
+{
+    public PortletHeaderResponseContextImpl(PortletContainer container, HttpServletRequest containerRequest,
+                                            HttpServletResponse containerResponse, PortletWindow window)
+    {
+        super(container, containerRequest, containerResponse, window);
+    }
+
+    public void setNextPossiblePortletModes(Collection<PortletMode> portletModes)
+    {
+        // not supported
+    }
+
+    public void setTitle(String title)
+    {
+        if (!isClosed())
+        {
+            getServletRequest().setAttribute(AttributeKeys.PORTLET_TITLE, title);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextServiceImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextServiceImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextServiceImpl.java
index 2425d82..c744243 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextServiceImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletRequestContextServiceImpl.java
@@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.pluto.container.PortletActionResponseContext;
 import org.apache.pluto.container.PortletContainer;
 import org.apache.pluto.container.PortletEventResponseContext;
+import org.apache.pluto.container.PortletHeaderResponseContext;
 import org.apache.pluto.container.PortletRenderResponseContext;
 import org.apache.pluto.container.PortletRequestContext;
 import org.apache.pluto.container.PortletRequestContextService;
@@ -76,6 +77,20 @@ public class PortletRequestContextServiceImpl implements PortletRequestContextSe
         return new PortletRenderResponseContextImpl(container, containerRequest, containerResponse, window);
     }
 
+    public PortletRequestContext getPortletHeaderRequestContext(PortletContainer container, HttpServletRequest containerRequest,
+                                                                HttpServletResponse containerResponse, PortletWindow window)
+    {
+        return new PortletRequestContextImpl(container, containerRequest, containerResponse, window, false);
+    }
+
+    public PortletHeaderResponseContext getPortletHeaderResponseContext(PortletContainer container,
+                                                                        HttpServletRequest containerRequest,
+                                                                        HttpServletResponse containerResponse,
+                                                                        PortletWindow window)
+    {
+        return new PortletHeaderResponseContextImpl(container, containerRequest, containerResponse, window);
+    }
+
     public PortletResourceRequestContext getPortletResourceRequestContext(PortletContainer container,
                                                                           HttpServletRequest containerRequest,
                                                                           HttpServletResponse containerResponse,

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
index 8de18c3..868dc20 100644
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/PortalDriverServlet.java
@@ -27,18 +27,17 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.pluto.container.PortletContainer;
 import org.apache.pluto.container.PortletContainerException;
 import org.apache.pluto.driver.core.PortalRequestContext;
 import org.apache.pluto.driver.core.PortletWindowImpl;
 import org.apache.pluto.driver.services.portal.PageConfig;
 import org.apache.pluto.driver.services.portal.PortletWindowConfig;
-import org.apache.pluto.driver.services.portal.RenderConfigService;
 import org.apache.pluto.driver.url.PortalURL;
 import org.apache.pluto.driver.url.PortalURL.URLType;
 import org.apache.pluto.driver.util.PageState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The controller servlet used to drive the Portal Driver. All requests mapped
@@ -216,10 +215,19 @@ public class PortalDriverServlet extends HttpServlet {
          request.setAttribute(AttributeKeys.CURRENT_PAGE, pageConfig);
          String uri = (pageConfig.getUri() != null) ? pageConfig.getUri() : DEFAULT_PAGE_URI;
          
+         // Execute header request for each portlet on the page
+         
+         if (LOG.isDebugEnabled()) {
+            LOG.debug("Executing header requests for target portlets.");
+         }
+
+         doHeaders(request, response, portalURL);
+         
          if (LOG.isDebugEnabled()) {
             LOG.debug("Dispatching to: " + uri);
          }
          
+         // Dispatch to the JSP that aggregates the page.
          RequestDispatcher dispatcher = request.getRequestDispatcher(uri);
          dispatcher.forward(request, response);
          
@@ -246,4 +254,18 @@ public class PortalDriverServlet extends HttpServlet {
          throws ServletException, IOException {
       doGet(request, response);
    }
+   
+   
+   private void doHeaders(HttpServletRequest req, HttpServletResponse resp, PortalURL purl) {
+      
+      for (String pid : purl.getPortletIds()) {
+         PortletWindowConfig wcfg = PortletWindowConfig.fromId(pid); 
+         PortletWindowImpl pwin = new PortletWindowImpl(container, wcfg, purl);
+         try {
+            container.doHeader(pwin, req, resp);
+         } catch (Exception e) {
+            
+         }
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/container/DefaultPortletInvokerService.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/container/DefaultPortletInvokerService.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/container/DefaultPortletInvokerService.java
index 32c097f..a46a4e5 100644
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/container/DefaultPortletInvokerService.java
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/container/DefaultPortletInvokerService.java
@@ -22,6 +22,8 @@ import javax.portlet.ActionRequest;
 import javax.portlet.ActionResponse;
 import javax.portlet.EventRequest;
 import javax.portlet.EventResponse;
+import javax.portlet.HeaderRequest;
+import javax.portlet.HeaderResponse;
 import javax.portlet.PortletException;
 import javax.portlet.PortletRequest;
 import javax.portlet.PortletResponse;
@@ -97,10 +99,26 @@ public class DefaultPortletInvokerService implements PortletInvokerService {
     }
 
     /**
+     * Invoke the portlet with a header request.
+     *
+     * @param request  header request used for the invocation.
+     * @param response header response used for the invocation.
+     * @see PortletServlet3
+     * @see javax.portlet.Portlet#header(javax.portlet.headerRequest,javax.portlet.headerResponse)
+     */
+    public void header(PortletRequestContext context, HeaderRequest request, HeaderResponse response, FilterManager filterManager)
+    throws IOException, PortletException, PortletContainerException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Performing header Invocation");
+        }
+        invoke(context, request, response, filterManager, PortletInvokerService.METHOD_HEADER);
+    }
+
+    /**
      * Invoke the portlet with a render request.
      *
-     * @param request  action request used for the invocation.
-     * @param response action response used for the invocation.
+     * @param request  render request used for the invocation.
+     * @param response render response used for the invocation.
      * @see PortletServlet3
      * @see javax.portlet.Portlet#render(javax.portlet.RenderRequest,javax.portlet.RenderResponse)
      */
@@ -115,8 +133,8 @@ public class DefaultPortletInvokerService implements PortletInvokerService {
     /**
      * Invoke the portlet with a render request.
      *
-     * @param request  action request used for the invocation.
-     * @param response action response used for the invocation.
+     * @param request  event request used for the invocation.
+     * @param response event response used for the invocation.
      * @see PortletServlet3
      * @see javax.portlet.Portlet#render(javax.portlet.RenderRequest,javax.portlet.RenderResponse)
      */

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/65c0050b/portlet-api/src/main/java/javax/portlet/PortletRequest.java
----------------------------------------------------------------------
diff --git a/portlet-api/src/main/java/javax/portlet/PortletRequest.java b/portlet-api/src/main/java/javax/portlet/PortletRequest.java
index 1ec5121..9581cdf 100644
--- a/portlet-api/src/main/java/javax/portlet/PortletRequest.java
+++ b/portlet-api/src/main/java/javax/portlet/PortletRequest.java
@@ -206,6 +206,17 @@ public interface PortletRequest extends PortletState
   /**
    * String identifier for the portlet render lifecycle phase. In this
    * phase the portlet request and response are from type
+   * <code>HeaderRequest</code> and <code>HeaderResponse</code>.
+   * <p>
+   * The value of the constant is <code>HEADER_PHASE</code>.
+   * 
+   * @since 3.0
+   */
+  public static final String HEADER_PHASE = "HEADER_PHASE";
+  
+  /**
+   * String identifier for the portlet render lifecycle phase. In this
+   * phase the portlet request and response are from type
    * <code>RenderRequest</code> and <code>RenderResponse</code>.
    * <p>
    * The value of the constant is <code>RENDER_PHASE</code>.