ExtensionsResponseWrapper.java

package org.andromda.cartridges.jsf.portlet.myfaces.tomahawk.support;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Locale;
import javax.portlet.PortletURL;
import javax.portlet.RenderResponse;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.xml.sax.InputSource;

/**
 * @author Sylvain Vieujot (latest modification by $Author: cwbrandon $)
 * @author Chad Brandon
 */
public class ExtensionsResponseWrapper
    extends HttpServletResponseWrapper
    implements RenderResponse
{
    private ByteArrayOutputStream stream = null;
    private PrintWriter printWriter = null;
    private String contentType;

    private final RenderResponse response;

    /**
     * @param servletResponse
     * @param response
     */
    public ExtensionsResponseWrapper(
        final HttpServletResponse servletResponse,
        final RenderResponse response)
    {
        super(servletResponse);
        this.response = response;
        stream = new ByteArrayOutputStream();
    }

    /**
     * @return stream.toByteArray()
     */
    public byte[] getBytes()
    {
        return stream.toByteArray();
    }

    /**
     * @see Object#toString()
     */
    @Override
    public String toString()
    {
        try
        {
            return stream.toString(getCharacterEncoding());
        }
        catch (final UnsupportedEncodingException e)
        {
            // an attempt to set an invalid character encoding would have caused
            // this exception before
            throw new RuntimeException("Response accepted invalid character encoding "
                + getCharacterEncoding());
        }
    }

    /**
     * This method is used by Tomcat.
     */
    @Override
    public PrintWriter getWriter()
    {
        if (printWriter == null)
        {
            final OutputStreamWriter streamWriter = new OutputStreamWriter(
                stream, Charset.forName(getCharacterEncoding()));
            printWriter = new PrintWriter(streamWriter, true);
        }
        return printWriter;
    }

    /**
     * This method is used by Jetty.
     *
     * @throws IOException
     */
    @Override
    public ServletOutputStream getOutputStream() throws IOException
    {
        return new MyServletOutputStream(stream);
    }

    /**
     * @return inputSource
     */
    public InputSource getInputSource()
    {
        final ByteArrayInputStream bais = new ByteArrayInputStream(stream.toByteArray());
        return new InputSource(bais);
    }

    /**
     * Prevent content-length being set as the page might be modified.
     */
    @Override
    public void setContentLength(final int contentLength)
    {
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#setContentType(String)
     */
    @Override
    public void setContentType(final String contentType)
    {
        super.setContentType(contentType);
        this.contentType = contentType;
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#getContentType()
     */
    @Override
    public String getContentType()
    {
        return contentType;
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#flushBuffer()
     */
    @Override
    public void flushBuffer() throws IOException
    {
        stream.flush();
    }

    /**
     *
     */
    public void finishResponse()
    {
        try
        {
            if (printWriter != null)
            {
                printWriter.close();
            }
            else
            {
                if (stream != null)
                {
                    stream.close();
                }
            }
        }
        catch (final IOException e)
        {
            // Ignore
        }
    }

    /**
     * Used in the <code>getOutputStream()</code> method.
     */
    private class MyServletOutputStream
    extends ServletOutputStream
    {
        private final OutputStream outputStream;

        public MyServletOutputStream(
            final OutputStream outputStream)
        {
            this.outputStream = outputStream;
        }

        @Override
        public void write(final int b) throws IOException
        {
            outputStream.write(b);
        }

        @Override
        public void write(final byte[] bytes) throws IOException
        {
            outputStream.write(bytes);
        }

        @Override
        public void write(final byte[] bytes, final int off, final int len) throws IOException
        {
            outputStream.write(bytes, off, len);
        }
    }

    /**
     * @see javax.portlet.RenderResponse#createActionURL()
     */
    public PortletURL createActionURL()
    {
        return response.createActionURL();
    }

    /**
     * @see javax.portlet.RenderResponse#createRenderURL()
     */
    public PortletURL createRenderURL()
    {
        return response.createRenderURL();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#getBufferSize()
     */
    @Override
    public int getBufferSize()
    {
        return response.getBufferSize();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#getCharacterEncoding()
     */
    @Override
    public String getCharacterEncoding()
    {
        return response.getCharacterEncoding();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#getLocale()
     */
    @Override
    public Locale getLocale()
    {
        return response.getLocale();
    }

    /**
     * @see javax.portlet.RenderResponse#getNamespace()
     */
    public String getNamespace()
    {
        return response.getNamespace();
    }

    /**
     * @see javax.portlet.RenderResponse#getPortletOutputStream()
     */
    public OutputStream getPortletOutputStream() throws IOException
    {
        return stream;
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#isCommitted()
     */
    @Override
    public boolean isCommitted()
    {
        return response.isCommitted();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#reset()
     */
    @Override
    public void reset()
    {
        response.reset();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#resetBuffer()
     */
    @Override
    public void resetBuffer()
    {
        response.resetBuffer();
    }

    /**
     * @see javax.servlet.ServletResponseWrapper#setBufferSize(int)
     */
    @Override
    public void setBufferSize(final int bufferSize)
    {
        response.setBufferSize(bufferSize);
    }

    /**
     * @see javax.portlet.RenderResponse#setTitle(String)
     */
    public void setTitle(final String title)
    {
        response.setTitle(title);
    }

    /**
     * @see javax.portlet.PortletResponse#addProperty(String, String)
     */
    public void addProperty(final String arg0, final String arg1)
    {
        response.addProperty(arg0, arg1);
    }

    /**
     * @see javax.servlet.http.HttpServletResponseWrapper#encodeURL(String)
     */
    @Override
    public String encodeURL(final String arg0)
    {
        return response.encodeURL(arg0);
    }

    /**
     * @see javax.portlet.PortletResponse#setProperty(String, String)
     */
    public void setProperty(final String arg0, final String arg1)
    {
        response.setProperty(arg0, arg1);
    }
}