package org.jboss.pitbull.servlet.internal; import org.jboss.pitbull.ContentOutputStream; import org.jboss.pitbull.StatusCode; import org.jboss.pitbull.server.handlers.stream.StreamedResponse; import org.jboss.pitbull.internal.NotImplementedYetException; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Collection; import java.util.Locale; import java.util.Map; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class HttpServletResponseImpl implements HttpServletResponse { protected boolean committed; protected StreamedResponse streamedResponse; public HttpServletResponseImpl(StreamedResponse streamResponseWriter) { this.streamedResponse = streamResponseWriter; } @Override public void addCookie(Cookie cookie) { StringBuffer buf = new StringBuffer(); ServerCookie.appendCookieValue(buf, cookie.getVersion(), cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getDomain(), cookie.getComment(), cookie.getMaxAge(), cookie.getSecure(), cookie.isHttpOnly()); addHeader("Set-Cookie", buf.toString()); } @Override public boolean containsHeader(String name) { return streamedResponse.getHeaders().containsHeader(name); } @Override public String encodeURL(String url) { throw new NotImplementedYetException(); } @Override public String encodeRedirectURL(String url) { throw new NotImplementedYetException(); } @Override public String encodeUrl(String url) { throw new NotImplementedYetException(); } @Override public String encodeRedirectUrl(String url) { throw new NotImplementedYetException(); } @Override public void sendError(int sc, String msg) throws IOException { if (isCommitted()) { throw new IllegalStateException("Response is committed"); } setStatus(sc); streamedResponse.getHeaders().clear(); setContentType("text/html"); getUnderlyingStream().reset(); StringBuilder builder = new StringBuilder("<html><body><h1>Server Error</h1>"); builder.append("<p>Error code: ").append(sc).append("</p><p>"); builder.append(msg); builder.append("</p></body></html>"); getUnderlyingStream().write(builder.toString().getBytes()); } @Override public void sendError(int sc) throws IOException { // todo error page.html if (isCommitted()) { throw new IllegalStateException("Response is committed"); } setStatus(sc); streamedResponse.getHeaders().clear(); setContentType("text/html"); getUnderlyingStream().reset(); StringBuilder builder = new StringBuilder("<html><body><h1>Server Error</h1>"); builder.append("<p>Error code: ").append(sc).append("</p><p>"); builder.append("</p></body></html>"); getUnderlyingStream().write(builder.toString().getBytes()); } @Override public void sendRedirect(String location) throws IOException { throw new NotImplementedYetException(); } @Override public void setDateHeader(String name, long date) { throw new NotImplementedYetException(); } @Override public void addDateHeader(String name, long date) { throw new NotImplementedYetException(); } @Override public void setHeader(String name, String value) { streamedResponse.getHeaders().setHeader(name, value); } private static class HeaderEntry implements Map.Entry<String, String> { private String name; private String value; private HeaderEntry(String name, String value) { this.name = name; this.value = value; } @Override public String getKey() { return name; } @Override public String getValue() { return value; } @Override public String setValue(String s) { return value = s; } } @Override public void addHeader(String name, String value) { streamedResponse.getHeaders().addHeader(name, value); } @Override public void setIntHeader(String name, int value) { throw new NotImplementedYetException(); } @Override public void addIntHeader(String name, int value) { throw new NotImplementedYetException(); } @Override public void setStatus(int sc) { StatusCode code = StatusCode.valueOf(sc); if (code == null) { code = StatusCode.create(sc, "Undefined Code"); } streamedResponse.setStatus(code); } @Override public void setStatus(int sc, String sm) { throw new NotImplementedYetException(); } @Override public int getStatus() { return streamedResponse.getStatusCode().getCode(); } @Override public String getHeader(String name) { return streamedResponse.getHeaders().getFirstHeader(name); } @Override public Collection<String> getHeaders(String name) { return streamedResponse.getHeaders().getHeaderValues(name); } @Override public Collection<String> getHeaderNames() { return streamedResponse.getHeaders().getHeaderNames(); } @Override public String getCharacterEncoding() { throw new NotImplementedYetException(); } @Override public String getContentType() { throw new NotImplementedYetException(); } protected ContentOutputStream getUnderlyingStream() { return streamedResponse.getOutputStream(); } @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(byte[] bytes) throws IOException { getUnderlyingStream().write(bytes); } @Override public void write(byte[] bytes, int i, int i1) throws IOException { getUnderlyingStream().write(bytes, i, i1); } @Override public void flush() throws IOException { getUnderlyingStream().flush(); } @Override public void close() throws IOException { getUnderlyingStream().close(); super.close(); } @Override public void write(int i) throws IOException { getUnderlyingStream().write(i); } }; } @Override public PrintWriter getWriter() throws IOException { throw new NotImplementedYetException(); } @Override public void setCharacterEncoding(String charset) { throw new NotImplementedYetException(); } @Override public void setContentLength(int len) { throw new NotImplementedYetException(); } @Override public void setContentType(String type) { setHeader("Content-Type", type); } @Override public void setBufferSize(int size) { getUnderlyingStream().setBufferSize(size); } @Override public int getBufferSize() { return getUnderlyingStream().getBufferSize(); } @Override public void flushBuffer() throws IOException { getUnderlyingStream().flush(); } @Override public void resetBuffer() { getUnderlyingStream().reset(); } @Override public boolean isCommitted() { return committed; } @Override public void reset() { getUnderlyingStream().reset(); } @Override public void setLocale(Locale loc) { throw new NotImplementedYetException(); } @Override public Locale getLocale() { throw new NotImplementedYetException(); } }