From 97b1ed2f989fb506cd53f90405dad4a5d78ea457 Mon Sep 17 00:00:00 2001 From: hdavidh Date: Mon, 24 Mar 2025 15:51:33 -0700 Subject: [PATCH] Migration tool - Date to Instant --- test/v2-migration-tests/pom.xml | 11 +++ .../v2migrationtests/maven/after/pom.xml | 5 ++ .../src/main/java/foo/bar/Application.java | 9 ++ .../v2migrationtests/maven/before/pom.xml | 4 + .../src/main/java/foo/bar/Application.java | 8 ++ .../awssdk/v2migration/DateToInstant.java | 88 +++++++++++++++++++ .../rewrite/aws-sdk-java-v1-to-v2-with-tm.yml | 1 + .../rewrite/aws-sdk-java-v1-to-v2.yml | 1 + 8 files changed, 127 insertions(+) create mode 100644 v2-migration/src/main/java/software/amazon/awssdk/v2migration/DateToInstant.java diff --git a/test/v2-migration-tests/pom.xml b/test/v2-migration-tests/pom.xml index 1dc8f9586830..01c841e56c88 100644 --- a/test/v2-migration-tests/pom.xml +++ b/test/v2-migration-tests/pom.xml @@ -70,6 +70,11 @@ aws-java-sdk-s3 test + + com.amazonaws + aws-java-sdk-cloudwatch + test + software.amazon.awssdk s3 @@ -82,6 +87,12 @@ ${project.version} test + + software.amazon.awssdk + cloudwatch + ${project.version} + test + software.amazon.awssdk v2-migration 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 960a0193d15d..c4fa83bdc7a0 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,5 +62,10 @@ s3 V2_VERSION + + software.amazon.awssdk + cloudwatch + V2_VERSION + \ No newline at end of file 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 3adcb2270e02..68ad13db7cea 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 @@ -20,10 +20,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.Date; import software.amazon.awssdk.awscore.exception.AwsServiceException; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.exception.SdkException; import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.cloudwatch.model.GetMetricStatisticsRequest; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; @@ -105,4 +107,11 @@ private static PutObjectResponse uploadString(S3Client s3, String bucket, String return result; } + + void dateToInstant(Date start, Date end) { + GetMetricStatisticsRequest getMetricStatisticsRequest = GetMetricStatisticsRequest.builder() + .startTime(start.toInstant()) + .endTime(end.toInstant()) + .build(); + } } diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/pom.xml b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/pom.xml index 6367504c15a1..b384cbf4cc64 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/pom.xml +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/pom.xml @@ -55,5 +55,9 @@ com.amazonaws aws-java-sdk-s3 + + com.amazonaws + aws-java-sdk-cloudwatch + \ No newline at end of file diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Application.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Application.java index fa8088e5c75c..8f4304898c7a 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Application.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Application.java @@ -17,6 +17,7 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; +import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsRequest; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.PutObjectRequest; @@ -33,6 +34,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.Date; public class Application { @@ -100,4 +102,10 @@ private static PutObjectResult uploadString(AmazonS3 s3, String bucket, String k return result; } + + void dateToInstant(Date start, Date end) { + GetMetricStatisticsRequest getMetricStatisticsRequest = new GetMetricStatisticsRequest() + .withStartTime(start) + .withEndTime(end); + } } diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/DateToInstant.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/DateToInstant.java new file mode 100644 index 000000000000..fc32241a63b4 --- /dev/null +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/DateToInstant.java @@ -0,0 +1,88 @@ +/* + * 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 java.util.Date; +import java.util.List; +import java.util.regex.Pattern; +import org.openrewrite.ExecutionContext; +import org.openrewrite.NlsRewrite; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.v2migration.internal.utils.SdkTypeUtils; + +@SdkInternalApi +public class DateToInstant extends Recipe { + private static final Pattern DATE_PATTERN = Pattern.compile(Date.class.getCanonicalName()); + + @Override + public @NlsRewrite.DisplayName String getDisplayName() { + return "Convert Date to Instant"; + } + + @Override + public @NlsRewrite.Description String getDescription() { + return "Convert Date to Instant by calling Date#toInstant"; + } + + @Override + public TreeVisitor getVisitor() { + return new DateToInstantVisitor(); + } + + private static final class DateToInstantVisitor extends JavaIsoVisitor { + + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation originalMethod, ExecutionContext ctx) { + J.MethodInvocation method = super.visitMethodInvocation(originalMethod, ctx); + + if (!isV2ModelSetterWithDateParam(method)) { + return method; + } + + JavaTemplate template = JavaTemplate.builder("#{any()}.toInstant()").contextSensitive().build(); + + return template.apply(updateCursor(method), method.getCoordinates().replaceArguments(), method.getArguments().get(0)); + } + + private static boolean isV2ModelSetterWithDateParam(J.MethodInvocation method) { + JavaType.Method mt = method.getMethodType(); + + if (mt == null) { + return false; + } + + JavaType.FullyQualified declaringType = mt.getDeclaringType(); + List parameterTypes = mt.getParameterTypes(); + if (parameterTypes.size() != 1) { + return false; + } + + JavaType javaType = parameterTypes.get(0); + if (javaType == null) { + return false; + } + + boolean isDateParam = javaType.isAssignableFrom(DATE_PATTERN); + return SdkTypeUtils.isV2ModelBuilder(declaringType) && isDateParam; + } + } +} 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 index c5b896c792ff..286cf37e4154 100644 --- 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 @@ -42,6 +42,7 @@ recipeList: - 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.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 0e3c6a495ab7..d6f7db75c130 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 @@ -40,5 +40,6 @@ recipeList: - 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 \ No newline at end of file