private static void transferBytes()

in s3-artifact-storage-agent/src/main/java/jetbrains/buildServer/artifacts/s3/download/S3DownloadIOUtil.java [93:126]


  private static void transferBytes(@NotNull ReadableByteChannel sourceChannel,
                            @NotNull WritableByteChannel targetChannel,
                            boolean expectedCheck,
                            long expectedBytes,
                            int bufferSize,
                            @NotNull IORunnable interruptedCheck,
                            @NotNull LongConsumer progressTracker
  ) throws IOException {
    interruptedCheck.run();
    if (expectedCheck && expectedBytes < 0) throw new IllegalArgumentException(String.format("Expecting negative number of bytes (%s)", expectedBytes));
    if (bufferSize <= 0) throw new IllegalArgumentException(String.format("Buffer size is not positive (%s)", bufferSize));

    ByteBuffer byteBuffer = ByteBuffer.allocate(expectedCheck && expectedBytes > 0 ? (int)Math.min(expectedBytes, bufferSize) : bufferSize);
    long transferred = 0;
    while (sourceChannel.read(byteBuffer) >= 0) {
      byteBuffer.flip();
      while (byteBuffer.hasRemaining()) {
        long toBeTransferred = byteBuffer.remaining() + transferred;
        if (expectedCheck && toBeTransferred > expectedBytes) {
          throw new RecoverableIOException(String.format("Received more bytes from source channel (at least %s) than expected (%s)", toBeTransferred, expectedBytes));
        }

        interruptedCheck.run();
        int written = targetChannel.write(byteBuffer);
        transferred += written;
        progressTracker.accept(written);
      }
      byteBuffer.clear();
    }

    if (expectedCheck && transferred < expectedBytes) {
      throw new RecoverableIOException(String.format("Received less bytes from source channel (%s) than expected (%s)", transferred, expectedBytes));
    }
  }