1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
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   * @author Eduardo Lundgren
41   */
42  public abstract class BaseFilter implements Filter {
43  
44      public void init(FilterConfig filterConfig) {
45          _filterConfig = filterConfig;
46  
47          String urlRegexPattern = GetterUtil.getString(
48              filterConfig.getInitParameter("url-regex-pattern"));
49  
50          if (Validator.isNotNull(urlRegexPattern)) {
51              _urlRegexPattern = Pattern.compile(urlRegexPattern);
52          }
53  
54          String urlRegexIgnorePattern = GetterUtil.getString(
55              filterConfig.getInitParameter("url-regex-ignore-pattern"));
56  
57          if (Validator.isNotNull(urlRegexIgnorePattern)) {
58              _urlRegexIgnorePattern = Pattern.compile(urlRegexIgnorePattern);
59          }
60  
61          String servlet24Dispatcher = GetterUtil.getString(
62              filterConfig.getInitParameter("servlet-2.4-dispatcher"));
63  
64          if (servlet24Dispatcher.equalsIgnoreCase(
65                  _SERVLET_24_DISPATCHER_REQUEST)) {
66  
67              _servlet24Dispatcher = true;
68          }
69      }
70  
71      public void doFilter(
72              ServletRequest servletRequest, ServletResponse servletResponse,
73              FilterChain filterChain)
74          throws IOException, ServletException {
75  
76          Log log = getLog();
77  
78          if (log.isDebugEnabled()) {
79              if (isFilterEnabled()) {
80                  log.debug(_filterClass + " is enabled");
81              }
82              else {
83                  log.debug(_filterClass + " is disabled");
84              }
85          }
86  
87          HttpServletRequest request = (HttpServletRequest)servletRequest;
88          HttpServletResponse response = (HttpServletResponse)servletResponse;
89  
90          StringBuffer requestURL = request.getRequestURL();
91  
92          boolean filterEnabled = isFilterEnabled();
93  
94          if (filterEnabled && _servlet24Dispatcher && (requestURL == null)) {
95              filterEnabled = false;
96          }
97  
98          if (filterEnabled &&
99              ((_urlRegexPattern != null) ||
100              (_urlRegexIgnorePattern != null))) {
101 
102             String url = requestURL.toString();
103 
104             String queryString = request.getQueryString();
105 
106             if (Validator.isNotNull(queryString)) {
107                 url = url.concat(StringPool.QUESTION).concat(queryString);
108             }
109 
110             if (_urlRegexPattern != null) {
111                 Matcher matcher = _urlRegexPattern.matcher(url);
112 
113                 filterEnabled = matcher.find();
114             }
115 
116             if (filterEnabled && (_urlRegexIgnorePattern != null)) {
117                 Matcher matcher = _urlRegexIgnorePattern.matcher(url);
118 
119                 filterEnabled = !matcher.find();
120             }
121         }
122 
123         try {
124             if (filterEnabled) {
125                 processFilter(request, response, filterChain);
126             }
127             else {
128                 processFilter(_filterClass, request, response, filterChain);
129             }
130         }
131         catch (IOException ioe) {
132             throw ioe;
133         }
134         catch (ServletException se) {
135             throw se;
136         }
137         catch (Exception e) {
138             getLog().error(e, e);
139         }
140     }
141 
142     public FilterConfig getFilterConfig() {
143         return _filterConfig;
144     }
145 
146     public void destroy() {
147     }
148 
149     protected abstract Log getLog();
150 
151     protected boolean isFilterEnabled() {
152         return _filterEnabled;
153     }
154 
155     protected abstract void processFilter(
156             HttpServletRequest request, HttpServletResponse response,
157             FilterChain filterChain)
158         throws Exception;
159 
160     protected void processFilter(
161             Class<?> filterClass, HttpServletRequest request,
162             HttpServletResponse response, FilterChain filterChain)
163         throws Exception {
164 
165         long startTime = 0;
166 
167         String threadName = null;
168         String depther = null;
169         String path = null;
170 
171         Log log = getLog();
172 
173         if (log.isDebugEnabled()) {
174             startTime = System.currentTimeMillis();
175 
176             Thread currentThread = Thread.currentThread();
177 
178             threadName = currentThread.getName();
179 
180             depther = (String)request.getAttribute(_DEPTHER);
181 
182             if (depther == null) {
183                 depther = StringPool.BLANK;
184             }
185             else {
186                 depther += StringPool.EQUAL;
187             }
188 
189             request.setAttribute(_DEPTHER, depther);
190 
191             path = request.getRequestURI();
192 
193             log.debug(
194                 "[" + threadName + "]" + depther + "> " +
195                     filterClass.getName() + " " + path);
196         }
197 
198         filterChain.doFilter(request, response);
199 
200         if (log.isDebugEnabled()) {
201             long endTime = System.currentTimeMillis();
202 
203             depther = (String)request.getAttribute(_DEPTHER);
204 
205             if (depther == null) {
206                 return;
207             }
208 
209             log.debug(
210                 "[" + threadName + "]" + depther + "< " +
211                     filterClass.getName() + " " + path + " " +
212                         (endTime - startTime) + " ms");
213 
214             if (depther.length() > 0) {
215                 depther = depther.substring(1);
216             }
217 
218             request.setAttribute(_DEPTHER, depther);
219         }
220     }
221 
222     private static final String _DEPTHER = "DEPTHER";
223 
224     private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
225 
226     private FilterConfig _filterConfig;
227     private Class<?> _filterClass = getClass();
228     private boolean _filterEnabled = true;
229     private boolean _servlet24Dispatcher;
230     private Pattern _urlRegexIgnorePattern;
231     private Pattern _urlRegexPattern;
232 
233 }