package org.nutz.mock.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponseWrapper; import org.nutz.castor.Castors; import org.nutz.lang.Encoding; import org.nutz.lang.Lang; import org.nutz.mock.Mock; public class MockHttpServletResponse extends HttpServletResponseWrapper { protected ByteArrayOutputStream stream = new ByteArrayOutputStream(); protected PrintWriter writer; protected Map<String, String> headers; protected Set<Cookie> cookies; protected int status; protected String statusMessage; protected Locale locale; protected String contentType; public MockHttpServletResponse() { super(Mock.EmtryHttpServletResponse); headers = new HashMap<String, String>(); cookies = new HashSet<Cookie>(); status = 200; statusMessage = "OK"; } public void addCookie(Cookie cookie) { cookies.add(cookie); } public void addDateHeader(String key, long value) { headers.put(key, "" + value); } public void addHeader(String key, String value) { headers.put(key, value); } public void addIntHeader(String key, int value) { headers.put(key, "" + value); } public boolean containsHeader(String key) { return headers.containsKey(key); } public void sendError(int error) throws IOException { this.setStatus(error); } public void sendError(int arg0, String arg1) throws IOException { this.setStatus(arg0, arg1); } public void sendRedirect(String value) throws IOException { headers.put("Location", "" + value); } public void setDateHeader(String key, long value) { headers.put(key, "" + value); } public void setHeader(String key, String value) { headers.put(key, value); } public void setIntHeader(String key, int value) { headers.put(key, "" + value); } public void setStatus(int status) { this.status = status; } public void setStatus(int status, String statusMessage) { this.status = status; this.statusMessage = statusMessage; } public void flushBuffer() throws IOException { getWriter().flush(); } public int getBufferSize() { return stream.size(); } public String getCharacterEncoding() { return characterEncoding; } public String getContentType() { return contentType; } public Locale getLocale() { return locale; } public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(int arg0) throws IOException { stream.write(arg0); } }; } public PrintWriter getWriter() throws IOException { if (writer == null) { writer = new PrintWriter(new OutputStreamWriter(stream, characterEncoding)); } return writer; } public void reset() { stream.reset(); } public void resetBuffer() { stream.reset(); } protected String characterEncoding = Encoding.defaultEncoding(); public void setCharacterEncoding(String characterEncoding) { this.characterEncoding = characterEncoding; } public void setContentType(String contentType) { this.contentType = contentType; } public void setLocale(Locale locale) { this.locale = locale; } public int getStatus() { return status; } public String getStatusMessage() { return statusMessage; } public String getAsString() { try { getWriter().flush(); return stream.toString(characterEncoding); } catch (UnsupportedEncodingException e) { throw Lang.wrapThrow(e); } catch (IOException e) { throw Lang.wrapThrow(e); } } public int getAsInt() { return Integer.parseInt(getAsString()); } public long getAsLong() { return Long.parseLong(getAsString()); } public <T> T getAs(Class<T> type) { return Castors.me().castTo(getAsString(), type); } public String getHeader(String key) { return headers.get(key); } }