View Javadoc

1   /*
2    * $Id: MockHttpServletRequestBuilder.java 19990 2010-10-22 04:20:40Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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 }