/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.portlet.rendering;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import org.apache.commons.io.output.StringBuilderWriter;
import org.apache.commons.io.output.WriterOutputStream;
/**
* PortletOutputHandler that stores all content written to a string. Requires that an encoding be
* specified in case the portlet writes to the output stream.
*
*/
public class RenderPortletOutputHandler implements PortletOutputHandler {
private final StringBuilderWriter writer = new StringBuilderWriter();
private final PrintWriter printWriter = new PrintWriter(this.writer);
private final String characterEncoding;
private OutputStream writerOutputStream;
private int bufferSize = Integer.MAX_VALUE;
private String contentType;
public RenderPortletOutputHandler(String characterEncoding) {
this.characterEncoding = characterEncoding;
}
/** @return The output the portlet has written, calls {@link #flushBuffer()} first */
public String getOutput() {
this.flushBuffer();
return writer.getBuilder().toString();
}
/** @return The content-type the portlet set */
public String getContentType() {
return contentType;
}
@Override
public PrintWriter getPrintWriter() {
return this.printWriter;
}
@Override
public OutputStream getOutputStream() {
if (this.writerOutputStream == null) {
this.writerOutputStream =
new WriterOutputStream(this.printWriter, this.characterEncoding);
}
return writerOutputStream;
}
@Override
public void flushBuffer() {
if (this.writerOutputStream != null) {
try {
this.writerOutputStream.flush();
} catch (IOException e) {
//No way the output stream can throw an IOE here
}
}
this.printWriter.flush();
}
@Override
public int getBufferSize() {
return bufferSize;
}
@Override
public boolean isCommitted() {
return false;
}
@Override
public void reset() {
this.contentType = null;
this.resetBuffer();
}
@Override
public void resetBuffer() {
this.flushBuffer();
final StringBuilder builder = this.writer.getBuilder();
if (builder.length() > 0) {
builder.delete(0, builder.length());
}
}
@Override
public void setBufferSize(int size) {
//Ignore, we can always buffer the max string length
}
@Override
public void setContentType(String contentType) {
this.contentType = contentType;
}
}