X-Git-Url: http://juplo.de/gitweb/?a=blobdiff_plain;f=testingtools%2Fsrc%2Fmain%2Fjava%2Fde%2Fjuplo%2Ftestingtools%2FLoggingHttpServletResponseWrapper.java;fp=testingtools%2Fsrc%2Fmain%2Fjava%2Fde%2Fjuplo%2Ftestingtools%2FLoggingHttpServletResponseWrapper.java;h=eb6a0675fd6c0cea2bf0f994ca61c2fed08ea499;hb=a6e0e65cce68acb20abc6ca935471611a740c342;hp=0000000000000000000000000000000000000000;hpb=1d395c6002486d485bde0d5dc713886d70bd3f8a;p=percentcodec diff --git a/testingtools/src/main/java/de/juplo/testingtools/LoggingHttpServletResponseWrapper.java b/testingtools/src/main/java/de/juplo/testingtools/LoggingHttpServletResponseWrapper.java new file mode 100644 index 00000000..eb6a0675 --- /dev/null +++ b/testingtools/src/main/java/de/juplo/testingtools/LoggingHttpServletResponseWrapper.java @@ -0,0 +1,359 @@ +package de.juplo.testingtools; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Date; +import java.util.Locale; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author kai + */ +public class LoggingHttpServletResponseWrapper implements HttpServletResponse { + + private final static Logger log = LoggerFactory.getLogger(LoggingHttpServletResponseWrapper.class); + + public final static int DEFAULT_BUFFER_SIZE = 1024; + + private static long count = 0; + + private final Long no; + private final HttpServletResponse response; + private CountingServletOutputStream out; + private ServletOutputStream stream; + private PrintWriter writer; + private int buffer = DEFAULT_BUFFER_SIZE; + private boolean committed = false; + + + LoggingHttpServletResponseWrapper(String name, HttpServletResponse response) { + no = ++count; + log.debug("New request {}: {}", no, name); + this.response = response; + } + + + public long close() throws IOException { + if (out == null) { + return -1l; + } + else { + if (writer != null) + writer.close(); + else + stream.close(); + long result = out.count; + out = null; + buffer = DEFAULT_BUFFER_SIZE; + return result; + } + } + + @Override + public void flushBuffer() throws IOException { + log.debug("{} -- flushing buffer", no); + committed = true; + response.flushBuffer(); + } + + @Override + public int getBufferSize() { + log.trace("{} -- getting buffer size: {}", no, buffer); + return buffer; + } + + @Override + public boolean isCommitted() { + Boolean result = committed || response.isCommitted(); + log.trace("{} -- commited? {}", no, result); + return result; + } + + @Override + public void reset() { + log.debug("{} -- reset!", no); + if (committed) + throw new IllegalStateException("call to reset() after response has been commited!"); + if (out != null) + out.count = 0; + response.reset(); + } + + @Override + public void resetBuffer() { + log.debug("{} -- resetting buffer", no); + if (committed) + throw new IllegalStateException("call to resetBuffer() after response has been commited!"); + if (out != null) + out.count = 0; + response.resetBuffer(); + } + + @Override + public void setBufferSize(int size) { + log.debug("{} -- setting buffer size to {}", no, size); + if (out != null && out.count > 0) + throw new IllegalStateException("call to setBuffer() after content has been written!"); + response.setBufferSize(size); + buffer = size; + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + log.debug("{} -- getting output stream", no); + + if (writer != null) + throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!"); + + if (stream == null) { + log.debug("{} -- creating new servlet output stream", no); + out = new CountingServletOutputStream(response.getOutputStream()); + stream = out; + } + + return stream; + } + + @Override + public PrintWriter getWriter() throws IOException { + log.debug("{} -- getting print writer", no); + + if (stream != null) + throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!"); + + if (writer == null) { + log.debug("{} -- creating new print writer", no); + out = new CountingServletOutputStream(response.getOutputStream()); + OutputStreamWriter streamWriter = new OutputStreamWriter(out, response.getCharacterEncoding()); + writer = new PrintWriter(streamWriter); + } + + return writer; + } + + @Override + public void addCookie(Cookie cookie) { + log.debug("{} -- adding cookie: {}", no, cookie); + response.addCookie(cookie); + } + + @Override + public boolean containsHeader(String name) { + Boolean result = response.containsHeader(name); + log.trace("{} -- contains header {}? {}", new Object[] { no, name, result }); + return result; + } + + @Override + public String encodeURL(String url) { + log.trace("{} -- encoding url {}", no, url); + return response.encodeURL(url); + } + + @Override + public String encodeRedirectURL(String url) { + log.trace("{} -- encoding redirect url {}", no, url); + return response.encodeRedirectURL(url); + } + + @Override + public String encodeUrl(String url) { + log.trace("{} -- encoding url {}", no, url); + return response.encodeUrl(url); + } + + @Override + public String encodeRedirectUrl(String url) { + log.trace("{} -- encoding redirect url {}", no, url); + return response.encodeRedirectUrl(url); + } + + @Override + public void sendError(int sc, String msg) throws IOException { + log.debug("{} -- sending error: {}. {}", new Object[] { no, sc, msg }); + response.sendError(sc, msg); + } + + @Override + public void sendError(int sc) throws IOException { + log.debug("{} -- sending error: {}", no, sc); + } + + @Override + public void sendRedirect(String location) throws IOException { + log.debug("{} -- sending redirect: {}", no, location); + response.sendRedirect(location); + } + + @Override + public void setDateHeader(String name, long date) { + log.debug("{} -- setting date header {} to {}", new Object[] { no, name, new Date(date) }); + response.setDateHeader(name, date); + } + + @Override + public void addDateHeader(String name, long date) { + log.debug("{} -- adding date header {}: {}", new Object[] { no, name, new Date(date) }); + response.addDateHeader(name, date); + } + + @Override + public void setHeader(String name, String value) { + log.debug("{} -- setting header {} to {}", new Object[] { no, name, value }); + response.setHeader(name, value); + } + + @Override + public void addHeader(String name, String value) { + log.debug("{} -- adding header {}: {}", new Object[] { no, name, value }); + response.addHeader(name, value); + } + + @Override + public void setIntHeader(String name, int value) { + log.debug("{} -- seting int header {} to {}", new Object[] { no, name, value }); + response.setIntHeader(name, value); + } + + @Override + public void addIntHeader(String name, int value) { + log.debug("{} -- adding int header {}: {}", new Object[] { no, name, value }); + response.addIntHeader(name, value); + } + + @Override + public void setStatus(int sc) { + log.debug("{} -- setting status to {}", no, sc); + response.setStatus(sc); + } + + @Override + public void setStatus(int sc, String sm) { + log.debug("{} -- setting status to {} (message: {})", new Object[] { no, sc, sm }); + response.setStatus(sc, sm); + } + + @Override + public String getCharacterEncoding() { + String result = response.getCharacterEncoding(); + log.trace("{} -- character encoding: {}", no, result); + return result; + } + + @Override + public String getContentType() { + String result = response.getContentType(); + log.trace("{} -- content type: {}", no, result); + return result; + } + + @Override + public void setCharacterEncoding(String charset) { + log.debug("{} -- setting character encoding to {}", no, charset); + response.setCharacterEncoding(charset); + } + + @Override + public void setContentLength(int len) { + log.debug("{} -- setting content length to {}", no, len); + response.setContentLength(len); + } + + @Override + public void setContentType(String type) { + log.debug("{} -- setting content type to {}", no, type); + response.setContentType(type); + } + + @Override + public void setLocale(Locale loc) { + log.debug("{} -- setting locale to {}", no, loc); + response.setLocale(loc); + } + + @Override + public Locale getLocale() { + Locale locale = response.getLocale(); + log.trace("{} -- locale: {}", no, locale); + return locale; + } + + @Override + public int getStatus() { + Integer status = response.getStatus(); + log.trace("{} -- status: {}", no, status); + return status; + } + + @Override + public String getHeader(String name) { + String value = response.getHeader(name); + log.trace("{} -- header \"{}\": {}", new Object[] { no, name, value }); + return value; + } + + @Override + public Collection getHeaders(String name) { + Collection values = response.getHeaders(name); + if (log.isTraceEnabled()) { + StringBuilder builder = new StringBuilder(); + builder.append(no); + builder.append(" -- headers \""); + builder.append(name); + builder.append("\":"); + for (String value : values) { + builder.append(' '); + builder.append(value); + } + log.trace(builder.toString()); + } + return values; + } + + @Override + public Collection getHeaderNames() { + Collection values = response.getHeaderNames(); + if (log.isTraceEnabled()) { + StringBuilder builder = new StringBuilder(); + builder.append(no); + builder.append(" -- header-names:"); + for (String value : values) { + builder.append(' '); + builder.append(value); + } + log.trace(builder.toString()); + } + return values; + } + + + class CountingServletOutputStream extends ServletOutputStream { + + private ServletOutputStream out; + long count = 0l; + + + CountingServletOutputStream(ServletOutputStream out) { + this.out = out; + } + + + @Override + public void write(int i) throws IOException { + count++; + /** Simulate commit, when count is getting bigger then buffer */ + if (count == buffer + 1) { + log.info("{} -- simulating commit because buffer overflow! buffer: {}, count: {}", new Object[] { no, buffer, count }); + committed = true; + } + log.trace("{} -- writing byte {}: {}", new Object[] { no, count, (char)i }); + out.write(i); + } + } +}