From b2444bc03d4bc4d63c08986715fa7fc83b16b1dd Mon Sep 17 00:00:00 2001 From: SiBorea Date: Fri, 20 Dec 2024 12:53:39 +0800 Subject: [PATCH] Fix single schema issue --- build.gradle.kts | 1 + ...eSwaggerDefinitionToOpenAPIDefinition.java | 23 +++++++--- .../openapi/swagger/SwaggerToOpenAPITest.java | 45 +++++++++++++++++-- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index fabd831..3665662 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { testRuntimeOnly("io.swagger:swagger-annotations:1.6.13") testRuntimeOnly("io.swagger.core.v3:swagger-annotations:2.2.20") + testRuntimeOnly("jakarta.ws.rs:jakarta.ws.rs-api:3.1.0") testRuntimeOnly("org.gradle:gradle-tooling-api:latest.release") } diff --git a/src/main/java/org/openrewrite/openapi/swagger/MigrateSwaggerDefinitionToOpenAPIDefinition.java b/src/main/java/org/openrewrite/openapi/swagger/MigrateSwaggerDefinitionToOpenAPIDefinition.java index 127aed7..6d9f1a4 100644 --- a/src/main/java/org/openrewrite/openapi/swagger/MigrateSwaggerDefinitionToOpenAPIDefinition.java +++ b/src/main/java/org/openrewrite/openapi/swagger/MigrateSwaggerDefinitionToOpenAPIDefinition.java @@ -49,6 +49,12 @@ public TreeVisitor getVisitor() { new JavaIsoVisitor() { private final AnnotationMatcher annotationMatcher = new AnnotationMatcher(FQN_SWAGGER_DEFINITION); + @Override + public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext executionContext) { + cu = super.visitCompilationUnit(cu, executionContext); + return cu; + } + @Override public J.@Nullable Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) { J.Annotation ann = super.visitAnnotation(annotation, ctx); @@ -66,12 +72,16 @@ public TreeVisitor getVisitor() { String servers = ""; if (basePath != null && host != null && schemes != null) { tpl.append("servers = {\n"); - for (Expression scheme : ((J.NewArray) schemes).getInitializer()) { - if (!servers.isEmpty()) { - servers += ",\n"; + if (schemes instanceof J.FieldAccess) { + servers += "@Server(url = \"" + ((J.FieldAccess) schemes).getSimpleName().toLowerCase() + "://" + host + basePath + "\")"; + } else if (schemes instanceof J.NewArray) { + for (Expression scheme : ((J.NewArray) schemes).getInitializer()) { + if (!servers.isEmpty()) { + servers += ",\n"; + } + String schemeName = ((J.FieldAccess) scheme).getSimpleName().toLowerCase(); + servers += "@Server(url = \"" + schemeName + "://" + host + basePath + "\")"; } - String schemeName = ((J.FieldAccess) scheme).getSimpleName().toLowerCase(); - servers += "@Server(url = \"" + schemeName + "://" + host + basePath + "\")"; } servers += "\n}"; parts.add(servers); @@ -91,7 +101,7 @@ public TreeVisitor getVisitor() { ann = JavaTemplate.builder(tpl.toString()) .imports(FQN_OPENAPI_DEFINITION, FQN_SERVER) - .javaParser(JavaParser.fromJavaVersion().dependsOn(FQN_OPENAPI_DEFINITION, FQN_SERVER)) + .javaParser(JavaParser.fromJavaVersion().classpath("swagger-annotations")) .build() .apply(updateCursor(ann), ann.getCoordinates().replace(), tplArgs.toArray()); maybeRemoveImport(FQN_SWAGGER_DEFINITION); @@ -100,6 +110,7 @@ public TreeVisitor getVisitor() { ann = maybeAutoFormat(annotation, ann, ctx); } + doAfterVisit(new RemoveUnusedImports().getVisitor()); return ann; } } diff --git a/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java b/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java index 9c55f9a..994fdd9 100644 --- a/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java +++ b/src/test/java/org/openrewrite/openapi/swagger/SwaggerToOpenAPITest.java @@ -30,7 +30,7 @@ class SwaggerToOpenAPITest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipeFromResources("org.openrewrite.openapi.swagger.SwaggerToOpenAPI") - .parser(JavaParser.fromJavaVersion().classpath("swagger-annotations-1.+", "swagger-annotations-2.+")); + .parser(JavaParser.fromJavaVersion().classpath("swagger-annotations-1.+", "swagger-annotations-2.+", "rs-api")); } @Test @@ -132,9 +132,8 @@ class Example { } @Test - void migrateSwaggerDefinitionsToOpenAPIDefinition() { + void migrateSwaggerDefinitionsToOpenAPIDefinitionSingleSchema() { rewriteRun( - recipeSpec -> recipeSpec.afterTypeValidationOptions(TypeValidation.none()), //language=java java( """ @@ -148,7 +147,8 @@ void migrateSwaggerDefinitionsToOpenAPIDefinition() { info = @Info(title = "Example", version = "V1.0"), consumes = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }, produces = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }, - schemes = { SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS }) + schemes = SwaggerDefinition.Scheme.HTTPS + ) class Example { } """, @@ -156,8 +156,45 @@ class Example { import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; import io.swagger.v3.oas.annotations.servers.Server; + + @OpenAPIDefinition( + servers = { + @Server(url = "https://example.com/api") + }, + info = @Info(title = "Example", version = "V1.0") + ) + class Example { + } + """ + )); + } + + @Test + void migrateSwaggerDefinitionsToOpenAPIDefinitionMultipleSchema() { + rewriteRun( +// recipeSpec -> recipeSpec.afterTypeValidationOptions(TypeValidation.none()), + //language=java + java( + """ + import io.swagger.annotations.Info; + import io.swagger.annotations.SwaggerDefinition; import jakarta.ws.rs.core.MediaType; + @SwaggerDefinition( + basePath = "/api", + host="example.com", + info = @Info(title = "Example", version = "V1.0"), + consumes = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }, + produces = { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }, + schemes = { SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS }) + class Example { + } + """, + """ + import io.swagger.v3.oas.annotations.OpenAPIDefinition; + import io.swagger.v3.oas.annotations.info.Info; + import io.swagger.v3.oas.annotations.servers.Server; + @OpenAPIDefinition( servers = { @Server(url = "http://example.com/api"),