001 package com.mockrunner.mock.web; 002 003 import java.io.IOException; 004 import java.io.OutputStreamWriter; 005 import java.io.PrintWriter; 006 import java.io.UnsupportedEncodingException; 007 import java.text.SimpleDateFormat; 008 import java.util.ArrayList; 009 import java.util.Date; 010 import java.util.Enumeration; 011 import java.util.List; 012 import java.util.Locale; 013 import java.util.Map; 014 import java.util.TimeZone; 015 import java.util.Vector; 016 017 import javax.servlet.ServletOutputStream; 018 import javax.servlet.http.Cookie; 019 import javax.servlet.http.HttpServletResponse; 020 021 import com.mockrunner.base.NestedApplicationException; 022 import com.mockrunner.util.common.CaseAwareMap; 023 024 /** 025 * Mock implementation of <code>HttpServletResponse</code>. 026 */ 027 public class MockHttpServletResponse implements HttpServletResponse 028 { 029 private PrintWriter writer; 030 private MockServletOutputStream outputStream; 031 private Map headers; 032 private Locale locale; 033 private String characterEncoding; 034 private int bufferSize; 035 private boolean wasErrorSent; 036 private boolean wasRedirectSent; 037 private int errorCode; 038 private int statusCode; 039 private List cookies; 040 041 public MockHttpServletResponse() 042 { 043 resetAll(); 044 } 045 046 /** 047 * Resets the state of this object to the default values 048 */ 049 public void resetAll() 050 { 051 headers = new CaseAwareMap(); 052 characterEncoding = "ISO-8859-1"; 053 bufferSize = 8192; 054 wasErrorSent = false; 055 wasRedirectSent = false; 056 errorCode = SC_OK; 057 statusCode = SC_OK; 058 cookies = new ArrayList(); 059 outputStream = new MockServletOutputStream(characterEncoding); 060 try 061 { 062 writer = new PrintWriter(new OutputStreamWriter(outputStream, characterEncoding), true); 063 } 064 catch(UnsupportedEncodingException exc) 065 { 066 throw new NestedApplicationException(exc); 067 } 068 } 069 070 public String encodeURL(String url) 071 { 072 return url; 073 } 074 075 public String encodeRedirectUrl(String url) 076 { 077 return url; 078 } 079 080 public String encodeRedirectURL(String url) 081 { 082 return url; 083 } 084 085 public String encodeUrl(String url) 086 { 087 return url; 088 } 089 090 public PrintWriter getWriter() throws IOException 091 { 092 return writer; 093 } 094 095 public ServletOutputStream getOutputStream() throws IOException 096 { 097 return outputStream; 098 } 099 100 public String getOutputStreamContent() 101 { 102 return outputStream.getContent(); 103 } 104 105 public void addCookie(Cookie cookie) 106 { 107 cookies.add(cookie); 108 } 109 110 public void addDateHeader(String key, long date) 111 { 112 addHeader(key, getDateString(date)); 113 } 114 115 public void addHeader(String key, String value) 116 { 117 List valueList = (List) headers.get(key); 118 if (null == valueList) 119 { 120 valueList = new ArrayList(); 121 headers.put(key, valueList); 122 } 123 valueList.add(value); 124 } 125 126 public void addIntHeader(String key, int value) 127 { 128 String stringValue = new Integer(value).toString(); 129 addHeader(key, stringValue); 130 } 131 132 public boolean containsHeader(String key) 133 { 134 return headers.containsKey(key); 135 } 136 137 public void sendError(int code, String message) throws IOException 138 { 139 errorCode = code; 140 wasErrorSent = true; 141 } 142 143 public void sendError(int code) throws IOException 144 { 145 errorCode = code; 146 wasErrorSent = true; 147 } 148 149 public void sendRedirect(String location) throws IOException 150 { 151 setHeader("Location", location); 152 wasRedirectSent = true; 153 } 154 155 public void setDateHeader(String key, long date) 156 { 157 setHeader(key, getDateString(date)); 158 } 159 160 public void setHeader(String key, String value) 161 { 162 List valueList = new ArrayList(); 163 headers.put(key, valueList); 164 valueList.add(value); 165 } 166 167 public void setIntHeader(String key, int value) 168 { 169 String stringValue = new Integer(value).toString(); 170 setHeader(key, stringValue); 171 } 172 173 public void setStatus(int code, String message) 174 { 175 statusCode = code; 176 } 177 178 public void setStatus(int code) 179 { 180 statusCode = code; 181 } 182 183 public void flushBuffer() throws IOException 184 { 185 writer.flush(); 186 outputStream.flush(); 187 } 188 189 public int getBufferSize() 190 { 191 return bufferSize; 192 } 193 194 public String getCharacterEncoding() 195 { 196 return characterEncoding; 197 } 198 199 public void setCharacterEncoding(String encoding) 200 { 201 characterEncoding = encoding; 202 outputStream.setEncoding(encoding); 203 } 204 205 public Locale getLocale() 206 { 207 return locale; 208 } 209 210 public void setLocale(Locale locale) 211 { 212 this.locale = locale; 213 } 214 215 public boolean isCommitted() 216 { 217 return false; 218 } 219 220 public void reset() 221 { 222 errorCode = SC_OK; 223 statusCode = SC_OK; 224 clearHeaders(); 225 resetBuffer(); 226 } 227 228 public void resetBuffer() 229 { 230 outputStream.clearContent(); 231 } 232 233 public void clearHeaders() 234 { 235 headers.clear(); 236 } 237 238 public void setBufferSize(int size) 239 { 240 bufferSize = size; 241 } 242 243 public void setContentLength(int length) 244 { 245 setIntHeader("Content-Length", length); 246 } 247 248 public String getContentType() 249 { 250 return getHeader("Content-Type"); 251 } 252 253 public void setContentType(String type) 254 { 255 setHeader("Content-Type", type); 256 } 257 258 public Enumeration getHeaderNames() 259 { 260 return new Vector(headers.keySet()).elements(); 261 } 262 263 public List getHeaderList(String key) 264 { 265 return (List)headers.get(key); 266 } 267 268 public String getHeader(String key) 269 { 270 List list = getHeaderList(key); 271 if(null == list || 0 == list.size()) return null; 272 return (String)list.get(0); 273 } 274 275 public int getStatusCode() 276 { 277 return statusCode; 278 } 279 280 public int getErrorCode() 281 { 282 return errorCode; 283 } 284 285 public List getCookies() 286 { 287 return cookies; 288 } 289 290 public boolean wasErrorSent() 291 { 292 return wasErrorSent; 293 } 294 295 public boolean wasRedirectSent() 296 { 297 return wasRedirectSent; 298 } 299 300 private String getDateString(long date) 301 { 302 Date dateValue = new Date(date); 303 SimpleDateFormat dateFormat = new SimpleDateFormat(WebConstants.DATE_FORMAT_HEADER, Locale.US); 304 dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 305 return dateFormat.format(dateValue); 306 } 307 }