WJResponseWrapper.java
package sk.iway.iwcm.system;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.PathFilter;
import sk.iway.iwcm.SetCharacterEncodingFilter;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.system.context.ContextFilter;
/**
* WJResponseWrapper.java
*
* @Title webjet4
* @Company Interway s.r.o. (www.interway.sk)
* @Copyright Interway s.r.o. (c) 2001-2005
* @author $Author: jeeff $
* @version $Revision: 1.3 $
* @created Date: 14.4.2005 15:24:08
* @modified $Date: 2007/01/08 14:41:25 $
*/
public class WJResponseWrapper extends HttpServletResponseWrapper
{
PrintWriter writer;
public StringWriter strWriter;
public String redirectURL = null;
HttpServletResponse origResponse;
HttpServletRequest origRequest;
private ByteArrayOutputStream baos = null;
public void writeResponseToOriginalOutput(HttpServletRequest req) throws IOException
{
String htmlCode = strWriter.getBuffer().toString();
writeResponseToOriginalOutput(req, htmlCode);
}
/**
* Zapise HTML kod na povodny vystup s testom na moznost gzip kompresie
* @param req
* @param htmlCode
* @throws IOException
*/
public void writeResponseToOriginalOutput(HttpServletRequest req, String htmlCode) throws IOException
{
if (ContextFilter.isRunning(req)==false && Constants.getBoolean("packagerGzipEnable"))
{
String ae = req.getHeader("accept-encoding");
if (ae != null && ae.indexOf("gzip") != -1)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipstream = new GZIPOutputStream(baos);
byte[] originalBytes = htmlCode.getBytes(SetCharacterEncodingFilter.getEncoding());
gzipstream.write(originalBytes);
gzipstream.finish();
byte[] bytes = baos.toByteArray();
origResponse.addHeader("Content-Length", Integer.toString(bytes.length));
origResponse.addHeader("Content-Encoding", "gzip");
origResponse.getOutputStream().write(bytes);
origResponse.getOutputStream().flush();
origResponse.getOutputStream().close();
Logger.debug(WJResponseWrapper.class, "Gzipping output, path="+PathFilter.getOrigPath(req)+"?"+(String)req.getAttribute("path_filter_query_string")+" original="+originalBytes.length+" compressed="+bytes.length+" ratio="+((double)originalBytes.length / (double)bytes.length));
return;
}
}
//zapis vystup
origResponse.getWriter().write(htmlCode);
}
@Override
public void sendRedirect(String url) throws IOException
{
Logger.println(this,"--> send redirect: "+url);
redirectURL = url;
//super.sendRedirect(url);
}
@Override
public void addCookie(Cookie c)
{
Logger.debug(this,"add cookie: " + c.getName());
Tools.addCookie(c, origResponse, origRequest);
}
// ----------------------------------------------------------- Constructors
/**
* Construct a new response wrapper according to the specified parameters.
*
* @param response The servlet response we are wrapping
*/
public WJResponseWrapper(HttpServletResponse response, HttpServletRequest req)
{
super(response);
origResponse = response;
//baos = new ByteArrayOutputStream();
strWriter = new StringWriter();
writer = new PrintWriter(strWriter);
origRequest = req;
}
// ----------------------------------------------------- Instance Variables
// --------------------------------------------------------- Public Methods
/**
* Swallow any attempt to flush the response buffer.
*/
@Override
public void flushBuffer() throws IOException {
Logger.println(this,"--> FLUSH BUFFER");
; // No action is required
}
/**
* Return a PrintWriter that can be used to accumulate the response data
* for the included resource.
*
* @exception IOException if an I/O error occurs
*/
@Override
public PrintWriter getWriter() throws IOException {
return (writer); // FIXME - getWriter()
}
@Override
public void setBufferSize(int bufferSize)
{
try
{
super.setBufferSize(bufferSize);
}
catch (Exception e)
{
}
}
public String getRedirectURL()
{
return redirectURL;
}
/**
* Pre vykonavanie dlhych cyklov - zapis prazdneho znaku na orig response aby sa udrzalo spojenie
* @throws IOException
*/
public void flushOrigResponse() throws IOException
{
if (Constants.getBoolean("packagerGzipEnable")==false)
{
origResponse.getWriter().print(" ");
origResponse.getWriter().flush();
}
}
@Override
public ServletOutputStream getOutputStream() throws IOException
{
if (baos==null) baos = new ByteArrayOutputStream();
ServletOutputStream sos = new ServletOutputStream() {
@Override
public void write(int b) throws IOException
{
baos.write(b);
}
@Override
public boolean isReady()
{
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener arg0)
{
// TODO Auto-generated method stub
}
};
return sos;
}
public String getOutputOfStreamAsString()
{
if (baos!=null)
{
try
{
return baos.toString(origRequest.getCharacterEncoding());
}
catch (UnsupportedEncodingException e)
{
sk.iway.iwcm.Logger.error(e);
}
}
else if (strWriter!=null&&strWriter.getBuffer().length()>0) return strWriter.getBuffer().toString();
return null;
}
}