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