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          _servlet24Dispatcher = filterConfig.getInitParameter(
54              "servlet-2.4-dispatcher");
55      }
56  
57      public void doFilter(
58              ServletRequest servletRequest, ServletResponse servletResponse,
59              FilterChain filterChain)
60          throws IOException, ServletException {
61  
62          Log log = getLog();
63  
64          if (log.isDebugEnabled()) {
65              if (isFilterEnabled()) {
66                  log.debug(_filterClass + " is enabled");
67              }
68              else {
69                  log.debug(_filterClass + " is disabled");
70              }
71          }
72  
73          HttpServletRequest request = (HttpServletRequest)servletRequest;
74          HttpServletResponse response = (HttpServletResponse)servletResponse;
75  
76          boolean filterEnabled = isFilterEnabled();
77  
78          if (filterEnabled && Validator.isNotNull(_servlet24Dispatcher)) {
79              if ((_servlet24Dispatcher.equalsIgnoreCase(
80                      _SERVLET_24_DISPATCHER_REQUEST)) &&
81                  (request.getRequestURL() == null)) {
82  
83                  filterEnabled = false;
84              }
85          }
86  
87          if (filterEnabled && (_urlRegexPattern != null)) {
88              StringBuilder sb = new StringBuilder();
89  
90              sb.append(request.getRequestURL());
91  
92              if (Validator.isNotNull(request.getQueryString())) {
93                  sb.append(StringPool.QUESTION);
94                  sb.append(request.getQueryString());
95              }
96  
97              Matcher matcher = _urlRegexPattern.matcher(sb.toString());
98  
99              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             log.debug(
185                 "[" + threadName + "]" + depther + "< " +
186                     filterClass.getName() + " " + path + " " +
187                         (endTime - startTime) + " ms");
188 
189             if (depther.length() > 0) {
190                 depther = depther.substring(1);
191             }
192 
193             request.setAttribute(_DEPTHER, depther);
194         }
195     }
196 
197     private static final String _DEPTHER = "DEPTHER";
198 
199     private static final String _SERVLET_24_DISPATCHER_REQUEST = "REQUEST";
200 
201     private FilterConfig _filterConfig;
202     private Class<?> _filterClass = getClass();
203     private boolean _filterEnabled = true;
204     private String _servlet24Dispatcher;
205     private Pattern _urlRegexPattern;
206 
207 }