/** * */ package org.jboss.test.faces.staging; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.logging.Logger; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; /** * @author asmirnov * */ abstract class StagingHttpResponse implements HttpServletResponse { private static final Logger log = ServerLogger.CONNECTION.getLogger(); private int status = 200; private String redirectLocation = null; private String errorMessage = null; private int bufferSize = 8196; private StringWriter outputWriter; private ByteArrayOutputStream outputStream; private PrintWriter printWriter; private ServletOutputStream servletOutputStream; private Locale locale = Locale.US; private String contentType="text"; private int contentLength = Integer.MIN_VALUE; private String encoding = StagingHttpRequest.UTF8; private final Map<String, String[]> headers= new HashMap<String, String[]>(); /** * @return the headers */ Map<String, String[]> getHeaders() { return headers; } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, * long) */ public void addDateHeader(String name, long date) { // TODO - locale support ? addHeader(name, new Date(date).toString()); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, * java.lang.String) */ public void addHeader(String name, String value) { String[] values = headers.get(name); if (null == values) { values = new String[1]; } else { String[] newValues = new String[values.length + 1]; System.arraycopy(values, 0, newValues, 0, values.length); values = newValues; } values[values.length - 1] = value; headers.put(name, values); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, * int) */ public void addIntHeader(String name, int value) { addHeader(name, String.valueOf(value)); } public void addCookie(Cookie cookie) { StringBuilder content = new StringBuilder(); String name = cookie.getName(); String value = cookie.getValue(); if(null !=name && null !=value){ content.append(name).append('=').append(value); if(null != cookie.getPath()){ content.append("; path=").append(cookie.getPath()); } if(null != cookie.getDomain()){ content.append("; domain=").append(cookie.getDomain()); } } addHeader("Set-Cookie", content.toString()); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String) */ public boolean containsHeader(String name) { return headers.containsKey(name); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String * ) */ public String encodeRedirectURL(String url) { return url; } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String * ) */ public String encodeRedirectUrl(String url) { return encodeRedirectURL(url); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String) */ public String encodeURL(String url) { return url; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String) */ public String encodeUrl(String url) { return encodeURL(url); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#sendError(int) */ public void sendError(int sc) throws IOException { status = sc; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#sendError(int, * java.lang.String) */ public void sendError(int sc, String msg) throws IOException { status = sc; errorMessage = msg; } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String) */ public void sendRedirect(String location) throws IOException { redirectLocation = location; } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, * long) */ public void setDateHeader(String name, long date) { // TODO - locale support ? setHeader(name, new Date(date).toString()); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, * java.lang.String) */ public void setHeader(String name, String value) { headers.put(name, new String[]{value}); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, * int) */ public void setIntHeader(String name, int value) { setHeader(name, String.valueOf(value)); } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#setStatus(int) */ public void setStatus(int sc) { status = sc; } /* * (non-Javadoc) * * @see javax.servlet.http.HttpServletResponse#setStatus(int, * java.lang.String) */ public void setStatus(int sc, String sm) { status = sc; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#flushBuffer() */ public void flushBuffer() throws IOException { // do nothing log.info("unimplemented response method flushBuffer"); } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getBufferSize() */ public int getBufferSize() { return bufferSize; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getCharacterEncoding() */ public String getCharacterEncoding() { return encoding; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getContentType() */ public String getContentType() { return contentType; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getLocale() */ public Locale getLocale() { return locale; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getOutputStream() */ public ServletOutputStream getOutputStream() throws IOException { if (null != this.outputWriter) { throw new IllegalStateException(); } if (this.outputStream == null) { this.outputStream = new ByteArrayOutputStream(getBufferSize()); servletOutputStream = new ServletOutputStream(){ @Override public void write(int b) throws IOException { StagingHttpResponse.this.outputStream.write(b); } }; } return servletOutputStream; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#getWriter() */ public PrintWriter getWriter() throws IOException { if (null != this.outputStream) { throw new IllegalStateException(); } if (this.outputWriter == null) { this.outputWriter = new StringWriter(getBufferSize()); printWriter = new PrintWriter(outputWriter); } return printWriter; } public String getWriterContent() { if(null != this.outputWriter){ return this.outputWriter.toString(); } return null; } public byte[] getStreamContent() { if(null!=outputStream){ return outputStream.toByteArray(); } return null; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#isCommitted() */ public boolean isCommitted() { // TODO Auto-generated method stub log.info("unimplemented response method isCommited"); return false; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#reset() */ public void reset() { if(isCommitted()){ throw new IllegalStateException(); } resetBuffer(); } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#resetBuffer() */ public void resetBuffer() { if(isCommitted()){ throw new IllegalStateException(); } this.servletOutputStream = null; this.outputStream = null; this.printWriter = null; this.outputWriter = null; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#setBufferSize(int) */ public void setBufferSize(int size) { this.bufferSize = size; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#setCharacterEncoding(java.lang.String) */ public void setCharacterEncoding(String charset) { encoding = charset; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#setContentLength(int) */ public void setContentLength(int len) { this.contentLength = len; } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#setContentType(java.lang.String) */ public void setContentType(String type) { if(null == type){ throw new NullPointerException(); } int i = type.indexOf(';'); if(i>=0){ setHeader("Content-Type", type); contentType = type.substring(0, i).trim(); i=type.lastIndexOf('='); if(i>=0){ setCharacterEncoding(type.substring(i+1).trim()); } } else { setHeader("Content-Type", type+";charset="+getCharacterEncoding()); contentType = type; } } /* * (non-Javadoc) * * @see javax.servlet.ServletResponse#setLocale(java.util.Locale) */ public void setLocale(Locale loc) { this.locale = loc; } /** * @return the status */ public int getStatus() { return status; } /* (non-Javadoc) * @see javax.servlet.http.HttpServletResponse#getHeader(java.lang.String) */ public String getHeader(String arg0) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see javax.servlet.http.HttpServletResponse#getHeaderNames() */ public Collection<String> getHeaderNames() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see javax.servlet.http.HttpServletResponse#getHeaders(java.lang.String) */ public Collection<String> getHeaders(String arg0) { // TODO Auto-generated method stub return null; } /** * @return the contentLength */ int getContentLength() { return contentLength; } /** * @return the redirectLocation */ String getRedirectLocation() { return redirectLocation; } /** * @return the errorMessage */ String getErrorMessage() { return errorMessage; } }