package de.axone.web;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public class TestHttpServletResponse implements HttpServletResponse {
@Override
public void addCookie( Cookie cookie ) {
cookies.add( cookie );
}
private List<Cookie> cookies = new LinkedList<Cookie>();
public List<Cookie> getCookies(){
return cookies;
}
private Map<String,Long> dateHeaders = new HashMap<String,Long>();
public Map<String,Long> getDateHeaders(){
return dateHeaders;
}
@Override
public void addDateHeader( String key, long value ) {
dateHeaders.put( key, value );
}
@Override
public void setDateHeader( String key, long value ) {
addDateHeader( key, value );
}
private Map<String,String> headers = new HashMap<String,String>();
public Map<String,String> getHeaders(){
return headers;
}
@Override
public void addHeader( String key, String value ) {
headers.put( key, value );
}
@Override
public void setHeader( String key, String value ) {
addHeader( key, value );
}
@Override
public void addIntHeader( String key, int value ) {
headers.put( key, ""+value );
}
@Override
public void setIntHeader( String key, int value ) {
addIntHeader( key, value );
}
@Override
public boolean containsHeader( String key ) {
return headers.containsKey( key );
}
@Override
public String encodeRedirectURL( String url ) {
return "[R" + url + "R]";
}
@Override
@Deprecated
public String encodeRedirectUrl( String url ) {
return encodeRedirectURL( url );
}
@Override
public String encodeURL( String url ) {
return "[E" + url + "E]";
}
@Override
@Deprecated
public String encodeUrl( String url ) {
return encodeURL( url );
}
@Override
public void sendError( int code ) throws IOException {
errorCode = code;
}
private int errorCode = -1;
private String errorMessage;
@Override
public void sendError( int code, String message ) throws IOException {
this.errorCode = code;
this.errorMessage = message;
}
public boolean hasError(){
return errorCode > 0;
}
public int getErrorCode(){
return errorCode;
}
public String getErrorMessage(){
return errorMessage;
}
@Override
public void sendRedirect( String redirect ) throws IOException {
this.redirect = redirect;
}
private String redirect;
public String getRedirect(){
return redirect;
}
@Override
public void setStatus( int code ) {
this.statusCode = code;
}
private int statusCode = -1;
private String statusMessage;
@Override
public void setStatus( int code, String message ) {
this.statusCode = code;
this.statusMessage = message;
}
public boolean hasStatus(){
return statusCode > 0;
}
public int getStatusCode(){
return statusCode;
}
public String getStatusMessage(){
return statusMessage;
}
@Override
public void flushBuffer() throws IOException {
}
@Override
public int getBufferSize() {
return bufferSize;
}
private int bufferSize;
@Override
public void setBufferSize( int bufferSize ){
this.bufferSize = bufferSize;
}
@Override
public String getCharacterEncoding() {
return characterEncoding;
}
private String characterEncoding;
@Override
public void setCharacterEncoding( String characterEncoding ) {
this.characterEncoding = characterEncoding;
}
@Override
public String getContentType() {
return contentType;
}
private String contentType;
@Override
public void setContentType( String contentType ) {
this.contentType = contentType;
}
@Override
public Locale getLocale() {
return locale;
}
private Locale locale;
@Override
public void setLocale( Locale locale ) {
this.locale = locale;
}
/* -------------------------------- */
private StringBuilder content = new StringBuilder();
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new TestServletOutputStream();
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter( new TestWriter() );
}
@Override
public boolean isCommitted() {
return false;
}
@Override
public void reset() {
}
@Override
public void resetBuffer() {
content = new StringBuilder();
}
@Override
public void setContentLength( int contentLength ) {
this.contentLength = contentLength;
}
private int contentLength;
public int getContentLength(){
return contentLength;
}
public String getContent(){
return content.toString();
}
/* -------------------------------- */
private class TestServletOutputStream extends ServletOutputStream {
@Override
public void write( int b ) throws IOException {
content.append( (char) b );
}
}
private class TestWriter extends Writer {
@Override
public void close() throws IOException {}
@Override
public void flush() throws IOException {}
@Override
public void write( char[] cbuf, int off, int len ) throws IOException {
content.append( cbuf, off, len );
}
}
/* Since 3.0 -------------------------------------------- */
@Override
public int getStatus() {
return statusCode;
}
@Override
public String getHeader( String name ) {
return headers.get( name );
}
@Override
public Collection<String> getHeaders( String name ) {
//TODO: Das sollte an die Spec angeglichen werden. u.a. fehlen hier die date headers
return Arrays.asList( headers.get( name ) );
}
@Override
public Collection<String> getHeaderNames() {
return headers.keySet();
}
}