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