From 415da2760335b58277a9676dd58706d8f84b7f70 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 13 Jan 2025 11:48:04 -0500
Subject: [PATCH 01/10] updated the S3 Java ListBuckets example

---
 .../s3/src/main/java/com/example/s3/ListBuckets.java       | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
index 4717df9de74..519d2fd91ba 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
@@ -37,8 +37,11 @@ public static void main(String[] args) {
     public static void listAllBuckets(S3Client s3) {
         ListBucketsResponse response = s3.listBuckets();
         List<Bucket> bucketList = response.buckets();
-        for (Bucket bucket: bucketList) {
-            System.out.println("Bucket name "+bucket.name());
+        // Print bucket names
+        System.out.println("Your Amazon S3 buckets are:");
+        for (Bucket bucket : bucketList) {
+            System.out.println(bucket.name());
+            System.out.println(bucket.creationDate());
         }
     }
 }

From 649e09b300551aac3650f3e254d2af57a24926c4 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Tue, 14 Jan 2025 09:53:16 -0500
Subject: [PATCH 02/10] added a locl policy example

---
 .../s3/lockscenario/CreateObjectLockRole.java | 82 +++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
new file mode 100644
index 00000000000..d3a87d0c875
--- /dev/null
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
@@ -0,0 +1,82 @@
+// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+
+package com.example.s3.lockscenario;
+
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.iam.IamClient;
+import software.amazon.awssdk.services.iam.model.CreateRoleRequest;
+import software.amazon.awssdk.services.iam.model.PutRolePolicyRequest;
+
+public class CreateObjectLockRole {
+    public static void main(String[] args) {
+        createLockRole();
+    }
+
+    // snippet-start:[S3Lock.javav2.lock.role.main]
+    /**
+     * Creates an IAM role for AWS S3 Batch Operations to manage object locks.
+     */
+    public static void createLockRole() {
+        final String roleName = "batch_operations-object-lock1";
+
+        // Trust policy
+        final String trustPolicy = "{"
+            + "\"Version\":\"2012-10-17\","
+            + "\"Statement\":[{"
+            + "\"Effect\":\"Allow\","
+            + "\"Principal\":{"
+            + "\"Service\":\"batchoperations.s3.amazonaws.com\""
+            + "},"
+            + "\"Action\":\"sts:AssumeRole\""
+            + "}]"
+            + "}";
+
+        // Permissions policy
+        final String bopsPermissions = "{"
+            + "\"Version\":\"2012-10-17\","
+            + "\"Statement\":["
+            + "{"
+            + "\"Effect\":\"Allow\","
+            + "\"Action\":\"s3:GetBucketObjectLockConfiguration\","
+            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket\""
+            + "},"
+            + "{"
+            + "\"Effect\":\"Allow\","
+            + "\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:GetBucketLocation\"],"
+            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket/*\""
+            + "},"
+            + "{"
+            + "\"Effect\":\"Allow\","
+            + "\"Action\":[\"s3:PutObject\",\"s3:GetBucketLocation\"],"
+            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*\""
+            + "}"
+            + "]"
+            + "}";
+
+        // Create IAM client
+        final IamClient iam = IamClient.builder()
+            .region(Region.US_WEST_2)
+            .build();
+
+        // Create the role with the trust policy
+        final CreateRoleRequest createRoleRequest = CreateRoleRequest.builder()
+            .assumeRolePolicyDocument(trustPolicy)
+            .roleName(roleName)
+            .build();
+
+        iam.createRole(createRoleRequest);
+
+        // Attach the permissions policy to the role
+        final PutRolePolicyRequest putRolePolicyRequest = PutRolePolicyRequest.builder()
+            .policyDocument(bopsPermissions)
+            .policyName("batch_operations-permissions")
+            .roleName(roleName)
+            .build();
+
+        iam.putRolePolicy(putRolePolicyRequest);
+        System.out.println("The object lock role was created.");
+    }
+    // snippet-end:[S3Lock.javav2.lock.role.main]
+}

From d135839dc4f82e90f48c611986e2ef6e6d492d4d Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Tue, 14 Jan 2025 13:44:49 -0500
Subject: [PATCH 03/10] updated the S3 listbucket example to use pagnation

---
 .../main/java/com/example/s3/ListBuckets.java   | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
index 519d2fd91ba..d313e12ee05 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
@@ -8,6 +8,8 @@
 import software.amazon.awssdk.services.s3.S3Client;
 import software.amazon.awssdk.services.s3.model.Bucket;
 import software.amazon.awssdk.services.s3.model.ListBucketsResponse;
+import software.amazon.awssdk.services.s3.paginators.ListBucketsIterable;
+
 import java.util.List;
 
 /**
@@ -35,14 +37,13 @@ public static void main(String[] args) {
      * @param s3 The {@link S3Client} instance to use for interacting with the Amazon S3 service.
      */
     public static void listAllBuckets(S3Client s3) {
-        ListBucketsResponse response = s3.listBuckets();
-        List<Bucket> bucketList = response.buckets();
-        // Print bucket names
-        System.out.println("Your Amazon S3 buckets are:");
-        for (Bucket bucket : bucketList) {
-            System.out.println(bucket.name());
-            System.out.println(bucket.creationDate());
-        }
+        ListBucketsIterable response = s3.listBucketsPaginator();
+
+        // Iterate over each response page and print bucket names.
+        response.stream()
+            .map(ListBucketsResponse::buckets)
+            .flatMap(buckets -> buckets.stream())
+            .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name()));
     }
 }
 // snippet-end:[s3.java2.list.buckets.main]
\ No newline at end of file

From 293d232234669b80226436edebb45e8020a5709d Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 09:41:21 -0500
Subject: [PATCH 04/10] rolled in review comments

---
 .../s3/lockscenario/CreateObjectLockRole.java | 75 +++++++++++--------
 1 file changed, 45 insertions(+), 30 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
index d3a87d0c875..756209d7534 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
@@ -15,6 +15,7 @@ public static void main(String[] args) {
     }
 
     // snippet-start:[S3Lock.javav2.lock.role.main]
+
     /**
      * Creates an IAM role for AWS S3 Batch Operations to manage object locks.
      */
@@ -22,38 +23,52 @@ public static void createLockRole() {
         final String roleName = "batch_operations-object-lock1";
 
         // Trust policy
-        final String trustPolicy = "{"
-            + "\"Version\":\"2012-10-17\","
-            + "\"Statement\":[{"
-            + "\"Effect\":\"Allow\","
-            + "\"Principal\":{"
-            + "\"Service\":\"batchoperations.s3.amazonaws.com\""
-            + "},"
-            + "\"Action\":\"sts:AssumeRole\""
-            + "}]"
-            + "}";
+        final String trustPolicy = """
+            {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Principal": {
+                            "Service": "batchoperations.s3.amazonaws.com"
+                        },
+                        "Action": "sts:AssumeRole"
+                    }
+                ]
+            }
+            """;
+
 
         // Permissions policy
-        final String bopsPermissions = "{"
-            + "\"Version\":\"2012-10-17\","
-            + "\"Statement\":["
-            + "{"
-            + "\"Effect\":\"Allow\","
-            + "\"Action\":\"s3:GetBucketObjectLockConfiguration\","
-            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket\""
-            + "},"
-            + "{"
-            + "\"Effect\":\"Allow\","
-            + "\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:GetBucketLocation\"],"
-            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket/*\""
-            + "},"
-            + "{"
-            + "\"Effect\":\"Allow\","
-            + "\"Action\":[\"s3:PutObject\",\"s3:GetBucketLocation\"],"
-            + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*\""
-            + "}"
-            + "]"
-            + "}";
+        final String bopsPermissions = """
+            {
+                "Version": "2012-10-17",
+                "Statement": [
+                    {
+                        "Effect": "Allow",
+                        "Action": "s3:GetBucketObjectLockConfiguration",
+                        "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket"
+                    },
+                    {
+                        "Effect": "Allow",
+                        "Action": [
+                            "s3:GetObject",
+                            "s3:GetObjectVersion",
+                            "s3:GetBucketLocation"
+                        ],
+                        "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
+                    },
+                    {
+                        "Effect": "Allow",
+                        "Action": [
+                            "s3:PutObject",
+                            "s3:GetBucketLocation"
+                        ],
+                        "Resource": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
+                    }
+                ]
+            }
+            """;
 
         // Create IAM client
         final IamClient iam = IamClient.builder()

From 475beb0eb169a05b3b96e8f7b3e9bc064c7ad7e3 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 09:45:39 -0500
Subject: [PATCH 05/10] rolled in review comments

---
 .../s3/src/main/java/com/example/s3/ListBuckets.java           | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
index d313e12ee05..ef1c2ad64e0 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
@@ -45,5 +45,4 @@ public static void listAllBuckets(S3Client s3) {
             .flatMap(buckets -> buckets.stream())
             .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name()));
     }
-}
-// snippet-end:[s3.java2.list.buckets.main]
\ No newline at end of file
+}// snippet-end:[s3.java2.list.buckets.main]
\ No newline at end of file

From 04fc79a9e9ea8506158293e0a7fff4bff30c1eec Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 10:37:39 -0500
Subject: [PATCH 06/10] rolled in review comments

---
 javav2/example_code/s3/pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/javav2/example_code/s3/pom.xml b/javav2/example_code/s3/pom.xml
index 3c25b740083..957e73c9091 100644
--- a/javav2/example_code/s3/pom.xml
+++ b/javav2/example_code/s3/pom.xml
@@ -48,7 +48,7 @@
                     </execution>
                 </executions>
             </plugin>
-         </plugins>
+        </plugins>
     </build>
     <dependencyManagement>
         <dependencies>
@@ -185,4 +185,4 @@
             <version>2.10.1</version>
         </dependency>
     </dependencies>
-   </project>
\ No newline at end of file
+</project>
\ No newline at end of file

From 263df5061d30249ea46187bd3f9ec5c05c2bd4f8 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 10:42:55 -0500
Subject: [PATCH 07/10] rolled in review comments

---
 .../s3/lockscenario/CreateObjectLockRole.java | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
index 756209d7534..4cdb455a3b0 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
@@ -11,7 +11,20 @@
 
 public class CreateObjectLockRole {
     public static void main(String[] args) {
-        createLockRole();
+        final String usage = """
+
+            Usage:    <roleName>
+
+            Where:
+               roleName - the IAM role name.
+            """;
+
+        if (args.length != 1) {
+            System.out.println(usage);
+            System.exit(1);
+        }
+        String roleName = args[0];
+        createLockRole(roleName);
     }
 
     // snippet-start:[S3Lock.javav2.lock.role.main]
@@ -19,9 +32,7 @@ public static void main(String[] args) {
     /**
      * Creates an IAM role for AWS S3 Batch Operations to manage object locks.
      */
-    public static void createLockRole() {
-        final String roleName = "batch_operations-object-lock1";
-
+    public static void createLockRole(String roleName) {
         // Trust policy
         final String trustPolicy = """
             {

From 7ee54d50684470674e79355439a23d6e6d67c9a9 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 10:49:19 -0500
Subject: [PATCH 08/10] rolled in review comments

---
 .../s3/src/main/java/com/example/s3/ListBuckets.java      | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
index ef1c2ad64e0..1e776d17a9e 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
@@ -38,11 +38,7 @@ public static void main(String[] args) {
      */
     public static void listAllBuckets(S3Client s3) {
         ListBucketsIterable response = s3.listBucketsPaginator();
-
-        // Iterate over each response page and print bucket names.
-        response.stream()
-            .map(ListBucketsResponse::buckets)
-            .flatMap(buckets -> buckets.stream())
-            .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name()));
+        response.buckets().forEach(bucket ->
+            System.out.println("Bucket Name: " + bucket.name()));
     }
 }// snippet-end:[s3.java2.list.buckets.main]
\ No newline at end of file

From 3709cb3b2006fff3556096ab86796a6753d2e4d1 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 11:54:38 -0500
Subject: [PATCH 09/10] rolled in review comments

---
 .../s3/src/main/java/com/example/s3/ListBuckets.java         | 5 -----
 .../com/example/s3/lockscenario/CreateObjectLockRole.java    | 1 -
 2 files changed, 6 deletions(-)

diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
index 1e776d17a9e..b5c4ef0a070 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java
@@ -6,12 +6,7 @@
 // snippet-start:[s3.java2.list.buckets.main]
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.model.Bucket;
-import software.amazon.awssdk.services.s3.model.ListBucketsResponse;
 import software.amazon.awssdk.services.s3.paginators.ListBucketsIterable;
-
-import java.util.List;
-
 /**
  * Before running this Java V2 code example, set up your development
  * environment, including your credentials.
diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
index 4cdb455a3b0..8dec910af3a 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
@@ -28,7 +28,6 @@ public static void main(String[] args) {
     }
 
     // snippet-start:[S3Lock.javav2.lock.role.main]
-
     /**
      * Creates an IAM role for AWS S3 Batch Operations to manage object locks.
      */

From ebcb3b98a525c277469a8ea66f47a9598828f334 Mon Sep 17 00:00:00 2001
From: scmacdon <scmacdon@amazon.com>
Date: Mon, 27 Jan 2025 14:08:57 -0500
Subject: [PATCH 10/10] rolled in review comments made by S3 team

---
 .doc_gen/metadata/s3-control_metadata.yaml                      | 2 +-
 .../s3/{lockscenario => batch}/CreateObjectLockRole.java        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
 rename javav2/example_code/s3/src/main/java/com/example/s3/{lockscenario => batch}/CreateObjectLockRole.java (98%)

diff --git a/.doc_gen/metadata/s3-control_metadata.yaml b/.doc_gen/metadata/s3-control_metadata.yaml
index 589285de221..5b34a0a4eac 100644
--- a/.doc_gen/metadata/s3-control_metadata.yaml
+++ b/.doc_gen/metadata/s3-control_metadata.yaml
@@ -33,7 +33,7 @@ s3-control_CreateJob:
             - description: Create a legal hold off job.
               snippet_tags:
                 - s3control.java2.create_job.compliance.main  
-            - description: Create a new governance retemtion job.
+            - description: Create a new governance retention job.
               snippet_tags:
                 - s3.java2.create_governance_retemtion.main       
   services:
diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java
similarity index 98%
rename from javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
rename to javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java
index 8dec910af3a..6cc3c9ea2df 100644
--- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java
+++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java
@@ -2,7 +2,7 @@
 // SPDX-License-Identifier: Apache-2.0
 
 
-package com.example.s3.lockscenario;
+package com.example.s3.batch;
 
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.iam.IamClient;