From: Brett Smith Date: Tue, 12 Dec 2023 13:54:51 +0000 (-0500) Subject: Merge branch '21277-github-pr-221' X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/b9c536f72871b980194fa54d783bfe09ef76cdd5?hp=cb73538f0851cea402a0544861966c2515a24b5b Merge branch '21277-github-pr-221' Closes #21277. Arvados-DCO-1.1-Signed-off-by: Brett Smith --- diff --git a/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingFileRequestBody.java b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingFileRequestBody.java index 43fcdba5c6..d6eb033ff5 100644 --- a/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingFileRequestBody.java +++ b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingFileRequestBody.java @@ -7,12 +7,9 @@ package org.arvados.client.api.client; -import okhttp3.MediaType; -import okhttp3.RequestBody; import okio.BufferedSink; import okio.Okio; import okio.Source; -import org.slf4j.Logger; import java.io.File; @@ -20,32 +17,20 @@ import java.io.File; * Based on: * {@link} https://gist.github.com/eduardb/dd2dc530afd37108e1ac */ -public class CountingFileRequestBody extends RequestBody { - - private static final int SEGMENT_SIZE = 2048; // okio.Segment.SIZE - private static final MediaType CONTENT_BINARY = MediaType.parse(com.google.common.net.MediaType.OCTET_STREAM.toString()); - - private final File file; - private final ProgressListener listener; +public class CountingFileRequestBody extends CountingRequestBody { CountingFileRequestBody(final File file, final ProgressListener listener) { - this.file = file; - this.listener = listener; + super(file, listener); } @Override public long contentLength() { - return file.length(); - } - - @Override - public MediaType contentType() { - return CONTENT_BINARY; + return requestBodyData.length(); } @Override public void writeTo(BufferedSink sink) { - try (Source source = Okio.source(file)) { + try (Source source = Okio.source(requestBodyData)) { long total = 0; long read; @@ -61,24 +46,4 @@ public class CountingFileRequestBody extends RequestBody { //ignore } } - - static class TransferData { - - private final Logger log = org.slf4j.LoggerFactory.getLogger(TransferData.class); - private int progressValue; - private long totalSize; - - TransferData(long totalSize) { - this.progressValue = 0; - this.totalSize = totalSize; - } - - void updateTransferProgress(long transferred) { - float progress = (transferred / (float) totalSize) * 100; - if (progressValue != (int) progress) { - progressValue = (int) progress; - log.debug("{} / {} / {}%", transferred, totalSize, progressValue); - } - } - } } \ No newline at end of file diff --git a/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingRequestBody.java b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingRequestBody.java new file mode 100644 index 0000000000..397a1e2306 --- /dev/null +++ b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingRequestBody.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) The Arvados Authors. All rights reserved. + * + * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0 + * + */ + +package org.arvados.client.api.client; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import org.slf4j.Logger; + +abstract class CountingRequestBody extends RequestBody { + + protected static final int SEGMENT_SIZE = 2048; // okio.Segment.SIZE + protected static final MediaType CONTENT_BINARY = MediaType.parse(com.google.common.net.MediaType.OCTET_STREAM.toString()); + + protected final ProgressListener listener; + + protected final T requestBodyData; + + CountingRequestBody(T file, final ProgressListener listener) { + this.requestBodyData = file; + this.listener = listener; + } + + @Override + public MediaType contentType() { + return CONTENT_BINARY; + } + + static class TransferData { + + private final Logger log = org.slf4j.LoggerFactory.getLogger(TransferData.class); + private int progressValue; + private long totalSize; + + TransferData(long totalSize) { + this.progressValue = 0; + this.totalSize = totalSize; + } + + void updateTransferProgress(long transferred) { + float progress = (transferred / (float) totalSize) * 100; + if (progressValue != (int) progress) { + progressValue = (int) progress; + log.debug("{} / {} / {}%", transferred, totalSize, progressValue); + } + } + } +} \ No newline at end of file diff --git a/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingStreamRequestBody.java b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingStreamRequestBody.java new file mode 100644 index 0000000000..7c39371697 --- /dev/null +++ b/sdk/java-v2/src/main/java/org/arvados/client/api/client/CountingStreamRequestBody.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) The Arvados Authors. All rights reserved. + * + * SPDX-License-Identifier: AGPL-3.0 OR Apache-2.0 + * + */ + +package org.arvados.client.api.client; + +import okio.BufferedSink; +import okio.Okio; +import okio.Source; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +public class CountingStreamRequestBody extends CountingRequestBody { + + CountingStreamRequestBody(final InputStream inputStream, final ProgressListener listener) { + super(inputStream, listener); + } + + @Override + public long contentLength() throws IOException { + return requestBodyData.available(); + } + + @Override + public void writeTo(BufferedSink sink) { + try (Source source = Okio.source(requestBodyData)) { + long total = 0; + long read; + + while ((read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) { + total += read; + sink.flush(); + listener.updateProgress(total); + + } + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + //ignore + } + } +} \ No newline at end of file diff --git a/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepServerApiClient.java b/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepServerApiClient.java index a9306ca2ec..c1525e07a7 100644 --- a/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepServerApiClient.java +++ b/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepServerApiClient.java @@ -9,7 +9,7 @@ package org.arvados.client.api.client; import okhttp3.Request; import okhttp3.RequestBody; -import org.arvados.client.api.client.CountingFileRequestBody.TransferData; +import org.arvados.client.api.client.CountingRequestBody.TransferData; import org.arvados.client.common.Headers; import org.arvados.client.config.ConfigProvider; import org.slf4j.Logger; diff --git a/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepWebApiClient.java b/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepWebApiClient.java index 05d39e9e60..2c3168649f 100644 --- a/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepWebApiClient.java +++ b/sdk/java-v2/src/main/java/org/arvados/client/api/client/KeepWebApiClient.java @@ -13,6 +13,7 @@ import okhttp3.RequestBody; import org.arvados.client.config.ConfigProvider; import java.io.File; +import java.io.InputStream; public class KeepWebApiClient extends BaseApiClient { @@ -48,6 +49,16 @@ public class KeepWebApiClient extends BaseApiClient { return newCall(request); } + public String upload(String collectionUuid, InputStream inputStream, String fileName, ProgressListener progressListener) { + RequestBody requestBody = new CountingStreamRequestBody(inputStream, progressListener); + + Request request = getRequestBuilder() + .url(getUrlBuilder(collectionUuid, fileName).build()) + .put(requestBody) + .build(); + return newCall(request); + } + private HttpUrl.Builder getUrlBuilder(String collectionUuid, String filePathName) { return new HttpUrl.Builder() .scheme(config.getApiProtocol())