1 package de.halbekunst.juplo.test;
3 import java.io.IOException;
4 import java.io.OutputStreamWriter;
5 import java.io.PrintWriter;
6 import java.util.Collection;
8 import java.util.Locale;
9 import javax.servlet.ServletOutputStream;
10 import javax.servlet.http.Cookie;
11 import javax.servlet.http.HttpServletResponse;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
18 public class LoggingHttpServletResponseWrapper implements HttpServletResponse {
20 private final static Logger log = LoggerFactory.getLogger(LoggingHttpServletResponseWrapper.class);
22 public final static int DEFAULT_BUFFER_SIZE = 1024;
24 private static long count = 0;
26 private final Long no;
27 private final HttpServletResponse response;
28 private CountingServletOutputStream out;
29 private ServletOutputStream stream;
30 private PrintWriter writer;
31 private int buffer = DEFAULT_BUFFER_SIZE;
32 private boolean committed = false;
35 LoggingHttpServletResponseWrapper(String name, HttpServletResponse response) {
37 log.debug("New request {}: {}", no, name);
38 this.response = response;
42 public long close() throws IOException {
51 long result = out.count;
53 buffer = DEFAULT_BUFFER_SIZE;
59 public void flushBuffer() throws IOException {
60 log.debug("{} -- flushing buffer", no);
62 response.flushBuffer();
66 public int getBufferSize() {
67 log.trace("{} -- getting buffer size: {}", no, buffer);
72 public boolean isCommitted() {
73 Boolean result = committed || response.isCommitted();
74 log.trace("{} -- commited? {}", no, result);
80 log.debug("{} -- reset!", no);
82 throw new IllegalStateException("call to reset() after response has been commited!");
89 public void resetBuffer() {
90 log.debug("{} -- resetting buffer", no);
92 throw new IllegalStateException("call to resetBuffer() after response has been commited!");
95 response.resetBuffer();
99 public void setBufferSize(int size) {
100 log.debug("{} -- setting buffer size to {}", no, size);
101 if (out != null && out.count > 0)
102 throw new IllegalStateException("call to setBuffer() after content has been written!");
103 response.setBufferSize(size);
108 public ServletOutputStream getOutputStream() throws IOException {
109 log.debug("{} -- getting output stream", no);
112 throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
114 if (stream == null) {
115 log.debug("{} -- creating new servlet output stream", no);
116 out = new CountingServletOutputStream(response.getOutputStream());
124 public PrintWriter getWriter() throws IOException {
125 log.debug("{} -- getting print writer", no);
128 throw new IllegalStateException("ServletOutputStream and PrintWriter cannot be requested both!");
130 if (writer == null) {
131 log.debug("{} -- creating new print writer", no);
132 out = new CountingServletOutputStream(response.getOutputStream());
133 OutputStreamWriter streamWriter = new OutputStreamWriter(out, response.getCharacterEncoding());
134 writer = new PrintWriter(streamWriter);
141 public void addCookie(Cookie cookie) {
142 log.debug("{} -- adding cookie: {}", no, cookie);
143 response.addCookie(cookie);
147 public boolean containsHeader(String name) {
148 Boolean result = response.containsHeader(name);
149 log.trace("{} -- contains header {}? {}", new Object[] { no, name, result });
154 public String encodeURL(String url) {
155 log.trace("{} -- encoding url {}", no, url);
156 return response.encodeURL(url);
160 public String encodeRedirectURL(String url) {
161 log.trace("{} -- encoding redirect url {}", no, url);
162 return response.encodeRedirectURL(url);
166 public String encodeUrl(String url) {
167 log.trace("{} -- encoding url {}", no, url);
168 return response.encodeUrl(url);
172 public String encodeRedirectUrl(String url) {
173 log.trace("{} -- encoding redirect url {}", no, url);
174 return response.encodeRedirectUrl(url);
178 public void sendError(int sc, String msg) throws IOException {
179 log.debug("{} -- sending error: {}. {}", new Object[] { no, sc, msg });
180 response.sendError(sc, msg);
184 public void sendError(int sc) throws IOException {
185 log.debug("{} -- sending error: {}", no, sc);
189 public void sendRedirect(String location) throws IOException {
190 log.debug("{} -- sending redirect: {}", no, location);
191 response.sendRedirect(location);
195 public void setDateHeader(String name, long date) {
196 log.debug("{} -- setting date header {} to {}", new Object[] { no, name, new Date(date) });
197 response.setDateHeader(name, date);
201 public void addDateHeader(String name, long date) {
202 log.debug("{} -- adding date header {}: {}", new Object[] { no, name, new Date(date) });
203 response.addDateHeader(name, date);
207 public void setHeader(String name, String value) {
208 log.debug("{} -- setting header {} to {}", new Object[] { no, name, value });
209 response.setHeader(name, value);
213 public void addHeader(String name, String value) {
214 log.debug("{} -- adding header {}: {}", new Object[] { no, name, value });
215 response.addHeader(name, value);
219 public void setIntHeader(String name, int value) {
220 log.debug("{} -- seting int header {} to {}", new Object[] { no, name, value });
221 response.setIntHeader(name, value);
225 public void addIntHeader(String name, int value) {
226 log.debug("{} -- adding int header {}: {}", new Object[] { no, name, value });
227 response.addIntHeader(name, value);
231 public void setStatus(int sc) {
232 log.debug("{} -- setting status to {}", no, sc);
233 response.setStatus(sc);
237 public void setStatus(int sc, String sm) {
238 log.debug("{} -- setting status to {} (message: {})", new Object[] { no, sc, sm });
239 response.setStatus(sc, sm);
243 public String getCharacterEncoding() {
244 String result = response.getCharacterEncoding();
245 log.trace("{} -- character encoding: {}", no, result);
250 public String getContentType() {
251 String result = response.getContentType();
252 log.trace("{} -- content type: {}", no, result);
257 public void setCharacterEncoding(String charset) {
258 log.debug("{} -- setting character encoding to {}", no, charset);
259 response.setCharacterEncoding(charset);
263 public void setContentLength(int len) {
264 log.debug("{} -- setting content length to {}", no, len);
265 response.setContentLength(len);
269 public void setContentType(String type) {
270 log.debug("{} -- setting content type to {}", no, type);
271 response.setContentType(type);
275 public void setLocale(Locale loc) {
276 log.debug("{} -- setting locale to {}", no, loc);
277 response.setLocale(loc);
281 public Locale getLocale() {
282 Locale locale = response.getLocale();
283 log.trace("{} -- locale: {}", no, locale);
288 public int getStatus() {
289 Integer status = response.getStatus();
290 log.trace("{} -- status: {}", no, status);
295 public String getHeader(String name) {
296 String value = response.getHeader(name);
297 log.trace("{} -- header \"{}\": {}", new Object[] { no, name, value });
302 public Collection<String> getHeaders(String name) {
303 Collection<String> values = response.getHeaders(name);
304 if (log.isTraceEnabled()) {
305 StringBuilder builder = new StringBuilder();
307 builder.append(" -- headers \"");
308 builder.append(name);
309 builder.append("\":");
310 for (String value : values) {
312 builder.append(value);
314 log.trace(builder.toString());
320 public Collection<String> getHeaderNames() {
321 Collection<String> values = response.getHeaderNames();
322 if (log.isTraceEnabled()) {
323 StringBuilder builder = new StringBuilder();
325 builder.append(" -- header-names:");
326 for (String value : values) {
328 builder.append(value);
330 log.trace(builder.toString());
336 class CountingServletOutputStream extends ServletOutputStream {
338 private ServletOutputStream out;
342 CountingServletOutputStream(ServletOutputStream out) {
348 public void write(int i) throws IOException {
350 /** Simulate commit, when count is getting bigger then buffer */
351 if (count == buffer + 1) {
352 log.info("{} -- simulating commit because buffer overflow! buffer: {}, count: {}", new Object[] { no, buffer, count });
355 log.trace("{} -- writing byte {}: {}", new Object[] { no, count, (char)i });