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