diff --git a/test/v2-migration-tests/pom.xml b/test/v2-migration-tests/pom.xml
index 1dc8f958683..01c841e56c8 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 960a0193d15..c4fa83bdc7a 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 3adcb2270e0..68ad13db7ce 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 6367504c15a..b384cbf4cc6 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 fa8088e5c75..8f4304898c7 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 00000000000..fc32241a63b
--- /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, ExecutionContext> 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 c5b896c792f..286cf37e415 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 0e3c6a495ab..d6f7db75c13 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