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\" : " +