/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.common.filter;
import org.candlepin.common.util.Util;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* Heavily borrowed from the logback-access package.
*/
public class TeeHttpServletResponse extends HttpServletResponseWrapper
implements BodyLogger {
protected TeeServletOutputStream teeServletOutputStream;
protected PrintWriter teeWriter;
protected Map<String, List<String>> headers = new HashMap<String, List<String>>();
protected int status;
public TeeHttpServletResponse(HttpServletResponse httpServletResponse) {
super(httpServletResponse);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
if (teeServletOutputStream == null) {
teeServletOutputStream = new TeeServletOutputStream(
this.getResponse());
}
return teeServletOutputStream;
}
@Override
public PrintWriter getWriter() throws IOException {
if (this.teeWriter == null) {
this.teeWriter = new PrintWriter(new OutputStreamWriter(
getOutputStream()), true);
}
return this.teeWriter;
}
@Override
public void flushBuffer() {
if (this.teeWriter != null) {
this.teeWriter.flush();
}
}
public byte[] getOutputBuffer() {
// teeServletOutputStream can be null if the getOutputStream method is
// never called.
if (teeServletOutputStream != null) {
return teeServletOutputStream.getOutputStreamAsByteArray();
}
else {
return null;
}
}
public void finish() throws IOException {
if (this.teeWriter != null) {
this.teeWriter.close();
}
if (this.teeServletOutputStream != null) {
this.teeServletOutputStream.close();
}
}
@Override
public String getBody() {
byte[] buff = getOutputBuffer();
if (buff != null) {
if (ServletLogger.showAsText(getContentType())) {
return new String(buff);
}
return StringUtils.abbreviate(Util.toBase64(buff), 100);
}
return "";
}
@Override
public void setHeader(String name, String value) {
List<String> values = new ArrayList<String>(1);
values.add(value);
headers.put(name, values);
super.setHeader(name, value);
}
@Override
public void addHeader(String name, String value) {
List<String> values = headers.get(name);
if (values == null) {
values = new ArrayList<String>();
headers.put(name, values);
}
values.add(value);
super.addHeader(name, value);
}
public Map<String, List<String>> getHeaders() {
return headers;
}
@Override
public void setStatus(int status) {
super.setStatus(status);
this.status = status;
}
@Override
public void setStatus(int status, String sm) {
super.setStatus(status, sm);
this.status = status;
}
public int getStatus() {
return status;
}
}