Skip to content

Commit a28443e

Browse files
Java V2: Create 27 Java V2 code examples for S3 directory bucket actions, S3 (#7109)
* 1. Add 26 Java V2 code examples for S3 directory bucket actions. Add 1 Java V2 code example for S3 directory bucket getting-started hello. 2. Update metadata.yaml 3. Update config.py for WRITEME --------- Co-authored-by: David Souther <[email protected]>
1 parent 7f17f6e commit a28443e

37 files changed

+5772
-7
lines changed

.doc_gen/metadata/s3-directory-buckets_metadata.yaml

Lines changed: 414 additions & 2 deletions
Large diffs are not rendered by default.

.tools/readmes/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"sdk_api_ref": 'https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/{{service["name"]}}/package-summary.html',
5555
"service_folder_overrides": {
5656
"s3-control": "javav2/example_code/s3/src/main/java/com/example/s3/batch",
57+
"s3-directory-buckets": "javav2/example_code/s3/src/main/java/com/example/s3/directorybucket",
5758
"medical-imaging": "javav2/example_code/medicalimaging",
5859
},
5960
},

javav2/example_code/s3/checkstyle.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
<?xml version="1.0" ?>
22

33
<!DOCTYPE module PUBLIC
4-
"-//Checkstyle//DTD Checkstyle Configuration 1.2//EN"
5-
"https://checkstyle.org/dtds/configuration_1_2.dtd">
4+
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
5+
"https://checkstyle.org/dtds/configuration_1_3.dtd">
66

77
<module name="Checker">
88
<module name="TreeWalker">
99

10-
<module name="IllegalCatch"/>
10+
<module name="IllegalCatch">
11+
<property name="illegalClassNames" value="Error,Exception,Throwable,java.lang.Error,java.lang.Exception,java.lang.Throwable"/>
12+
</module>
1113
<module name="EmptyStatement"/>
1214
<module name="AvoidStarImport"/>
1315
<module name="UnusedImports"/>
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package com.example.s3.directorybucket;
5+
6+
// snippet-start:[s3directorybuckets.java2.abortmultipartupload.import]
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import software.amazon.awssdk.regions.Region;
10+
import software.amazon.awssdk.services.s3.S3Client;
11+
import software.amazon.awssdk.services.s3.model.AbortMultipartUploadRequest;
12+
import software.amazon.awssdk.services.s3.model.S3Exception;
13+
14+
import static com.example.s3.util.S3DirectoryBucketUtils.createDirectoryBucket;
15+
import static com.example.s3.util.S3DirectoryBucketUtils.createDirectoryBucketMultipartUpload;
16+
import static com.example.s3.util.S3DirectoryBucketUtils.createS3Client;
17+
import static com.example.s3.util.S3DirectoryBucketUtils.deleteDirectoryBucket;
18+
// snippet-end:[s3directorybuckets.java2.abortmultipartupload.import]
19+
20+
/**
21+
* Before running this example:
22+
* <p>
23+
* The SDK must be able to authenticate AWS requests on your behalf. If you have
24+
* not configured
25+
* authentication for SDKs and tools, see
26+
* https://docs.aws.amazon.com/sdkref/latest/guide/access.html in the AWS SDKs
27+
* and Tools Reference Guide.
28+
* <p>
29+
* You must have a runtime environment configured with the Java SDK.
30+
* See
31+
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html in
32+
* the Developer Guide if this is not set up.
33+
* <p>
34+
* To use S3 directory buckets, configure a gateway VPC endpoint. This is the
35+
* recommended method to enable directory bucket traffic without
36+
* requiring an internet gateway or NAT device. For more information on
37+
* configuring VPC gateway endpoints, visit
38+
* https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-networking.html#s3-express-networking-vpc-gateway.
39+
* <p>
40+
* Directory buckets are available in specific AWS Regions and Zones. For
41+
* details on Regions and Zones supporting directory buckets, see
42+
* https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-networking.html#s3-express-endpoints.
43+
*/
44+
45+
public class AbortDirectoryBucketMultipartUploads {
46+
private static final Logger logger = LoggerFactory.getLogger(AbortDirectoryBucketMultipartUploads.class);
47+
48+
// snippet-start:[s3directorybuckets.java2.abortmultipartupload.main]
49+
50+
/**
51+
* Aborts a specific multipart upload for the specified S3 directory bucket.
52+
*
53+
* @param s3Client The S3 client used to interact with S3
54+
* @param bucketName The name of the directory bucket
55+
* @param objectKey The key (name) of the object to be uploaded
56+
* @param uploadId The upload ID of the multipart upload to abort
57+
* @return True if the multipart upload is successfully aborted, false otherwise
58+
*/
59+
public static boolean abortDirectoryBucketMultipartUpload(S3Client s3Client, String bucketName,
60+
String objectKey, String uploadId) {
61+
logger.info("Aborting multipart upload: {} for bucket: {}", uploadId, bucketName);
62+
try {
63+
// Abort the multipart upload
64+
AbortMultipartUploadRequest abortMultipartUploadRequest = AbortMultipartUploadRequest.builder()
65+
.bucket(bucketName)
66+
.key(objectKey)
67+
.uploadId(uploadId)
68+
.build();
69+
70+
s3Client.abortMultipartUpload(abortMultipartUploadRequest);
71+
logger.info("Aborted multipart upload: {} for object: {}", uploadId, objectKey);
72+
return true;
73+
} catch (S3Exception e) {
74+
logger.error("Failed to abort multipart upload: {} - Error code: {}", e.awsErrorDetails().errorMessage(),
75+
e.awsErrorDetails().errorCode(), e);
76+
return false;
77+
}
78+
}
79+
// snippet-end:[s3directorybuckets.java2.abortmultipartupload.main]
80+
81+
public static void main(String[] args) {
82+
Region region = Region.US_WEST_2;
83+
S3Client s3Client = createS3Client(region);
84+
String zone = "usw2-az1";
85+
String bucketName = "test-bucket-" + System.currentTimeMillis() + "--" + zone + "--x-s3";
86+
String objectKey = "largeObject"; // your-object-key
87+
String uploadId;
88+
89+
try {
90+
// Create the directory bucket
91+
createDirectoryBucket(s3Client, bucketName, zone);
92+
// Create a Multipart Upload Request
93+
uploadId = createDirectoryBucketMultipartUpload(s3Client, bucketName, objectKey);
94+
95+
// Abort Multipart Uploads
96+
boolean aborted = abortDirectoryBucketMultipartUpload(s3Client, bucketName, objectKey, uploadId);
97+
if (aborted) {
98+
logger.info("Multipart upload successfully aborted for bucket: {}", bucketName);
99+
} else {
100+
logger.error("Failed to abort multipart upload for bucket: {}", bucketName);
101+
}
102+
} catch (S3Exception e) {
103+
logger.error("An error occurred during S3 operations: {} - Error code: {}",
104+
e.awsErrorDetails().errorMessage(), e.awsErrorDetails().errorCode(), e);
105+
} finally {
106+
// Tear down by deleting the bucket
107+
try {
108+
deleteDirectoryBucket(s3Client, bucketName);
109+
} catch (S3Exception e) {
110+
logger.error("Failed to delete the bucket due to S3 error: {} - Error code: {}",
111+
e.awsErrorDetails().errorMessage(), e.awsErrorDetails().errorCode(), e);
112+
} catch (RuntimeException e) {
113+
logger.error("Failed to delete the bucket due to unexpected error: {}", e.getMessage(), e);
114+
} finally {
115+
s3Client.close();
116+
}
117+
}
118+
}
119+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package com.example.s3.directorybucket;
4+
5+
// snippet-start:[s3directorybuckets.java2.completedirectorybucketmultipartupload.import]
6+
7+
import com.example.s3.util.S3DirectoryBucketUtils;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import software.amazon.awssdk.regions.Region;
11+
import software.amazon.awssdk.services.s3.S3Client;
12+
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;
13+
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse;
14+
import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;
15+
import software.amazon.awssdk.services.s3.model.CompletedPart;
16+
import software.amazon.awssdk.services.s3.model.S3Exception;
17+
18+
import java.io.IOException;
19+
import java.nio.file.Path;
20+
import java.util.List;
21+
22+
import static com.example.s3.util.S3DirectoryBucketUtils.createDirectoryBucket;
23+
import static com.example.s3.util.S3DirectoryBucketUtils.createDirectoryBucketMultipartUpload;
24+
import static com.example.s3.util.S3DirectoryBucketUtils.createS3Client;
25+
import static com.example.s3.util.S3DirectoryBucketUtils.deleteAllObjectsInDirectoryBucket;
26+
import static com.example.s3.util.S3DirectoryBucketUtils.deleteDirectoryBucket;
27+
import static com.example.s3.util.S3DirectoryBucketUtils.getFilePath;
28+
import static com.example.s3.util.S3DirectoryBucketUtils.multipartUploadForDirectoryBucket;
29+
// snippet-end:[s3directorybuckets.java2.completedirectorybucketmultipartupload.import]
30+
31+
/**
32+
* Before running this example:
33+
* <p>
34+
* The SDK must be able to authenticate AWS requests on your behalf. If you have
35+
* not configured
36+
* authentication for SDKs and tools, see
37+
* https://docs.aws.amazon.com/sdkref/latest/guide/access.html in the AWS SDKs
38+
* and Tools Reference Guide.
39+
* <p>
40+
* You must have a runtime environment configured with the Java SDK.
41+
* See
42+
* https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html in
43+
* the Developer Guide if this is not set up.
44+
* <p>
45+
* To use S3 directory buckets, configure a gateway VPC endpoint. This is the
46+
* recommended method to enable directory bucket traffic without
47+
* requiring an internet gateway or NAT device. For more information on
48+
* configuring VPC gateway endpoints, visit
49+
* https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-networking.html#s3-express-networking-vpc-gateway.
50+
* <p>
51+
* Directory buckets are available in specific AWS Regions and Zones. For
52+
* details on Regions and Zones supporting directory buckets, see
53+
* https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-networking.html#s3-express-endpoints.
54+
*/
55+
56+
public class CompleteDirectoryBucketMultipartUpload {
57+
private static final Logger logger = LoggerFactory.getLogger(CompleteDirectoryBucketMultipartUpload.class);
58+
59+
// snippet-start:[s3directorybuckets.java2.completedirectorybucketmultipartupload.main]
60+
61+
/**
62+
* This method completes the multipart upload request by collating all the
63+
* upload parts.
64+
*
65+
* @param s3Client The S3 client used to interact with S3
66+
* @param bucketName The name of the directory bucket
67+
* @param objectKey The key (name) of the object to be uploaded
68+
* @param uploadId The upload ID used to track the multipart upload
69+
* @param uploadParts The list of completed parts
70+
* @return True if the multipart upload is successfully completed, false
71+
* otherwise
72+
*/
73+
public static boolean completeDirectoryBucketMultipartUpload(S3Client s3Client, String bucketName, String objectKey,
74+
String uploadId, List<CompletedPart> uploadParts) {
75+
try {
76+
CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder()
77+
.parts(uploadParts)
78+
.build();
79+
CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder()
80+
.bucket(bucketName)
81+
.key(objectKey)
82+
.uploadId(uploadId)
83+
.multipartUpload(completedMultipartUpload)
84+
.build();
85+
86+
CompleteMultipartUploadResponse response = s3Client.completeMultipartUpload(completeMultipartUploadRequest);
87+
logger.info("Multipart upload completed. ETag: {}", response.eTag());
88+
return true;
89+
} catch (S3Exception e) {
90+
logger.error("Failed to complete multipart upload: {} - Error code: {}", e.awsErrorDetails().errorMessage(),
91+
e.awsErrorDetails().errorCode(), e);
92+
return false;
93+
}
94+
}
95+
// snippet-end:[s3directorybuckets.java2.completedirectorybucketmultipartupload.main]
96+
97+
// Main method for testing
98+
public static void main(String[] args) {
99+
Region region = Region.US_WEST_2;
100+
S3Client s3Client = createS3Client(region);
101+
String zone = "usw2-az1";
102+
String bucketName = "test-bucket-" + System.currentTimeMillis() + "--" + zone + "--x-s3";
103+
String uploadId;
104+
String objectKey = "largeObject";
105+
Path filePath = getFilePath("directoryBucket/sample-large-object.jpg");
106+
107+
try {
108+
// Create the directory bucket
109+
createDirectoryBucket(s3Client, bucketName, zone);
110+
// Create a multipart upload
111+
uploadId = createDirectoryBucketMultipartUpload(s3Client, bucketName, objectKey);
112+
// Perform multipart upload for the directory bucket
113+
List<CompletedPart> uploadedParts = multipartUploadForDirectoryBucket(s3Client, bucketName, objectKey,
114+
uploadId, filePath);
115+
logger.info("Uploaded parts: {}", uploadedParts);
116+
// Complete Multipart Uploads
117+
boolean completed = completeDirectoryBucketMultipartUpload(s3Client, bucketName, objectKey, uploadId,
118+
uploadedParts);
119+
if (completed) {
120+
logger.info("Multipart upload successfully completed for bucket: {}", bucketName);
121+
} else {
122+
logger.error("Failed to complete multipart upload for bucket: {}", bucketName);
123+
}
124+
} catch (S3Exception e) {
125+
logger.error("An error occurred during S3 operations: {} - Error code: {}",
126+
e.awsErrorDetails().errorMessage(), e.awsErrorDetails().errorCode());
127+
} catch (IOException e) {
128+
logger.error("An I/O error occurred: {}", e.getMessage());
129+
} finally {
130+
// Error handling
131+
try {
132+
logger.info("Starting cleanup for bucket: {}", bucketName);
133+
S3DirectoryBucketUtils.abortDirectoryBucketMultipartUploads(s3Client, bucketName);
134+
deleteAllObjectsInDirectoryBucket(s3Client, bucketName);
135+
deleteDirectoryBucket(s3Client, bucketName);
136+
logger.info("Cleanup completed for bucket: {}", bucketName);
137+
} catch (S3Exception e) {
138+
logger.error("Error during cleanup: {} - Error code: {}", e.awsErrorDetails().errorMessage(),
139+
e.awsErrorDetails().errorCode(), e);
140+
} catch (RuntimeException e) {
141+
logger.error("Unexpected error during cleanup: {}", e.getMessage(), e);
142+
} finally {
143+
// Close the S3 client
144+
s3Client.close();
145+
}
146+
}
147+
}
148+
}

0 commit comments

Comments
 (0)