ResponseWrapper.java :  » Web-Framework » argun » biz » hammurapi » web » menu » Java Open Source

Java Open Source » Web Framework » argun 
argun » biz » hammurapi » web » menu » ResponseWrapper.java
/*
  * argun 1.0
 * Web 2.0 delivery framework 
 * Copyright (C) 2007  Hammurapi Group
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * URL: http://www.hammurapi.biz
 * e-Mail: support@hammurapi.biz 
 */

package biz.hammurapi.web.menu;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.apache.log4j.Logger;

/**
 *  This response wrapper class extends the support class HttpServletResponseWrapper,
 *  which implements all the methods in the HttpServletResponse interface, as
 *  delegations to the wrapped response.
 *  You only need to override the methods that you need to change.
 *  You can get access to the wrapped response using the method getResponse()
 */
public class ResponseWrapper extends HttpServletResponseWrapper {
    static Logger logger=Logger.getLogger(ResponseWrapper.class);
    private StringWriter sWriter;
    private PrintWriter pWriter;
    private ByteArrayOutputStream baos;
    private ServletOutputStream sos;
    int contentLength;
    private String errorString;
    private boolean responseObtained=false;

    public String getResponseString() throws IOException {
        if (errorString!=null) {
          return errorString;
        }
        
        if (responseObtained) {
          throw new IllegalStateException("Response already obtained");
        }
        
        responseObtained=true;

        if (baos!=null) {
            baos.close();
            Reader r=new InputStreamReader(new ByteArrayInputStream(baos.toByteArray()));
            StringWriter s=new StringWriter();
            char[] cbuf=new char[4096];
            int i;
            while ((i=r.read(cbuf))!=-1) s.write(cbuf, 0, i);
            s.close();
            return s.toString();
        }

        if (sWriter!=null) {
          return sWriter.toString();
        }

        return "<B>Resource not found!</B>";
    }
    
    public Reader getResponseReader() throws IOException {
        if (errorString!=null) {
          return new StringReader(errorString);
        }
        
        if (responseObtained) {
          throw new IllegalStateException("Response already obtained");
        }
        
        responseObtained=true;
        
        if (baos!=null) {
            baos.close();
            return new InputStreamReader(new ByteArrayInputStream(baos.toByteArray()));
        }

        if (sWriter!=null) {
          return new StringReader(sWriter.toString());
        }
        
        return new StringReader("<B>Resource not found!</B>");                
    }

    HttpServletResponse response; 

    public ResponseWrapper(HttpServletResponse response) {
        super(response);
        this.response=response;
    }

    public void setContentLength(int len) {
        logger.debug("setContentLength("+len+") - ignored");            
    }

    public void setContentType(String type) {
        logger.debug("setContentType("+type+") - ignored");
    }

    public void addDateHeader(String name, long date) {
        logger.debug("addDateHeader("+name+", "+date+")");
        response.addDateHeader(name, date);
    }

    public void addHeader(String name, String value) {
        logger.debug("addHeader("+name+", "+value+")");
        response.addHeader(name, value);            
    }

    public void addIntHeader(String name, int value) {
        logger.debug("addIntHeader("+name+", "+value+")");
        response.addIntHeader(name, value);            
    }
    
    public void setDateHeader(String name, long date) {
        logger.debug("setDateHeader("+name+", "+date+")");
        response.setDateHeader(name, date);
    }

    public void setHeader(String name, String value) {
        logger.debug("setHeader("+name+", "+value+")");
        if ("Content-Length".equalsIgnoreCase(name)) {
            logger.debug("    Ignored");
        } else {
            response.setHeader(name, value);
        }
    }

    public void setIntHeader(String name, int value) {
        logger.debug("setIntHeader("+name+", "+value+")");
        response.setIntHeader(name, value);            
    }
    
    public void sendError(int sc) throws IOException {
        errorString="Error: "+sc;
        logger.error(errorString);
        response.sendError(sc);
    }
    
    public void sendError(int sc, String msg) throws IOException {
        errorString="Error: "+sc+" ("+msg+")";
        logger.error(errorString);
        response.sendError(sc, msg);
    }
    
    public ServletOutputStream getOutputStream() throws IOException {
        if (sWriter!=null) {
          throw new IllegalStateException("getWriter() already called");
        }
        
        if (baos==null) {
            baos=new ByteArrayOutputStream();
            sos=new ServletOutputStream() {
                public void write(int b) throws IOException {
                    baos.write(b);
                }
            };
            logger.debug("ServletOutputStream obtained");                    
        }

        return sos;
    }

    public PrintWriter getWriter() throws IOException {
        if (baos!=null) {
          throw new IllegalStateException("getOutputStream() already called");
        }
        
        if (sWriter==null) {
            sWriter=new StringWriter();
            pWriter=new PrintWriter(sWriter);
            logger.debug("PrintWriter obtained");                    
        }
        return pWriter;
    }               
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.