001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.util.ArrayUtil;
018 import com.liferay.portal.kernel.util.CharPool;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.kernel.util.StringUtil;
021
022 import java.util.Collections;
023 import java.util.Enumeration;
024 import java.util.HashMap;
025 import java.util.LinkedHashSet;
026 import java.util.Map;
027 import java.util.Set;
028
029 import javax.servlet.http.HttpServletRequest;
030 import javax.servlet.http.HttpServletRequestWrapper;
031
032
036 public class DynamicServletRequest extends HttpServletRequestWrapper {
037
038 public static HttpServletRequest addQueryString(
039 HttpServletRequest request, String queryString) {
040
041 return addQueryString(request, queryString, true);
042 }
043
044 public static HttpServletRequest addQueryString(
045 HttpServletRequest request, String queryString, boolean inherit) {
046
047 String[] parameters = StringUtil.split(queryString, CharPool.AMPERSAND);
048
049 if (parameters.length == 0) {
050 return request;
051 }
052
053 Map<String, String[]> parameterMap = new HashMap<String, String[]>();
054
055 for (String parameter : parameters) {
056 String[] parameterParts = StringUtil.split(
057 parameter, CharPool.EQUAL);
058
059 String name = parameterParts[0];
060 String value = StringPool.BLANK;
061
062 if (parameterParts.length == 2) {
063 value = parameterParts[1];
064 }
065
066 String[] values = parameterMap.get(name);
067
068 if (values == null) {
069 parameterMap.put(name, new String[] {value});
070 }
071 else {
072 String[] newValues = new String[values.length + 1];
073
074 System.arraycopy(values, 0, newValues, 0, values.length);
075
076 newValues[newValues.length - 1] = value;
077
078 parameterMap.put(name, newValues);
079 }
080 }
081
082 request = new DynamicServletRequest(request, parameterMap, inherit);
083
084 return request;
085 }
086
087 public DynamicServletRequest(HttpServletRequest request) {
088 this(request, null, true);
089 }
090
091 public DynamicServletRequest(HttpServletRequest request, boolean inherit) {
092 this(request, null, inherit);
093 }
094
095 public DynamicServletRequest(
096 HttpServletRequest request, Map<String, String[]> params) {
097
098 this(request, params, true);
099 }
100
101 public DynamicServletRequest(
102 HttpServletRequest request, Map<String, String[]> params,
103 boolean inherit) {
104
105 super(request);
106
107 _params = new HashMap<String, String[]>();
108 _inherit = inherit;
109
110 if (params != null) {
111 _params.putAll(params);
112 }
113
114 if (_inherit && (request instanceof DynamicServletRequest)) {
115 DynamicServletRequest dynamicRequest =
116 (DynamicServletRequest)request;
117
118 setRequest(dynamicRequest.getRequest());
119
120 params = dynamicRequest.getDynamicParameterMap();
121
122 for (Map.Entry<String, String[]> entry : params.entrySet()) {
123 String name = entry.getKey();
124 String[] oldValues = entry.getValue();
125
126 String[] curValues = _params.get(name);
127
128 if (curValues == null) {
129 _params.put(name, oldValues);
130 }
131 else {
132 String[] newValues = ArrayUtil.append(oldValues, curValues);
133
134 _params.put(name, newValues);
135 }
136 }
137 }
138 }
139
140 public void appendParameter(String name, String value) {
141 String[] values = _params.get(name);
142
143 if (values == null) {
144 values = new String[] {value};
145 }
146 else {
147 String[] newValues = new String[values.length + 1];
148
149 System.arraycopy(values, 0, newValues, 0, values.length);
150
151 newValues[newValues.length - 1] = value;
152
153 values = newValues;
154 }
155
156 _params.put(name, values);
157 }
158
159 public Map<String, String[]> getDynamicParameterMap() {
160 return _params;
161 }
162
163 @Override
164 public String getParameter(String name) {
165 String[] values = _params.get(name);
166
167 if (_inherit && (values == null)) {
168 return super.getParameter(name);
169 }
170
171 if ((values != null) && (values.length > 0)) {
172 return values[0];
173 }
174 else {
175 return null;
176 }
177 }
178
179 @Override
180 public Map<String, String[]> getParameterMap() {
181 Map<String, String[]> map = new HashMap<String, String[]>();
182
183 if (_inherit) {
184 map.putAll(super.getParameterMap());
185 }
186
187 map.putAll(_params);
188
189 return map;
190 }
191
192 @Override
193 public Enumeration<String> getParameterNames() {
194 Set<String> names = new LinkedHashSet<String>();
195
196 if (_inherit) {
197 Enumeration<String> enu = super.getParameterNames();
198
199 while (enu.hasMoreElements()) {
200 names.add(enu.nextElement());
201 }
202 }
203
204 names.addAll(_params.keySet());
205
206 return Collections.enumeration(names);
207 }
208
209 @Override
210 public String[] getParameterValues(String name) {
211 String[] values = _params.get(name);
212
213 if (_inherit && (values == null)) {
214 return super.getParameterValues(name);
215 }
216
217 return values;
218 }
219
220 public void setParameter(String name, String value) {
221 _params.put(name, new String[] {value});
222 }
223
224 public void setParameterValues(String name, String[] values) {
225 _params.put(name, values);
226 }
227
228 private boolean _inherit;
229 private Map<String, String[]> _params;
230
231 }