package com.ajah.servlet.filter; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import lombok.extern.java.Log; /** * Implementation of {@link HttpServletResponseWrapper} that holds the data for * manipulation typically by a {@link Filter}. * * @author <a href="http://efsavage.com">Eric F. Savage</a>, <a * href="mailto:code@efsavage.com">code@efsavage.com</a>. */ @Log public class GenericResponseWrapper extends HttpServletResponseWrapper { private final ByteArrayOutputStream output; private int contentLength; private String contentType; /** * Public constructor, calls * {@link HttpServletResponseWrapper#HttpServletResponseWrapper(HttpServletResponse)} * and creates alternate output stream. * * @param response */ public GenericResponseWrapper(final HttpServletResponse response) { super(response); this.output = new ByteArrayOutputStream(); this.contentType = response.getContentType(); } /** * Returns the content length. * * @return The content length. */ public int getContentLength() { return this.contentLength; } /** * Returns the content type. * * @see javax.servlet.ServletResponseWrapper#getContentType() */ @Override public String getContentType() { return this.contentType; } /** * Returns the captured output stream as a byte array. * * @return The captured output stream as a byte array. */ public byte[] getData() { return this.output.toByteArray(); } /** * Wraps the output in a {@link FilterServletOutputStream}. * * @see javax.servlet.ServletResponseWrapper#getOutputStream() */ @Override public ServletOutputStream getOutputStream() { return new FilterServletOutputStream(this.output); } /** * Wraps {@link #getOutputStream()} in a {@link PrintWriter}. * * @see javax.servlet.ServletResponseWrapper#getWriter() */ @Override public PrintWriter getWriter() { return new PrintWriter(getOutputStream(), true); } /** * Sets the content length. * * @see javax.servlet.ServletResponseWrapper#setContentLength(int) */ @Override public void setContentLength(final int length) { this.contentLength = length; super.setContentLength(length); } /** * Sets the content type. * * @see javax.servlet.ServletResponseWrapper#setContentType(java.lang.String) */ @Override public void setContentType(final String type) { log.fine("Setting content type to :" + type); this.contentType = type; super.setContentType(type); } }