1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.kernel.servlet;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.util.GetterUtil;
19  import com.liferay.portal.kernel.util.StringPool;
20  import com.liferay.portal.kernel.util.Validator;
21  
22  import java.io.IOException;
23  
24  import java.util.regex.Matcher;
25  import java.util.regex.Pattern;
26  
27  import javax.servlet.Filter;
28  import javax.servlet.FilterChain;
29  import javax.servlet.FilterConfig;
30  import javax.servlet.ServletException;
31  import javax.servlet.ServletRequest;
32  import javax.servlet.ServletResponse;
33  import javax.servlet.http.HttpServletRequest;
34  import javax.servlet.http.HttpServletResponse;
35  
36  /**
37   * <a href="BaseFilter.java.html"><b><i>View Source</i></b></a>
38   *
39   * @author Raymond Augé
40   */
41  public abstract class BaseFilter implements Filter {
42  
43      public void init(FilterConfig filterConfig) {
44          _filterConfig = filterConfig;
45  
46          String urlRegexPattern = GetterUtil.getString(
47              filterConfig.getInitParameter("url-regex-pattern"));
48  
49          if (Validator.isNotNull(urlRegexPattern)) {
50              _urlRegexPattern = Pattern.compile(urlRegexPattern);
51          }
52  
53          String servlet24Dispatcher = GetterUtil.getString(
54              filterConfig.getInitParameter("servlet-2.4-dispatcher"));
55  
56          if (servlet24Dispatcher.equalsIgnoreCase(
57                  _SERVLET_24_DISPATCHER_REQUEST)) {
58  
59              _servlet24Dispatcher = true;
60          }
61      }
62  
63      public void doFilter(
64              ServletRequest servletRequest, ServletResponse servletResponse,
65              FilterChain filterChain)
66          throws IOException, ServletException {
67  
68          Log log = getLog();
69  
70          if (log.isDebugEnabled()) {
71              if (isFilterEnabled()) {
72                  log.debug(_filterClass + " is enabled");
73              }
74              else {
75                  log.debug(_filterClass + " is disabled");
76              }
77          }
78  
79          HttpServletRequest request = (HttpServletRequest)servletRequest;
80          HttpServletResponse response = (HttpServletResponse)servletResponse;
81  
82          StringBuffer requestURL = request.getRequestURL();
83  
84          boolean filterEnabled = isFilterEnabled();
85  
86          if (filterEnabled && _servlet24Dispatcher && (requestURL == null)) {
87              filterEnabled = false;
88          }
89  
90          if (filterEnabled && (_urlRegexPattern != null)) {
91              String url = requestURL.toString();
92  
93              String queryString = request.getQueryString();
94  
95              if (Validator.isNotNull(queryString)) {
96                  url = url.concat(StringPool.QUESTION).concat(queryString);
97              }
98  
99              Matcher matcher = _urlRegexPattern.matcher(url);
100 
101             filterEnabled = matcher.find();
102         }
103 
104         try {
105             if (filterEnabled) {
106                 processFilter(request, response, filterChain);
107             }
108             else {
109                 processFilter(_filterClass, request, response, filterChain);
110             }
111         }
112         catch (IOException ioe) {
113             throw ioe;
114         }
115         catch (ServletException se) {
116             throw se;
117         }
118         catch (Exception e) {
119             getLog().error(e, e);
120         }
121     }
122 
123     public FilterConfig getFilterConfig() {
124         return _filterConfig;
125     }
126 
127     public void destroy() {
128     }
129 
130     protected abstract Log getLog();
131 
132     protected boolean isFilterEnabled() {
133         return _filterEnabled;
134     }
135 
136     protected abstract void processFilter(
137             HttpServletRequest request, HttpServletResponse response,
138             FilterChain filterChain)
139         throws Exception;
140 
141     protected void processFilter(
142             Class<?> filterClass, HttpServletRequest request,
143             HttpServletResponse response, FilterChain filterChain)
144         throws Exception {
145 
146         long startTime = 0;
147 
148         String threadName = null;
149         String depther = null;
150         String path = null;
151 
152         Log log = getLog();
153 
154         if (log.isDebugEnabled()) {
155             startTime = System.currentTimeMillis();
156 
157             Thread currentThread = Thread.currentThread();
158 
159             threadName = currentThread.getName();
160 
161             depther = (String)request.getAttribute(_DEPTHER);
162 
163             if (depther == null) {
164                 depther = StringPool.BLANK;
165             }
166             else {
167                 depther += StringPool.EQUAL;
168             }
169 
170             request.setAttribute(_DEPTHER, depther);
171 
172             path = request.getRequestURI();
173 
174             log.debug(
175                 "[" + threadName + "]" + depther + "> " +
176                     filterClass.getName() + " " + path);
177         }
178 
179         filterChain.doFilter(request, response);
180 
181         if (log.isDebugEnabled()) {
182             long endTime = System.currentTimeMillis();
183 
184             depther = (String)request.getAttribute(_DEPTHER);
185 
186             if (depther == null) {
187                 return;
188             }
189 
190             log.debug(
191                 "[" + threadName + "]" + depther + "< " +
192                     filterClass.getName() + " " + path + " " +
193                         (endTime - startTime) + " ms");
194 
195             if (depther.length() > 0) {
196                 depther = depther.substring(1);
197             }
198 
199             request.setAttribute(_DEPTHER, depther);
200         }
201     }
202 
203     private static final String _DEPTHER = "DEPTHER";
204 
205     private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
206 
207     private FilterConfig _filterConfig;
208     private Class<?> _filterClass = getClass();
209     private boolean _filterEnabled = true;
210     private boolean _servlet24Dispatcher;
211     private Pattern _urlRegexPattern;
212 
213 }