001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet;
016    
017    import java.io.IOException;
018    
019    import java.util.Collections;
020    import java.util.List;
021    
022    import javax.portlet.ActionRequest;
023    import javax.portlet.ActionResponse;
024    import javax.portlet.EventPortlet;
025    import javax.portlet.EventRequest;
026    import javax.portlet.EventResponse;
027    import javax.portlet.Portlet;
028    import javax.portlet.PortletException;
029    import javax.portlet.RenderRequest;
030    import javax.portlet.RenderResponse;
031    import javax.portlet.ResourceRequest;
032    import javax.portlet.ResourceResponse;
033    import javax.portlet.ResourceServingPortlet;
034    import javax.portlet.filter.ActionFilter;
035    import javax.portlet.filter.EventFilter;
036    import javax.portlet.filter.FilterChain;
037    import javax.portlet.filter.PortletFilter;
038    import javax.portlet.filter.RenderFilter;
039    import javax.portlet.filter.ResourceFilter;
040    
041    /**
042     * @author Brian Wing Shun Chan
043     */
044    public class FilterChainImpl implements FilterChain {
045    
046            public FilterChainImpl(
047                    Portlet portlet, List<? extends PortletFilter> portletFilters) {
048    
049                    _portlet = portlet;
050    
051                    if (portletFilters != null) {
052                            _portletFilters = portletFilters;
053                    }
054                    else {
055                            _portletFilters = Collections.EMPTY_LIST;
056                    }
057            }
058    
059            public void doFilter(
060                            ActionRequest actionRequest, ActionResponse actionResponse)
061                    throws IOException, PortletException {
062    
063                    if (_portletFilters.size() > _pos) {
064                            ActionFilter portletFilter = (ActionFilter)_portletFilters.get(
065                                    _pos++);
066    
067                            portletFilter.doFilter(actionRequest, actionResponse, this);
068                    }
069                    else {
070                            _portlet.processAction(actionRequest, actionResponse);
071                    }
072            }
073    
074            public void doFilter(EventRequest eventRequest, EventResponse eventResponse)
075                    throws IOException, PortletException {
076    
077                    if (_portletFilters.size() > _pos) {
078                            EventFilter portletFilter = (EventFilter)_portletFilters.get(
079                                    _pos++);
080    
081                            portletFilter.doFilter(eventRequest, eventResponse, this);
082                    }
083                    else {
084                            EventPortlet eventPortlet = (EventPortlet)_portlet;
085    
086                            eventPortlet.processEvent(eventRequest, eventResponse);
087                    }
088            }
089    
090            public void doFilter(
091                            RenderRequest renderRequest, RenderResponse renderResponse)
092                    throws IOException, PortletException {
093    
094                    if (_portletFilters.size() > _pos) {
095                            RenderFilter portletFilter = (RenderFilter)_portletFilters.get(
096                                    _pos++);
097    
098                            portletFilter.doFilter(renderRequest, renderResponse, this);
099                    }
100                    else {
101                            _portlet.render(renderRequest, renderResponse);
102                    }
103            }
104    
105            public void doFilter(
106                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
107                    throws IOException, PortletException {
108    
109                    if (_portletFilters.size() > _pos) {
110                            ResourceFilter portletFilter = (ResourceFilter)_portletFilters.get(
111                                    _pos++);
112    
113                            portletFilter.doFilter(resourceRequest, resourceResponse, this);
114                    }
115                    else {
116                            ResourceServingPortlet resourceServingPortlet =
117                                    (ResourceServingPortlet)_portlet;
118    
119                            resourceServingPortlet.serveResource(
120                                    resourceRequest, resourceResponse);
121                    }
122            }
123    
124            private Portlet _portlet;
125            private List<? extends PortletFilter> _portletFilters;
126            private int _pos;
127    
128    }