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