001
014
015 package com.liferay.portal.servlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.security.pacl.DoPrivileged;
020 import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactory;
021 import com.liferay.portal.kernel.servlet.DirectServletRegistryUtil;
022 import com.liferay.portal.kernel.util.CharPool;
023 import com.liferay.portal.kernel.util.ContextPathUtil;
024 import com.liferay.portal.kernel.util.WebKeys;
025 import com.liferay.portal.util.PropsValues;
026
027 import javax.servlet.RequestDispatcher;
028 import javax.servlet.Servlet;
029 import javax.servlet.ServletContext;
030 import javax.servlet.ServletRequest;
031
032
036 @DoPrivileged
037 public class DirectRequestDispatcherFactoryImpl
038 implements DirectRequestDispatcherFactory {
039
040 @Override
041 public RequestDispatcher getRequestDispatcher(
042 ServletContext servletContext, String path) {
043
044 RequestDispatcher requestDispatcher = doGetRequestDispatcher(
045 servletContext, path);
046
047 return new ClassLoaderRequestDispatcherWrapper(
048 servletContext, requestDispatcher);
049 }
050
051 @Override
052 public RequestDispatcher getRequestDispatcher(
053 ServletRequest servletRequest, String path) {
054
055 ServletContext servletContext =
056 (ServletContext)servletRequest.getAttribute(WebKeys.CTX);
057
058 if (servletContext == null) {
059 return servletRequest.getRequestDispatcher(path);
060 }
061
062 return getRequestDispatcher(servletContext, path);
063 }
064
065 protected RequestDispatcher doGetRequestDispatcher(
066 ServletContext servletContext, String path) {
067
068 if (!PropsValues.DIRECT_SERVLET_CONTEXT_ENABLED) {
069 return servletContext.getRequestDispatcher(path);
070 }
071
072 if ((path == null) || (path.length() == 0)) {
073 return null;
074 }
075
076 if (path.charAt(0) != CharPool.SLASH) {
077 throw new IllegalArgumentException(
078 "Path " + path + " is not relative to context root");
079 }
080
081 String contextPath = ContextPathUtil.getContextPath(servletContext);
082
083 String fullPath = contextPath.concat(path);
084 String queryString = null;
085
086 int pos = fullPath.indexOf(CharPool.QUESTION);
087
088 if (pos != -1) {
089 queryString = fullPath.substring(pos + 1);
090
091 fullPath = fullPath.substring(0, pos);
092 }
093
094 Servlet servlet = DirectServletRegistryUtil.getServlet(fullPath);
095
096 RequestDispatcher requestDispatcher = null;
097
098 if (servlet == null) {
099 if (_log.isDebugEnabled()) {
100 _log.debug("No servlet found for " + fullPath);
101 }
102
103 requestDispatcher = servletContext.getRequestDispatcher(path);
104
105 requestDispatcher = new DirectServletPathRegisterDispatcher(
106 path, requestDispatcher);
107 }
108 else {
109 if (_log.isDebugEnabled()) {
110 _log.debug("Servlet found for " + fullPath);
111 }
112
113 requestDispatcher = new DirectRequestDispatcher(
114 servlet, queryString);
115 }
116
117 return _pacl.getRequestDispatcher(servletContext, requestDispatcher);
118 }
119
120 private static Log _log = LogFactoryUtil.getLog(
121 DirectRequestDispatcherFactoryImpl.class);
122
123 private static PACL _pacl = new NoPACL();
124
125 private static class NoPACL implements PACL {
126
127 @Override
128 public RequestDispatcher getRequestDispatcher(
129 ServletContext servletContext,
130 RequestDispatcher requestDispatcher) {
131
132 return requestDispatcher;
133 }
134
135 }
136
137 public static interface PACL {
138
139 public RequestDispatcher getRequestDispatcher(
140 ServletContext servletContext, RequestDispatcher requestDispatcher);
141
142 }
143
144 }