001
014
015 package com.liferay.portal.kernel.servlet.filters.invoker;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.servlet.DirectCallFilter;
020 import com.liferay.portal.kernel.servlet.LiferayFilter;
021 import com.liferay.portal.kernel.servlet.TryFilter;
022 import com.liferay.portal.kernel.servlet.TryFinallyFilter;
023 import com.liferay.portal.kernel.servlet.WrapHttpServletRequestFilter;
024 import com.liferay.portal.kernel.servlet.WrapHttpServletResponseFilter;
025
026 import java.io.IOException;
027
028 import java.util.ArrayList;
029 import java.util.List;
030
031 import javax.servlet.Filter;
032 import javax.servlet.FilterChain;
033 import javax.servlet.ServletException;
034 import javax.servlet.ServletRequest;
035 import javax.servlet.ServletResponse;
036 import javax.servlet.http.HttpServletRequest;
037 import javax.servlet.http.HttpServletResponse;
038
039
044 public class InvokerFilterChain implements FilterChain {
045
046 public InvokerFilterChain(FilterChain filterChain) {
047 _filterChain = filterChain;
048 }
049
050 public void addFilter(Filter filter) {
051 if (_filters == null) {
052 _filters = new ArrayList<Filter>();
053 }
054
055 _filters.add(filter);
056 }
057
058 public InvokerFilterChain clone(FilterChain filterChain) {
059 InvokerFilterChain invokerFilterChain = new InvokerFilterChain(
060 filterChain);
061
062 invokerFilterChain._filters = _filters;
063
064 return invokerFilterChain;
065 }
066
067 @Override
068 public void doFilter(
069 ServletRequest servletRequest, ServletResponse servletResponse)
070 throws IOException, ServletException {
071
072 if (_filters != null) {
073 HttpServletRequest request = (HttpServletRequest)servletRequest;
074 HttpServletResponse response = (HttpServletResponse)servletResponse;
075
076 while (_index < _filters.size()) {
077 Filter filter = _filters.get(_index++);
078
079 if (filter instanceof LiferayFilter) {
080 LiferayFilter liferayFilter = (LiferayFilter)filter;
081
082 if (!liferayFilter.isFilterEnabled() ||
083 !liferayFilter.isFilterEnabled(request, response)) {
084
085 if (_log.isDebugEnabled()) {
086 _log.debug(
087 "Skip disabled filter " + filter.getClass());
088 }
089
090 continue;
091 }
092 }
093
094 if (filter instanceof DirectCallFilter) {
095 try {
096 processDirectCallFilter(filter, request, response);
097 }
098 catch (IOException ioe) {
099 throw ioe;
100 }
101 catch (ServletException se) {
102 throw se;
103 }
104 catch (Exception e) {
105 throw new ServletException(e);
106 }
107 }
108 else {
109 processDoFilter(filter, request, response);
110 }
111
112 return;
113 }
114 }
115
116 _filterChain.doFilter(servletRequest, servletResponse);
117 }
118
119 public void setContextClassLoader(ClassLoader contextClassLoader) {
120 _contextClassLoader = contextClassLoader;
121 }
122
123 protected void processDirectCallFilter(
124 Filter filter, HttpServletRequest request,
125 HttpServletResponse response)
126 throws Exception {
127
128 if (filter instanceof WrapHttpServletRequestFilter) {
129 if (_log.isDebugEnabled()) {
130 _log.debug("Wrap response with filter " + filter.getClass());
131 }
132
133 WrapHttpServletRequestFilter wrapHttpServletRequestFilter =
134 (WrapHttpServletRequestFilter)filter;
135
136 request = wrapHttpServletRequestFilter.getWrappedHttpServletRequest(
137 request, response);
138 }
139
140 if (filter instanceof WrapHttpServletResponseFilter) {
141 if (_log.isDebugEnabled()) {
142 _log.debug("Wrap request with filter " + filter.getClass());
143 }
144
145 WrapHttpServletResponseFilter wrapHttpServletResponseFilter =
146 (WrapHttpServletResponseFilter)filter;
147
148 response =
149 wrapHttpServletResponseFilter.getWrappedHttpServletResponse(
150 request, response);
151 }
152
153 if (filter instanceof TryFinallyFilter) {
154 TryFinallyFilter tryFinallyFilter = (TryFinallyFilter)filter;
155
156 Object object = null;
157
158 try {
159 if (_log.isDebugEnabled()) {
160 _log.debug("Invoke try for filter " + filter.getClass());
161 }
162
163 object = tryFinallyFilter.doFilterTry(request, response);
164
165 doFilter(request, response);
166 }
167 finally {
168 if (_log.isDebugEnabled()) {
169 _log.debug(
170 "Invoke finally for filter " + filter.getClass());
171 }
172
173 tryFinallyFilter.doFilterFinally(request, response, object);
174 }
175 }
176 else if (filter instanceof TryFilter) {
177 TryFilter tryFilter = (TryFilter)filter;
178
179 if (_log.isDebugEnabled()) {
180 _log.debug("Invoke try for filter " + filter.getClass());
181 }
182
183 tryFilter.doFilterTry(request, response);
184
185 doFilter(request, response);
186 }
187 else {
188 doFilter(request, response);
189 }
190 }
191
192 protected void processDoFilter(
193 Filter filter, ServletRequest servletRequest,
194 ServletResponse servletResponse)
195 throws IOException, ServletException {
196
197 Thread currentThread = Thread.currentThread();
198
199 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
200
201 currentThread.setContextClassLoader(_contextClassLoader);
202
203 try {
204 filter.doFilter(servletRequest, servletResponse, this);
205 }
206 finally {
207 currentThread.setContextClassLoader(contextClassLoader);
208 }
209 }
210
211 private static Log _log = LogFactoryUtil.getLog(InvokerFilterChain.class);
212
213 private ClassLoader _contextClassLoader;
214 private FilterChain _filterChain;
215 private List<Filter> _filters;
216 private int _index;
217
218 }