001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.bean.ClassLoaderBeanHandler;
018 import com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain;
019 import com.liferay.portal.kernel.util.BasePortalLifecycle;
020 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
021 import com.liferay.portal.kernel.util.ProxyUtil;
022 import com.liferay.portal.kernel.util.StringUtil;
023
024 import java.io.IOException;
025
026 import javax.servlet.Filter;
027 import javax.servlet.FilterChain;
028 import javax.servlet.FilterConfig;
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
038 public class PortalClassLoaderFilter
039 extends BasePortalLifecycle implements LiferayFilter {
040
041 public void destroy() {
042 portalDestroy();
043 }
044
045 public void doFilter(
046 ServletRequest servletRequest, ServletResponse servletResponse,
047 FilterChain filterChain)
048 throws IOException, ServletException {
049
050 Thread currentThread = Thread.currentThread();
051
052 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
053
054 try {
055 currentThread.setContextClassLoader(
056 PortalClassLoaderUtil.getClassLoader());
057
058 FilterChain contextClassLoaderFilterChain =
059 (FilterChain)ProxyUtil.newProxyInstance(
060 contextClassLoader, new Class[] {FilterChain.class},
061 new ClassLoaderBeanHandler(
062 filterChain, contextClassLoader));
063
064 InvokerFilterChain invokerFilterChain = new InvokerFilterChain(
065 contextClassLoaderFilterChain);
066
067 invokerFilterChain.addFilter(_filter);
068
069 invokerFilterChain.doFilter(servletRequest, servletResponse);
070 }
071 finally {
072 currentThread.setContextClassLoader(contextClassLoader);
073 }
074 }
075
076 public void init(FilterConfig filterConfig) {
077 _filterConfig = filterConfig;
078
079 registerPortalLifecycle();
080 }
081
082 public boolean isFilterEnabled() {
083 if (_liferayFilter != null) {
084 return _liferayFilter.isFilterEnabled();
085 }
086
087 return true;
088 }
089
090 public boolean isFilterEnabled(
091 HttpServletRequest request, HttpServletResponse response) {
092
093 if (_liferayFilter != null) {
094 return _liferayFilter.isFilterEnabled(request, response);
095 }
096
097 return true;
098 }
099
100 @Override
101 protected void doPortalDestroy() {
102 Thread currentThread = Thread.currentThread();
103
104 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
105
106 try {
107 currentThread.setContextClassLoader(
108 PortalClassLoaderUtil.getClassLoader());
109
110 _filter.destroy();
111 }
112 finally {
113 currentThread.setContextClassLoader(contextClassLoader);
114 }
115 }
116
117 @Override
118 protected void doPortalInit() throws Exception {
119 ClassLoader classLoader = PortalClassLoaderUtil.getClassLoader();
120
121 String filterClass = _filterConfig.getInitParameter("filter-class");
122
123 if (filterClass.startsWith("com.liferay.filters.")) {
124 filterClass = StringUtil.replace(
125 filterClass, "com.liferay.filters.",
126 "com.liferay.portal.servlet.filters.");
127 }
128
129 _filter = (Filter)classLoader.loadClass(filterClass).newInstance();
130
131 _filter.init(_filterConfig);
132
133 if (_filter instanceof LiferayFilter) {
134 _liferayFilter = (LiferayFilter)_filter;
135 }
136 }
137
138 private Filter _filter;
139 private FilterConfig _filterConfig;
140 private LiferayFilter _liferayFilter;
141
142 }