001
014
015 package com.liferay.portal.servlet;
016
017 import com.liferay.portal.kernel.servlet.PluginContextListener;
018 import com.liferay.portal.util.ClassLoaderUtil;
019
020 import java.io.IOException;
021
022 import javax.servlet.RequestDispatcher;
023 import javax.servlet.ServletContext;
024 import javax.servlet.ServletException;
025 import javax.servlet.ServletRequest;
026 import javax.servlet.ServletResponse;
027
028
031 public class ClassLoaderRequestDispatcherWrapper implements RequestDispatcher {
032
033 public ClassLoaderRequestDispatcherWrapper(
034 ServletContext servletContext, RequestDispatcher requestDispatcher) {
035
036 _servletContext = servletContext;
037 _requestDispatcher = requestDispatcher;
038 }
039
040 @Override
041 public void forward(
042 ServletRequest servletRequest, ServletResponse servletResponse)
043 throws IOException, ServletException {
044
045 doDispatch(servletRequest, servletResponse, false);
046 }
047
048 @Override
049 public void include(
050 ServletRequest servletRequest, ServletResponse servletResponse)
051 throws IOException, ServletException {
052
053 doDispatch(servletRequest, servletResponse, true);
054 }
055
056 protected void doDispatch(
057 ServletRequest servletRequest, ServletResponse servletResponse,
058 boolean include)
059 throws IOException, ServletException {
060
061 ClassLoader contextClassLoader =
062 ClassLoaderUtil.getContextClassLoader();
063
064 ClassLoader pluginClassLoader =
065 (ClassLoader)_servletContext.getAttribute(
066 PluginContextListener.PLUGIN_CLASS_LOADER);
067
068 try {
069 if (pluginClassLoader == null) {
070 ClassLoaderUtil.setContextClassLoader(
071 ClassLoaderUtil.getPortalClassLoader());
072 }
073 else {
074 ClassLoaderUtil.setContextClassLoader(pluginClassLoader);
075 }
076
077 if (include) {
078 _requestDispatcher.include(servletRequest, servletResponse);
079 }
080 else {
081 _requestDispatcher.forward(servletRequest, servletResponse);
082 }
083 }
084 finally {
085 ClassLoaderUtil.setContextClassLoader(contextClassLoader);
086 }
087 }
088
089 private RequestDispatcher _requestDispatcher;
090 private ServletContext _servletContext;
091
092 }