From 4e9549fd1a301c600db0800ae0d15360772d313b Mon Sep 17 00:00:00 2001 From: David Ho <70000000+davidh44@users.noreply.github.com> Date: Wed, 3 Sep 2025 11:04:09 -0700 Subject: [PATCH 1/4] Merge TransferManager recipes to main recipe (#6392) --- .../v2migrationtests/MavenNoCompileTest.java | 3 +- .../v2migrationtests/MavenProjectTest.java | 3 +- .../v2migrationtests/MavenTestBase.java | 6 +- .../MavenTransferManagerTest.java | 56 ------------------ .../v2migrationtests/maven-tm/after/pom.xml | 55 ------------------ .../v2migrationtests/maven-tm/before/pom.xml | 49 ---------------- .../v2migrationtests/maven/after/pom.xml | 5 ++ .../main/java/foo/bar/TransferManagerS3.java | 19 +++--- .../main/java/foo/bar/TransferManagerS3.java | 0 .../rewrite/aws-sdk-java-v1-to-v2-with-tm.yml | 58 ------------------- .../rewrite/aws-sdk-java-v1-to-v2.yml | 7 ++- 11 files changed, 23 insertions(+), 238 deletions(-) delete mode 100644 test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTransferManagerTest.java delete mode 100644 test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/pom.xml delete mode 100644 test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/pom.xml rename test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/{maven-tm => maven}/after/src/main/java/foo/bar/TransferManagerS3.java (98%) rename test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/{maven-tm => maven}/before/src/main/java/foo/bar/TransferManagerS3.java (100%) delete mode 100644 v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2-with-tm.yml diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenNoCompileTest.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenNoCompileTest.java index 2da211c3ba5b..f4c50969c9c0 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenNoCompileTest.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenNoCompileTest.java @@ -50,7 +50,6 @@ static void setUp() throws IOException { @Test @EnabledIf("versionAvailable") void mavenProject_shouldConvert() throws IOException { - boolean experimental = true; - verifyTransformation(experimental); + verifyTransformation(); } } diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenProjectTest.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenProjectTest.java index 3c950c5ee85c..f55506fddf83 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenProjectTest.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenProjectTest.java @@ -47,8 +47,7 @@ static void setUp() throws IOException { @Test @EnabledIf("versionAvailable") void mavenProject_shouldConvert() throws IOException { - boolean experimental = false; - verifyTransformation(experimental); + verifyTransformation(); verifyCompilation(); } } diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java index 4df43daf5712..db23674b1554 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java @@ -47,12 +47,8 @@ protected static void deleteTempDirectories() throws IOException { FileUtils.deleteDirectory(mavenExpected.toFile()); } - protected static void verifyTransformation(boolean experimental) throws IOException { + protected static void verifyTransformation() throws IOException { String recipeCmd = "-Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2"; - if (experimental) { - recipeCmd += "Experimental"; - } - List rewriteArgs = new ArrayList<>(); // pin version since updates have broken tests String rewriteMavenPluginVersion = "5.46.0"; diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTransferManagerTest.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTransferManagerTest.java deleted file mode 100644 index a97cb1de231b..000000000000 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTransferManagerTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.v2migrationtests; - -import static software.amazon.awssdk.v2migrationtests.TestUtils.getVersion; -import static software.amazon.awssdk.v2migrationtests.TestUtils.replaceVersion; - -import java.io.File; -import java.io.IOException; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIf; - -public class MavenTransferManagerTest extends MavenTestBase { - - @BeforeAll - static void setUp() throws IOException { - sdkVersion = getVersion(); - mavenBefore = new File(MavenTransferManagerTest.class.getResource("maven-tm/before").getFile()).toPath(); - mavenAfter = new File(MavenTransferManagerTest.class.getResource("maven-tm/after").getFile()).toPath(); - target = new File(MavenTransferManagerTest.class.getResource("/").getFile()).toPath().getParent(); - - mavenActual = target.resolve("maven-tm/actual"); - mavenExpected = target.resolve("maven-tm/expected"); - - deleteTempDirectories(); - - FileUtils.copyDirectory(mavenBefore.toFile(), mavenActual.toFile()); - FileUtils.copyDirectory(mavenAfter.toFile(), mavenExpected.toFile()); - - replaceVersion(mavenExpected.resolve("pom.xml"), sdkVersion); - replaceVersion(mavenActual.resolve("pom.xml"), sdkVersion); - } - - @Test - @EnabledIf("versionAvailable") - void mavenProject_shouldConvert() throws IOException { - boolean experimental = true; - verifyTransformation(experimental); - verifyCompilation(); - } -} diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/pom.xml b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/pom.xml deleted file mode 100644 index cd6274a6a517..000000000000 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - 4.0.0 - - software.amazon.awssdk - sample-application - 1.2.3 - - - 1.8 - 1.8 - - - - - - software.amazon.awssdk - bom - V2_VERSION - pom - import - - - - - - - software.amazon.awssdk - s3 - V2_VERSION - - - software.amazon.awssdk - s3-transfer-manager - V2_VERSION - - - \ No newline at end of file diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/pom.xml b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/pom.xml deleted file mode 100644 index 70c4e8e9b12c..000000000000 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - 4.0.0 - - software.amazon.awssdk - sample-application - 1.2.3 - - - 1.8 - 1.8 - - - - - - com.amazonaws - aws-java-sdk-bom - 1.11.1000 - pom - import - - - - - - - com.amazonaws - aws-java-sdk-s3 - - - \ No newline at end of file diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/pom.xml b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/pom.xml index 693894ce86eb..a49910e17980 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/pom.xml +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/pom.xml @@ -62,6 +62,11 @@ s3-event-notifications V2_VERSION + + software.amazon.awssdk + s3-transfer-manager + V2_VERSION + software.amazon.awssdk s3 diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/src/main/java/foo/bar/TransferManagerS3.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/TransferManagerS3.java similarity index 98% rename from test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/src/main/java/foo/bar/TransferManagerS3.java rename to test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/TransferManagerS3.java index c4971ff63b1e..fd314f386f47 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/after/src/main/java/foo/bar/TransferManagerS3.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/TransferManagerS3.java @@ -15,6 +15,10 @@ package foo.bar; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.time.Duration; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; @@ -41,18 +45,13 @@ import software.amazon.awssdk.transfer.s3.model.UploadRequest; import software.amazon.awssdk.transfer.s3.progress.TransferProgress; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.time.Duration; - public class TransferManagerS3 { File file = new File("path/to/file.txt"); void tmConstructor(AwsCredentials credentials, AwsCredentialsProvider credentialsProvider) { S3TransferManager tm = S3TransferManager.builder() - .build(); + .build(); S3TransferManager tmBuilderDefault = S3TransferManager.create(); S3TransferManager tmBuilderWithS3 = S3TransferManager.builder().build(); S3TransferManager tmConstructorWithCred = S3TransferManager.builder().s3Client(S3AsyncClient.builder().credentialsProvider(StaticCredentialsProvider.create(credentials)).build()).build(); @@ -66,7 +65,7 @@ void download(S3TransferManager tm, String bucket, String key) { FileDownload download2 = tm.downloadFile(DownloadFileRequest.builder().getObjectRequest(GetObjectRequest.builder().bucket(bucket).key(key).overrideConfiguration(AwsRequestOverrideConfiguration.builder().apiCallTimeout(Duration.ofMillis(timeout)).build()).build()).destination(file).build()); GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucket).key(key) - .build(); + .build(); FileDownload download3 = tm.downloadFile(DownloadFileRequest.builder().getObjectRequest(getObjectRequest).destination(file).build()); @@ -78,11 +77,11 @@ void upload(S3TransferManager tm, String bucket, String key) { File file = new File("file1.txt"); PutObjectRequest requestWithFile = PutObjectRequest.builder().bucket(bucket).key(key) - .build(); + .build(); tm.uploadFile(UploadFileRequest.builder().putObjectRequest(requestWithFile).source(file).build()); PutObjectRequest requestWithoutPayload = PutObjectRequest.builder().bucket(bucket).key(key).websiteRedirectLocation("location") - .build(); + .build(); tm.upload(UploadRequest.builder().putObjectRequest(requestWithoutPayload).requestBody(AsyncRequestBody.empty()).build()); } @@ -90,7 +89,7 @@ void copy(S3TransferManager tm, String sourceBucket, String sourceKey, String de Copy copy = tm.copy(CopyRequest.builder().copyObjectRequest(CopyObjectRequest.builder().sourceBucket(sourceBucket).sourceKey(sourceKey).destinationBucket(destinationBucket).destinationKey(destinationKey).build()).build()); CopyObjectRequest copyRequest = CopyObjectRequest.builder().sourceBucket(sourceBucket).sourceKey(sourceKey).destinationBucket(destinationBucket).destinationKey(destinationKey) - .build(); + .build(); Copy copy2 = tm.copy(CopyRequest.builder().copyObjectRequest(copyRequest).build()); } diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/src/main/java/foo/bar/TransferManagerS3.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/TransferManagerS3.java similarity index 100% rename from test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-tm/before/src/main/java/foo/bar/TransferManagerS3.java rename to test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/TransferManagerS3.java diff --git a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2-with-tm.yml b/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2-with-tm.yml deleted file mode 100644 index 9769969f3748..000000000000 --- a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2-with-tm.yml +++ /dev/null @@ -1,58 +0,0 @@ -# -# 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. -# ---- -type: specs.openrewrite.org/v1beta/recipe -name: software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2Experimental -displayName: Migrate from the AWS SDK for Java v1 to the AWS SDK for Java v2 including S3 Transfer Manager. -description: This recipe will apply changes required for migrating from the AWS SDK for Java v1 to the AWS SDK for Java v2, including S3 Transfer Manager. Transforms for Transfer Manager are incomplete and in-progress. -tags: - - aws - - sdk -recipeList: - - software.amazon.awssdk.v2migration.AddTransferManagerDependency - - software.amazon.awssdk.v2migration.AddS3EventNotificationDependency - - software.amazon.awssdk.v2migration.UpgradeSdkDependencies - - software.amazon.awssdk.v2migration.S3AddImportsAndComments - - software.amazon.awssdk.v2migration.S3EventNotificationMethodToV2 - - software.amazon.awssdk.v2migration.S3TypesToV2 - - software.amazon.awssdk.v2migration.S3StreamingResponseToV2 - - software.amazon.awssdk.v2migration.S3StreamingRequestToV2 - - software.amazon.awssdk.v2migration.S3NonStreamingRequestToV2 - - software.amazon.awssdk.v2migration.S3MethodsToV2 - - software.amazon.awssdk.v2migration.S3EventNotificationMethodsToV2 - - software.amazon.awssdk.v2migration.S3MethodsConstructorToFluent - - software.amazon.awssdk.v2migration.S3UriToV2 - - software.amazon.awssdk.v2migration.EnumGettersToV2 - - software.amazon.awssdk.v2migration.ChangeTransferManagerTypes - - software.amazon.awssdk.v2migration.ChangeS3EventNotificationTypes - - software.amazon.awssdk.v2migration.ChangeSdkType - - software.amazon.awssdk.v2migration.ChangeSdkCoreTypes - # At this point, all classes should be changed to v2 equivalents - - software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder - - software.amazon.awssdk.v2migration.NewClassToBuilderPattern - - software.amazon.awssdk.v2migration.NewClassToStaticFactory - - software.amazon.awssdk.v2migration.V1GetterToV2 - - software.amazon.awssdk.v2migration.HttpSettingsToHttpClient - - software.amazon.awssdk.v2migration.WrapSdkClientBuilderRegionStr - - software.amazon.awssdk.v2migration.EnumCasingToV2 - - software.amazon.awssdk.v2migration.SdkBytesToByteBuffer - - software.amazon.awssdk.v2migration.ByteBufferToSdkBytes - - software.amazon.awssdk.v2migration.DateToInstant - - software.amazon.awssdk.v2migration.S3NonStreamingRequestToV2Complex - - software.amazon.awssdk.v2migration.S3PutObjectRequestToV2 - - software.amazon.awssdk.v2migration.SettersToBuilderV2 - - software.amazon.awssdk.v2migration.S3TmAddComments - - software.amazon.awssdk.v2migration.ChangeTransferManagerSimpleMethods - - software.amazon.awssdk.v2migration.TransferManagerMethodsToV2 \ No newline at end of file diff --git a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml b/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml index 3c4f420719f5..c040f4a7cf71 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml @@ -21,6 +21,7 @@ tags: - aws - sdk recipeList: + - software.amazon.awssdk.v2migration.AddTransferManagerDependency - software.amazon.awssdk.v2migration.AddS3EventNotificationDependency - software.amazon.awssdk.v2migration.UpgradeSdkDependencies - software.amazon.awssdk.v2migration.S3AddImportsAndComments @@ -34,6 +35,7 @@ recipeList: - software.amazon.awssdk.v2migration.S3MethodsConstructorToFluent - software.amazon.awssdk.v2migration.S3UriToV2 - software.amazon.awssdk.v2migration.EnumGettersToV2 + - software.amazon.awssdk.v2migration.ChangeTransferManagerTypes - software.amazon.awssdk.v2migration.ChangeS3EventNotificationTypes - software.amazon.awssdk.v2migration.ChangeSdkType - software.amazon.awssdk.v2migration.ChangeSdkCoreTypes @@ -50,4 +52,7 @@ recipeList: - software.amazon.awssdk.v2migration.DateToInstant - software.amazon.awssdk.v2migration.S3NonStreamingRequestToV2Complex - software.amazon.awssdk.v2migration.S3PutObjectRequestToV2 - - software.amazon.awssdk.v2migration.SettersToBuilderV2 \ No newline at end of file + - software.amazon.awssdk.v2migration.SettersToBuilderV2 + - software.amazon.awssdk.v2migration.S3TmAddComments + - software.amazon.awssdk.v2migration.ChangeTransferManagerSimpleMethods + - software.amazon.awssdk.v2migration.TransferManagerMethodsToV2 \ No newline at end of file From 3a01289246f1f4ac814a354051d00030e53ef968 Mon Sep 17 00:00:00 2001 From: David Ho <70000000+davidh44@users.noreply.github.com> Date: Fri, 5 Sep 2025 13:33:25 -0700 Subject: [PATCH 2/4] Bump OpenRewrite to 3.14.0 (#6394) * Bump OpenRewrite to 3.6.1 * Bump OpenRewrite to 3.14.0 * Remove redundant import add/remove * Add v2 import in S3PojoToV2 * Update unit test for exceptions --- test/v2-migration-tests/pom.xml | 5 + .../v2migrationtests/GradleProjectTest.java | 1 - .../v2migrationtests/MavenTestBase.java | 2 +- .../gradle/before/init.gradle | 2 +- .../src/main/java/foo/bar/S3EnDateTime.java | 2 +- .../src/main/java/foo/bar/Application.java | 6 +- .../maven/after/src/main/java/foo/bar/S3.java | 3 +- .../java/foo/bar/S3RequestConstructor.java | 6 +- .../src/main/java/foo/bar/S3Streaming.java | 7 +- v2-migration/pom.xml | 4 +- .../v2migration/ConstructorToFluent.java | 2 + .../v2migration/HttpSettingsToHttpClient.java | 6 + .../awssdk/v2migration/NewClassToBuilder.java | 4 + .../S3NonStreamingRequestToV2.java | 2 + .../amazon/awssdk/v2migration/S3PojoToV2.java | 95 +++++++++++++ .../v2migration/S3PutObjectRequestToV2.java | 16 +-- .../v2migration/S3StreamingRequestToV2.java | 6 + .../v2migration/S3StreamingResponseToV2.java | 2 + .../awssdk/v2migration/SdkExceptionToV2.java | 94 +++++++++++++ .../TransferManagerMethodsToV2.java | 25 +++- .../V1BuilderVariationsToV2Builder.java | 2 + .../internal/utils/NamingUtils.java | 10 +- .../internal/utils/S3TransformUtils.java | 5 + .../ChangeMethodInvocationReturnType.java | 133 ------------------ .../rewrite/aws-sdk-java-v1-to-v2.yml | 2 + .../rewrite/change-exception-types.yml | 22 --- .../change-s3-event-notification-methods.yml | 2 +- .../META-INF/rewrite/change-s3-types.yml | 52 +++---- ...change-transfer-manager-simple-methods.yml | 11 +- .../rewrite/change-transfer-manager-types.yml | 4 +- .../s3-methods-constructor-to-fluent.yml | 20 +-- .../v2migration/ChangeConfigTypesTest.java | 4 +- .../v2migration/ChangeExceptionTypesTest.java | 7 +- 33 files changed, 313 insertions(+), 251 deletions(-) create mode 100644 v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PojoToV2.java create mode 100644 v2-migration/src/main/java/software/amazon/awssdk/v2migration/SdkExceptionToV2.java delete mode 100644 v2-migration/src/main/java/software/amazon/awssdk/v2migration/openrewrite/ChangeMethodInvocationReturnType.java diff --git a/test/v2-migration-tests/pom.xml b/test/v2-migration-tests/pom.xml index 007032fc9ec9..0066b81536e8 100644 --- a/test/v2-migration-tests/pom.xml +++ b/test/v2-migration-tests/pom.xml @@ -136,6 +136,11 @@ test-utils test + + commons-io + commons-io + test + diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java index 6fdf0018102b..2a77a993e5cd 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java @@ -36,7 +36,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIf; -import software.amazon.awssdk.testutils.SdkVersionUtils; import software.amazon.awssdk.utils.Logger; public class GradleProjectTest { diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java index db23674b1554..a7b6a5befe1d 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java @@ -51,7 +51,7 @@ protected static void verifyTransformation() throws IOException { String recipeCmd = "-Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2"; List rewriteArgs = new ArrayList<>(); // pin version since updates have broken tests - String rewriteMavenPluginVersion = "5.46.0"; + String rewriteMavenPluginVersion = "6.17.0"; addAll(rewriteArgs, "mvn", "org.openrewrite.maven:rewrite-maven-plugin:" + rewriteMavenPluginVersion + ":run", "-Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:"+ getMigrationToolVersion() + "-PREVIEW", recipeCmd); diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle index 25eb4abdc9c1..8e1300870bc2 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/gradle/before/init.gradle @@ -3,7 +3,7 @@ initscript { maven { url "https://plugins.gradle.org/m2" } } dependencies { - classpath("org.openrewrite:plugin:6.28.0") + classpath("org.openrewrite:plugin:7.15.0") } } diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-nocompile/after/src/main/java/foo/bar/S3EnDateTime.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-nocompile/after/src/main/java/foo/bar/S3EnDateTime.java index bee0b278b9af..ecab91a6b763 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-nocompile/after/src/main/java/foo/bar/S3EnDateTime.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven-nocompile/after/src/main/java/foo/bar/S3EnDateTime.java @@ -25,7 +25,7 @@ public class S3EnDateTime { public void parseEvent(String jsonInput) { S3EventNotification notification = S3EventNotification.fromJson(jsonInput); - for (S3EventNotification.S3EventNotificationRecord record : notification.getRecords()) { + for (S3EventNotificationRecord record : notification.getRecords()) { DateTime eventTime = /*AWS SDK for Java v2 migration: getEventTime returns Instant instead of DateTime in v2. AWS SDK v2 does not include org.joda.time as a dependency. If you want to keep using DateTime, you'll need to manually add "org.joda.time:joda-time" dependency to your project after migration.*/new DateTime(record.getEventTime().toEpochMilli()); GlacierEventData glacierEventData = record.getGlacierEventData(); diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Application.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Application.java index fcb5b1da2862..bc3f83e38420 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Application.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Application.java @@ -70,11 +70,11 @@ public static void main(String... args) { } catch (SqsException exception) { System.out.println(String.format("Error code: %s. RequestId: %s. Raw response content: %s", - exception.awsErrorDetails().errorCode(), exception.requestId(), - exception.awsErrorDetails().rawResponse().asUtf8String())); + exception.awsErrorDetails().errorCode(), exception.requestId(), + exception.awsErrorDetails().rawResponse().asUtf8String())); } catch (AwsServiceException exception) { System.out.println(String.format("Error message: %s. Service Name: %s", - exception.awsErrorDetails().errorMessage(), exception.awsErrorDetails().serviceName())); + exception.awsErrorDetails().errorMessage(), exception.awsErrorDetails().serviceName())); } catch (SdkException exception) { System.out.println("Error message " + exception.getMessage()); } diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3.java index 51244f6e1ac4..c28f71bdd5c5 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3.java @@ -170,8 +170,7 @@ private void completeMpu(S3Client s3, String bucket, String key) { .build(); CompleteMultipartUploadRequest completeMpuRequest2 = - CompleteMultipartUploadRequest.builder().bucket(bucket).key(key).uploadId("uploadId").multipartUpload(CompletedMultipartUpload.builder().parts(partETags).build()) - .build(); + CompleteMultipartUploadRequest.builder().bucket(bucket).key(key).uploadId("uploadId").multipartUpload(CompletedMultipartUpload.builder().parts(partETags).build()).build(); } private void listObjects(S3Client s3, String bucket) { diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3RequestConstructor.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3RequestConstructor.java index e884c669749f..19b4b6e2036c 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3RequestConstructor.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3RequestConstructor.java @@ -147,8 +147,7 @@ public void requestconstructor() { s3.abortMultipartUpload(AbortMultipartUploadRequest.builder().bucket("name").key("key").uploadId("upload") .build()); - s3.completeMultipartUpload(CompleteMultipartUploadRequest.builder().bucket("name").key("key").uploadId("upload").multipartUpload(CompletedMultipartUpload.builder().parts(new ArrayList<>()).build()) - .build()); + s3.completeMultipartUpload(CompleteMultipartUploadRequest.builder().bucket("name").key("key").uploadId("upload").multipartUpload(CompletedMultipartUpload.builder().parts(new ArrayList<>()).build()).build()); s3.copyObject(CopyObjectRequest.builder() .build()); @@ -458,8 +457,7 @@ public void requestconstructor() { .build(); List tags = new ArrayList<>(); - GetObjectTaggingResponse getObjectTaggingResult = GetObjectTaggingResponse.builder().tagSet(tags) - .build(); + GetObjectTaggingResponse getObjectTaggingResult = GetObjectTaggingResponse.builder().tagSet(tags).build(); PutBucketVersioningRequest setBucketVersioningConfigurationRequest = PutBucketVersioningRequest.builder().bucket(bucketName).versioningConfiguration(VersioningConfiguration.builder() diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java index bccb2eae944b..b0b6cca9cfe8 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/S3Streaming.java @@ -61,7 +61,7 @@ void putObject_bucketKeyStreamMetadata(String bucket, String key, InputStream st HeadObjectResponse metadataWithLength = HeadObjectResponse.builder() .build(); s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key).contentLength(22L) - .build(), RequestBody.fromInputStream(stream, 22L)); + .build(), RequestBody.fromInputStream(stream, 22)); HeadObjectResponse metadataWithoutLength = HeadObjectResponse.builder() @@ -105,7 +105,7 @@ void putObject_requestPojoWithInputStream(String bucket, String key) { HeadObjectResponse metadata = HeadObjectResponse.builder() .build(); s3.putObject(PutObjectRequest.builder().bucket(bucket).key(key).websiteRedirectLocation("location").contentLength(11L) - .build(), RequestBody.fromInputStream(inputStream2, 11L)); + .build(), RequestBody.fromInputStream(inputStream2, 11)); } void putObject_requestPojoWithoutPayload(String bucket, String key) { @@ -117,8 +117,7 @@ void putObject_requestPojoWithoutPayload(String bucket, String key) { void putObjectSetters() { List tags = new ArrayList<>(); - Tagging objectTagging = Tagging.builder().tagSet(tags) - .build(); + Tagging objectTagging = Tagging.builder().tagSet(tags).build(); PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket("bucket").key("key").websiteRedirectLocation("location") diff --git a/v2-migration/pom.xml b/v2-migration/pom.xml index f15eccad356f..478ce4054c0b 100644 --- a/v2-migration/pom.xml +++ b/v2-migration/pom.xml @@ -34,7 +34,7 @@ ${project.parent.version} - 2.23.0 + 3.14.0 5.10.3 1.12.472 @@ -74,7 +74,7 @@ org.openrewrite rewrite-java-8 - runtime + test org.openrewrite.recipe diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/ConstructorToFluent.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/ConstructorToFluent.java index 51e8c726b8dc..f0e7d65ae36e 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/ConstructorToFluent.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/ConstructorToFluent.java @@ -147,6 +147,8 @@ private static J.MethodInvocation addWither(Expression select, String simpleName Collections.singletonList(simpleName), Collections.singletonList(parameterType), null, + null, + null, null ); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/HttpSettingsToHttpClient.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/HttpSettingsToHttpClient.java index b29ce8b40791..b32a02291e84 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/HttpSettingsToHttpClient.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/HttpSettingsToHttpClient.java @@ -308,6 +308,8 @@ private J.MethodInvocation addHttpClientBuilderIfNeeded( Collections.emptyList(), parametersTypes, Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), Collections.emptyList() ); @@ -359,6 +361,8 @@ private JContainer httpClientBuilderInvoke(Map h Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), Collections.emptyList() ); @@ -403,6 +407,8 @@ private static J.MethodInvocation invokeHttpSetting(Map.Entry names, names, types, null, + null, + null, null ); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PojoToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PojoToV2.java new file mode 100644 index 000000000000..3503b038d4d3 --- /dev/null +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PojoToV2.java @@ -0,0 +1,95 @@ +/* + * 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.v2migration; + +import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V1_S3_MODEL_PKG; +import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_S3_MODEL_PKG; + +import java.util.List; +import java.util.regex.Pattern; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.AddImport; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.JavaVisitor; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import software.amazon.awssdk.annotations.SdkInternalApi; + +@SdkInternalApi +public class S3PojoToV2 extends Recipe { + + private static final Pattern COMPETE_MPU = Pattern.compile(V1_S3_MODEL_PKG + "CompleteMultipartUploadRequest"); + private static final Pattern OBJECT_TAGGING = Pattern.compile(V1_S3_MODEL_PKG + "ObjectTagging"); + private static final Pattern GET_OBJECT_TAGGING_RESULT = Pattern.compile(V1_S3_MODEL_PKG + "GetObjectTaggingResult"); + + @Override + public String getDisplayName() { + return "S3 POJOs to V2"; + } + + @Override + public String getDescription() { + return "S3 POJOs to V2"; + } + + @Override + public TreeVisitor getVisitor() { + return new Visitor(); + } + + private static final class Visitor extends JavaVisitor { + + @Override + public J visitNewClass(J.NewClass newClass, ExecutionContext executionContext) { + JavaType type = newClass.getType(); + if (!(type instanceof JavaType.FullyQualified)) { + return newClass; + } + + if (type.isAssignableFrom(COMPETE_MPU) && newClass.getArguments().size() == 4) { + addV2S3ModelImport("CompleteMultipartUploadRequest"); + addV2S3ModelImport("CompletedMultipartUpload"); + List params = newClass.getArguments(); + String v2Builder = "CompleteMultipartUploadRequest.builder().bucket(#{any()}).key(#{any()}).uploadId(#{any()})" + + ".multipartUpload(CompletedMultipartUpload.builder().parts(#{any()}).build()).build()"; + return JavaTemplate.builder(v2Builder) + .build().apply(getCursor(), newClass.getCoordinates().replace(), + params.get(0), params.get(1), params.get(2), params.get(3)); + } + if (type.isAssignableFrom(OBJECT_TAGGING) && newClass.getArguments().size() == 1) { + String v2Builder = "Tagging.builder().tagSet(#{any()}).build();"; + return JavaTemplate.builder(v2Builder) + .build().apply(getCursor(), newClass.getCoordinates().replace(), + newClass.getArguments().get(0)); + } + if (type.isAssignableFrom(GET_OBJECT_TAGGING_RESULT) && newClass.getArguments().size() == 1) { + String v2Builder = "GetObjectTaggingResponse.builder().tagSet(#{any()}).build();"; + return JavaTemplate.builder(v2Builder) + .build().apply(getCursor(), newClass.getCoordinates().replace(), + newClass.getArguments().get(0)); + } + + return super.visitNewClass(newClass, executionContext); + } + + private void addV2S3ModelImport(String className) { + doAfterVisit(new AddImport<>(V2_S3_MODEL_PKG + className, null, false)); + } + } +} diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java index 151d24a95c24..db9601b045e5 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3PutObjectRequestToV2.java @@ -305,13 +305,8 @@ private J.MethodInvocation addInputStreamToPutObject(J.MethodInvocation method, .withComments(inputStreamBufferingWarningComment()); } - StringBuilder sb = new StringBuilder("#{any()}, RequestBody.fromInputStream(#{any()}, #{any()}"); - if (contentLen instanceof J.Literal) { - sb.append("L"); - } - sb.append(")"); - - return JavaTemplate.builder(sb.toString()).build() + v2Method = "#{any()}, RequestBody.fromInputStream(#{any()}, #{any()})"; + return JavaTemplate.builder(v2Method).build() .apply(getCursor(), method.getCoordinates().replaceArguments(), method.getArguments().get(0), inputStream, contentLen); } @@ -346,12 +341,7 @@ private J.MethodInvocation transformPutObjectWithStreamAndMetadata(J.MethodInvoc .withComments(inputStreamBufferingWarningComment()); } - sb.append(".build(), RequestBody.fromInputStream(#{any()}, #{any()}"); - - if (contentLen instanceof J.Literal) { - sb.append("L"); - } - sb.append(")"); + sb.append(".build(), RequestBody.fromInputStream(#{any()}, #{any()})"); params = Arrays.copyOf(params, 4); params[3] = contentLen; diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingRequestToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingRequestToV2.java index 9d9c237acc1c..403bd213a6bd 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingRequestToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingRequestToV2.java @@ -123,6 +123,8 @@ private J.MethodInvocation stringToRequestBody(Expression fileExpr) { Collections.singletonList("stringContent"), Collections.singletonList(JavaType.buildType("java.lang.String")), null, + null, + null, null ); @@ -186,6 +188,8 @@ private J.MethodInvocation fileToRequestBody(Expression fileExpr) { Collections.singletonList("file"), Collections.singletonList(JavaType.buildType("java.io.File")), null, + null, + null, null ); @@ -217,6 +221,8 @@ private Expression bucketAndKeyToPutObject(Expression bucketExpr, Expression key Arrays.asList("bucket", "key"), Arrays.asList(bucketExpr.getType(), keyExpr.getType()), null, + null, + null, null ); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingResponseToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingResponseToV2.java index 3504afb21e51..1c7e8adce40c 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingResponseToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/S3StreamingResponseToV2.java @@ -149,6 +149,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), Collections.emptyList() ); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/SdkExceptionToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/SdkExceptionToV2.java new file mode 100644 index 000000000000..8e244787bdb6 --- /dev/null +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/SdkExceptionToV2.java @@ -0,0 +1,94 @@ +/* + * 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.v2migration; + +import static software.amazon.awssdk.v2migration.internal.utils.NamingUtils.transformMethodName; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.tree.J; +import software.amazon.awssdk.annotations.SdkInternalApi; + +@SdkInternalApi +public class SdkExceptionToV2 extends Recipe { + + public static MethodMatcher v1ExceptionMethod(String methodSignature) { + return new MethodMatcher("com.amazonaws.AmazonServiceException " + methodSignature, true); + } + + @Override + public String getDisplayName() { + return "SDK Exceptions Methods to V2"; + } + + @Override + public String getDescription() { + return "SDK Exceptions Methods to V2"; + } + + @Override + public TreeVisitor getVisitor() { + return new Visitor(); + } + + private static final class Visitor extends JavaIsoVisitor { + + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) { + if (v1ExceptionMethod("getErrorCode()").matches(method)) { + String newMethodName = "awsErrorDetails().errorCode()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getServiceName()").matches(method)) { + String newMethodName = "awsErrorDetails().serviceName()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getErrorMessage()").matches(method)) { + String newMethodName = "awsErrorDetails().errorMessage()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getStatusCode()").matches(method)) { + String newMethodName = "awsErrorDetails().sdkHttpResponse().statusCode()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getHttpHeaders()").matches(method)) { + // TODO: v2 returns Map>. Convert it to Map + String newMethodName = "awsErrorDetails().sdkHttpResponse().headers()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getRawResponse()").matches(method)) { + String newMethodName = "awsErrorDetails().rawResponse().asByteArray()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (v1ExceptionMethod("getRawResponseContent()").matches(method)) { + String newMethodName = "awsErrorDetails().rawResponse().asUtf8String()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + + return super.visitMethodInvocation(method, executionContext); + } + } +} diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/TransferManagerMethodsToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/TransferManagerMethodsToV2.java index 749d94d1ed8a..c97a83125791 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/TransferManagerMethodsToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/TransferManagerMethodsToV2.java @@ -15,10 +15,12 @@ package software.amazon.awssdk.v2migration; +import static software.amazon.awssdk.v2migration.internal.utils.NamingUtils.transformMethodName; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_S3_MODEL_PKG; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_TM_CLIENT; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.V2_TM_MODEL_PKG; import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.v2TmMethodMatcher; +import static software.amazon.awssdk.v2migration.internal.utils.S3TransformUtils.v2TransferProgressMethodMatcher; import java.util.regex.Pattern; import org.openrewrite.ExecutionContext; @@ -55,8 +57,12 @@ public class TransferManagerMethodsToV2 extends Recipe { private static final MethodMatcher UPLOAD_DIR = v2TmMethodMatcher("uploadDirectory(String, String, java.io.File, boolean)"); + private static final MethodMatcher GET_BYTES_TRANSFERRED = v2TransferProgressMethodMatcher("getBytesTransferred()"); + private static final MethodMatcher GET_TOTAL_BYTES_TO_TRANSFER = v2TransferProgressMethodMatcher("getTotalBytesToTransfer()"); + private static final MethodMatcher GET_PERCENT_TRANSFERRED = v2TransferProgressMethodMatcher("getPercentTransferred()"); + private static final Pattern S3_TM_CREDENTIAL = Pattern.compile(V2_TM_CLIENT); - private static final Pattern V2_AWSCREDENTAIL = Pattern.compile("software.amazon.awssdk.auth.credentials.AwsCredentials"); + private static final Pattern V2_AWS_CREDENTIALS = Pattern.compile("software.amazon.awssdk.auth.credentials.AwsCredentials"); private static final Pattern V2_CREDENTIAL_PROVIDER = Pattern.compile("software.amazon.awssdk.auth.credentials" + ".AwsCredentialsProvider"); @@ -116,6 +122,21 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu method = transformUploadDirectory(method); return super.visitMethodInvocation(method, executionContext); } + if (GET_BYTES_TRANSFERRED.matches(method, false)) { + String newMethodName = "snapshot().transferredBytes()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (GET_TOTAL_BYTES_TO_TRANSFER.matches(method, false)) { + String newMethodName = "snapshot().totalBytes()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } + if (GET_PERCENT_TRANSFERRED.matches(method, false)) { + String newMethodName = "snapshot().ratioTransferred()"; + method = transformMethodName(method, newMethodName, getCursor()); + return super.visitMethodInvocation(method, executionContext); + } return super.visitMethodInvocation(method, executionContext); } @@ -131,7 +152,7 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext executionContext) { newClass.getArguments().size() == 1 && newClass.getArguments().get(0).getType() != null) { Expression arg = newClass.getArguments().get(0); - if (arg.getType().isAssignableFrom(V2_AWSCREDENTAIL)) { + if (arg.getType().isAssignableFrom(V2_AWS_CREDENTIALS)) { addS3AsyncClientImport(); addStaticCredentialsProviderImport(); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1BuilderVariationsToV2Builder.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1BuilderVariationsToV2Builder.java index 2264637619a9..d8bb986e03b9 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1BuilderVariationsToV2Builder.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/V1BuilderVariationsToV2Builder.java @@ -135,6 +135,8 @@ private J.MethodInvocation renameStandardToBuilderOrDefaultClientToCreate(J.Meth Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), Collections.emptyList() ); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingUtils.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingUtils.java index 3e1c71f800e0..64f8a3858d28 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingUtils.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingUtils.java @@ -15,6 +15,9 @@ package software.amazon.awssdk.v2migration.internal.utils; +import org.openrewrite.Cursor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.tree.J; import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.utils.StringUtils; import software.amazon.awssdk.utils.internal.CodegenNamingUtils; @@ -59,6 +62,11 @@ public static boolean isSetter(String name) { } public static boolean isGetter(String name) { - return !StringUtils.isBlank(name) && name.startsWith("get") && !name.equals("get"); + return !StringUtils.isBlank(name) && name.startsWith("get") && !"get".equals(name); + } + + public static J.MethodInvocation transformMethodName(J.MethodInvocation method, String newMethodName, Cursor cursor) { + return JavaTemplate.builder("#{any()}." + newMethodName).build() + .apply(cursor, method.getCoordinates().replace(), method.getSelect()); } } diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java index 87981c4f8bca..a4390027f79b 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/S3TransformUtils.java @@ -46,6 +46,7 @@ public final class S3TransformUtils { public static final String V2_TM_CLIENT = "software.amazon.awssdk.transfer.s3.S3TransferManager"; public static final String V2_TM_MODEL_PKG = "software.amazon.awssdk.transfer.s3.model."; + public static final String V2_TM_PROGRESS = "software.amazon.awssdk.transfer.s3.progress.TransferProgress"; public static final Set SUPPORTED_METADATA_TRANSFORMS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( "contentLength", @@ -91,6 +92,10 @@ public static MethodMatcher v2TmMethodMatcher(String methodSignature) { return new MethodMatcher(V2_TM_CLIENT + " " + methodSignature, true); } + public static MethodMatcher v2TransferProgressMethodMatcher(String methodSignature) { + return new MethodMatcher(V2_TM_PROGRESS + " " + methodSignature, true); + } + public static void addMetadataFields(StringBuilder sb, String metadataName, Map> metadataMap) { Map map = metadataMap.get(metadataName); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/openrewrite/ChangeMethodInvocationReturnType.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/openrewrite/ChangeMethodInvocationReturnType.java deleted file mode 100644 index 40b3706d96f5..000000000000 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/openrewrite/ChangeMethodInvocationReturnType.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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.v2migration.openrewrite; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Collections; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Option; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.ListUtils; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; -import org.openrewrite.java.tree.TypeUtils; -import org.openrewrite.marker.Markers; -import software.amazon.awssdk.annotations.SdkInternalApi; - -/** - * This class contains source imported from https://github - * .com/openrewrite/rewrite/blob/main/rewrite-java/src/main/java/org/openrewrite/java/ChangeMethodInvocationReturnType.java, - * licensed under the Apache License 2.0, available at the time of the fork (4/11/2025) here: - * https://github.com/openrewrite/rewrite/blob/main/LICENSE - *

- * All original source licensed under the Apache License 2.0. All modifications are licensed under the Apache - * License 2.0 by Amazon Web Services. - */ -@SdkInternalApi -public class ChangeMethodInvocationReturnType extends Recipe { - - @Option(displayName = "Method pattern", - description = "A method pattern is used to find matching method invocations.", - example = "org.mockito.Matchers anyVararg()") - private final String methodPattern; - - @Option(displayName = "New method invocation return type", - description = "The fully qualified new return type of method invocation.", - example = "long") - private final String newReturnType; - - @JsonCreator - public ChangeMethodInvocationReturnType(@JsonProperty("methodPattern") String methodPattern, - @JsonProperty("newReturnType") String newReturnType) { - this.methodPattern = methodPattern; - this.newReturnType = newReturnType; - } - - @Override - public String getDisplayName() { - return "Change method invocation return type"; - } - - @Override - public String getDescription() { - return "Changes the return type of a method invocation."; - } - - @Override - public TreeVisitor getVisitor() { - return new JavaIsoVisitor() { - private final MethodMatcher methodMatcher = new MethodMatcher(methodPattern, false); - - private boolean methodUpdated; - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation m = super.visitMethodInvocation(method, ctx); - JavaType.Method type = m.getMethodType(); - if (methodMatcher.matches(method) && type != null && !newReturnType.equals(type.getReturnType().toString())) { - type = type.withReturnType(JavaType.buildType(newReturnType)); - m = m.withMethodType(type); - if (m.getName().getType() != null) { - m = m.withName(m.getName().withType(type)); - } - methodUpdated = true; - } - return m; - } - - @Override - public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { - methodUpdated = false; - JavaType.FullyQualified originalType = multiVariable.getTypeAsFullyQualified(); - J.VariableDeclarations mv = super.visitVariableDeclarations(multiVariable, ctx); - - if (methodUpdated) { - JavaType newType = JavaType.buildType(newReturnType); - JavaType.FullyQualified newFieldType = TypeUtils.asFullyQualified(newType); - - maybeAddImport(newFieldType); - maybeRemoveImport(originalType); - - mv = mv.withTypeExpression(mv.getTypeExpression() == null ? - null : - new J.Identifier(mv.getTypeExpression().getId(), - mv.getTypeExpression().getPrefix(), - Markers.EMPTY, - Collections.emptyList(), - newReturnType.substring(newReturnType.lastIndexOf('.') + 1), - newType, - null - ) - ); - - mv = mv.withVariables(ListUtils.map(mv.getVariables(), var -> { - JavaType.FullyQualified varType = TypeUtils.asFullyQualified(var.getType()); - if (varType != null && !varType.equals(newType)) { - return var.withType(newType).withName(var.getName().withType(newType)); - } - return var; - })); - } - - return mv; - } - }; - } -} \ No newline at end of file diff --git a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml b/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml index c040f4a7cf71..3a427b78bfef 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/aws-sdk-java-v1-to-v2.yml @@ -32,12 +32,14 @@ recipeList: - software.amazon.awssdk.v2migration.S3NonStreamingRequestToV2 - software.amazon.awssdk.v2migration.S3MethodsToV2 - software.amazon.awssdk.v2migration.S3EventNotificationMethodsToV2 + - software.amazon.awssdk.v2migration.S3PojoToV2 - software.amazon.awssdk.v2migration.S3MethodsConstructorToFluent - software.amazon.awssdk.v2migration.S3UriToV2 - software.amazon.awssdk.v2migration.EnumGettersToV2 - software.amazon.awssdk.v2migration.ChangeTransferManagerTypes - software.amazon.awssdk.v2migration.ChangeS3EventNotificationTypes - software.amazon.awssdk.v2migration.ChangeSdkType + - software.amazon.awssdk.v2migration.SdkExceptionToV2 - software.amazon.awssdk.v2migration.ChangeSdkCoreTypes # At this point, all classes should be changed to v2 equivalents - software.amazon.awssdk.v2migration.V1BuilderVariationsToV2Builder diff --git a/v2-migration/src/main/resources/META-INF/rewrite/change-exception-types.yml b/v2-migration/src/main/resources/META-INF/rewrite/change-exception-types.yml index ac28f9e1ea5d..601c78dc6cf9 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/change-exception-types.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/change-exception-types.yml @@ -31,28 +31,6 @@ recipeList: - org.openrewrite.java.ChangeMethodName: methodPattern: com.amazonaws.AmazonServiceException getRequestId() newMethodName: requestId - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getErrorCode() - newMethodName: awsErrorDetails().errorCode - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getServiceName() - newMethodName: awsErrorDetails().serviceName - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getErrorMessage() - newMethodName: awsErrorDetails().errorMessage - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getStatusCode() - newMethodName: awsErrorDetails().sdkHttpResponse().statusCode - ### TODO: v2 returns Map>. Convert it to Map - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getHttpHeaders() - newMethodName: awsErrorDetails().sdkHttpResponse().headers - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getRawResponse() - newMethodName: awsErrorDetails().rawResponse().asByteArray - - org.openrewrite.java.ChangeMethodName: - methodPattern: com.amazonaws.AmazonServiceException getRawResponseContent() - newMethodName: awsErrorDetails().rawResponse().asUtf8String - software.amazon.awssdk.v2migration.AddCommentToMethod: methodPattern: com.amazonaws.AmazonServiceException getErrorType() comment: getErrorType is not supported in v2. AwsServiceException is a service error in v2. Consider removing it. diff --git a/v2-migration/src/main/resources/META-INF/rewrite/change-s3-event-notification-methods.yml b/v2-migration/src/main/resources/META-INF/rewrite/change-s3-event-notification-methods.yml index d43fc06bdb39..3d590ef614cd 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/change-s3-event-notification-methods.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/change-s3-event-notification-methods.yml @@ -17,7 +17,7 @@ name: software.amazon.awssdk.v2migration.S3EventNotificationMethodsToV2 displayName: Change S3EventNotification methods to v2. description: Change S3EventNotification methods to v2. recipeList: - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord getEventNameAsEnum() newReturnType: String - org.openrewrite.java.ChangeMethodName: diff --git a/v2-migration/src/main/resources/META-INF/rewrite/change-s3-types.yml b/v2-migration/src/main/resources/META-INF/rewrite/change-s3-types.yml index 0c8096334214..0d0e3391c8e1 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/change-s3-types.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/change-s3-types.yml @@ -17,82 +17,82 @@ name: software.amazon.awssdk.v2migration.S3TypesToV2 displayName: Change S3 types to v2. description: Change S3 types to v2. recipeList: - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getObject(com.amazonaws.services.s3.model.GetObjectRequest, java.io.File) newReturnType: software.amazon.awssdk.services.s3.model.GetObjectResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketAcl(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketAclResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getObjectAcl(..) newReturnType: software.amazon.awssdk.services.s3.model.GetObjectAclResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketAccelerateConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketAccelerateConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketLifecycleConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketLifecycleConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketCrossOriginConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketCorsResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketLoggingConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketLoggingResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketNotificationConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketNotificationConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketPolicy(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketPolicyResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketReplicationConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketReplicationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketTaggingConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketTaggingResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketVersioningConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketVersioningResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3 getBucketWebsiteConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketWebsiteResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getObject(com.amazonaws.services.s3.model.GetObjectRequest, java.io.File) newReturnType: software.amazon.awssdk.services.s3.model.GetObjectResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketAcl(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketAclResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getObjectAcl(..) newReturnType: software.amazon.awssdk.services.s3.model.GetObjectAclResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketAccelerateConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketAccelerateConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketLifecycleConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketLifecycleConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketCrossOriginConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketCorsResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketLoggingConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketLoggingResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketNotificationConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketNotificationConfigurationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketPolicy(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketPolicyResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketReplicationConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketReplicationResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketTaggingConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketTaggingResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketVersioningConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketVersioningResponse - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.AmazonS3Client getBucketWebsiteConfiguration(..) newReturnType: software.amazon.awssdk.services.s3.model.GetBucketWebsiteResponse \ No newline at end of file diff --git a/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-simple-methods.yml b/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-simple-methods.yml index 8fbc8dee0856..d4dc3f6f3cc2 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-simple-methods.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-simple-methods.yml @@ -34,13 +34,4 @@ recipeList: newMethodName: serializeToString - org.openrewrite.java.ChangeMethodName: methodPattern: software.amazon.awssdk.transfer.s3.model.ResumableTransfer serialize(java.io.OutputStream) - newMethodName: serializeToOutputStream - - org.openrewrite.java.ChangeMethodName: - methodPattern: software.amazon.awssdk.transfer.s3.progress.TransferProgress getBytesTransferred() - newMethodName: snapshot().transferredBytes - - org.openrewrite.java.ChangeMethodName: - methodPattern: software.amazon.awssdk.transfer.s3.progress.TransferProgress getTotalBytesToTransfer() - newMethodName: snapshot().totalBytes - - org.openrewrite.java.ChangeMethodName: - methodPattern: software.amazon.awssdk.transfer.s3.progress.TransferProgress getPercentTransferred() - newMethodName: snapshot().ratioTransferred \ No newline at end of file + newMethodName: serializeToOutputStream \ No newline at end of file diff --git a/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-types.yml b/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-types.yml index 159f7b123262..6739f5d74ae4 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-types.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/change-transfer-manager-types.yml @@ -18,10 +18,10 @@ name: software.amazon.awssdk.v2migration.ChangeTransferManagerTypes displayName: Change SDK TransferManager types from v1 to v2 description: Change SDK TransferManager types from v1 to v2. recipeList: - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.transfer.TransferManager resumeDownload(..) newReturnType: software.amazon.awssdk.transfer.s3.model.FileDownload - - software.amazon.awssdk.v2migration.openrewrite.ChangeMethodInvocationReturnType: + - org.openrewrite.java.ChangeMethodInvocationReturnType: methodPattern: com.amazonaws.services.s3.transfer.TransferManager resumeUpload(..) newReturnType: software.amazon.awssdk.transfer.s3.model.FileUpload - org.openrewrite.java.ChangeType: diff --git a/v2-migration/src/main/resources/META-INF/rewrite/s3-methods-constructor-to-fluent.yml b/v2-migration/src/main/resources/META-INF/rewrite/s3-methods-constructor-to-fluent.yml index 1ff60af26d89..42ffb5200902 100644 --- a/v2-migration/src/main/resources/META-INF/rewrite/s3-methods-constructor-to-fluent.yml +++ b/v2-migration/src/main/resources/META-INF/rewrite/s3-methods-constructor-to-fluent.yml @@ -662,18 +662,6 @@ recipeList: fluentNames: - withPartNumber - withETag - - software.amazon.awssdk.v2migration.ConstructorToFluent: - clzzFqcn: com.amazonaws.services.s3.model.CompleteMultipartUploadRequest - parameterTypes: - - java.lang.String - - java.lang.String - - java.lang.String - - java.util.List - fluentNames: - - withBucket - - withKey - - withUploadId - - withMultipartUpload - software.amazon.awssdk.v2migration.ConstructorToFluent: clzzFqcn: com.amazonaws.services.s3.model.ListPartsRequest parameterTypes: @@ -805,10 +793,4 @@ recipeList: - java.lang.String fluentNames: - withBucket - - withPolicy - - software.amazon.awssdk.v2migration.ConstructorToFluent: - clzzFqcn: com.amazonaws.services.s3.model.GetObjectTaggingResult - parameterTypes: - - java.util.List - fluentNames: - - withTagSet \ No newline at end of file + - withPolicy \ No newline at end of file diff --git a/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeConfigTypesTest.java b/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeConfigTypesTest.java index 3ea66b1e7ebd..11ef971526d2 100644 --- a/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeConfigTypesTest.java +++ b/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeConfigTypesTest.java @@ -29,6 +29,7 @@ import org.openrewrite.java.Java8Parser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; public class ChangeConfigTypesTest implements RewriteTest { @@ -46,7 +47,8 @@ public void defaults(RecipeSpec spec) { throw new RuntimeException(e); } - spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs", "sdk-core")); + spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs", "sdk-core")) + .typeValidationOptions(TypeValidation.all().immutableExecutionContext(false)); } @Test diff --git a/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeExceptionTypesTest.java b/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeExceptionTypesTest.java index f0007840e9a1..f5c63bbcb4f2 100644 --- a/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeExceptionTypesTest.java +++ b/v2-migration/src/test/java/software/amazon/awssdk/v2migration/ChangeExceptionTypesTest.java @@ -29,13 +29,15 @@ import org.openrewrite.java.Java8Parser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; public class ChangeExceptionTypesTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { try (InputStream stream = getClass().getResourceAsStream("/META-INF/rewrite/change-exception-types.yml")) { - spec.recipes(Environment.builder() + spec.recipes(new SdkExceptionToV2(), + Environment.builder() .load(new YamlResourceLoader(stream, URI.create("rewrite.yml"), new Properties())) .build() .activateRecipes("software.amazon.awssdk.v2migration.ChangeExceptionTypes")); @@ -43,7 +45,8 @@ public void defaults(RecipeSpec spec) { throw new RuntimeException(e); } - spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs", "sdk-core")); + spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs", "sdk-core")) + .typeValidationOptions(TypeValidation.all().methodInvocations(false)); } @Test From 72ba6c41a746993a5d872fecc49de189e7575352 Mon Sep 17 00:00:00 2001 From: David Ho <70000000+davidh44@users.noreply.github.com> Date: Fri, 12 Sep 2025 14:20:30 -0700 Subject: [PATCH 3/4] Update README and remove "-PREVIEW" from version (#6416) * Update README * Remove -PREVIEW from pom --- test/v2-migration-tests/pom.xml | 2 +- .../v2migrationtests/GradleProjectTest.java | 2 +- .../v2migrationtests/MavenTestBase.java | 3 +-- v2-migration/README.md | 27 ++++++++++++++++--- v2-migration/pom.xml | 2 +- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/test/v2-migration-tests/pom.xml b/test/v2-migration-tests/pom.xml index 0066b81536e8..b063113456c2 100644 --- a/test/v2-migration-tests/pom.xml +++ b/test/v2-migration-tests/pom.xml @@ -96,7 +96,7 @@ software.amazon.awssdk v2-migration - ${project.version}-PREVIEW + ${project.version} test diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java index 2a77a993e5cd..299a9677f9ac 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/GradleProjectTest.java @@ -74,7 +74,7 @@ static void setUp() throws IOException { Files.setPosixFilePermissions(gradlew, perms); - replaceVersion(gradleActual.resolve("init.gradle"), getMigrationToolVersion() + "-PREVIEW"); + replaceVersion(gradleActual.resolve("init.gradle"), getMigrationToolVersion()); } private static void deleteTempDirectories() throws IOException { diff --git a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java index a7b6a5befe1d..a859c879f630 100644 --- a/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java +++ b/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java @@ -53,8 +53,7 @@ protected static void verifyTransformation() throws IOException { // pin version since updates have broken tests String rewriteMavenPluginVersion = "6.17.0"; addAll(rewriteArgs, "mvn", "org.openrewrite.maven:rewrite-maven-plugin:" + rewriteMavenPluginVersion + ":run", - "-Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:"+ getMigrationToolVersion() + "-PREVIEW", - recipeCmd); + "-Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:"+ getMigrationToolVersion(), recipeCmd); run(mavenActual, rewriteArgs.toArray(new String[0])); FileUtils.deleteDirectory(mavenActual.resolve("target").toFile()); diff --git a/v2-migration/README.md b/v2-migration/README.md index 30a16d51180f..60302e1fdec2 100755 --- a/v2-migration/README.md +++ b/v2-migration/README.md @@ -1,11 +1,29 @@ # AWS SDK for Java v2 Migration Tool ## Description -This modules contains [OpenRewrite][open-rewrite] recipes to automate migration from the AWS SDK for Java v1 to the AWS SDK for Java v2. +This module contains [OpenRewrite][open-rewrite] recipes to automate migration from the AWS SDK for Java v1 to the +AWS SDK for Java v2. + +While the majority of v1 code is supported by recipes that transform to the v2 equivalent, there are some classes and +methods not covered by the migration tool. For these classes and methods, refer to our +[Developer Guide][developer-guide-steps] and [API Reference][api-reference-v2] to manually migrate your code. ## Usage -For steps on performing the migration, see our [Developer Guide][developer-guide]. +For detailed steps on using the tool, see our [Developer Guide][developer-guide]. + +### Maven Project + +To transform a Maven project, run the following command from your project root directory: + +``` +mvn org.openrewrite.maven:rewrite-maven-plugin:6.17.0 \ + -Drewrite.recipeArtifactCoordinates=software.amazon.awssdk:v2-migration:2.34.0 \ + -Drewrite.activeRecipes=software.amazon.awssdk.v2migration.AwsSdkJavaV1ToV2 +``` + +**Note:** Newer OpenRewrite versions may not be compatible. If errors occur during the transforms, specify the +[SDK supported version][maven-plugin-version], e.g., `6.17.0`, and run the command again. ## Development @@ -31,4 +49,7 @@ code and ensures it compiles. [open-rewrite]: https://docs.openrewrite.org/ [rewrite-test]: https://docs.openrewrite.org/authoring-recipes/recipe-testing#rewritetest-interface [v2-migration-tests]: ../test/v2-migration-tests -[developer-guide]: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration-tool.html \ No newline at end of file +[developer-guide]: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration-tool.html +[developer-guide-steps]: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/migration-steps.html +[api-reference-v2]: https://sdk.amazonaws.com/java/api/latest/index.html +[maven-plugin-version]: https://github.com/aws/aws-sdk-java-v2/blob/master/test/v2-migration-tests/src/test/java/software/amazon/awssdk/v2migrationtests/MavenTestBase.java#L54 \ No newline at end of file diff --git a/v2-migration/pom.xml b/v2-migration/pom.xml index 478ce4054c0b..df04e219f715 100644 --- a/v2-migration/pom.xml +++ b/v2-migration/pom.xml @@ -26,7 +26,7 @@ v2-migration - ${awsjavasdk.version}-PREVIEW + ${awsjavasdk.version} AWS Java SDK :: V2 Migration Contains OpenRewrite recipes to help users migrate from the AWS SDK for Java v1 to the AWS SDK for Java v2 From f5b24a22355a66c53d832eca99474d8237bd7b2d Mon Sep 17 00:00:00 2001 From: hdavidh Date: Thu, 18 Sep 2025 11:04:25 -0700 Subject: [PATCH 4/4] Add changelog --- .../feature-AWSSDKforJavav2MigrationTool-94848a6.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/next-release/feature-AWSSDKforJavav2MigrationTool-94848a6.json diff --git a/.changes/next-release/feature-AWSSDKforJavav2MigrationTool-94848a6.json b/.changes/next-release/feature-AWSSDKforJavav2MigrationTool-94848a6.json new file mode 100644 index 000000000000..442250f73477 --- /dev/null +++ b/.changes/next-release/feature-AWSSDKforJavav2MigrationTool-94848a6.json @@ -0,0 +1,6 @@ +{ + "type": "feature", + "category": "AWS SDK for Java v2 Migration Tool", + "contributor": "", + "description": "General availability release of the AWS SDK for Java v2 migration tool that automatically migrates applications from the AWS SDK for Java v1 to the AWS SDK for Java v2." +}