001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.servlet.PersistentHttpServletRequestWrapper;
020 import com.liferay.portal.kernel.servlet.RequestDispatcherAttributeNames;
021 import com.liferay.portal.kernel.util.Mergeable;
022 import com.liferay.portal.kernel.util.PropsKeys;
023 import com.liferay.portal.kernel.util.PropsUtil;
024 import com.liferay.portal.kernel.util.WebKeys;
025
026 import java.util.Collections;
027 import java.util.Enumeration;
028 import java.util.HashMap;
029 import java.util.HashSet;
030 import java.util.Map;
031 import java.util.Set;
032 import java.util.concurrent.locks.Lock;
033
034 import javax.servlet.ServletRequest;
035 import javax.servlet.http.HttpServletRequest;
036
037
040 public class RestrictPortletServletRequest
041 extends PersistentHttpServletRequestWrapper {
042
043 public RestrictPortletServletRequest(HttpServletRequest request) {
044 super(request);
045 }
046
047 @Override
048 public Object getAttribute(String name) {
049 if (RequestDispatcherAttributeNames.contains(name)) {
050 return super.getAttribute(name);
051 }
052
053 Object value = _attributes.get(name);
054
055 if (value == _nullValue) {
056 return null;
057 }
058
059 if (value != null) {
060 return value;
061 }
062
063 return super.getAttribute(name);
064 }
065
066 @Override
067 public Enumeration<String> getAttributeNames() {
068 Enumeration<String> superEnumeration = super.getAttributeNames();
069
070 if (_attributes.isEmpty()) {
071 return superEnumeration;
072 }
073
074 Set<String> names = new HashSet<String>();
075
076 while (superEnumeration.hasMoreElements()) {
077 names.add(superEnumeration.nextElement());
078 }
079
080 for (Map.Entry<String, Object> entry : _attributes.entrySet()) {
081 String key = entry.getKey();
082 Object value = entry.getValue();
083
084 if (value == null) {
085 names.remove(key);
086 }
087 else {
088 names.add(key);
089 }
090 }
091
092 names.addAll(_attributes.keySet());
093
094 return Collections.enumeration(names);
095 }
096
097 public Map<String, Object> getAttributes() {
098 return _attributes;
099 }
100
101 public void mergeSharedAttributes() {
102 ServletRequest servletRequest = getRequest();
103
104 Lock lock = (Lock)servletRequest.getAttribute(
105 WebKeys.PARALLEL_RENDERING_MERGE_LOCK);
106
107 if (lock != null) {
108 lock.lock();
109 }
110
111 try {
112 doMergeSharedAttributes(servletRequest);
113 }
114 finally {
115 if (lock != null) {
116 lock.unlock();
117 }
118 }
119 }
120
121 @Override
122 public void removeAttribute(String name) {
123 if (RequestDispatcherAttributeNames.contains(name)) {
124 super.removeAttribute(name);
125 }
126 else {
127 _attributes.put(name, _nullValue);
128 }
129 }
130
131 @Override
132 public void setAttribute(String name, Object value) {
133 if (RequestDispatcherAttributeNames.contains(name)) {
134 super.setAttribute(name, value);
135 }
136 else {
137 if (value == null) {
138 value = _nullValue;
139 }
140
141 _attributes.put(name, value);
142 }
143 }
144
145 protected void doMergeSharedAttributes(ServletRequest servletRequest) {
146 for (Map.Entry<String, Object> entry : _attributes.entrySet()) {
147 String name = entry.getKey();
148 Object value = entry.getValue();
149
150 doMergeSharedAttributes(servletRequest, name, value);
151 }
152 }
153
154 protected void doMergeSharedAttributes(
155 ServletRequest servletRequest, String name, Object value) {
156
157 if (isSharedRequestAttribute(name)) {
158 if (value == _nullValue) {
159 servletRequest.removeAttribute(name);
160
161 if (_log.isDebugEnabled()) {
162 _log.debug("Remove shared attribute " + name);
163 }
164 }
165 else {
166 Object masterValue = servletRequest.getAttribute(name);
167
168 if ((masterValue == null) || !(value instanceof Mergeable)) {
169 servletRequest.setAttribute(name, value);
170
171 if (_log.isDebugEnabled()) {
172 _log.debug("Set shared attribute " + name);
173 }
174 }
175 else {
176 Mergeable<Object> masterMergeable =
177 (Mergeable<Object>)masterValue;
178 Mergeable<Object> slaveMergeable = (Mergeable<Object>)value;
179
180 masterMergeable.merge(slaveMergeable);
181
182 if (_log.isDebugEnabled()) {
183 _log.debug("Merge shared attribute " + name);
184 }
185 }
186 }
187 }
188 else {
189 if ((value != _nullValue) && _log.isDebugEnabled()) {
190 _log.debug("Ignore setting restricted attribute " + name);
191 }
192 }
193 }
194
195 protected boolean isSharedRequestAttribute(String name) {
196 for (String requestSharedAttribute : _REQUEST_SHARED_ATTRIBUTES) {
197 if (name.startsWith(requestSharedAttribute)) {
198 return true;
199 }
200 }
201
202 return false;
203 }
204
205 private static final String[] _REQUEST_SHARED_ATTRIBUTES =
206 PropsUtil.getArray(PropsKeys.REQUEST_SHARED_ATTRIBUTES);
207
208 private static Log _log = LogFactoryUtil.getLog(
209 RestrictPortletServletRequest.class);
210
211 private static Object _nullValue = new Object();
212
213 private Map<String, Object> _attributes = new HashMap<String, Object>();
214
215 }