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