001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.servlet.filters.invoker.FilterMapping;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.kernel.util.PropsKeys;
021 import com.liferay.portal.kernel.util.PropsUtil;
022 import com.liferay.portal.kernel.util.StringPool;
023
024 import java.io.IOException;
025
026 import java.util.ArrayList;
027
028 import javax.servlet.FilterChain;
029 import javax.servlet.FilterConfig;
030 import javax.servlet.ServletContext;
031 import javax.servlet.ServletException;
032 import javax.servlet.ServletRequest;
033 import javax.servlet.ServletResponse;
034 import javax.servlet.http.HttpServletRequest;
035 import javax.servlet.http.HttpServletResponse;
036
037
041 public abstract class BaseFilter implements LiferayFilter {
042
043 @Override
044 public void destroy() {
045 LiferayFilterTracker.removeLiferayFilter(this);
046 }
047
048 @Override
049 public void doFilter(
050 ServletRequest servletRequest, ServletResponse servletResponse,
051 FilterChain filterChain)
052 throws IOException, ServletException {
053
054 try {
055 HttpServletRequest request = (HttpServletRequest)servletRequest;
056 HttpServletResponse response = (HttpServletResponse)servletResponse;
057
058 if (_invokerEnabled) {
059 processFilter(request, response, filterChain);
060 }
061 else {
062 String uri = request.getRequestURI();
063
064 if (isFilterEnabled() && isFilterEnabled(request, response) &&
065 _filterMapping.isMatchURLRegexPattern(request, uri)) {
066
067 processFilter(request, response, filterChain);
068 }
069 else {
070 filterChain.doFilter(servletRequest, servletResponse);
071 }
072 }
073 }
074 catch (IOException ioe) {
075 throw ioe;
076 }
077 catch (ServletException se) {
078 throw se;
079 }
080 catch (Exception e) {
081 Log log = getLog();
082
083 log.error(e, e);
084 }
085 }
086
087 public FilterConfig getFilterConfig() {
088 return _filterConfig;
089 }
090
091 @Override
092 public void init(FilterConfig filterConfig) {
093 _filterConfig = filterConfig;
094
095 if (_TCK_URL) {
096 ServletContext servletContext = _filterConfig.getServletContext();
097
098 _invokerEnabled = GetterUtil.get(
099 servletContext.getInitParameter("liferay-invoker-enabled"),
100 true);
101
102 if (!_invokerEnabled) {
103 _filterMapping = new FilterMapping(
104 this, filterConfig, new ArrayList<String>(0),
105 new ArrayList<String>(0));
106 }
107 }
108
109 LiferayFilterTracker.addLiferayFilter(this);
110 }
111
112 @Override
113 public boolean isFilterEnabled() {
114 return _filterEnabled;
115 }
116
117 @Override
118 public boolean isFilterEnabled(
119 HttpServletRequest request, HttpServletResponse response) {
120
121 return _filterEnabled;
122 }
123
124 @Override
125 public void setFilterEnabled(boolean filterEnabled) {
126 _filterEnabled = filterEnabled;
127 }
128
129 protected abstract Log getLog();
130
131 protected void processFilter(
132 Class<?> filterClass, HttpServletRequest request,
133 HttpServletResponse response, FilterChain filterChain)
134 throws Exception {
135
136 long startTime = 0;
137
138 String threadName = null;
139 String depther = null;
140 String path = null;
141
142 Log log = getLog();
143
144 if (log.isDebugEnabled()) {
145 startTime = System.currentTimeMillis();
146
147 Thread currentThread = Thread.currentThread();
148
149 threadName = currentThread.getName();
150
151 depther = (String)request.getAttribute(_DEPTHER);
152
153 if (depther == null) {
154 depther = StringPool.BLANK;
155 }
156 else {
157 depther += StringPool.EQUAL;
158 }
159
160 request.setAttribute(_DEPTHER, depther);
161
162 path = request.getRequestURI();
163
164 log.debug(
165 "[" + threadName + "]" + depther + "> " +
166 filterClass.getName() + " " + path);
167 }
168
169 filterChain.doFilter(request, response);
170
171 if (!log.isDebugEnabled()) {
172 return;
173 }
174
175 long endTime = System.currentTimeMillis();
176
177 depther = (String)request.getAttribute(_DEPTHER);
178
179 if (depther == null) {
180 return;
181 }
182
183 log.debug(
184 "[" + threadName + "]" + depther + "< " +
185 filterClass.getName() + " " + path + " " +
186 (endTime - startTime) + " ms");
187
188 if (depther.length() > 0) {
189 depther = depther.substring(1);
190 }
191
192 request.setAttribute(_DEPTHER, depther);
193 }
194
195 protected void processFilter(
196 HttpServletRequest request, HttpServletResponse response,
197 FilterChain filterChain)
198 throws Exception {
199
200 throw new UnsupportedOperationException(
201 "Please implement processFilter(HttpServletRequest, " +
202 "HttpServletResponse, FilterChain)");
203 }
204
205 private static final String _DEPTHER = "DEPTHER";
206
207 private static final boolean _TCK_URL = GetterUtil.getBoolean(
208 PropsUtil.get(PropsKeys.TCK_URL));
209
210 private FilterConfig _filterConfig;
211 private boolean _filterEnabled = true;
212 private FilterMapping _filterMapping;
213 private boolean _invokerEnabled = true;
214
215 }