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 <[email protected]>
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\" : " +