public static void write(HttpServletResponse response, File file) throws IOException {

    if (response instanceof ByteBufferServletResponse) {
      ByteBufferServletResponse byteBufferResponse = (ByteBufferServletResponse) response;

      ByteBuffer byteBuffer = ByteBuffer.wrap(FileUtil.getBytes(file));

      byteBufferResponse.setByteBuffer(byteBuffer);
    } else if (response instanceof StringServletResponse) {
      StringServletResponse stringResponse = (StringServletResponse) response;

      String s = FileUtil.read(file);

      stringResponse.setString(s);
    } else {
      FileInputStream fileInputStream = new FileInputStream(file);

      FileChannel fileChannel = fileInputStream.getChannel();

      try {
        int contentLength = (int) fileChannel.size();

        response.setContentLength(contentLength);

        response.flushBuffer();

        fileChannel.transferTo(0, contentLength, Channels.newChannel(response.getOutputStream()));
      } finally {
        fileChannel.close();
      }
    }
  }
  public static void write(HttpServletResponse response, ByteBuffer byteBuffer) throws IOException {

    if (response instanceof ByteBufferServletResponse) {
      ByteBufferServletResponse byteBufferResponse = (ByteBufferServletResponse) response;

      byteBufferResponse.setByteBuffer(byteBuffer);
    } else {
      write(response, byteBuffer.array(), byteBuffer.position(), byteBuffer.limit());
    }
  }
  @Override
  protected void processFilter(
      HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws Exception {

    ByteBufferServletResponse byteBufferResponse = new ByteBufferServletResponse(response);

    processFilter(ETagFilter.class, request, byteBufferResponse, filterChain);

    if (!ETagUtil.processETag(request, response, byteBufferResponse)) {
      ServletResponseUtil.write(response, byteBufferResponse.getByteBuffer());
    }
  }
  public static void write(
      HttpServletResponse response, byte[] bytes, int offset, int contentLength)
      throws IOException {

    try {

      // LEP-3122

      if (!response.isCommitted()) {

        // LEP-536

        if (contentLength == 0) {
          contentLength = bytes.length;
        }

        response.setContentLength(contentLength);

        response.flushBuffer();

        if (response instanceof ByteBufferServletResponse) {
          ByteBufferServletResponse byteBufferResponse = (ByteBufferServletResponse) response;

          byteBufferResponse.setByteBuffer(ByteBuffer.wrap(bytes, offset, contentLength));
        } else {
          ServletOutputStream servletOutputStream = response.getOutputStream();

          servletOutputStream.write(bytes, offset, contentLength);
        }
      }
    } catch (IOException ioe) {
      if (ioe instanceof SocketException
          || ioe.getClass().getName().equals(_CLIENT_ABORT_EXCEPTION)) {

        if (_log.isWarnEnabled()) {
          _log.warn(ioe);
        }
      } else {
        throw ioe;
      }
    }
  }