From 66c7be9a02c18bbefc2d8a6b0a4cee5e3de81a87 Mon Sep 17 00:00:00 2001 From: SiBorea Date: Thu, 2 Jan 2025 10:17:55 +0800 Subject: [PATCH 1/5] Migrate ApiImplicitParam defaultValue --- ...lass.java => MigrateApiImplicitParam.java} | 39 +++++++++++++++---- .../resources/META-INF/rewrite/swagger-2.yml | 2 +- .../openapi/swagger/SwaggerToOpenAPITest.java | 6 +-- 3 files changed, 35 insertions(+), 12 deletions(-) rename src/main/java/org/openrewrite/openapi/swagger/{MigrateApiImplicitParamDataTypeClass.java => MigrateApiImplicitParam.java} (67%) diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParamDataTypeClass.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java similarity index 67% rename from src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParamDataTypeClass.java rename to src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java index a7ef2f1..437f418 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParamDataTypeClass.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java @@ -30,7 +30,7 @@ import java.util.ArrayList; import java.util.List; -public class MigrateApiImplicitParamDataTypeClass extends Recipe { +public class MigrateApiImplicitParam extends Recipe { private static final String FQN_SCHEMA = "io.swagger.v3.oas.annotations.media.Schema"; @Override @@ -58,20 +58,32 @@ public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ct } StringBuilder tpl = new StringBuilder(); + StringBuilder schemaTpl = new StringBuilder(); List args = new ArrayList<>(); for (Expression exp : anno.getArguments()) { - if (!args.isEmpty()) { - tpl.append(", "); - } if (isDataTypeClass(exp)) { - J.FieldAccess fieldAccess = (J.FieldAccess) ((J.Assignment) exp).getAssignment(); - tpl.append("schema = @Schema(implementation = #{any()})"); - args.add(fieldAccess); + Expression expression = ((J.Assignment) exp).getAssignment(); + addSchema(schemaTpl, "implementation"); + args.add(expression); + } else if (isDefaultValue(exp)) { + Expression expression = ((J.Assignment) exp).getAssignment(); + addSchema(schemaTpl, "defaultValue"); + args.add(expression); } else { - tpl.append("#{any()}"); + tpl.append("#{any()}, "); args.add(exp); } } + if (tpl.toString().endsWith(", ")) { + tpl.delete(tpl.length() - 2, tpl.length()); + } + if (schemaTpl.length() > 0) { + if (schemaTpl.toString().endsWith(", ")) { + schemaTpl.delete(schemaTpl.length() - 2, schemaTpl.length()); + } + schemaTpl.append(")"); + tpl.append(", ").append(schemaTpl); + } anno = JavaTemplate.builder(tpl.toString()) .imports(FQN_SCHEMA) .javaParser(JavaParser.fromJavaVersion().classpath("swagger-annotations")) @@ -81,9 +93,20 @@ public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ct return maybeAutoFormat(annotation, anno, ctx, getCursor().getParentTreeCursor()); } + private void addSchema(StringBuilder tpl, String key) { + if (tpl.length() == 0) { + tpl.append("schema = @Schema("); + } + tpl.append(key).append(" = #{any()}, "); + } + private boolean isDataTypeClass(Expression exp) { return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("dataTypeClass"); } + + private boolean isDefaultValue(Expression exp) { + return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("defaultValue"); + } } ); } diff --git a/src/main/resources/META-INF/rewrite/swagger-2.yml b/src/main/resources/META-INF/rewrite/swagger-2.yml index 0865a56..adef3f3 100644 --- a/src/main/resources/META-INF/rewrite/swagger-2.yml +++ b/src/main/resources/META-INF/rewrite/swagger-2.yml @@ -197,7 +197,7 @@ recipeList: - org.openrewrite.java.RemoveAnnotationAttribute: annotationType: io.swagger.v3.oas.annotations.Parameter attributeName: allowMultiple - - org.openrewrite.openapi.swagger.MigrateApiImplicitParamDataTypeClass + - org.openrewrite.openapi.swagger.MigrateApiImplicitParam --- type: specs.openrewrite.org/v1beta/recipe diff --git a/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java b/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java index a0f8ea4..9c0015b 100644 --- a/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java +++ b/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java @@ -128,7 +128,7 @@ class Example { } @Test - void migrateApiImplicitParamDataTypeClass() { + void migrateApiImplicitParam() { rewriteRun( //language=java java( @@ -136,7 +136,7 @@ void migrateApiImplicitParamDataTypeClass() { import io.swagger.annotations.ApiImplicitParam; class Example { - @ApiImplicitParam(name = "foo", value = "Foo object", required = true, dataTypeClass = Example.class) + @ApiImplicitParam(name = "foo", value = "Foo object", required = true, dataTypeClass = Example.class, defaultValue = "example") public void create(Example foo) { } } @@ -146,7 +146,7 @@ public void create(Example foo) { import io.swagger.v3.oas.annotations.media.Schema; class Example { - @Parameter(name = "foo", description = "Foo object", required = true, schema = @Schema(implementation = Example.class)) + @Parameter(name = "foo", description = "Foo object", required = true, schema = @Schema(implementation = Example.class, defaultValue = "example")) public void create(Example foo) { } } From aae6b47b1223529d6a5fde792fc3bd5f62b4f0e5 Mon Sep 17 00:00:00 2001 From: SiBorea Date: Thu, 2 Jan 2025 10:22:07 +0800 Subject: [PATCH 2/5] Reformat --- .../swagger/MigrateApiImplicitParam.java | 122 +++++++++--------- 1 file changed, 58 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java index 437f418..b8029c3 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java @@ -15,14 +15,8 @@ */ package org.openrewrite.openapi.swagger; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; -import org.openrewrite.java.AnnotationMatcher; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; +import org.openrewrite.*; +import org.openrewrite.java.*; import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; @@ -47,67 +41,67 @@ public String getDescription() { public TreeVisitor getVisitor() { // This recipe is after ChangeType recipe return Preconditions.check( - new UsesMethod<>("io.swagger.annotations.ApiImplicitParam dataTypeClass()", false), - new JavaIsoVisitor() { - @Override - public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { - J.Annotation anno = super.visitAnnotation(annotation, ctx); + new UsesMethod<>("io.swagger.annotations.ApiImplicitParam dataTypeClass()", false), + new JavaIsoVisitor() { + @Override + public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { + J.Annotation anno = super.visitAnnotation(annotation, ctx); - if (!new AnnotationMatcher("io.swagger.v3.oas.annotations.Parameter").matches(anno)) { - return anno; - } + if (!new AnnotationMatcher("io.swagger.v3.oas.annotations.Parameter").matches(anno)) { + return anno; + } - StringBuilder tpl = new StringBuilder(); - StringBuilder schemaTpl = new StringBuilder(); - List args = new ArrayList<>(); - for (Expression exp : anno.getArguments()) { - if (isDataTypeClass(exp)) { - Expression expression = ((J.Assignment) exp).getAssignment(); - addSchema(schemaTpl, "implementation"); - args.add(expression); - } else if (isDefaultValue(exp)) { - Expression expression = ((J.Assignment) exp).getAssignment(); - addSchema(schemaTpl, "defaultValue"); - args.add(expression); - } else { - tpl.append("#{any()}, "); - args.add(exp); - } - } - if (tpl.toString().endsWith(", ")) { - tpl.delete(tpl.length() - 2, tpl.length()); - } - if (schemaTpl.length() > 0) { - if (schemaTpl.toString().endsWith(", ")) { - schemaTpl.delete(schemaTpl.length() - 2, schemaTpl.length()); - } - schemaTpl.append(")"); - tpl.append(", ").append(schemaTpl); - } - anno = JavaTemplate.builder(tpl.toString()) - .imports(FQN_SCHEMA) - .javaParser(JavaParser.fromJavaVersion().classpath("swagger-annotations")) - .build() - .apply(updateCursor(anno), annotation.getCoordinates().replaceArguments(), args.toArray()); - maybeAddImport(FQN_SCHEMA, false); - return maybeAutoFormat(annotation, anno, ctx, getCursor().getParentTreeCursor()); - } + StringBuilder tpl = new StringBuilder(); + StringBuilder schemaTpl = new StringBuilder(); + List args = new ArrayList<>(); + for (Expression exp : anno.getArguments()) { + if (isDataTypeClass(exp)) { + Expression expression = ((J.Assignment) exp).getAssignment(); + addSchema(schemaTpl, "implementation"); + args.add(expression); + } else if (isDefaultValue(exp)) { + Expression expression = ((J.Assignment) exp).getAssignment(); + addSchema(schemaTpl, "defaultValue"); + args.add(expression); + } else { + tpl.append("#{any()}, "); + args.add(exp); + } + } + if (tpl.toString().endsWith(", ")) { + tpl.delete(tpl.length() - 2, tpl.length()); + } + if (schemaTpl.length() > 0) { + if (schemaTpl.toString().endsWith(", ")) { + schemaTpl.delete(schemaTpl.length() - 2, schemaTpl.length()); + } + schemaTpl.append(")"); + tpl.append(", ").append(schemaTpl); + } + anno = JavaTemplate.builder(tpl.toString()) + .imports(FQN_SCHEMA) + .javaParser(JavaParser.fromJavaVersion().classpath("swagger-annotations")) + .build() + .apply(updateCursor(anno), annotation.getCoordinates().replaceArguments(), args.toArray()); + maybeAddImport(FQN_SCHEMA, false); + return maybeAutoFormat(annotation, anno, ctx, getCursor().getParentTreeCursor()); + } - private void addSchema(StringBuilder tpl, String key) { - if (tpl.length() == 0) { - tpl.append("schema = @Schema("); - } - tpl.append(key).append(" = #{any()}, "); - } + private void addSchema(StringBuilder tpl, String key) { + if (tpl.length() == 0) { + tpl.append("schema = @Schema("); + } + tpl.append(key).append(" = #{any()}, "); + } - private boolean isDataTypeClass(Expression exp) { - return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("dataTypeClass"); - } + private boolean isDataTypeClass(Expression exp) { + return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("dataTypeClass"); + } - private boolean isDefaultValue(Expression exp) { - return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("defaultValue"); - } - } + private boolean isDefaultValue(Expression exp) { + return exp instanceof J.Assignment && ((J.Identifier) ((J.Assignment) exp).getVariable()).getSimpleName().equals("defaultValue"); + } + } ); } } From 6f6bb2566d310d0dac28d061371dbd80ed035068 Mon Sep 17 00:00:00 2001 From: SiBorea Date: Thu, 2 Jan 2025 10:32:05 +0800 Subject: [PATCH 3/5] Fix description --- .../openrewrite/openapi/swagger/MigrateApiImplicitParam.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java index b8029c3..a8f6d53 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java @@ -29,12 +29,12 @@ public class MigrateApiImplicitParam extends Recipe { @Override public String getDisplayName() { - return "Migrate `@ApiImplicitParam(dataTypeClass=Foo.class)` to `@Parameter(schema=@Schema(implementation=Foo.class))`"; + return "Migrate `@ApiImplicitParam` to `@Parameter)`"; } @Override public String getDescription() { - return "Migrate `@ApiImplicitParam(dataTypeClass=Foo.class)` to `@Parameter(schema=@Schema(implementation=Foo.class))`."; + return "Migrate `@ApiImplicitParam` to `@Parameter`."; } @Override From 91fd041e75150d10cb5ce456de9ebc0ba1adbb0a Mon Sep 17 00:00:00 2001 From: SiBorea Date: Thu, 2 Jan 2025 10:33:48 +0800 Subject: [PATCH 4/5] Fix check --- .../openrewrite/openapi/swagger/MigrateApiImplicitParam.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java index a8f6d53..fd2d4d5 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java @@ -41,7 +41,10 @@ public String getDescription() { public TreeVisitor getVisitor() { // This recipe is after ChangeType recipe return Preconditions.check( - new UsesMethod<>("io.swagger.annotations.ApiImplicitParam dataTypeClass()", false), + Preconditions.or( + new UsesMethod<>("io.swagger.annotations.ApiImplicitParam dataTypeClass()", false), + new UsesMethod<>("io.swagger.annotations.ApiImplicitParam defaultValue()", false) + ), new JavaIsoVisitor() { @Override public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { From 9a62cea2a29979efd1b84aaa9c8f99e4a3322f3b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 2 Jan 2025 11:44:51 +0100 Subject: [PATCH 5/5] Update src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../openapi/swagger/MigrateApiImplicitParam.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java index fd2d4d5..0b4d470 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateApiImplicitParam.java @@ -15,8 +15,14 @@ */ package org.openrewrite.openapi.swagger; -import org.openrewrite.*; -import org.openrewrite.java.*; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.AnnotationMatcher; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J;