001 package com.mockrunner.mock.web;
002
003 import java.io.BufferedReader;
004 import java.io.IOException;
005 import java.io.StringReader;
006 import java.io.UnsupportedEncodingException;
007 import java.security.Principal;
008 import java.text.ParseException;
009 import java.text.SimpleDateFormat;
010 import java.util.ArrayList;
011 import java.util.Collections;
012 import java.util.Date;
013 import java.util.Enumeration;
014 import java.util.HashMap;
015 import java.util.List;
016 import java.util.Locale;
017 import java.util.Map;
018 import java.util.Vector;
019
020 import javax.servlet.RequestDispatcher;
021 import javax.servlet.ServletContext;
022 import javax.servlet.ServletInputStream;
023 import javax.servlet.ServletRequestAttributeEvent;
024 import javax.servlet.ServletRequestAttributeListener;
025 import javax.servlet.http.Cookie;
026 import javax.servlet.http.HttpServletRequest;
027 import javax.servlet.http.HttpSession;
028
029 /**
030 * Mock implementation of <code>HttpServletRequest</code>.
031 */
032 public class MockHttpServletRequest implements HttpServletRequest
033 {
034 private Map attributes;
035 private Map parameters;
036 private Vector locales;
037 private Map requestDispatchers;
038 private HttpSession session;
039 private String method;
040 private String authType;
041 private Map headers;
042 private String contextPath;
043 private String pathInfo;
044 private String pathTranslated;
045 private String queryString;
046 private StringBuffer requestUrl;
047 private String requestUri;
048 private String servletPath;
049 private Principal principal;
050 private String remoteUser;
051 private boolean requestedSessionIdIsFromCookie;
052 private String protocol;
053 private String serverName;
054 private int serverPort;
055 private String scheme;
056 private String remoteHost;
057 private String remoteAddr;
058 private Map roles;
059 private String characterEncoding;
060 private int contentLength;
061 private String contentType;
062 private List cookies;
063 private String bodyContent;
064 private String localAddr;
065 private String localName;
066 private int localPort;
067 private int remotePort;
068 private boolean sessionCreated;
069 private List attributeListener;
070
071 public MockHttpServletRequest()
072 {
073 attributes = new HashMap();
074 parameters = new HashMap();
075 locales = new Vector();
076 requestDispatchers = new HashMap();
077 method = "GET";
078 headers = new HashMap();
079 requestedSessionIdIsFromCookie = true;
080 protocol = "HTTP/1.1";
081 serverName = "localhost";
082 serverPort = 8080;
083 scheme = "http";
084 remoteHost = "localhost";
085 remoteAddr = "127.0.0.1";
086 roles = new HashMap();
087 contentLength = -1;
088 cookies = new ArrayList();
089 localAddr = "127.0.0.1";
090 localName = "localhost";
091 localPort = 8080;
092 remotePort = 5000;
093 sessionCreated = false;
094 attributeListener = new ArrayList();
095 }
096
097 public void addAttributeListener(ServletRequestAttributeListener listener)
098 {
099 attributeListener.add(listener);
100 }
101
102 public String getParameter(String key)
103 {
104 String[] values = getParameterValues(key);
105 if (null != values && 0 < values.length)
106 {
107 return values[0];
108 }
109 return null;
110 }
111
112 public void clearParameters()
113 {
114 parameters.clear();
115 }
116
117 public String[] getParameterValues(String key)
118 {
119 return (String[]) parameters.get(key);
120 }
121
122 public void setupAddParameter(String key, String[] values)
123 {
124 parameters.put(key, values);
125 }
126
127 public void setupAddParameter(String key, String value)
128 {
129 setupAddParameter(key, new String[] { value });
130 }
131
132 public Enumeration getParameterNames()
133 {
134 Vector parameterKeys = new Vector(parameters.keySet());
135 return parameterKeys.elements();
136 }
137
138 public Map getParameterMap()
139 {
140 return Collections.unmodifiableMap(parameters);
141 }
142
143 public void clearAttributes()
144 {
145 attributes.clear();
146 }
147
148 public Object getAttribute(String key)
149 {
150 return attributes.get(key);
151 }
152
153 public Enumeration getAttributeNames()
154 {
155 Vector attKeys = new Vector(attributes.keySet());
156 return attKeys.elements();
157 }
158
159 public void removeAttribute(String key)
160 {
161 Object value = attributes.get(key);
162 attributes.remove(key);
163 if(null != value)
164 {
165 callAttributeListenersRemovedMethod(key, value);
166 }
167 }
168
169 public void setAttribute(String key, Object value)
170 {
171 Object oldValue = attributes.get(key);
172 attributes.put(key, value);
173 handleAttributeListenerCalls(key, value, oldValue);
174 }
175
176 public HttpSession getSession()
177 {
178 sessionCreated = true;
179 return session;
180 }
181
182 public HttpSession getSession(boolean create)
183 {
184 if(!create && !sessionCreated) return null;
185 return getSession();
186 }
187
188 public void setSession(HttpSession session)
189 {
190 this.session = session;
191 }
192
193 public RequestDispatcher getRequestDispatcher(String path)
194 {
195 RequestDispatcher dispatcher = (RequestDispatcher)requestDispatchers.get(path);
196 if(null == dispatcher)
197 {
198 dispatcher = new MockRequestDispatcher();
199 setRequestDispatcher(path, dispatcher);
200 }
201 return dispatcher;
202 }
203
204 /**
205 * Returns the map of <code>RequestDispatcher</code> objects. The specified path
206 * maps to the corresponding <code>RequestDispatcher</code> object.
207 * @return the map of <code>RequestDispatcher</code> objects
208 */
209 public Map getRequestDispatcherMap()
210 {
211 return Collections.unmodifiableMap(requestDispatchers);
212 }
213
214 /**
215 * Sets a <code>RequestDispatcher</code> that will be returned when calling
216 * {@link #getRequestDispatcher} with the specified path. If no <code>RequestDispatcher</code>
217 * is set for the specified path, {@link #getRequestDispatcher} automatically creates a
218 * new one.
219 * @param path the path for the <code>RequestDispatcher</code>
220 * @param dispatcher the <code>RequestDispatcher</code> object
221 */
222 public void setRequestDispatcher(String path, RequestDispatcher dispatcher)
223 {
224 if(dispatcher instanceof MockRequestDispatcher)
225 {
226 ((MockRequestDispatcher)dispatcher).setPath(path);
227 }
228 requestDispatchers.put(path, dispatcher);
229 }
230
231 public Locale getLocale()
232 {
233 if(locales.size() < 1) return Locale.getDefault();
234 return (Locale)locales.get(0);
235 }
236
237 public Enumeration getLocales()
238 {
239 return locales.elements();
240 }
241
242 public void addLocale(Locale locale)
243 {
244 locales.add(locale);
245 }
246
247 public void addLocales(List localeList)
248 {
249 locales.addAll(localeList);
250 }
251
252 public String getMethod()
253 {
254 return method;
255 }
256
257 public void setMethod(String method)
258 {
259 this.method = method;
260 }
261
262 public String getAuthType()
263 {
264 return authType;
265 }
266
267 public void setAuthType(String authType)
268 {
269 this.authType = authType;
270 }
271
272 public long getDateHeader(String key)
273 {
274 String header = getHeader(key);
275 if(null == header) return -1;
276 try
277 {
278 Date dateValue = new SimpleDateFormat(WebConstants.DATE_FORMAT_HEADER, Locale.US).parse(header);
279 return dateValue.getTime();
280 }
281 catch (ParseException exc)
282 {
283 throw new IllegalArgumentException(exc.getMessage());
284 }
285 }
286
287 public String getHeader(String key)
288 {
289 List headerList = (List)headers.get(key);
290 if(null == headerList || 0 == headerList.size()) return null;
291 return (String)headerList.get(0);
292 }
293
294 public Enumeration getHeaderNames()
295 {
296 return new Vector(headers.keySet()).elements();
297 }
298
299 public Enumeration getHeaders(String key)
300 {
301 List headerList = (List)headers.get(key);
302 if(null == headerList) return null;
303 return new Vector(headerList).elements();
304 }
305
306 public int getIntHeader(String key)
307 {
308 String header = getHeader(key);
309 if(null == header) return -1;
310 return new Integer(header).intValue();
311 }
312
313 public void addHeader(String key, String value)
314 {
315 List valueList = (List) headers.get(key);
316 if (null == valueList)
317 {
318 valueList = new ArrayList();
319 headers.put(key, valueList);
320 }
321 valueList.add(value);
322 }
323
324 public void setHeader(String key, String value)
325 {
326 List valueList = new ArrayList();
327 headers.put(key, valueList);
328 valueList.add(value);
329 }
330
331 public String getContextPath()
332 {
333 return contextPath;
334 }
335
336 public void setContextPath(String contextPath)
337 {
338 this.contextPath = contextPath;
339 }
340
341 public String getPathInfo()
342 {
343 return pathInfo;
344 }
345
346 public void setPathInfo(String pathInfo)
347 {
348 this.pathInfo = pathInfo;
349 }
350
351 public String getPathTranslated()
352 {
353 return pathTranslated;
354 }
355
356 public void setPathTranslated(String pathTranslated)
357 {
358 this.pathTranslated = pathTranslated;
359 }
360
361 public String getQueryString()
362 {
363 return queryString;
364 }
365
366 public void setQueryString(String queryString)
367 {
368 this.queryString = queryString;
369 }
370
371 public String getRequestURI()
372 {
373 return requestUri;
374 }
375
376 public void setRequestURI(String requestUri)
377 {
378 this.requestUri = requestUri;
379 }
380
381 public StringBuffer getRequestURL()
382 {
383 return requestUrl;
384 }
385
386 public void setRequestURL(String requestUrl)
387 {
388 this.requestUrl = new StringBuffer(requestUrl);
389 }
390
391 public String getServletPath()
392 {
393 return servletPath;
394 }
395
396 public void setServletPath(String servletPath)
397 {
398 this.servletPath = servletPath;
399 }
400
401 public Principal getUserPrincipal()
402 {
403 return principal;
404 }
405
406 public void setUserPrincipal(Principal principal)
407 {
408 this.principal = principal;
409 }
410
411 public String getRemoteUser()
412 {
413 return remoteUser;
414 }
415
416 public void setRemoteUser(String remoteUser)
417 {
418 this.remoteUser = remoteUser;
419 }
420
421 public Cookie[] getCookies()
422 {
423 return (Cookie[])cookies.toArray(new Cookie[cookies.size()]);
424 }
425
426 public void addCookie(Cookie cookie)
427 {
428 cookies.add(cookie);
429 }
430
431 public String getRequestedSessionId()
432 {
433 HttpSession session = getSession();
434 if(null == session) return null;
435 return session.getId();
436 }
437
438 public boolean isRequestedSessionIdFromCookie()
439 {
440 return requestedSessionIdIsFromCookie;
441 }
442
443 public boolean isRequestedSessionIdFromUrl()
444 {
445 return isRequestedSessionIdFromURL();
446 }
447
448 public boolean isRequestedSessionIdFromURL()
449 {
450 return !requestedSessionIdIsFromCookie;
451 }
452
453 public void setRequestedSessionIdFromCookie(boolean requestedSessionIdIsFromCookie)
454 {
455 this.requestedSessionIdIsFromCookie = requestedSessionIdIsFromCookie;
456 }
457
458 public boolean isRequestedSessionIdValid()
459 {
460 HttpSession session = getSession();
461 if(null == session) return false;
462 return true;
463 }
464
465 public boolean isUserInRole(String role)
466 {
467 return ((Boolean)roles.get(role)).booleanValue();
468 }
469
470 public void setUserInRole(String role, boolean isInRole)
471 {
472 roles.put(role, new Boolean(isInRole));
473 }
474
475 public String getCharacterEncoding()
476 {
477 return characterEncoding;
478 }
479
480 public void setCharacterEncoding(String characterEncoding) throws UnsupportedEncodingException
481 {
482 this.characterEncoding = characterEncoding;
483 }
484
485 public int getContentLength()
486 {
487 return contentLength;
488 }
489
490 public void setContentLength(int contentLength)
491 {
492 this.contentLength = contentLength;
493 }
494
495 public String getContentType()
496 {
497 return contentType;
498 }
499
500 public void setContentType(String contentType)
501 {
502 this.contentType = contentType;
503 }
504
505 public String getProtocol()
506 {
507 return protocol;
508 }
509
510 public void setProtocol(String protocol)
511 {
512 this.protocol = protocol;
513 }
514
515 public String getServerName()
516 {
517 return serverName;
518 }
519
520 public void setServerName(String serverName)
521 {
522 this.serverName = serverName;
523 }
524
525 public int getServerPort()
526 {
527 return serverPort;
528 }
529
530 public void setServerPort(int serverPort)
531 {
532 this.serverPort = serverPort;
533 }
534
535 public String getScheme()
536 {
537 return scheme;
538 }
539
540 public void setScheme(String scheme)
541 {
542 this.scheme = scheme;
543 }
544
545 public String getRemoteAddr()
546 {
547 return remoteAddr;
548 }
549
550 public void setRemoteAddr(String remoteAddr)
551 {
552 this.remoteAddr = remoteAddr;
553 }
554
555 public String getRemoteHost()
556 {
557 return remoteHost;
558 }
559
560 public void setRemoteHost(String remoteHost)
561 {
562 this.remoteHost = remoteHost;
563 }
564
565 public BufferedReader getReader() throws IOException
566 {
567 if(null == bodyContent) return null;
568 return new BufferedReader(new StringReader(bodyContent));
569 }
570
571 public ServletInputStream getInputStream() throws IOException
572 {
573 return new MockServletInputStream(bodyContent.getBytes());
574 }
575
576 public void setBodyContent(byte[] data)
577 {
578 setBodyContent(new String(data));
579 }
580
581 public void setBodyContent(String bodyContent)
582 {
583 this.bodyContent = bodyContent;
584 }
585
586 public String getRealPath(String path)
587 {
588 HttpSession session = getSession();
589 if(null == session) return null;
590 return session.getServletContext().getRealPath(path);
591 }
592
593 public boolean isSecure()
594 {
595 String scheme = getScheme();
596 if(null == scheme) return false;
597 return scheme.equals("https");
598 }
599
600 public String getLocalAddr()
601 {
602 return localAddr;
603 }
604
605 public void setLocalAddr(String localAddr)
606 {
607 this.localAddr = localAddr;
608 }
609
610 public String getLocalName()
611 {
612 return localName;
613 }
614
615 public void setLocalName(String localName)
616 {
617 this.localName = localName;
618 }
619
620 public int getLocalPort()
621 {
622 return localPort;
623 }
624
625 public void setLocalPort(int localPort)
626 {
627 this.localPort = localPort;
628 }
629
630 public int getRemotePort()
631 {
632 return remotePort;
633 }
634
635 public void setRemotePort(int remotePort)
636 {
637 this.remotePort = remotePort;
638 }
639
640 private void handleAttributeListenerCalls(String key, Object value, Object oldValue)
641 {
642 if(null != oldValue)
643 {
644 if(value != null)
645 {
646 callAttributeListenersReplacedMethod(key, oldValue);
647 }
648 else
649 {
650 callAttributeListenersRemovedMethod(key, oldValue);
651 }
652 }
653 else
654 {
655 if(value != null)
656 {
657 callAttributeListenersAddedMethod(key, value);
658 }
659
660 }
661 }
662
663 private void callAttributeListenersAddedMethod(String key, Object value)
664 {
665 for(int ii = 0; ii < attributeListener.size(); ii++)
666 {
667 ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(getServletContext(), this, key, value);
668 ((ServletRequestAttributeListener)attributeListener.get(ii)).attributeAdded(event);
669 }
670 }
671
672 private void callAttributeListenersReplacedMethod(String key, Object value)
673 {
674 for(int ii = 0; ii < attributeListener.size(); ii++)
675 {
676 ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(getServletContext(), this, key, value);
677 ((ServletRequestAttributeListener)attributeListener.get(ii)).attributeReplaced(event);
678 }
679 }
680
681 private void callAttributeListenersRemovedMethod(String key, Object value)
682 {
683 for(int ii = 0; ii < attributeListener.size(); ii++)
684 {
685 ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(getServletContext(), this, key, value);
686 ((ServletRequestAttributeListener)attributeListener.get(ii)).attributeRemoved(event);
687 }
688 }
689
690 private ServletContext getServletContext()
691 {
692 if(null == session) return new MockServletContext();
693 return session.getServletContext();
694 }
695 }