schemas) {
*
* This method will remove the native and puts the target, converted schema in place.
*/
- private void processCommonModelConverters(Schema payloadSchema, Map schemas) {
+ private void processCommonModelConverters(Schema> payloadSchema, Map> schemas) {
schemas.values().stream()
.filter(schema -> schema.getType() == null)
.filter(schema -> schema.get$ref() != null)
@@ -166,7 +160,7 @@ private void processCommonModelConverters(Schema payloadSchema, Map schema, String targetSchemaName, String sourceSchemaName) {
if (schema != null && schema.get$ref() != null) {
String refTypeName = ReferenceUtil.getLastSegment(schema.get$ref());
if (refTypeName.equals(sourceSchemaName)) {
@@ -175,7 +169,7 @@ private void updatePayloadSchemaRef(Schema schema, String targetSchemaName, Stri
}
}
- private void processSchemaAnnotation(Schema payloadSchema, Type type) {
+ private void processSchemaAnnotation(Schema> payloadSchema, Type type) {
JavaType javaType = Json.mapper().constructType(type);
Class> clazz = javaType.getRawClass();
if (payloadSchema != null) {
@@ -186,7 +180,7 @@ private void processSchemaAnnotation(Schema payloadSchema, Type type) {
}
}
- private void processAsyncApiPayloadAnnotation(Map schemas, Type type) {
+ private void processAsyncApiPayloadAnnotation(Map> schemas, Type type) {
JavaType javaType = Json.mapper().constructType(type);
Class> clazz = javaType.getRawClass();
List withPayloadAnnotatedFields = Arrays.stream(clazz.getDeclaredFields())
@@ -216,7 +210,7 @@ public String getNameFromType(Type type) {
return primitiveType.getKeyClass().getName();
}
JavaType javaType = Json.mapper().constructType(type);
- return modelConvertersProvider.getTypeNameResolver().nameForType(javaType);
+ return modelConvertersRegisterer.getTypeNameResolver().nameForType(javaType);
}
public String getSimpleNameFromType(Type type) {
@@ -225,9 +219,9 @@ public String getSimpleNameFromType(Type type) {
}
private void postProcessSchemas(
- Map schemasToProcess, Map schemas, String contentType) {
+ Map> schemasToProcess, Map> schemas, String contentType) {
for (SchemasPostProcessor processor : schemaPostProcessors) {
- for (Schema schema : schemasToProcess.values()) {
+ for (Schema> schema : schemasToProcess.values()) {
if (!schemas.containsValue(schema)) {
// If the post-processor removed the schema, we can skip it
continue;
diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/SchemaWalkerProvider.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/SchemaWalkerProvider.java
similarity index 59%
rename from springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/SchemaWalkerProvider.java
rename to springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/SchemaWalkerProvider.java
index 2aec306d1..6135c68bb 100644
--- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/SchemaWalkerProvider.java
+++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/SchemaWalkerProvider.java
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
-package io.github.springwolf.core.asyncapi.components.examples;
+package io.github.springwolf.core.asyncapi.schemas.schema.examples;
-import io.github.springwolf.core.asyncapi.components.examples.walkers.SchemaWalker;
+import io.github.springwolf.core.asyncapi.schemas.schema.examples.walkers.SchemaWalker;
import lombok.RequiredArgsConstructor;
import java.util.List;
@@ -13,9 +13,9 @@
@RequiredArgsConstructor
public class SchemaWalkerProvider {
- private final List schemaWalkers;
+ private final List> schemaWalkers;
- public Optional generatorFor(String contentType) {
+ public Optional> generatorFor(String contentType) {
return schemaWalkers.stream()
.filter(walker -> walker.canHandle(contentType))
.findFirst();
diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/formatter/ExampleFormatter.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/formatter/ExampleFormatter.java
similarity index 90%
rename from springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/formatter/ExampleFormatter.java
rename to springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/formatter/ExampleFormatter.java
index ac32e493d..6c5b9aaee 100644
--- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/formatter/ExampleFormatter.java
+++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/formatter/ExampleFormatter.java
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: Apache-2.0
-package io.github.springwolf.core.asyncapi.components.examples.formatter;
+package io.github.springwolf.core.asyncapi.schemas.schema.examples.formatter;
import java.text.SimpleDateFormat;
import java.time.OffsetDateTime;
diff --git a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/walkers/DefaultSchemaWalker.java b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/walkers/DefaultSchemaWalker.java
similarity index 78%
rename from springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/walkers/DefaultSchemaWalker.java
rename to springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/walkers/DefaultSchemaWalker.java
index a5c41e33d..7c5bcb1b8 100644
--- a/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/components/examples/walkers/DefaultSchemaWalker.java
+++ b/springwolf-core/src/main/java/io/github/springwolf/core/asyncapi/schemas/schema/examples/walkers/DefaultSchemaWalker.java
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: Apache-2.0
-package io.github.springwolf.core.asyncapi.components.examples.walkers;
+package io.github.springwolf.core.asyncapi.schemas.schema.examples.walkers;
import io.github.springwolf.asyncapi.v3.model.ReferenceUtil;
-import io.github.springwolf.core.asyncapi.components.examples.formatter.ExampleFormatter;
+import io.github.springwolf.core.asyncapi.schemas.schema.examples.formatter.ExampleFormatter;
import io.swagger.v3.oas.models.media.MapSchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
@@ -11,7 +11,9 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
+import java.util.ArrayList;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -53,7 +55,7 @@ public boolean canHandle(String contentType) {
}
@Override
- public R fromSchema(Schema schema, Map definitions) {
+ public R fromSchema(Schema> schema, Map definitions) {
exampleValueGenerator.initialize();
Optional schemaName = exampleValueGenerator.lookupSchemaName(schema);
@@ -70,7 +72,7 @@ public R fromSchema(Schema schema, Map definitions) {
}
private Optional buildExample(
- Optional name, Schema schema, Map definitions, Set visited) {
+ Optional name, Schema> schema, Map definitions, Set> visited) {
log.trace("Building example for schema {}", schema);
Optional exampleValue = getExampleFromSchemaAnnotation(name, schema);
@@ -87,13 +89,13 @@ private Optional buildExample(
return example;
}
- private Optional getExampleFromSchemaAnnotation(Optional fieldName, Schema schema) {
+ private Optional getExampleFromSchemaAnnotation(Optional fieldName, Schema> schema) {
return getExampleValueFromSchemaAnnotation(fieldName, schema, schema.getExample())
.or(() -> getExampleValueFromSchemaAnnotation(fieldName, schema, schema.getDefault()));
}
private Optional getExampleValueFromSchemaAnnotation(
- Optional fieldName, Schema schema, Object exampleValue) {
+ Optional fieldName, Schema> schema, Object exampleValue) {
// schema is a map of properties from a nested object, whose example cannot be inferred
if (exampleValue == null) {
return Optional.empty();
@@ -154,7 +156,7 @@ private Optional getExampleValueFromSchemaAnnotation(
* The caller must ensure that the schema has not been visited before to avoid infinite recursion
*/
private Optional buildExampleFromUnvisitedSchema(
- Optional name, Schema schema, Map definitions, Set visited) {
+ Optional name, Schema> schema, Map definitions, Set> visited) {
Optional> resolvedSchema = resolveSchemaFromRef(schema, definitions);
if (resolvedSchema.isPresent()) {
return buildExample(name, resolvedSchema.get(), definitions, visited);
@@ -187,8 +189,8 @@ private Optional buildExampleFromUnvisitedSchema(
};
}
- private Optional buildArrayExample(Schema schema, Map definitions, Set visited) {
- Schema arrayItemSchema =
+ private Optional buildArrayExample(Schema> schema, Map definitions, Set> visited) {
+ Schema> arrayItemSchema =
resolveSchemaFromRef(schema.getItems(), definitions).orElse(schema.getItems());
Optional arrayName = exampleValueGenerator.lookupSchemaName(schema);
@@ -201,7 +203,7 @@ private Optional buildArrayExample(Schema schema, Map definit
.map(arrayItem -> exampleValueGenerator.createArrayExample(arrayName, arrayItem));
}
- private Optional buildFromStringSchema(Schema schema) {
+ private Optional buildFromStringSchema(Schema> schema) {
String format = schema.getFormat();
if (format == null) {
return exampleValueGenerator.createStringExample(DEFAULT_STRING_EXAMPLE, schema);
@@ -219,7 +221,7 @@ private Optional buildFromStringSchema(Schema schema) {
};
}
- private Optional buildFromConstOrEnum(Schema schema) {
+ private Optional buildFromConstOrEnum(Schema> schema) {
Object constValue = schema.getConst();
if (constValue != null) {
return exampleValueGenerator.createStringExample(constValue.toString(), schema);
@@ -233,18 +235,15 @@ private Optional buildFromConstOrEnum(Schema schema) {
return Optional.empty();
}
- private String getFirstEnumValue(Schema schema) {
- List enums = schema.getEnum();
+ private String getFirstEnumValue(Schema> schema) {
+ List> enums = schema.getEnum();
if (enums != null) {
- Optional firstEnumEntry = enums.stream().findFirst();
- if (firstEnumEntry.isPresent()) {
- return firstEnumEntry.get();
- }
+ return enums.stream().findFirst().map(Object::toString).orElse(null);
}
return null;
}
- private Optional getFallbackExampleSchemaStringForFormat(String schemaFormat, Schema schema) {
+ private Optional getFallbackExampleSchemaStringForFormat(String schemaFormat, Schema> schema) {
return switch (schemaFormat) {
case "int32", "int64" ->
exampleValueGenerator.createStringExample(DEFAULT_INTEGER_EXAMPLE.toString(), schema);
@@ -258,11 +257,10 @@ private Optional getFallbackExampleSchemaStringForFormat(String schemaFormat,
* looks in schemas openapi-v3 'type' and openapi-v3.1 'types' fields to
* find the best candidate to use as an example value.
*
- * @param schema
* @return the type to use for example values, or null if no suitable type was found.
*/
@Nullable
- String getTypeForExampleValue(Schema schema) {
+ String getTypeForExampleValue(Schema> schema) {
// if the single type field is present, it has precedence over the types field
if (schema.getType() != null) {
return schema.getType();
@@ -282,10 +280,10 @@ String getTypeForExampleValue(Schema schema) {
}
private Optional buildFromComposedSchema(
- Optional name, Schema schema, Map definitions, Set visited) {
- final List schemasAllOf = schema.getAllOf();
- final List schemasAnyOf = schema.getAnyOf();
- final List schemasOneOf = schema.getOneOf();
+ Optional name, Schema> schema, Map definitions, Set> visited) {
+ final List> schemasAllOf = schemasOf(schema.getAllOf());
+ final List> schemasAnyOf = schemasOf(schema.getAnyOf());
+ final List> schemasOneOf = schemasOf(schema.getOneOf());
if (!CollectionUtils.isEmpty(schemasAllOf)) {
return buildFromObjectSchemaWithAllOf(name, schemasAllOf, definitions, visited);
} else if (!CollectionUtils.isEmpty(schemasAnyOf)) {
@@ -298,15 +296,15 @@ private Optional buildFromComposedSchema(
}
private Optional buildFromObjectSchema(
- Optional name, Schema schema, Map definitions, Set visited) {
+ Optional name, Schema> schema, Map definitions, Set> visited) {
final Optional exampleValue;
- final Map properties = schema.getProperties();
+ final Map> properties = getProperties(schema);
final Object additionalProperties = schema.getAdditionalProperties();
if (properties != null) {
exampleValue = buildFromObjectSchemaWithProperties(name, properties, definitions, visited);
- } else if (schema instanceof MapSchema && additionalProperties instanceof Schema schema1) {
- exampleValue = buildMapExample(name, schema1, definitions, visited);
+ } else if (schema instanceof MapSchema && additionalProperties instanceof Schema> additionalPropertySchema) {
+ exampleValue = buildMapExample(name, additionalPropertySchema, definitions, visited);
} else {
exampleValue = exampleValueGenerator.createEmptyObjectExample();
}
@@ -315,9 +313,9 @@ private Optional buildFromObjectSchema(
}
private Optional buildMapExample(
- Optional name, Schema additionalProperties, Map definitions, Set visited) {
+ Optional name, Schema> additionalProperties, Map definitions, Set> visited) {
T object = exampleValueGenerator.startObject(name);
- Map mapProperties = Map.of(DEFAULT_MAP_KEY_EXAMPLE, additionalProperties);
+ Map> mapProperties = Map.of(DEFAULT_MAP_KEY_EXAMPLE, additionalProperties);
exampleValueGenerator.addPropertyExamples(
object, buildPropertyExampleListFromSchema(mapProperties, definitions, visited));
exampleValueGenerator.endObject();
@@ -327,9 +325,9 @@ private Optional buildMapExample(
private Optional buildFromObjectSchemaWithProperties(
Optional name,
- Map properties,
- Map definitions,
- Set visited) {
+ Map> properties,
+ Map definitions,
+ Set