responseadapter.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 373 行

JAVA
373
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source 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, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the *   Free SoftwareFoundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.server.connection;import com.caucho.log.Log;import com.caucho.util.FreeList;import com.caucho.vfs.FlushBuffer;import javax.servlet.ServletOutputStream;import javax.servlet.ServletResponse;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.util.logging.Logger;public class ResponseAdapter extends ResponseWrapper  implements CauchoResponse{  private static final Logger log    = Logger.getLogger(ResponseAdapter.class.getName());  private static final FreeList<ResponseAdapter> _freeList    = new FreeList<ResponseAdapter>(32);  protected RequestAdapter _request;  protected FlushBuffer _flushBuffer;  protected AbstractResponseStream _originalResponseStream;  protected AbstractResponseStream _responseStream;  private ServletOutputStreamImpl _os;  private ResponseWriter _writer;  private boolean _hasOutputStream;  private boolean _hasError;  private ResponseAdapter()  {  }  protected ResponseAdapter(HttpServletResponse response)  {    setResponse(response);    _originalResponseStream = createWrapperResponseStream();    _os = new ServletOutputStreamImpl();    _writer = new ResponseWriter();  }  /**   * Creates a new ResponseAdapter.   */  public static ResponseAdapter create(HttpServletResponse response)  {    ResponseAdapter resAdapt = _freeList.allocate();    if (resAdapt == null)      resAdapt = new ResponseAdapter(response);    else      resAdapt.setResponse(response);    resAdapt.init(response);    return resAdapt;  }  void setRequest(RequestAdapter request)  {    _request = request;  }  protected AbstractResponseStream createWrapperResponseStream()  {    return new WrapperResponseStream();  }  public void init(HttpServletResponse response)  {    setResponse(response);    _hasError = false;    _responseStream = _originalResponseStream;    if (_originalResponseStream instanceof WrapperResponseStream) {      WrapperResponseStream wrapper = (WrapperResponseStream) _originalResponseStream;      wrapper.init(response);    }    _originalResponseStream.start();    _os.init(_originalResponseStream);    _writer.init(_originalResponseStream);  }  public AbstractResponseStream getResponseStream()  {    return _responseStream;  }  public boolean isCauchoResponseStream()  {    return false;  }  public void setResponseStream(AbstractResponseStream responseStream)  {    _responseStream = responseStream;    _os.init(responseStream);    _writer.init(responseStream);  }  public boolean isTop()  {    return false;  }  public void resetBuffer()  {    super.resetBuffer();    _responseStream.clearBuffer();  }  public void sendRedirect(String url)    throws IOException  {    resetBuffer();    super.sendRedirect(url);  }  @Override  public int getBufferSize()  {    return _responseStream.getBufferSize();  }  @Override  public void setBufferSize(int size)  {    _responseStream.setBufferSize(size);  }  public ServletOutputStream getOutputStream() throws IOException  {    return _os;  }  /**   * Sets the flush buffer   */  public void setFlushBuffer(FlushBuffer flushBuffer)  {    _flushBuffer = flushBuffer;  }  /**   * Gets the flush buffer   */  public FlushBuffer getFlushBuffer()  {    return _flushBuffer;  }  public PrintWriter getWriter() throws IOException  {    return _writer;  }  public void setContentType(String value)  {    super.setContentType(value);    try {      _responseStream.setEncoding(getCharacterEncoding());    } catch (UnsupportedEncodingException e) {    }  }  public void addCookie(Cookie cookie)  {    if (_request != null)      _request.setHasCookie();    super.addCookie(cookie);  }  /*   * caucho   */  public String getHeader(String key)  {    return null;  }  public boolean disableHeaders(boolean disable)  {    return false;  }  public void setFooter(String key, String value)  {  }  public void addFooter(String key, String value)  {  }  public int getRemaining()  {    return _responseStream.getRemaining();  }  /**   * When set to true, RequestDispatcher.forward() is disallowed on   * this stream.   */  public void setForbidForward(boolean forbid)  {  }  /**   * Returns true if RequestDispatcher.forward() is disallowed on   * this stream.   */  public boolean getForbidForward()  {    return false;  }  /**   * Set to true while processing an error.   */  public void setHasError(boolean hasError)  {    _hasError = hasError;  }  /**   * Returns true if we're processing an error.   */  public boolean hasError()  {    return _hasError;  }  /**   * Kills the cache for an error.   */  public void killCache()  {    if (getResponse() instanceof CauchoResponse)      ((CauchoResponse) getResponse()).killCache();  }  /**   * Sets private caching   */  public void setPrivateCache(boolean isPrivate)  {    if (getResponse() instanceof CauchoResponse)      ((CauchoResponse) getResponse()).setPrivateCache(isPrivate);  }  /**   * Sets no caching   */  public void setNoCache(boolean isPrivate)  {    if (getResponse() instanceof CauchoResponse)      ((CauchoResponse) getResponse()).setNoCache(isPrivate);  }  public void setSessionId(String id)  {    if (getResponse() instanceof CauchoResponse)      ((CauchoResponse) getResponse()).setSessionId(id);  }  public void finish()    throws IOException  {    if (_responseStream != null)      _responseStream.flushBuffer();    _responseStream = _originalResponseStream;  }  public void close()    throws IOException  {    ServletResponse response = getResponse();    AbstractResponseStream responseStream = _responseStream;    _responseStream = _originalResponseStream;    if (responseStream != null)      responseStream.close();    if (_originalResponseStream != responseStream)      _originalResponseStream.close();    if (response instanceof CauchoResponse) {      ((CauchoResponse) response).close();    }    /*    else {      try {	PrintWriter writer = response.getWriter();	writer.close();      } catch (Throwable e) {      }      try {	OutputStream os = response.getOutputStream();	os.close();      } catch (Throwable e) {      }    }    */  }  public static void free(ResponseAdapter resAdapt)  {    resAdapt.free();    _freeList.free(resAdapt);  }  /**   * Clears the adapter.   */  protected void free()  {    _request = null;    _responseStream = null;    setResponse(null);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?