001
014
015 package com.liferay.portal.servlet;
016
017 import com.liferay.portal.kernel.servlet.PersistentHttpServletRequestWrapper;
018 import com.liferay.portal.kernel.util.AutoResetThreadLocal;
019 import com.liferay.portal.kernel.util.WebKeys;
020
021 import java.io.Closeable;
022
023 import java.util.ArrayList;
024 import java.util.Collections;
025 import java.util.Enumeration;
026 import java.util.List;
027 import java.util.Locale;
028 import java.util.concurrent.locks.Lock;
029
030 import javax.servlet.RequestDispatcher;
031 import javax.servlet.ServletRequest;
032 import javax.servlet.ServletRequestWrapper;
033 import javax.servlet.http.HttpServletRequest;
034 import javax.servlet.http.HttpSession;
035
036
039 public class ThreadLocalFacadeHttpServletRequestWrapper
040 extends PersistentHttpServletRequestWrapper implements Closeable {
041
042 public ThreadLocalFacadeHttpServletRequestWrapper(
043 ServletRequestWrapper servletRequestWrapper,
044 HttpServletRequest httpServletRequest) {
045
046 super(httpServletRequest);
047
048 _servletRequestWrapper = servletRequestWrapper;
049
050 _nextHttpServletRequestThreadLocal.set(httpServletRequest);
051
052 _locales = new ArrayList<Locale>();
053
054 Enumeration<Locale> enumeration = httpServletRequest.getLocales();
055
056 while (enumeration.hasMoreElements()) {
057 _locales.add(enumeration.nextElement());
058 }
059 }
060
061 @Override
062 public void close() {
063 if (_servletRequestWrapper != null) {
064 HttpServletRequest nextHttpServletRequest =
065 _nextHttpServletRequestThreadLocal.get();
066
067 _servletRequestWrapper.setRequest(nextHttpServletRequest);
068 }
069 }
070
071 @Override
072 public Object getAttribute(String name) {
073 ServletRequest servletRequest = getRequest();
074
075 return servletRequest.getAttribute(name);
076 }
077
078 @Override
079 public Enumeration<String> getAttributeNames() {
080 ServletRequest servletRequest = getRequest();
081
082 Lock lock = (Lock)servletRequest.getAttribute(
083 WebKeys.PARALLEL_RENDERING_MERGE_LOCK);
084
085 if (lock != null) {
086 lock.lock();
087 }
088
089 try {
090 return servletRequest.getAttributeNames();
091 }
092 finally {
093 if (lock != null) {
094 lock.unlock();
095 }
096 }
097 }
098
099 @Override
100 public Enumeration<Locale> getLocales() {
101 return Collections.enumeration(_locales);
102 }
103
104 @Override
105 public ServletRequest getRequest() {
106 return _nextHttpServletRequestThreadLocal.get();
107 }
108
109 @Override
110 public RequestDispatcher getRequestDispatcher(String uri) {
111 ServletRequest servletRequest = getRequest();
112
113 return servletRequest.getRequestDispatcher(uri);
114 }
115
116 @Override
117 public HttpSession getSession() {
118 return getSession(true);
119 }
120
121 @Override
122 public HttpSession getSession(boolean create) {
123 HttpServletRequest httpServletRequest =
124 (HttpServletRequest)getRequest();
125
126 return httpServletRequest.getSession(create);
127 }
128
129 @Override
130 public void removeAttribute(String name) {
131 ServletRequest servletRequest = getRequest();
132
133 servletRequest.removeAttribute(name);
134 }
135
136 @Override
137 public void setAttribute(String name, Object o) {
138 ServletRequest servletRequest = getRequest();
139
140 servletRequest.setAttribute(name, o);
141 }
142
143 @Override
144 public void setRequest(ServletRequest servletRequest) {
145 _nextHttpServletRequestThreadLocal.set(
146 (HttpServletRequest)servletRequest);
147 }
148
149 private static ThreadLocal<HttpServletRequest>
150 _nextHttpServletRequestThreadLocal =
151 new AutoResetThreadLocal<HttpServletRequest>(
152 ThreadLocalFacadeHttpServletRequestWrapper.class +
153 "._nextHttpServletRequestThreadLocal") {
154
155 @Override
156 protected HttpServletRequest copy(
157 HttpServletRequest httpServletRequest) {
158
159 return httpServletRequest;
160 }
161
162 };
163
164 private List<Locale> _locales;
165 private ServletRequestWrapper _servletRequestWrapper;
166
167 }