/**
   * Check out.
   *
   * @param lengthToWrite the length
   * @throws IOException Signals that an I/O exception has occurred.
   */
  private void checkOut(int lengthToWrite) throws IOException {
    if (_closed) throw new IOException("CLOSED");

    if (_out == null) {
      long length = _wrapper.getContentLength();
      if (_response.isCommitted() || (length >= 0 && length < _wrapper.getMinCompressSize()))
        doNotCompress(false);
      else if (lengthToWrite > _wrapper.getMinCompressSize()) doCompress();
      else _out = _bOut = new ByteArrayOutputStream2(_wrapper.getBufferSize());
    } else if (_bOut != null) {
      long length = _wrapper.getContentLength();
      if (_response.isCommitted() || (length >= 0 && length < _wrapper.getMinCompressSize()))
        doNotCompress(false);
      else if (lengthToWrite >= (_bOut.getBuf().length - _bOut.getCount())) doCompress();
    }
  }
  /** @see java.io.OutputStream#flush() */
  @Override
  public void flush() throws IOException {
    if (_out == null || _bOut != null) {
      long length = _wrapper.getContentLength();
      if (length > 0 && length < _wrapper.getMinCompressSize()) doNotCompress(false);
      else doCompress();
    }

    _out.flush();
  }
  /** Instantiates a new compressed stream. */
  public AbstractCompressedStream(
      String encoding, HttpServletRequest request, CompressedResponseWrapper wrapper, String vary)
      throws IOException {
    _encoding = encoding;
    _wrapper = wrapper;
    _response = (HttpServletResponse) wrapper.getResponse();
    _vary = vary;

    if (_wrapper.getMinCompressSize() == 0) doCompress();
  }
  /**
   * Finish.
   *
   * @throws IOException Signals that an I/O exception has occurred.
   */
  public void finish() throws IOException {
    if (!_closed) {
      if (_out == null || _bOut != null) {
        long length = _wrapper.getContentLength();
        if (length > 0 && length < _wrapper.getMinCompressSize()) doNotCompress(false);
        else doCompress();
      }

      if (_compressedOutputStream != null && !_closed) {
        _closed = true;
        _compressedOutputStream.close();
      }
    }
  }
  /** @see java.io.OutputStream#close() */
  @Override
  public void close() throws IOException {
    if (_closed) return;

    if (_wrapper.getRequest().getAttribute("javax.servlet.include.request_uri") != null) flush();
    else {
      if (_bOut != null) {
        long length = _wrapper.getContentLength();
        if (length < 0) {
          length = _bOut.getCount();
          _wrapper.setContentLength(length);
        }
        if (length < _wrapper.getMinCompressSize()) doNotCompress(false);
        else doCompress();
      } else if (_out == null) {
        // No output
        doNotCompress(false);
      }

      if (_compressedOutputStream != null) _compressedOutputStream.close();
      else _out.close();
      _closed = true;
    }
  }