package org.phms.sling.handlebars.helper.include;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class StringResponseWrapper extends HttpServletResponseWrapper implements AutoCloseable {
private BufferedServletOutputStream bufferedOut = new BufferedServletOutputStream();
private PrintWriter writer;
StringResponseWrapper(final HttpServletResponse response) {
super(response);
}
public String getStringOutput() throws IOException {
flushBuffer();
return bufferedOut.toString(getCharacterEncoding());
}
@Override
public void flushBuffer() throws IOException {
if (writer != null) {
writer.flush();
} else {
super.flushBuffer();
}
}
@Override
public PrintWriter getWriter() throws IOException {
if (writer == null) {
writer = new PrintWriter(new OutputStreamWriter(bufferedOut, super.getCharacterEncoding()));
}
return writer;
}
@Override
public void close() throws IOException {
bufferedOut.close();
}
private static class BufferedServletOutputStream extends ServletOutputStream {
private final ByteArrayOutputStream baops = new ByteArrayOutputStream();
public String toString(String charset) throws IOException {
return baops.toString(charset);
}
@Override
public void close() throws IOException {
baops.reset();
super.close();
}
@Override
public void write(final int b) throws IOException {
baops.write(b);
}
}
}