From d33a920c525afa31a781642d8b88c94ba546167a Mon Sep 17 00:00:00 2001 From: yibole Date: Wed, 5 Mar 2025 15:42:08 -0800 Subject: [PATCH 1/4] special cases for Enum Recipe added --- .../after/src/main/java/foo/bar/Enums.java | 6 ++++- .../before/src/main/java/foo/bar/Enums.java | 5 ++++ .../awssdk/v2migration/EnumCasingToV2.java | 25 +++++++++++++++++++ .../internal/utils/NamingConversionUtils.java | 3 +++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Enums.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Enums.java index 501c80effdfc..4964fb9bc07b 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Enums.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/after/src/main/java/foo/bar/Enums.java @@ -14,7 +14,8 @@ */ package foo.bar; - +import software.amazon.awssdk.services.s3.model.Event; +import software.amazon.awssdk.services.s3.model.StorageClass; import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; import software.amazon.awssdk.services.sqs.model.QueueAttributeName; import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest; @@ -27,6 +28,9 @@ public class Enums { public static void main(String... args) { QueueAttributeName qan = QueueAttributeName.DELAY_SECONDS; QueueAttributeName qan2 = QueueAttributeName.ALL; + StorageClass sc1 = StorageClass.STANDARD_IA; + StorageClass sc2 = StorageClass.ONEZONE_IA; + Event se = Event.S3_OBJECT_CREATED; System.out.println(qan); System.out.println(qan2); diff --git a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Enums.java b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Enums.java index 867cc2ce195f..e81bb087510c 100644 --- a/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Enums.java +++ b/test/v2-migration-tests/src/test/resources/software/amazon/awssdk/v2migrationtests/maven/before/src/main/java/foo/bar/Enums.java @@ -15,6 +15,8 @@ package foo.bar; +import com.amazonaws.services.s3.model.S3Event; +import com.amazonaws.services.s3.model.StorageClass; import com.amazonaws.services.sqs.model.QueueAttributeName; import com.amazonaws.services.sqs.model.ReceiveMessageRequest; import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; @@ -27,6 +29,9 @@ public class Enums { public static void main(String... args) { QueueAttributeName qan = QueueAttributeName.DelaySeconds; QueueAttributeName qan2 = QueueAttributeName.All; + StorageClass sc1 = StorageClass.StandardInfrequentAccess; + StorageClass sc2 = StorageClass.OneZoneInfrequentAccess; + S3Event se = S3Event.ObjectCreated; System.out.println(qan); System.out.println(qan2); diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java index 2e3dbf30ab8f..95950a7d1f8b 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java @@ -17,7 +17,9 @@ import static software.amazon.awssdk.utils.internal.CodegenNamingUtils.splitOnWordBoundaries; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.openrewrite.ExecutionContext; import org.openrewrite.Recipe; @@ -35,6 +37,14 @@ public class EnumCasingToV2 extends Recipe { private static Set ENUMS = new HashSet<>(); + private static final Map SPECIAL_CASES = new HashMap<>(); + + static { + SPECIAL_CASES.put("StandardInfrequentAccess", "STANDARD_IA"); + SPECIAL_CASES.put("OneZoneInfrequentAccess", "ONEZONE_IA"); + SPECIAL_CASES.put("GlacierInstantRetrieval", "GLACIER_IR"); + } + @Override public String getDisplayName() { return "V1 Enum Casing to V2"; @@ -51,6 +61,10 @@ public TreeVisitor getVisitor() { } private static String v2Casing(String enumValue) { + if (SPECIAL_CASES.containsKey(enumValue)) { + return SPECIAL_CASES.get(enumValue); + } + String result = enumValue; result = result.replaceAll("textORcsv", "TEXT_OR_CSV"); result = String.join("_", splitOnWordBoundaries(result)); @@ -64,6 +78,9 @@ public J.FieldAccess visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContex if (isV2EnumValue(fa)) { String v2Casing = v2Casing(fa.getSimpleName()); + if (isS3EventsEnum(fa) && !v2Casing.startsWith("S3_")){ + v2Casing = "S3_" + v2Casing; + } ENUMS.add(v2Casing); return fa.withName(fa.getName().withSimpleName(v2Casing)); } @@ -96,5 +113,13 @@ public boolean isV2EnumValue(J.FieldAccess fa) { } return false; } + + private boolean isS3EventsEnum(J.FieldAccess fa) { + JavaType javaType = fa.getTarget().getType(); + JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(javaType); + return fullyQualified != null && fullyQualified.getClassName().equals("Event") + && fullyQualified.getPackageName().contains("s3.model"); + } + } } diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingConversionUtils.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingConversionUtils.java index 339e4080e66c..e7580e0f99b1 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingConversionUtils.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/internal/utils/NamingConversionUtils.java @@ -182,6 +182,9 @@ public final class NamingConversionUtils { S3_POJO_MAPPING.put("ReplicationFilter", "ReplicationRuleFilter"); S3_POJO_MAPPING.put("ReplicationAndOperator", "ReplicationRuleAndOperator"); S3_POJO_MAPPING.put("PartETag", "CompletedPart"); + + //Special Enum mapping + S3_POJO_MAPPING.put("S3Event", "Event"); } static { From a6e73851b9299814a0c11324c0fb797b994b8059 Mon Sep 17 00:00:00 2001 From: yibole Date: Wed, 5 Mar 2025 16:22:32 -0800 Subject: [PATCH 2/4] minor change --- .../software/amazon/awssdk/v2migration/EnumCasingToV2.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java index 95950a7d1f8b..3ea142332db8 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java @@ -43,6 +43,7 @@ public class EnumCasingToV2 extends Recipe { SPECIAL_CASES.put("StandardInfrequentAccess", "STANDARD_IA"); SPECIAL_CASES.put("OneZoneInfrequentAccess", "ONEZONE_IA"); SPECIAL_CASES.put("GlacierInstantRetrieval", "GLACIER_IR"); + SPECIAL_CASES.put("textORcsv", "TEXT_OR_CSV"); } @Override @@ -66,7 +67,6 @@ private static String v2Casing(String enumValue) { } String result = enumValue; - result = result.replaceAll("textORcsv", "TEXT_OR_CSV"); result = String.join("_", splitOnWordBoundaries(result)); return StringUtils.upperCase(result); } @@ -78,7 +78,7 @@ public J.FieldAccess visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContex if (isV2EnumValue(fa)) { String v2Casing = v2Casing(fa.getSimpleName()); - if (isS3EventsEnum(fa) && !v2Casing.startsWith("S3_")){ + if (isS3EventsEnum(fa)){ v2Casing = "S3_" + v2Casing; } ENUMS.add(v2Casing); @@ -118,7 +118,7 @@ private boolean isS3EventsEnum(J.FieldAccess fa) { JavaType javaType = fa.getTarget().getType(); JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(javaType); return fullyQualified != null && fullyQualified.getClassName().equals("Event") - && fullyQualified.getPackageName().contains("s3.model"); + && fullyQualified.getPackageName().contains("s3.model") && !fa.getSimpleName().startsWith("S3_"); } } From c920575f769b23476854c4ad81b2d378a7ee8f6e Mon Sep 17 00:00:00 2001 From: yibole Date: Wed, 5 Mar 2025 16:34:49 -0800 Subject: [PATCH 3/4] checkstyle fixed --- .../java/software/amazon/awssdk/v2migration/EnumCasingToV2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java index 3ea142332db8..8a8ae37182dc 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java @@ -78,7 +78,7 @@ public J.FieldAccess visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContex if (isV2EnumValue(fa)) { String v2Casing = v2Casing(fa.getSimpleName()); - if (isS3EventsEnum(fa)){ + if (isS3EventsEnum(fa)) { v2Casing = "S3_" + v2Casing; } ENUMS.add(v2Casing); From 5e68ab4a5fe98092a704f3756591f484502bb659 Mon Sep 17 00:00:00 2001 From: yibole Date: Wed, 5 Mar 2025 16:50:12 -0800 Subject: [PATCH 4/4] comments addressed --- .../software/amazon/awssdk/v2migration/EnumCasingToV2.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java index 8a8ae37182dc..7bd873cf9ca3 100644 --- a/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java +++ b/v2-migration/src/main/java/software/amazon/awssdk/v2migration/EnumCasingToV2.java @@ -118,7 +118,8 @@ private boolean isS3EventsEnum(J.FieldAccess fa) { JavaType javaType = fa.getTarget().getType(); JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(javaType); return fullyQualified != null && fullyQualified.getClassName().equals("Event") - && fullyQualified.getPackageName().contains("s3.model") && !fa.getSimpleName().startsWith("S3_"); + && fullyQualified.getPackageName().equals("software.amazon.awssdk.services.s3.model") + && !fa.getSimpleName().startsWith("S3_"); } }