001    /**
002     * Copyright (c) 2000-2012 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.emptyList();
056                    }
057            }
058    
059            public void doFilter(
060                            ActionRequest actionRequest, ActionResponse actionResponse)
061                    throws IOException, PortletException {
062    
063                    if (_portletFilters.size() > _pos) {
064                            ActionFilter actionFilter = (ActionFilter)_portletFilters.get(
065                                    _pos++);
066    
067                            actionFilter.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 eventFilter = (EventFilter)_portletFilters.get(_pos++);
079    
080                            eventFilter.doFilter(eventRequest, eventResponse, this);
081                    }
082                    else {
083                            EventPortlet eventPortlet = (EventPortlet)_portlet;
084    
085                            eventPortlet.processEvent(eventRequest, eventResponse);
086                    }
087            }
088    
089            public void doFilter(
090                            RenderRequest renderRequest, RenderResponse renderResponse)
091                    throws IOException, PortletException {
092    
093                    if (_portletFilters.size() > _pos) {
094                            RenderFilter renderFilter = (RenderFilter)_portletFilters.get(
095                                    _pos++);
096    
097                            renderFilter.doFilter(renderRequest, renderResponse, this);
098                    }
099                    else {
100                            _portlet.render(renderRequest, renderResponse);
101                    }
102            }
103    
104            public void doFilter(
105                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
106                    throws IOException, PortletException {
107    
108                    if (_portletFilters.size() > _pos) {
109                            ResourceFilter resourceFilter = (ResourceFilter)_portletFilters.get(
110                                    _pos++);
111    
112                            resourceFilter.doFilter(resourceRequest, resourceResponse, this);
113                    }
114                    else {
115                            ResourceServingPortlet resourceServingPortlet =
116                                    (ResourceServingPortlet)_portlet;
117    
118                            resourceServingPortlet.serveResource(
119                                    resourceRequest, resourceResponse);
120                    }
121            }
122    
123            private Portlet _portlet;
124            private List<? extends PortletFilter> _portletFilters;
125            private int _pos;
126    
127    }