22
22
import java .util .function .Consumer ;
23
23
import software .amazon .awssdk .annotations .SdkPreviewApi ;
24
24
import software .amazon .awssdk .annotations .SdkPublicApi ;
25
+ import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
25
26
import software .amazon .awssdk .utils .Validate ;
26
27
import software .amazon .awssdk .utils .builder .CopyableBuilder ;
27
28
import software .amazon .awssdk .utils .builder .ToCopyableBuilder ;
@@ -41,13 +42,15 @@ public final class UploadDirectoryRequest implements TransferRequest, ToCopyable
41
42
private final String prefix ;
42
43
private final UploadDirectoryOverrideConfiguration overrideConfiguration ;
43
44
private final String delimiter ;
45
+ private final UploadRequestTransformer uploadRequestTransformer ;
44
46
45
47
public UploadDirectoryRequest (DefaultBuilder builder ) {
46
48
this .sourceDirectory = Validate .paramNotNull (builder .sourceDirectory , "sourceDirectory" );
47
49
this .bucket = Validate .paramNotNull (builder .bucket , "bucket" );
48
50
this .prefix = builder .prefix ;
49
51
this .overrideConfiguration = builder .configuration ;
50
52
this .delimiter = builder .delimiter ;
53
+ this .uploadRequestTransformer = builder .uploadRequestTransformer ;
51
54
}
52
55
53
56
/**
@@ -86,6 +89,14 @@ public Optional<String> delimiter() {
86
89
return Optional .ofNullable (delimiter );
87
90
}
88
91
92
+ /**
93
+ * @return the optional upload request transformer
94
+ * @see Builder#uploadRequestTransformer(UploadRequestTransformer)
95
+ */
96
+ public Optional <UploadRequestTransformer > uploadRequestTransformer () {
97
+ return Optional .ofNullable (uploadRequestTransformer );
98
+ }
99
+
89
100
/**
90
101
* @return the optional override configuration
91
102
* @see Builder#overrideConfiguration(UploadDirectoryOverrideConfiguration)
@@ -130,6 +141,9 @@ public boolean equals(Object o) {
130
141
if (!Objects .equals (delimiter , that .delimiter )) {
131
142
return false ;
132
143
}
144
+ if (!Objects .equals (uploadRequestTransformer , that .uploadRequestTransformer )) {
145
+ return false ;
146
+ }
133
147
return Objects .equals (overrideConfiguration , that .overrideConfiguration );
134
148
}
135
149
@@ -140,6 +154,7 @@ public int hashCode() {
140
154
result = 31 * result + (prefix != null ? prefix .hashCode () : 0 );
141
155
result = 31 * result + (delimiter != null ? delimiter .hashCode () : 0 );
142
156
result = 31 * result + (overrideConfiguration != null ? overrideConfiguration .hashCode () : 0 );
157
+ result = 31 * result + (uploadRequestTransformer != null ? uploadRequestTransformer .hashCode () : 0 );
143
158
return result ;
144
159
}
145
160
@@ -220,6 +235,51 @@ public interface Builder extends CopyableBuilder<Builder, UploadDirectoryRequest
220
235
*/
221
236
Builder delimiter (String delimiter );
222
237
238
+ /**
239
+ * Specify a function used to transform the {@link UploadRequest}s generated by this {@link UploadDirectoryRequest}. The
240
+ * provided function is called once for each file that is uploaded, allowing you to modify the paths resolved by
241
+ * TransferManager on a per-file basis, modify the created {@link PutObjectRequest} before it is passed to S3, or
242
+ * configure a {@link TransferRequestOverrideConfiguration}.
243
+ *
244
+ * <p>The factory receives the {@link UploadRequest}s created by Transfer Manager for each file in the directory being
245
+ * uploaded, and returns a (potentially modified) {@link UploadRequest}.
246
+ *
247
+ * <p>
248
+ * <b>Usage Example:</b>
249
+ * <pre>
250
+ * {@code
251
+ * // Add a LoggingTransferListener to every transfer within the upload directory request
252
+ * TransferRequestOverrideConfiguration transferConfiguration =
253
+ * TransferRequestOverrideConfiguration.builder()
254
+ * .addListener(LoggingTransferListener.create())
255
+ * .build();
256
+ *
257
+ * UploadDirectoryRequest request =
258
+ * UploadDirectoryRequest.builder()
259
+ * .sourceDirectory(Paths.get("."))
260
+ * .bucket("bucket")
261
+ * .prefix("prefix")
262
+ * .uploadRequestTransformer(uploadRequest -> uploadRequest.toBuilder()
263
+ * .overrideConfiguration(transferConfiguration)
264
+ * .build())
265
+ * .build()
266
+ *
267
+ * UploadDirectoryTransfer uploadDirectory = transferManager.uploadDirectory(request);
268
+ *
269
+ * // Wait for the transfer to complete
270
+ * CompletedUploadDirectory completedUploadDirectory = uploadDirectory.completionFuture().join();
271
+ *
272
+ * // Print out the failed uploads
273
+ * completedUploadDirectory.failedUploads().forEach(System.out::println);
274
+ * }
275
+ * </pre>
276
+ *
277
+ * @param uploadRequestTransformer A transformer to use for modifying the file-level upload requests before execution
278
+ * @return This builder for method chaining
279
+ * @see UploadRequestTransformer
280
+ */
281
+ Builder uploadRequestTransformer (UploadRequestTransformer uploadRequestTransformer );
282
+
223
283
/**
224
284
* Add an optional request override configuration.
225
285
*
@@ -249,13 +309,15 @@ default Builder overrideConfiguration(Consumer<UploadDirectoryOverrideConfigurat
249
309
UploadDirectoryRequest build ();
250
310
}
251
311
312
+
252
313
private static final class DefaultBuilder implements Builder {
253
314
254
315
private Path sourceDirectory ;
255
316
private String bucket ;
256
317
private String prefix ;
257
318
private UploadDirectoryOverrideConfiguration configuration ;
258
319
private String delimiter ;
320
+ private UploadRequestTransformer uploadRequestTransformer ;
259
321
260
322
private DefaultBuilder () {
261
323
}
@@ -265,6 +327,8 @@ private DefaultBuilder(UploadDirectoryRequest request) {
265
327
this .bucket = request .bucket ;
266
328
this .prefix = request .prefix ;
267
329
this .configuration = request .overrideConfiguration ;
330
+ this .delimiter = request .delimiter ;
331
+ this .uploadRequestTransformer = request .uploadRequestTransformer ;
268
332
}
269
333
270
334
@ Override
@@ -315,6 +379,12 @@ public Builder delimiter(String delimiter) {
315
379
return this ;
316
380
}
317
381
382
+ @ Override
383
+ public Builder uploadRequestTransformer (UploadRequestTransformer uploadRequestTransformer ) {
384
+ this .uploadRequestTransformer = uploadRequestTransformer ;
385
+ return this ;
386
+ }
387
+
318
388
public void setDelimiter (String delimiter ) {
319
389
delimiter (delimiter );
320
390
}
0 commit comments