Skip to content

Commit 0228ea5

Browse files
committed
Address remaining feedback
1 parent 1b4fa19 commit 0228ea5

15 files changed

+358
-178
lines changed

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/CompletedDownload.java

+80-3
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,95 @@
1717

1818
import software.amazon.awssdk.annotations.SdkPreviewApi;
1919
import software.amazon.awssdk.annotations.SdkPublicApi;
20+
import software.amazon.awssdk.services.s3.S3AsyncClient;
2021
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
22+
import software.amazon.awssdk.utils.Validate;
2123

2224
/**
23-
* A completed download transfer.
25+
* Represents a completed download transfer from Amazon S3. It can be used to track
26+
* the underlying {@link GetObjectResponse}
27+
*
28+
* @see S3TransferManager#download(DownloadRequest)
2429
*/
2530
@SdkPublicApi
2631
@SdkPreviewApi
27-
public interface CompletedDownload extends CompletedTransfer {
32+
public final class CompletedDownload implements CompletedTransfer {
33+
private final GetObjectResponse response;
34+
35+
private CompletedDownload(DefaultBuilder builder) {
36+
this.response = Validate.paramNotNull(builder.response, "response");
37+
}
2838

2939
/**
3040
* Returns the API response from the {@link S3TransferManager#download(DownloadRequest)}
3141
* @return the response
3242
*/
33-
GetObjectResponse response();
43+
public GetObjectResponse response() {
44+
return response;
45+
}
46+
47+
@Override
48+
public boolean equals(Object o) {
49+
if (this == o) {
50+
return true;
51+
}
52+
if (o == null || getClass() != o.getClass()) {
53+
return false;
54+
}
55+
56+
CompletedDownload that = (CompletedDownload) o;
57+
58+
return response.equals(that.response);
59+
}
60+
61+
@Override
62+
public int hashCode() {
63+
return response.hashCode();
64+
}
65+
66+
public static Builder builder() {
67+
return new DefaultBuilder();
68+
}
69+
70+
public interface Builder {
71+
/**
72+
* Specify the {@link GetObjectResponse} from {@link S3AsyncClient#getObject}
73+
*
74+
* @param response the response
75+
* @return This builder for method chaining.
76+
*/
77+
Builder response(GetObjectResponse response);
78+
79+
/**
80+
* Builds a {@link CompletedUpload} based on the properties supplied to this builder
81+
* @return An initialized {@link CompletedUpload}
82+
*/
83+
CompletedDownload build();
84+
}
85+
86+
private static final class DefaultBuilder implements Builder {
87+
private GetObjectResponse response;
88+
89+
private DefaultBuilder() {
90+
}
91+
92+
@Override
93+
public Builder response(GetObjectResponse response) {
94+
this.response = response;
95+
return this;
96+
}
97+
98+
public void setResponse(GetObjectResponse response) {
99+
response(response);
100+
}
101+
102+
public GetObjectResponse getResponse() {
103+
return response;
104+
}
105+
106+
@Override
107+
public CompletedDownload build() {
108+
return new CompletedDownload(this);
109+
}
110+
}
34111
}

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/CompletedUpload.java

+83-3
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,98 @@
1717

1818
import software.amazon.awssdk.annotations.SdkPreviewApi;
1919
import software.amazon.awssdk.annotations.SdkPublicApi;
20+
import software.amazon.awssdk.services.s3.S3AsyncClient;
2021
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
22+
import software.amazon.awssdk.utils.ToString;
23+
import software.amazon.awssdk.utils.Validate;
2124

2225
/**
23-
* A completed upload transfer.
26+
* Represents a completed upload transfer to Amazon S3. It can be used to track
27+
* the underlying {@link PutObjectResponse}
28+
*
29+
* @see S3TransferManager#upload(UploadRequest)
2430
*/
2531
@SdkPublicApi
2632
@SdkPreviewApi
27-
public interface CompletedUpload extends CompletedTransfer {
33+
public final class CompletedUpload implements CompletedTransfer {
34+
private final PutObjectResponse response;
35+
36+
private CompletedUpload(DefaultBuilder builder) {
37+
this.response = Validate.paramNotNull(builder.response, "response");
38+
}
2839

2940
/**
3041
* Returns the API response from the {@link S3TransferManager#upload(UploadRequest)}
3142
* @return the response
3243
*/
33-
PutObjectResponse response();
44+
public PutObjectResponse response() {
45+
return response;
46+
}
47+
48+
@Override
49+
public boolean equals(Object o) {
50+
if (this == o) {
51+
return true;
52+
}
53+
if (o == null || getClass() != o.getClass()) {
54+
return false;
55+
}
56+
57+
CompletedUpload that = (CompletedUpload) o;
58+
59+
return response.equals(that.response);
60+
}
61+
62+
@Override
63+
public int hashCode() {
64+
return response.hashCode();
65+
}
66+
67+
@Override
68+
public String toString() {
69+
return ToString.builder("CompletedUpload")
70+
.add("response", response)
71+
.build();
72+
}
73+
74+
/**
75+
* Creates a default builder for {@link CompletedUpload}.
76+
*/
77+
public static Builder builder() {
78+
return new DefaultBuilder();
79+
}
80+
81+
public interface Builder {
82+
/**
83+
* Specify the {@link PutObjectResponse} from {@link S3AsyncClient#putObject}
84+
*
85+
* @param response the response
86+
* @return This builder for method chaining.
87+
*/
88+
Builder response(PutObjectResponse response);
89+
90+
/**
91+
* Builds a {@link CompletedUpload} based on the properties supplied to this builder
92+
* @return An initialized {@link CompletedUpload}
93+
*/
94+
CompletedUpload build();
95+
}
96+
97+
private static class DefaultBuilder implements Builder {
98+
private PutObjectResponse response;
99+
100+
private DefaultBuilder() {
101+
}
102+
103+
@Override
104+
public Builder response(PutObjectResponse response) {
105+
this.response = response;
106+
return this;
107+
}
108+
109+
@Override
110+
public CompletedUpload build() {
111+
return new CompletedUpload(this);
112+
}
113+
}
34114
}

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/CompletedUploadDirectory.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,31 @@ private CompletedUploadDirectory(DefaultBuilder builder) {
4444
* An immutable collection of failed uploads with error details, request metadata about each file that is failed to
4545
* upload.
4646
*
47+
* <p>
48+
* Failed single file uploads can be retried by calling {@link S3TransferManager#upload(UploadRequest)}
49+
*
50+
* <pre>
51+
* {@code
52+
* // Retrying failed uploads if the exception is retryable
53+
* List<CompletableFuture<CompletedUpload>> futures =
54+
* completedUploadDirectory.failedUploads()
55+
* .stream()
56+
* .filter(failedSingleFileUpload -> isRetryable(failedSingleFileUpload.exception()))
57+
* .map(failedSingleFileUpload ->
58+
* tm.upload(failedSingleFileUpload.request()).completionFuture())
59+
* .collect(Collectors.toList());
60+
* CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
61+
* }
62+
* </pre>
63+
*
4764
* @return a list of failed uploads
4865
*/
4966
public Collection<FailedSingleFileUpload> failedUploads() {
5067
return failedUploads;
5168
}
5269

5370
/**
54-
* Creates a default builder for {@link CompletedUpload}.
71+
* Creates a default builder for {@link CompletedUploadDirectory}.
5572
*/
5673
public static Builder builder() {
5774
return new DefaultBuilder();

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/S3TransferManager.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ default Upload upload(Consumer<UploadRequest.Builder> request) {
198198
* // Print out the failed uploads
199199
* completedUploadDirectory.failedUploads().forEach(System.out::println);
200200
*
201-
* // Retrying failed uploads if the exceptions are retryable
201+
* // Retrying failed uploads if the exception is retryable
202202
* List<CompletableFuture<CompletedUpload>> futures =
203203
* completedUploadDirectory.failedUploads()
204204
* .stream()
@@ -207,6 +207,7 @@ default Upload upload(Consumer<UploadRequest.Builder> request) {
207207
* tm.upload(failedSingleFileUpload.request()).completionFuture())
208208
* .collect(Collectors.toList());
209209
* CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
210+
* }
210211
* </pre>
211212
*
212213
* @param uploadDirectoryRequest the upload directory request
@@ -252,7 +253,7 @@ default UploadDirectoryTransfer uploadDirectory(UploadDirectoryRequest uploadDir
252253
* // Print out the failed uploads
253254
* completedUploadDirectory.failedUploads().forEach(System.out::println);
254255
*
255-
* // Retrying failed uploads if the exceptions are retryable
256+
* // Retrying failed uploads if the exception is retryable
256257
* List<CompletableFuture<CompletedUpload>> futures =
257258
* completedUploadDirectory.failedUploads()
258259
* .stream()
@@ -261,6 +262,7 @@ default UploadDirectoryTransfer uploadDirectory(UploadDirectoryRequest uploadDir
261262
* tm.upload(failedSingleFileUpload.request()).completionFuture())
262263
* .collect(Collectors.toList());
263264
* CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
265+
* }
264266
* </pre>
265267
* @param requestBuilder the upload directory request builder
266268
* @see #uploadDirectory(UploadDirectoryRequest)
@@ -342,6 +344,7 @@ default Builder s3ClientConfiguration(Consumer<S3ClientConfiguration.Builder> co
342344
* @see #transferConfiguration(S3TransferManagerOverrideConfiguration)
343345
*/
344346
default Builder transferConfiguration(Consumer<S3TransferManagerOverrideConfiguration.Builder> configuration) {
347+
Validate.paramNotNull(configuration, "configuration");
345348
S3TransferManagerOverrideConfiguration.Builder builder = S3TransferManagerOverrideConfiguration.builder();
346349
configuration.accept(builder);
347350
transferConfiguration(builder.build());

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/S3TransferManagerOverrideConfiguration.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,15 @@ public static Builder builder() {
102102
public interface Builder extends CopyableBuilder<Builder, S3TransferManagerOverrideConfiguration> {
103103

104104
/**
105-
* Specify the executor that will be used in {@link S3TransferManager} to offload
106-
* execution
105+
* Specify the executor that {@link S3TransferManager} will use to execute
106+
* the request that might take some time to process before handing it off to the underlying S3 async client such as
107+
* visiting file tree in {@link S3TransferManager#uploadDirectory(UploadDirectoryRequest)} operation.
107108
*
108-
* @param executor the async configuration
109+
* <p>
110+
* <b>This executor must be shut down by the user when it is ready to be disposed. The SDK will not close the executor
111+
* when the s3 transfer manager is closed.</b>
112+
*
113+
* @param executor the executor to use
109114
* @return this builder for method chaining.
110115
*/
111116
Builder executor(Executor executor);

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/UploadDirectoryRequest.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public UploadDirectoryRequest(DefaultBuilder builder) {
5454
* The source directory to upload
5555
*
5656
* @return the source directory
57+
* @see Builder#sourceDirectory(Path)
5758
*/
5859
public Path sourceDirectory() {
5960
return sourceDirectory;
@@ -63,24 +64,31 @@ public Path sourceDirectory() {
6364
* The name of the bucket to upload objects to.
6465
*
6566
* @return bucket name
67+
* @see Builder#bucket(String)
6668
*/
6769
public String bucket() {
6870
return bucket;
6971
}
7072

7173
/**
7274
* @return the optional key prefix
75+
* @see Builder#prefix(String)
7376
*/
7477
public Optional<String> prefix() {
7578
return Optional.ofNullable(prefix);
7679
}
7780

81+
/**
82+
* @return the optional delimiter
83+
* @see Builder#delimiter(String)
84+
*/
7885
public Optional<String> delimiter() {
7986
return Optional.ofNullable(delimiter);
8087
}
8188

8289
/**
8390
* @return the optional override configuration
91+
* @see Builder#overrideConfiguration(UploadDirectoryOverrideConfiguration)
8492
*/
8593
public Optional<UploadDirectoryOverrideConfiguration> overrideConfiguration() {
8694
return Optional.ofNullable(overrideConfiguration);
@@ -134,10 +142,16 @@ public int hashCode() {
134142
public interface Builder extends CopyableBuilder<Builder, UploadDirectoryRequest> {
135143

136144
/**
137-
* Specify the source directory to upload
145+
* Specify the source directory to upload. The source directory must exist.
146+
* Fle wildcards are not supported and treated literally. Hidden files/directories are visited.
147+
*
148+
* <p>
149+
* Note that the current user must have read access to all directories and files,
150+
* otherwise {@link SecurityException} will be thrown.
138151
*
139152
* @param sourceDirectory the source directory
140153
* @return This builder for method chaining.
154+
* @see UploadDirectoryOverrideConfiguration
141155
*/
142156
Builder sourceDirectory(Path sourceDirectory);
143157

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/UploadRequest.java

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
/**
3434
* Upload an object to S3 using {@link S3TransferManager}.
35+
* @see S3TransferManager#upload(UploadRequest)
3536
*/
3637
@SdkPublicApi
3738
@SdkPreviewApi

0 commit comments

Comments
 (0)