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.portal.kernel.servlet;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.servlet.filters.invoker.FilterMapping;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.StringPool;
021    
022    import java.io.IOException;
023    
024    import java.util.ArrayList;
025    
026    import javax.servlet.FilterChain;
027    import javax.servlet.FilterConfig;
028    import javax.servlet.ServletContext;
029    import javax.servlet.ServletException;
030    import javax.servlet.ServletRequest;
031    import javax.servlet.ServletResponse;
032    import javax.servlet.http.HttpServletRequest;
033    import javax.servlet.http.HttpServletResponse;
034    
035    /**
036     * @author Raymond Augé
037     * @author Eduardo Lundgren
038     */
039    public abstract class BaseFilter implements LiferayFilter {
040    
041            public void destroy() {
042                    LiferayFilterTracker.removeLiferayFilter(this);
043            }
044    
045            public void doFilter(
046                            ServletRequest servletRequest, ServletResponse servletResponse,
047                            FilterChain filterChain)
048                    throws IOException, ServletException {
049    
050                    try {
051                            HttpServletRequest request = (HttpServletRequest)servletRequest;
052                            HttpServletResponse response = (HttpServletResponse)servletResponse;
053    
054                            if (_invokerEnabled) {
055                                    processFilter(request, response, filterChain);
056                            }
057                            else {
058                                    String uri = request.getRequestURI();
059    
060                                    if (isFilterEnabled() && isFilterEnabled(request, response) &&
061                                            _filterMapping.isMatchURLRegexPattern(request, uri)) {
062    
063                                            processFilter(request, response, filterChain);
064                                    }
065                                    else {
066                                            filterChain.doFilter(servletRequest, servletResponse);
067                                    }
068                            }
069                    }
070                    catch (IOException ioe) {
071                            throw ioe;
072                    }
073                    catch (ServletException se) {
074                            throw se;
075                    }
076                    catch (Exception e) {
077                            Log log = getLog();
078    
079                            log.error(e, e);
080                    }
081            }
082    
083            public FilterConfig getFilterConfig() {
084                    return _filterConfig;
085            }
086    
087            public void init(FilterConfig filterConfig) {
088                    _filterConfig = filterConfig;
089    
090                    ServletContext servletContext = _filterConfig.getServletContext();
091    
092                    _invokerEnabled = GetterUtil.get(
093                            servletContext.getInitParameter("liferay-invoker-enabled"), true);
094    
095                    if (!_invokerEnabled) {
096                            _filterMapping = new FilterMapping(
097                                    this, filterConfig, new ArrayList<String>(0),
098                                    new ArrayList<String>(0));
099                    }
100    
101                    LiferayFilterTracker.addLiferayFilter(this);
102            }
103    
104            public boolean isFilterEnabled() {
105                    return _filterEnabled;
106            }
107    
108            public boolean isFilterEnabled(
109                    HttpServletRequest request, HttpServletResponse response) {
110    
111                    return _filterEnabled;
112            }
113    
114            public void setFilterEnabled(boolean filterEnabled) {
115                    _filterEnabled = filterEnabled;
116            }
117    
118            protected abstract Log getLog();
119    
120            protected void processFilter(
121                            Class<?> filterClass, HttpServletRequest request,
122                            HttpServletResponse response, FilterChain filterChain)
123                    throws Exception {
124    
125                    long startTime = 0;
126    
127                    String threadName = null;
128                    String depther = null;
129                    String path = null;
130    
131                    Log log = getLog();
132    
133                    if (log.isDebugEnabled()) {
134                            startTime = System.currentTimeMillis();
135    
136                            Thread currentThread = Thread.currentThread();
137    
138                            threadName = currentThread.getName();
139    
140                            depther = (String)request.getAttribute(_DEPTHER);
141    
142                            if (depther == null) {
143                                    depther = StringPool.BLANK;
144                            }
145                            else {
146                                    depther += StringPool.EQUAL;
147                            }
148    
149                            request.setAttribute(_DEPTHER, depther);
150    
151                            path = request.getRequestURI();
152    
153                            log.debug(
154                                    "[" + threadName + "]" + depther + "> " +
155                                            filterClass.getName() + " " + path);
156                    }
157    
158                    filterChain.doFilter(request, response);
159    
160                    if (log.isDebugEnabled()) {
161                            long endTime = System.currentTimeMillis();
162    
163                            depther = (String)request.getAttribute(_DEPTHER);
164    
165                            if (depther == null) {
166                                    return;
167                            }
168    
169                            log.debug(
170                                    "[" + threadName + "]" + depther + "< " +
171                                            filterClass.getName() + " " + path + " " +
172                                                    (endTime - startTime) + " ms");
173    
174                            if (depther.length() > 0) {
175                                    depther = depther.substring(1);
176                            }
177    
178                            request.setAttribute(_DEPTHER, depther);
179                    }
180            }
181    
182            protected void processFilter(
183                            HttpServletRequest request, HttpServletResponse response,
184                            FilterChain filterChain)
185                    throws Exception {
186    
187                    throw new UnsupportedOperationException(
188                            "Please implement processFilter(HttpServletRequest, " +
189                                    "HttpServletResponse, FilterChain)");
190            }
191    
192            private static final String _DEPTHER = "DEPTHER";
193    
194            private FilterConfig _filterConfig;
195            private boolean _filterEnabled = true;
196            private FilterMapping _filterMapping;
197            private boolean _invokerEnabled;
198    
199    }