1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts.upload;
22
23 import javax.servlet.http.HttpServletRequest;
24 import javax.servlet.http.HttpServletRequestWrapper;
25
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.Enumeration;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.Map;
32 import java.util.Vector;
33
34 /**
35 * <p> This class functions as a wrapper around HttpServletRequest to provide
36 * working getParameter methods for multipart requests. </p>
37 */
38 public class MultipartRequestWrapper extends HttpServletRequestWrapper {
39 /**
40 * <p> The parameters for this multipart request </p>
41 */
42 protected Map parameters;
43
44 public MultipartRequestWrapper(HttpServletRequest request) {
45 super(request);
46 this.parameters = new HashMap();
47 }
48
49 /**
50 * <p> Sets a parameter for this request. The parameter is actually
51 * separate from the request parameters, but calling on the getParameter()
52 * methods of this class will work as if they weren't. </p>
53 */
54 public void setParameter(String name, String value) {
55 String[] mValue = (String[]) parameters.get(name);
56
57 if (mValue == null) {
58 mValue = new String[0];
59 }
60
61 String[] newValue = new String[mValue.length + 1];
62
63 System.arraycopy(mValue, 0, newValue, 0, mValue.length);
64 newValue[mValue.length] = value;
65
66 parameters.put(name, newValue);
67 }
68
69 /**
70 * <p> Attempts to get a parameter for this request. It first looks in
71 * the underlying HttpServletRequest object for the parameter, and if that
72 * doesn't exist it looks for the parameters retrieved from the multipart
73 * request </p>
74 */
75 public String getParameter(String name) {
76 String value = getRequest().getParameter(name);
77
78 if (value == null) {
79 String[] mValue = (String[]) parameters.get(name);
80
81 if ((mValue != null) && (mValue.length > 0)) {
82 value = mValue[0];
83 }
84 }
85
86 return value;
87 }
88
89 /**
90 * <p> Returns the names of the parameters for this request. The
91 * enumeration consists of the normal request parameter names plus the
92 * parameters read from the multipart request </p>
93 */
94 public Enumeration getParameterNames() {
95 Enumeration baseParams = getRequest().getParameterNames();
96 Vector list = new Vector();
97
98 while (baseParams.hasMoreElements()) {
99 list.add(baseParams.nextElement());
100 }
101
102 Collection multipartParams = parameters.keySet();
103 Iterator iterator = multipartParams.iterator();
104
105 while (iterator.hasNext()) {
106 list.add(iterator.next());
107 }
108
109 return Collections.enumeration(list);
110 }
111
112 /**
113 * <p> Returns the values of a parameter in this request. It first looks
114 * in the underlying HttpServletRequest object for the parameter, and if
115 * that doesn't exist it looks for the parameter retrieved from the
116 * multipart request. </p>
117 */
118 public String[] getParameterValues(String name) {
119 String[] value = getRequest().getParameterValues(name);
120
121 if (value == null) {
122 value = (String[]) parameters.get(name);
123 }
124
125 return value;
126 }
127
128 /**
129 * <p> Combines the parameters stored here with those in the underlying
130 * request. If paramater values in the underlying request take precedence
131 * over those stored here. </p>
132 */
133 public Map getParameterMap() {
134 Map map = new HashMap(parameters);
135
136 map.putAll(getRequest().getParameterMap());
137
138 return map;
139 }
140 }