public static void render(RenderRequest request, RenderResponse response) throws IOException {
    BufferedResponseStream bufferedResponseStream = getBufferedResponseStream(request);
    if (bufferedResponseStream == null) {
      throw new IllegalStateException("BufferedResponseStream is null.");
    }
    synchronized (bufferedResponseStream) {
      // flush stream
      bufferedResponseStream.commit();

      if (request.getWindowState() != WindowState.MINIMIZED) {
        Reader r = bufferedResponseStream.getReader();
        Writer w = response.getWriter();
        char[] bytes = new char[FacesResponseConstants.BLOCK_SIZE];
        try {
          int length = r.read(bytes);
          while (length != -1) {
            if (length != 0) {
              w.write(bytes, 0, length);
            }
            length = r.read(bytes);
          }
        } finally {
          bytes = null;
        }
        w.flush();
      }
    }

    // cleanup
    //        if (FacesResponseUtil.isMyFacesFacesContext(request)) {
    // for MyFaces
    // MyFaces needs this workaround code because of the implementation
    // issue..
    // request.getPortletSession().removeAttribute(
    // FacesResponseConstants.BUFFERED_RESPONSE_STREAM);
    //        } else {
    //            // for JSF implementation whice does not pass FacesContext from
    //            // processAction to render
    //            request
    //                    .removeAttribute(FacesResponseConstants.BUFFERED_RESPONSE_STREAM);
    //        }
  }
  public static void init(RenderRequest request, RenderResponse response) {
    String outputEncoding = response.getCharacterEncoding();
    //        if (FacesResponseUtil.isMyFacesFacesContext(request)) {
    // for MyFaces
    // MyFaces needs this workaround code because of the implementation
    // issue..
    PortletSession session = request.getPortletSession(true);
    // FacesContext facesContext = FacesContext.getCurrentInstance();
    FacesContext facesContext = FacesResponseUtil.getMyFacesFacesContext(request);
    boolean existResonseWriter = true;
    if (facesContext == null) {
      existResonseWriter = false;
    } else {
      if (facesContext.getResponseWriter() == null) {
        existResonseWriter = false;
      }
    }

    Object oldBufferedResonseStream =
        session.getAttribute(FacesResponseConstants.BUFFERED_RESPONSE_STREAM);
    if (existResonseWriter && oldBufferedResonseStream != null) {
      ((BufferedResponseStream) oldBufferedResonseStream).recycle();
    } else {
      BufferedResponseStream bufferedResponseStream = new BufferedResponseStream(outputEncoding);
      session.setAttribute(FacesResponseConstants.BUFFERED_RESPONSE_STREAM, bufferedResponseStream);
    }
    //        } else {
    //            // for JSF implementation whice does not pass FacesContext from
    //            // processAction to render
    //            BufferedResponseStream bufferedResponseStream = new BufferedResponseStream(
    //                    outputEncoding);
    //            request.setAttribute(
    //                    FacesResponseConstants.BUFFERED_RESPONSE_STREAM,
    //                    bufferedResponseStream);
    //        }
  }