You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2022/03/18 10:05:41 UTC

[camel-quarkus] 06/12: Fix #3606 to add reflection configs for Schema and its subClasses (#3624)

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch 2.7.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 237423bf2e5d4f410a1cbf4d1535a7c2edf99954
Author: Amos Feng <zh...@gmail.com>
AuthorDate: Wed Mar 16 09:04:30 2022 +0800

    Fix #3606 to add reflection configs for Schema and its subClasses (#3624)
---
 .../java/deployment/OpenApiJavaProcessor.java      | 23 ++++++++++++++++++++++
 .../component/openapijava/it/OpenApiRoutes.java    |  5 +++--
 .../component/openapijava/it/model/Fruit.java      |  4 +++-
 .../component/openapijava/it/v2/OpenApiV2Test.java | 16 +++++++++++++++
 .../component/openapijava/it/v3/OpenApiV3Test.java | 16 +++++++++++++++
 5 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/extensions/openapi-java/deployment/src/main/java/org/apache/camel/quarkus/component/openapi/java/deployment/OpenApiJavaProcessor.java b/extensions/openapi-java/deployment/src/main/java/org/apache/camel/quarkus/component/openapi/java/deployment/OpenApiJavaProcessor.java
index 9f6ac2e..af8d8a3 100644
--- a/extensions/openapi-java/deployment/src/main/java/org/apache/camel/quarkus/component/openapi/java/deployment/OpenApiJavaProcessor.java
+++ b/extensions/openapi-java/deployment/src/main/java/org/apache/camel/quarkus/component/openapi/java/deployment/OpenApiJavaProcessor.java
@@ -16,15 +16,38 @@
  */
 package org.apache.camel.quarkus.component.openapi.java.deployment;
 
+import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.swagger.v3.oas.models.media.Schema;
+import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.DotName;
+import org.jboss.jandex.IndexView;
 
 class OpenApiJavaProcessor {
 
     private static final String FEATURE = "camel-openapi-java";
+    private static final DotName SCHEMA = DotName.createSimple(Schema.class.getName());
 
     @BuildStep
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
     }
+
+    @BuildStep
+    void addDependencies(BuildProducer<IndexDependencyBuildItem> indexDependency) {
+        indexDependency.produce(new IndexDependencyBuildItem("io.swagger.core.v3", "swagger-models"));
+    }
+
+    @BuildStep
+    void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClasses, CombinedIndexBuildItem combinedIndex) {
+        reflectiveClasses.produce(new ReflectiveClassBuildItem(true, true, SCHEMA.toString()));
+
+        IndexView index = combinedIndex.getIndex();
+        index.getAllKnownSubclasses(SCHEMA).stream().map(ClassInfo::toString).forEach(
+                name -> reflectiveClasses.produce(new ReflectiveClassBuildItem(false, false, name)));
+    }
 }
diff --git a/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/OpenApiRoutes.java b/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/OpenApiRoutes.java
index 8e6a1e3..884bf4c 100644
--- a/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/OpenApiRoutes.java
+++ b/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/OpenApiRoutes.java
@@ -60,6 +60,7 @@ public class OpenApiRoutes extends RouteBuilder {
 
         rest("/api")
                 .get("/fruits/list")
+                .type(Fruit.class)
                 .description("Gets a list of fruits")
                 .id("list")
                 .produces(MediaType.APPLICATION_JSON)
@@ -173,8 +174,8 @@ public class OpenApiRoutes extends RouteBuilder {
 
     private Set<Fruit> getFruits() {
         Set<Fruit> fruits = Collections.newSetFromMap(Collections.synchronizedMap(new LinkedHashMap<>()));
-        fruits.add(new Fruit("Apple", "Winter fruit"));
-        fruits.add(new Fruit("Pineapple", "Tropical fruit"));
+        fruits.add(new Fruit("Apple", "Winter fruit", 10));
+        fruits.add(new Fruit("Pineapple", "Tropical fruit", 20));
         return fruits;
     }
 }
diff --git a/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/model/Fruit.java b/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/model/Fruit.java
index 44ee9a1..52117e7 100644
--- a/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/model/Fruit.java
+++ b/integration-tests/openapi-java/src/main/java/org/apache/camel/quarkus/component/openapijava/it/model/Fruit.java
@@ -23,9 +23,11 @@ public class Fruit {
 
     public String name;
     public String description;
+    public Integer num;
 
-    public Fruit(String name, String description) {
+    public Fruit(String name, String description, Integer num) {
         this.name = name;
         this.description = description;
+        this.num = num;
     }
 }
diff --git a/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v2/OpenApiV2Test.java b/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v2/OpenApiV2Test.java
index 0b57703..d59ac56 100644
--- a/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v2/OpenApiV2Test.java
+++ b/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v2/OpenApiV2Test.java
@@ -136,4 +136,20 @@ public class OpenApiV2Test extends OpenApiTest {
                         "basePath", is("/api"),
                         "schemes", contains("http", "https"));
     }
+
+    @ParameterizedTest
+    @EnumSource(OpenApiContentType.class)
+    public void openApiDefinitions(OpenApiContentType contentType) {
+        RestAssured.given()
+                .header("Accept", contentType.getMimeType())
+                .get("/openapi")
+                .then()
+                .contentType(ContentType.JSON)
+                .statusCode(200)
+                .body(
+                        "definitions.Fruit.type", is("object"),
+                        "definitions.Fruit.properties.name.type", is("string"),
+                        "definitions.Fruit.properties.description.type", is("string"),
+                        "definitions.Fruit.properties.num.type", is("integer"));
+    }
 }
diff --git a/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v3/OpenApiV3Test.java b/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v3/OpenApiV3Test.java
index 463b943..0f7159b 100644
--- a/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v3/OpenApiV3Test.java
+++ b/integration-tests/openapi-java/src/test/java/org/apache/camel/quarkus/component/openapijava/it/v3/OpenApiV3Test.java
@@ -92,4 +92,20 @@ public class OpenApiV3Test extends OpenApiTest {
                 .statusCode(200)
                 .body("servers[0].url", is("http://localhost:8080/api"));
     }
+
+    @ParameterizedTest
+    @EnumSource(OpenApiContentType.class)
+    public void openApiComponents(OpenApiContentType contentType) {
+        RestAssured.given()
+                .header("Accept", contentType.getMimeType())
+                .get("/openapi")
+                .then()
+                .contentType(ContentType.JSON)
+                .statusCode(200)
+                .body(
+                        "components.schemas.Fruit.type", is("object"),
+                        "components.schemas.Fruit.properties.name.type", is("string"),
+                        "components.schemas.Fruit.properties.description.type", is("string"),
+                        "components.schemas.Fruit.properties.num.type", is("integer"));
+    }
 }