1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.internal.controller.impl;
17
18 import static org.seasar.cubby.CubbyConstants.ATTR_ACTION;
19 import static org.seasar.cubby.CubbyConstants.ATTR_CONTEXT_PATH;
20 import static org.seasar.cubby.CubbyConstants.ATTR_MESSAGES;
21
22 import java.util.ArrayList;
23 import java.util.Enumeration;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29 import java.util.Map.Entry;
30
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpServletRequestWrapper;
33
34 import org.seasar.cubby.CubbyConstants;
35 import org.seasar.cubby.internal.controller.ThreadContext;
36 import org.seasar.cubby.internal.util.IteratorEnumeration;
37 import org.seasar.cubby.spi.beans.BeanDesc;
38 import org.seasar.cubby.spi.beans.BeanDescFactory;
39 import org.seasar.cubby.spi.beans.PropertyDesc;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 class CubbyHttpServletRequestWrapper extends HttpServletRequestWrapper {
94
95
96 private final Map<String, String[]> uriParameters;
97
98
99
100
101
102
103
104
105
106 public CubbyHttpServletRequestWrapper(final HttpServletRequest request,
107 final Map<String, String[]> uriParameters) {
108 super(request);
109 this.uriParameters = uriParameters;
110 }
111
112
113
114
115
116
117
118
119
120 @Override
121 public Object getAttribute(final String name) {
122 final Object attribute;
123 if (ATTR_CONTEXT_PATH.equals(name)) {
124 attribute = this.getContextPath();
125 } else if (ATTR_MESSAGES.equals(name)) {
126 attribute = ThreadContext.getMessagesMap();
127 } else {
128 final Object action = super.getAttribute(ATTR_ACTION);
129 if (action != null) {
130 final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(action
131 .getClass());
132 if (beanDesc.hasPropertyDesc(name)) {
133 final PropertyDesc propertyDesc = beanDesc
134 .getPropertyDesc(name);
135 if (propertyDesc.isReadable()) {
136 attribute = propertyDesc.getValue(action);
137 } else {
138 attribute = super.getAttribute(name);
139 }
140 } else {
141 attribute = super.getAttribute(name);
142 }
143 } else {
144 attribute = super.getAttribute(name);
145 }
146 }
147 return attribute;
148 }
149
150
151
152
153
154
155
156 @SuppressWarnings("unchecked")
157 @Override
158 public Enumeration getAttributeNames() {
159 final Set attributeNames = new HashSet();
160
161 attributeNames.add(ATTR_CONTEXT_PATH);
162 attributeNames.add(ATTR_ACTION);
163 attributeNames.add(ATTR_MESSAGES);
164
165 final Object action = super.getAttribute(ATTR_ACTION);
166 if (action != null) {
167 final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(action
168 .getClass());
169 for (final PropertyDesc propertyDesc : beanDesc.getPropertyDescs()) {
170 if (propertyDesc.isReadable()) {
171 attributeNames.add(propertyDesc.getPropertyName());
172 }
173 }
174 }
175
176 final Enumeration defaultAttributeNames = super.getAttributeNames();
177 while (defaultAttributeNames.hasMoreElements()) {
178 attributeNames.add(defaultAttributeNames.nextElement());
179 }
180 return new IteratorEnumeration(attributeNames.iterator());
181 }
182
183
184
185
186
187
188
189
190
191
192
193 @Override
194 public String getParameter(final String name) {
195 final String[] parameters = this.getParameterValues(name);
196 if (parameters == null) {
197 return null;
198 } else {
199 return parameters[0];
200 }
201 }
202
203
204
205
206
207
208
209
210 @SuppressWarnings("unchecked")
211 @Override
212 public Enumeration getParameterNames() {
213 return new IteratorEnumeration(this.getParameterMap().keySet()
214 .iterator());
215 }
216
217
218
219
220
221
222
223
224
225
226
227 @SuppressWarnings("unchecked")
228 @Override
229 public String[] getParameterValues(final String name) {
230 final Map<String, String[]> parameterMap = this.getParameterMap();
231 return parameterMap.get(name);
232 }
233
234
235
236
237
238
239
240
241
242
243 @SuppressWarnings("unchecked")
244 @Override
245 public Map getParameterMap() {
246 final Map<String, String[]> parameterMap = buildParameterMap(
247 (HttpServletRequest) getRequest(), uriParameters);
248 return parameterMap;
249 }
250
251
252
253
254
255
256
257
258
259
260 private Map<String, String[]> buildParameterMap(
261 final HttpServletRequest request,
262 final Map<String, String[]> uriParameters) {
263 final Map<String, List<String>> extendedParameterMap = new HashMap<String, List<String>>();
264
265 final Map<?, ?> originalParameterMap = request.getParameterMap();
266 for (final Entry<?, ?> entry : originalParameterMap.entrySet()) {
267 final String name = (String) entry.getKey();
268 final List<String> values = new ArrayList<String>();
269 for (final String value : (String[]) entry.getValue()) {
270 values.add(value);
271 }
272 extendedParameterMap.put(name, values);
273 }
274 for (final Entry<String, String[]> entry : uriParameters.entrySet()) {
275 final String name = entry.getKey();
276 if (extendedParameterMap.containsKey(name)) {
277 final List<String> values = extendedParameterMap.get(name);
278 for (final String value : entry.getValue()) {
279 values.add(value);
280 }
281 } else {
282 final List<String> values = new ArrayList<String>();
283 for (final String value : entry.getValue()) {
284 values.add(value);
285 }
286 extendedParameterMap.put(name, values);
287 }
288 }
289
290 final Map<String, String[]> parameterMap = new HashMap<String, String[]>();
291 for (final Entry<String, List<String>> entry : extendedParameterMap
292 .entrySet()) {
293 parameterMap.put(entry.getKey(), entry.getValue().toArray(
294 new String[0]));
295 }
296 return parameterMap;
297 }
298
299 }