001    /**
002     * Copyright (c) 2000-2010 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.util.GetterUtil;
019    import com.liferay.portal.kernel.util.StringPool;
020    import com.liferay.portal.kernel.util.Validator;
021    
022    import java.io.IOException;
023    
024    import java.util.regex.Matcher;
025    import java.util.regex.Pattern;
026    
027    import javax.servlet.Filter;
028    import javax.servlet.FilterChain;
029    import javax.servlet.FilterConfig;
030    import javax.servlet.ServletException;
031    import javax.servlet.ServletRequest;
032    import javax.servlet.ServletResponse;
033    import javax.servlet.http.HttpServletRequest;
034    import javax.servlet.http.HttpServletResponse;
035    
036    /**
037     * @author Raymond Augé
038     * @author Eduardo Lundgren
039     */
040    public abstract class BaseFilter implements Filter {
041    
042            public void init(FilterConfig filterConfig) {
043                    _filterConfig = filterConfig;
044    
045                    String urlRegexPattern = GetterUtil.getString(
046                            filterConfig.getInitParameter("url-regex-pattern"));
047    
048                    if (Validator.isNotNull(urlRegexPattern)) {
049                            _urlRegexPattern = Pattern.compile(urlRegexPattern);
050                    }
051    
052                    String urlRegexIgnorePattern = GetterUtil.getString(
053                            filterConfig.getInitParameter("url-regex-ignore-pattern"));
054    
055                    if (Validator.isNotNull(urlRegexIgnorePattern)) {
056                            _urlRegexIgnorePattern = Pattern.compile(urlRegexIgnorePattern);
057                    }
058    
059                    String servlet24Dispatcher = GetterUtil.getString(
060                            filterConfig.getInitParameter("servlet-2.4-dispatcher"));
061    
062                    if (servlet24Dispatcher.equalsIgnoreCase(
063                                    _SERVLET_24_DISPATCHER_REQUEST)) {
064    
065                            _servlet24Dispatcher = true;
066                    }
067            }
068    
069            public void doFilter(
070                            ServletRequest servletRequest, ServletResponse servletResponse,
071                            FilterChain filterChain)
072                    throws IOException, ServletException {
073    
074                    Log log = getLog();
075    
076                    if (log.isDebugEnabled()) {
077                            if (isFilterEnabled()) {
078                                    log.debug(_filterClass + " is enabled");
079                            }
080                            else {
081                                    log.debug(_filterClass + " is disabled");
082                            }
083                    }
084    
085                    HttpServletRequest request = (HttpServletRequest)servletRequest;
086                    HttpServletResponse response = (HttpServletResponse)servletResponse;
087    
088                    StringBuffer requestURL = request.getRequestURL();
089    
090                    boolean filterEnabled = isFilterEnabled();
091    
092                    if (filterEnabled && _servlet24Dispatcher && (requestURL == null)) {
093                            filterEnabled = false;
094                    }
095    
096                    if (filterEnabled &&
097                            ((_urlRegexPattern != null) ||
098                             (_urlRegexIgnorePattern != null))) {
099    
100                            String url = requestURL.toString();
101    
102                            String queryString = request.getQueryString();
103    
104                            if (Validator.isNotNull(queryString)) {
105                                    url = url.concat(StringPool.QUESTION).concat(queryString);
106                            }
107    
108                            if (_urlRegexPattern != null) {
109                                    Matcher matcher = _urlRegexPattern.matcher(url);
110    
111                                    filterEnabled = matcher.find();
112                            }
113    
114                            if (filterEnabled && (_urlRegexIgnorePattern != null)) {
115                                    Matcher matcher = _urlRegexIgnorePattern.matcher(url);
116    
117                                    filterEnabled = !matcher.find();
118                            }
119                    }
120    
121                    try {
122                            if (filterEnabled) {
123                                    processFilter(request, response, filterChain);
124                            }
125                            else {
126                                    processFilter(_filterClass, request, response, filterChain);
127                            }
128                    }
129                    catch (IOException ioe) {
130                            throw ioe;
131                    }
132                    catch (ServletException se) {
133                            throw se;
134                    }
135                    catch (Exception e) {
136                            getLog().error(e, e);
137                    }
138            }
139    
140            public FilterConfig getFilterConfig() {
141                    return _filterConfig;
142            }
143    
144            public void destroy() {
145            }
146    
147            protected abstract Log getLog();
148    
149            protected boolean isFilterEnabled() {
150                    return _filterEnabled;
151            }
152    
153            protected abstract void processFilter(
154                            HttpServletRequest request, HttpServletResponse response,
155                            FilterChain filterChain)
156                    throws Exception;
157    
158            protected void processFilter(
159                            Class<?> filterClass, HttpServletRequest request,
160                            HttpServletResponse response, FilterChain filterChain)
161                    throws Exception {
162    
163                    long startTime = 0;
164    
165                    String threadName = null;
166                    String depther = null;
167                    String path = null;
168    
169                    Log log = getLog();
170    
171                    if (log.isDebugEnabled()) {
172                            startTime = System.currentTimeMillis();
173    
174                            Thread currentThread = Thread.currentThread();
175    
176                            threadName = currentThread.getName();
177    
178                            depther = (String)request.getAttribute(_DEPTHER);
179    
180                            if (depther == null) {
181                                    depther = StringPool.BLANK;
182                            }
183                            else {
184                                    depther += StringPool.EQUAL;
185                            }
186    
187                            request.setAttribute(_DEPTHER, depther);
188    
189                            path = request.getRequestURI();
190    
191                            log.debug(
192                                    "[" + threadName + "]" + depther + "> " +
193                                            filterClass.getName() + " " + path);
194                    }
195    
196                    filterChain.doFilter(request, response);
197    
198                    if (log.isDebugEnabled()) {
199                            long endTime = System.currentTimeMillis();
200    
201                            depther = (String)request.getAttribute(_DEPTHER);
202    
203                            if (depther == null) {
204                                    return;
205                            }
206    
207                            log.debug(
208                                    "[" + threadName + "]" + depther + "< " +
209                                            filterClass.getName() + " " + path + " " +
210                                                    (endTime - startTime) + " ms");
211    
212                            if (depther.length() > 0) {
213                                    depther = depther.substring(1);
214                            }
215    
216                            request.setAttribute(_DEPTHER, depther);
217                    }
218            }
219    
220            private static final String _DEPTHER = "DEPTHER";
221    
222            private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
223    
224            private FilterConfig _filterConfig;
225            private Class<?> _filterClass = getClass();
226            private boolean _filterEnabled = true;
227            private boolean _servlet24Dispatcher;
228            private Pattern _urlRegexIgnorePattern;
229            private Pattern _urlRegexPattern;
230    
231    }