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