1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.servlet;
12
13 import org.mule.transport.http.HttpConstants;
14
15 import com.mockobjects.dynamic.C;
16 import com.mockobjects.dynamic.Mock;
17
18 import java.util.Enumeration;
19 import java.util.HashMap;
20 import java.util.Hashtable;
21 import java.util.Map;
22 import java.util.Set;
23
24 import javax.servlet.ServletInputStream;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpSession;
27
28 import org.apache.commons.collections.iterators.IteratorEnumeration;
29
30 public class MockHttpServletRequestBuilder
31 {
32 public static final String REQUEST_URI = "/services/Echo";
33
34 public String method = HttpConstants.METHOD_GET;
35 public String requestUri = REQUEST_URI;
36 public ServletInputStream inputStream = null;
37 public String payload = null;
38 public String queryString = null;
39 public Map<String, String[]> parameters = null;
40 public String contentType = null;
41 public HttpSession session = null;
42 public String characterEncoding = null;
43 public Map<String, String> attributes = new HashMap<String, String>();
44 public Map<String, Object> headers = new HashMap<String, Object>();
45 public String host = "localhost";
46 public int localPort = 8080;
47
48 public HttpServletRequest buildRequest()
49 {
50 Mock mockRequest = new Mock(HttpServletRequest.class);
51
52 mockRequest.expectAndReturn("getMethod", method);
53
54 Enumeration<?> emptyEnumeration = new Hashtable<Object, Object>().elements();
55 mockRequest.expectAndReturn("getParameterNames", emptyEnumeration);
56
57 mockRequest.expectAndReturn("getRequestURI", requestUri);
58 mockRequest.expectAndReturn("getQueryString", queryString);
59 mockRequest.expectAndReturn("getInputStream", inputStream);
60 mockRequest.expectAndReturn("getSession", C.ANY_ARGS, session);
61 mockRequest.expectAndReturn("getCharacterEncoding", characterEncoding);
62 mockRequest.expectAndReturn("getLocalPort", localPort);
63
64 mockRequest.expectAndReturn("getContentType", contentType);
65 mockRequest.expectAndReturn("getContentType", contentType);
66
67 mockRequest.expectAndReturn("getRemoteAddr", host);
68
69 addParameterExpectations(mockRequest);
70 addAttributeExpectations(mockRequest);
71 addHeaderExpectations(mockRequest);
72 mockRequest.expectAndReturn("getHeader", C.eq(HttpConstants.HEADER_HOST), host);
73
74 return (HttpServletRequest) mockRequest.proxy();
75 }
76
77 private void addParameterExpectations(Mock mockRequest)
78 {
79 Enumeration<?> nameEnum = null;
80
81 if (parameters != null)
82 {
83 Set<String> keys = parameters.keySet();
84 nameEnum = new IteratorEnumeration(keys.iterator());
85
86 for (Map.Entry<String, String[]> entry : parameters.entrySet())
87 {
88 String key = entry.getKey();
89 String[] value = entry.getValue();
90 mockRequest.expectAndReturn("getParameterValues", C.eq(key), value);
91 }
92 }
93
94 mockRequest.expectAndReturn("getParameterNames", nameEnum);
95 mockRequest.expectAndReturn("getParameterMap", parameters);
96 }
97
98 private void addAttributeExpectations(Mock mockRequest)
99 {
100 Enumeration<?> nameEnum = null;
101
102 if (attributes != null)
103 {
104 nameEnum = keyEnumeration(attributes);
105
106 for (Map.Entry<String, String> entry : attributes.entrySet())
107 {
108 String key = entry.getKey();
109 String value = entry.getValue();
110
111 mockRequest.expectAndReturn("getAttribute", C.eq(key), value);
112 }
113 }
114
115 mockRequest.expectAndReturn("getAttributeNames", nameEnum);
116 }
117
118 private void addHeaderExpectations(Mock mockRequest)
119 {
120 Enumeration<?> nameEnum = null;
121 if (headers != null)
122 {
123 nameEnum = keyEnumeration(headers);
124
125 for (Map.Entry<String, Object> entry : headers.entrySet())
126 {
127 String key = entry.getKey();
128 Object value = entry.getValue();
129 if ((value instanceof Enumeration<?>) == false)
130 {
131 value = new SingleElementEnumeration(value);
132 }
133
134 mockRequest.expectAndReturn("getHeaders", C.eq(key), value);
135 }
136 }
137
138 mockRequest.expectAndReturn("getHeaderNames", nameEnum);
139 }
140
141 private Enumeration<?> keyEnumeration(Map<?, ?> map)
142 {
143 Set<?> keys = map.keySet();
144 return new IteratorEnumeration(keys.iterator());
145 }
146
147 private static class SingleElementEnumeration implements Enumeration<Object>
148 {
149 private Object element;
150
151 public SingleElementEnumeration(Object singleElement)
152 {
153 super();
154 element = singleElement;
155 }
156
157 public boolean hasMoreElements()
158 {
159 return (element != null);
160 }
161
162 public Object nextElement()
163 {
164 Object retValue = element;
165 if (element != null)
166 {
167 element = null;
168 }
169 return retValue;
170 }
171 }
172 }