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

zhfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 779ab53d27b CAMEL-20193: camel-openapi-java - add to support OpenAPI 
3.1 ModelConverter (#12322)
779ab53d27b is described below

commit 779ab53d27b343bb64cd41470d08d40619f8eeab
Author: Zheng Feng <zh.f...@gmail.com>
AuthorDate: Wed Dec 6 15:57:57 2023 +0800

    CAMEL-20193: camel-openapi-java - add to support OpenAPI 3.1 ModelConverter 
(#12322)
---
 .../apache/camel/openapi/RestModelConverters.java  | 22 ++++++++++++++++++++--
 .../apache/camel/openapi/RestOpenApiReader.java    | 10 ++++++----
 .../apache/camel/openapi/RestOpenApiV3XOfTest.java |  9 +++++++--
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git 
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestModelConverters.java
 
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestModelConverters.java
index 84e47be76fb..f81bceba9f7 100644
--- 
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestModelConverters.java
+++ 
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestModelConverters.java
@@ -38,6 +38,13 @@ import io.swagger.v3.oas.models.media.Schema;
 @SuppressWarnings("rawtypes")
 public class RestModelConverters {
 
+    private static final ModelConverters MODEL31_CONVERTERS;
+
+    static {
+        MODEL31_CONVERTERS = ModelConverters.getInstance(true);
+        MODEL31_CONVERTERS.addConverter(new 
ClassNameExtensionModelResolver(new FqnModelResolver(true)));
+    }
+
     private static final ModelConverters MODEL30_CONVERTERS;
 
     static {
@@ -52,6 +59,12 @@ public class RestModelConverters {
         MODEL20_CONVERTERS.addConverter(new ClassNameExtensionModelResolver());
     }
 
+    private final boolean openapi31;
+
+    public RestModelConverters(boolean openapi31) {
+        this.openapi31 = openapi31;
+    }
+
     public List<? extends Schema<?>> readClass(OpenAPI oasDocument, Class<?> 
clazz) {
         if (clazz.equals(java.io.File.class)) {
             // File is a special type in OAS2 / OAS3 (no model)
@@ -67,7 +80,8 @@ public class RestModelConverters {
             return null;
         }
 
-        Map<String, Schema> swaggerModel = MODEL30_CONVERTERS.readAll(clazz);
+        ModelConverters modelConverters = openapi31 ? MODEL31_CONVERTERS : 
MODEL30_CONVERTERS;
+        Map<String, Schema> swaggerModel = modelConverters.readAll(clazz);
         List<Schema<?>> modelSchemas = new java.util.ArrayList<>();
         swaggerModel.forEach((key, schema) -> {
             schema.setName(key);
@@ -78,7 +92,12 @@ public class RestModelConverters {
 
     private static class FqnModelResolver extends ModelResolver {
         public FqnModelResolver() {
+            this(false);
+        }
+
+        public FqnModelResolver(boolean openapi31) {
             this(new ObjectMapper());
+            openapi31(openapi31);
         }
 
         public FqnModelResolver(ObjectMapper mapper) {
@@ -124,5 +143,4 @@ public class RestModelConverters {
             return result;
         }
     }
-
 }
diff --git 
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java
 
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java
index f73d8baa480..49753a4de42 100644
--- 
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java
+++ 
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiReader.java
@@ -259,7 +259,7 @@ public class RestOpenApiReader {
         // use annotation scanner to find models (annotated classes)
         for (String type : types) {
             Class<?> clazz = classResolver.resolveMandatoryClass(type);
-            appendModels(clazz, openApi);
+            appendModels(clazz, openApi, config.isOpenApi31());
         }
 
         doParseVerbs(camelContext, openApi, rest, camelContextId, verbs, 
pathAsTags, config);
@@ -500,7 +500,9 @@ public class RestOpenApiReader {
                         parameter.setSchema(schema);
                         String type = getValue(camelContext, 
param.getDataType());
                         schema.setType(type);
-                        schema.addType(type);
+                        if (openApi.getSpecVersion().equals(SpecVersion.V31)) {
+                            schema.addType(type);
+                        }
                         if (param.getDataFormat() != null) {
                             schema.setFormat(getValue(camelContext, 
param.getDataFormat()));
                         }
@@ -962,8 +964,8 @@ public class RestOpenApiReader {
      * @param clazz   the class such as pojo with openApi annotation
      * @param openApi the openApi model
      */
-    private void appendModels(Class<?> clazz, OpenAPI openApi) {
-        RestModelConverters converters = new RestModelConverters();
+    private void appendModels(Class<?> clazz, OpenAPI openApi, boolean 
openapi31) {
+        RestModelConverters converters = new RestModelConverters(openapi31);
         List<? extends Schema<?>> models = converters.readClass(openApi, 
clazz);
         if (models == null) {
             return;
diff --git 
a/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiV3XOfTest.java
 
b/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiV3XOfTest.java
index f4b77eafae5..6a3950fce76 100644
--- 
a/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiV3XOfTest.java
+++ 
b/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiV3XOfTest.java
@@ -122,8 +122,13 @@ public class RestOpenApiV3XOfTest extends CamelTestSupport 
{
         assertTrue(json.contains(
                 "\"XOfFormB\" : { \"type\" : \"object\", \"properties\" : { 
\"code\" : { \"type\" : \"string\" }, \"x\" : { \"type\" : \"integer\", 
\"format\" : \"int32\" }, \"y\" : { \"type\" : \"string\" } },"));
 
-        assertTrue(json.contains(
-                "\"OneOfFormWrapper\" : { \"type\" : \"object\", 
\"properties\" : { \"formType\" : { \"type\" : \"string\" }, \"form\" : { 
\"$ref\" : \"#/components/schemas/OneOfForm\" } },"));
+        if (config.isOpenApi30()) {
+            assertTrue(json.contains(
+                    "\"OneOfFormWrapper\" : { \"type\" : \"object\", 
\"properties\" : { \"formType\" : { \"type\" : \"string\" }, \"form\" : { 
\"$ref\" : \"#/components/schemas/OneOfForm\" } },"));
+        } else if (config.isOpenApi31()) {
+            assertTrue(json.contains(
+                    "\"OneOfFormWrapper\" : { \"type\" : \"object\", 
\"properties\" : { \"formType\" : { \"type\" : \"string\" }, \"form\" : { 
\"discriminator\" : { \"propertyName\" : \"code\", \"mapping\" : { \"a-123\" : 
\"#/components/schemas/org.apache.camel.openapi.model.XOfFormA\", \"b-456\" : 
\"#/components/schemas/org.apache.camel.openapi.model.XOfFormB\" } }, \"oneOf\" 
: [ { \"$ref\" : \"#/components/schemas/XOfFormA\" }, { \"$ref\" : 
\"#/components/schemas/XOfFormB\" } ], \"x-cl [...]
+        }
         assertTrue(json.contains(
                 "\"OneOfForm\" : { \"type\" : \"object\", " +
                                  "\"discriminator\" : { \"propertyName\" : 
\"code\", \"mapping\" : " +

Reply via email to