001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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    }