Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@
import software.amazon.awssdk.testutils.RandomTempFile;
import software.amazon.awssdk.transfer.s3.model.CompletedDownload;
import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.model.Download;
import software.amazon.awssdk.transfer.s3.model.FileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;
Expand Down Expand Up @@ -92,7 +92,7 @@ static Stream<Arguments> testCases() {
void downloadFileWithPresignedUrl_shouldDownloadCorrectly(S3TransferManager tm, String key,
File sourceFile, int objSize) throws Exception {
Path downloadPath = RandomTempFile.randomUncreatedFile().toPath();
FileDownload download = tm.downloadFileWithPresignedUrl(createFileDownloadRequest(key, downloadPath));
PresignedFileDownload download = tm.downloadFileWithPresignedUrl(createFileDownloadRequest(key, downloadPath));
CompletedFileDownload completed = download.completionFuture().join();

assertThat(Files.exists(downloadPath)).isTrue();
Expand Down Expand Up @@ -131,7 +131,7 @@ void downloadFileWithPresignedUrl_progressTracking(String tmType, S3TransferMana
requestBuilder.range(range);
}

FileDownload download = tm.downloadFileWithPresignedUrl(
PresignedFileDownload download = tm.downloadFileWithPresignedUrl(
PresignedDownloadFileRequest.builder()
.presignedUrlDownloadRequest(requestBuilder.build())
.destination(downloadPath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import software.amazon.awssdk.transfer.s3.model.FileUpload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload;
import software.amazon.awssdk.transfer.s3.model.Upload;
Expand Down Expand Up @@ -730,16 +731,16 @@ default Copy copy(Consumer<CopyRequest.Builder> copyRequestBuilder) {
* LoggingTransferListener.create())
* .build();
*
* FileDownload download = transferManager.downloadFileWithPresignedUrl(request);
* PresignedFileDownload download = transferManager.downloadFileWithPresignedUrl(request);
* download.completionFuture().join();
* }
*
* @param presignedDownloadFileRequest the presigned download file request
* @return A {@link FileDownload} that can be used to track the ongoing transfer
* @return A {@link PresignedFileDownload} that can be used to track the ongoing transfer
* @see #downloadFileWithPresignedUrl(Consumer)
* @see #downloadWithPresignedUrl(PresignedDownloadRequest)
*/
default FileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
default PresignedFileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
throw new UnsupportedOperationException();
}

Expand All @@ -752,7 +753,7 @@ default FileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest p
*
* @see #downloadFileWithPresignedUrl(PresignedDownloadFileRequest)
*/
default FileDownload downloadFileWithPresignedUrl(
default PresignedFileDownload downloadFileWithPresignedUrl(
Consumer<PresignedDownloadFileRequest.Builder> presignedDownloadFileRequest) {
return downloadFileWithPresignedUrl(
PresignedDownloadFileRequest.builder().applyMutation(presignedDownloadFileRequest).build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import software.amazon.awssdk.transfer.s3.model.FileUpload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileDownload;
import software.amazon.awssdk.transfer.s3.model.Upload;
import software.amazon.awssdk.transfer.s3.model.UploadDirectoryRequest;
Expand Down Expand Up @@ -88,7 +89,7 @@ public Copy copy(CopyRequest copyRequest) {
}

@Override
public FileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
public PresignedFileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
return delegate.downloadFileWithPresignedUrl(presignedDownloadFileRequest);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import software.amazon.awssdk.transfer.s3.internal.model.DefaultDownload;
import software.amazon.awssdk.transfer.s3.internal.model.DefaultFileDownload;
import software.amazon.awssdk.transfer.s3.internal.model.DefaultFileUpload;
import software.amazon.awssdk.transfer.s3.internal.model.DefaultPresignedFileDownload;
import software.amazon.awssdk.transfer.s3.internal.model.DefaultUpload;
import software.amazon.awssdk.transfer.s3.internal.progress.DefaultTransferProgress;
import software.amazon.awssdk.transfer.s3.internal.progress.DefaultTransferProgressSnapshot;
Expand All @@ -77,6 +78,7 @@
import software.amazon.awssdk.transfer.s3.model.FileUpload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileDownload;
import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload;
import software.amazon.awssdk.transfer.s3.model.Upload;
Expand Down Expand Up @@ -600,7 +602,7 @@ public final Copy copy(CopyRequest copyRequest) {
}

@Override
public final FileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
public final PresignedFileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequest presignedDownloadFileRequest) {
Validate.paramNotNull(presignedDownloadFileRequest, "presignedDownloadFileRequest");

AsyncResponseTransformer<GetObjectResponse, GetObjectResponse> responseTransformer =
Expand Down Expand Up @@ -632,11 +634,7 @@ public final FileDownload downloadFileWithPresignedUrl(PresignedDownloadFileRequ
returnFuture.completeExceptionally(throwable);
}

return new DefaultFileDownload(returnFuture, progressUpdater.progress(),
() -> {
throw new UnsupportedOperationException(
"Pause is not supported for presigned URL downloads");
}, null);
return new DefaultPresignedFileDownload(returnFuture, progressUpdater.progress());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/

package software.amazon.awssdk.transfer.s3.internal.model;

import java.util.concurrent.CompletableFuture;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.progress.TransferProgress;
import software.amazon.awssdk.utils.ToString;
import software.amazon.awssdk.utils.Validate;

@SdkInternalApi
public final class DefaultPresignedFileDownload implements PresignedFileDownload {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can add equals and hashcode methods and also add test with EqualsVerifier something like DefaultDownloadTest

private final CompletableFuture<CompletedFileDownload> completionFuture;
private final TransferProgress progress;

public DefaultPresignedFileDownload(CompletableFuture<CompletedFileDownload> completionFuture,
TransferProgress progress) {
this.completionFuture = Validate.paramNotNull(completionFuture, "completionFuture");
this.progress = Validate.paramNotNull(progress, "progress");
}

@Override
public CompletableFuture<CompletedFileDownload> completionFuture() {
return completionFuture;
}

@Override
public TransferProgress progress() {
return progress;
}

@Override
public String toString() {
return ToString.builder("DefaultPresignedFileDownload")
.add("completionFuture", completionFuture)
.add("progress", progress)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/

package software.amazon.awssdk.transfer.s3.model;

import java.util.concurrent.CompletableFuture;
import software.amazon.awssdk.annotations.SdkPublicApi;
import software.amazon.awssdk.annotations.ThreadSafe;

/**
* A download transfer of a single object from S3 using a presigned URL.
*
* <p>Unlike {@link FileDownload}, this type does not support pause/resume because presigned URLs
* have a limited lifetime and cannot be reliably resumed after expiration.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the expiry time only limitation for not implementing this for pause/resume?

*/
@SdkPublicApi
@ThreadSafe
public interface PresignedFileDownload extends ObjectTransfer {

@Override
CompletableFuture<CompletedFileDownload> completionFuture();
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import software.amazon.awssdk.services.s3.presignedurl.model.PresignedUrlDownloadRequest;
import software.amazon.awssdk.transfer.s3.model.CompletedDownload;
import software.amazon.awssdk.transfer.s3.model.CompletedFileDownload;
import software.amazon.awssdk.transfer.s3.model.FileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;

Expand Down Expand Up @@ -154,18 +153,6 @@ void downloadWithPresignedUrl_withNullRequest_shouldThrowNullPointerException()
assertThatThrownBy(() -> tm.downloadWithPresignedUrl(null))
.isInstanceOf(NullPointerException.class);
}
@Test
void downloadFileWithPresignedUrl_pause_shouldThrowUnsupportedOperationException() {
GetObjectResponse response = GetObjectResponse.builder().build();
stubGetObject(CompletableFuture.completedFuture(response));

FileDownload download = tm.downloadFileWithPresignedUrl(fileDownloadRequest());
download.completionFuture().join();

assertThatThrownBy(download::pause)
.isInstanceOf(UnsupportedOperationException.class)
.hasMessageContaining("Pause is not supported for presigned URL downloads");
}

private PresignedDownloadFileRequest fileDownloadRequest() {
return PresignedDownloadFileRequest.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
import software.amazon.awssdk.testutils.RandomTempFile;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.Download;
import software.amazon.awssdk.transfer.s3.model.FileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedFileDownload;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadFileRequest;
import software.amazon.awssdk.transfer.s3.model.PresignedDownloadRequest;
import software.amazon.awssdk.transfer.s3.progress.TransferListener;
Expand Down Expand Up @@ -123,7 +123,7 @@ void presignedUrlDownload_shouldInvokeListener(boolean multipartEnabled, String
}

if ("toFile".equals(type)) {
FileDownload download = tm.downloadFileWithPresignedUrl(
PresignedFileDownload download = tm.downloadFileWithPresignedUrl(
PresignedDownloadFileRequest.builder()
.presignedUrlDownloadRequest(requestBuilder.build())
.destination(testFile.toPath())
Expand Down Expand Up @@ -172,7 +172,7 @@ void presignedUrlDownload_failure_shouldInvokeListener(boolean multipartEnabled,
URL presignedUrl = new URL(testEndpoint + "/presigned-key?X-Amz-Algorithm=AWS4-HMAC-SHA256");

if ("toFile".equals(type)) {
FileDownload download = tm.downloadFileWithPresignedUrl(
PresignedFileDownload download = tm.downloadFileWithPresignedUrl(
PresignedDownloadFileRequest.builder()
.presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder()
.presignedUrl(presignedUrl)
Expand Down Expand Up @@ -222,7 +222,7 @@ void presignedUrlDownload_cancelled_shouldInvokeTransferFailed(boolean multipart
URL presignedUrl = new URL(testEndpoint + "/presigned-key?X-Amz-Algorithm=AWS4-HMAC-SHA256");

if ("toFile".equals(type)) {
FileDownload download = tm.downloadFileWithPresignedUrl(
PresignedFileDownload download = tm.downloadFileWithPresignedUrl(
PresignedDownloadFileRequest.builder()
.presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder()
.presignedUrl(presignedUrl)
Expand Down
Loading