001
014
015 package com.liferay.portal.servlet;
016
017 import com.liferay.portal.kernel.util.ObjectValuePair;
018
019 import java.io.Closeable;
020
021 import java.util.HashSet;
022 import java.util.Set;
023
024 import javax.servlet.ServletRequest;
025 import javax.servlet.ServletRequestWrapper;
026 import javax.servlet.http.HttpServletRequest;
027
028
031 public class ThreadLocalFacadeServletRequestWrapperUtil {
032
033 public static <T extends ServletRequest> ObjectValuePair<T, Closeable>
034 inject(T servletRequest) {
035
036 ServletRequestWrapper previousServletRequestWrapper = null;
037 ServletRequest currentServletRequest = servletRequest;
038
039 while (currentServletRequest != null) {
040 if (!(currentServletRequest instanceof ServletRequestWrapper)) {
041 break;
042 }
043
044 Class<?> clazz = currentServletRequest.getClass();
045
046 if (_stopperClassNames.contains(clazz.getName())) {
047 break;
048 }
049
050 previousServletRequestWrapper =
051 (ServletRequestWrapper)currentServletRequest;
052
053 ServletRequestWrapper servletRequestWrapper =
054 (ServletRequestWrapper)currentServletRequest;
055
056 currentServletRequest = servletRequestWrapper.getRequest();
057 }
058
059 ServletRequestWrapper servletRequestWrapper = null;
060
061 if (currentServletRequest instanceof HttpServletRequest) {
062 servletRequestWrapper =
063 new ThreadLocalFacadeHttpServletRequestWrapper(
064 previousServletRequestWrapper,
065 (HttpServletRequest)currentServletRequest);
066 }
067 else {
068 servletRequestWrapper = new ThreadLocalFacadeServletRequestWrapper(
069 previousServletRequestWrapper, currentServletRequest);
070 }
071
072 if (previousServletRequestWrapper != null) {
073 previousServletRequestWrapper.setRequest(servletRequestWrapper);
074 }
075 else {
076 servletRequest = (T)servletRequestWrapper;
077 }
078
079 Closeable closeable = (Closeable)servletRequestWrapper;
080
081 return new ObjectValuePair<T, Closeable>(servletRequest, closeable);
082 }
083
084 public void setStopperClassNames(Set<String> stopperClassNames) {
085 _stopperClassNames.clear();
086
087 _stopperClassNames.addAll(stopperClassNames);
088 }
089
090 private static Set<String> _stopperClassNames = new HashSet<String>();
091
092 }