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