From a395837729e672b442eab8e1728b63d3c2239185 Mon Sep 17 00:00:00 2001 From: Bartosz Michalik Date: Mon, 13 Mar 2023 12:04:30 +0100 Subject: [PATCH] flex other parts of the API Signed-off-by: Bartosz Michalik Signed-off-by: Bartosz Michalik --- .../sonata/blender/cmd/AbstractBlend.java | 3 ++- .../com/amartus/sonata/blender/cmd/Merge.java | 3 ++- .../blender/impl/ProductSpecReader.java | 25 ++++++++++++++----- .../blender/parser/DeserializerProvider.java | 2 +- .../blender/impl/ProductSpecReaderTest.java | 7 +++--- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/amartus/sonata/blender/cmd/AbstractBlend.java b/src/main/java/com/amartus/sonata/blender/cmd/AbstractBlend.java index 5cb2f5b..25d98c4 100644 --- a/src/main/java/com/amartus/sonata/blender/cmd/AbstractBlend.java +++ b/src/main/java/com/amartus/sonata/blender/cmd/AbstractBlend.java @@ -21,6 +21,7 @@ import com.amartus.sonata.blender.impl.ProductSpecReader; import com.amartus.sonata.blender.impl.util.Pair; import com.amartus.sonata.blender.impl.util.PathResolver; +import com.amartus.sonata.blender.parser.DeserializerProvider; import com.github.rvesse.airline.annotations.Option; import com.github.rvesse.airline.annotations.restrictions.Once; import com.github.rvesse.airline.annotations.restrictions.RequireOnlyOne; @@ -93,7 +94,7 @@ public abstract class AbstractBlend { protected Map toProductSpecifications() { return toSchemaPaths(blendingSchemas()) - .flatMap(schema -> new ProductSpecReader(modelToAugment, schema.first(), schema.second()).readSchemas().entrySet().stream()) + .flatMap(schema -> new ProductSpecReader(modelToAugment, schema.first(), schema.second(), new DeserializerProvider(), ProductSpecReader.defaultOptions()).readSchemas().entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> { if (a.equals(b)) return a; throw new IllegalArgumentException(String.format("Object for the same key does not match %s %s", a, b)); diff --git a/src/main/java/com/amartus/sonata/blender/cmd/Merge.java b/src/main/java/com/amartus/sonata/blender/cmd/Merge.java index 0474f8d..08c15d5 100644 --- a/src/main/java/com/amartus/sonata/blender/cmd/Merge.java +++ b/src/main/java/com/amartus/sonata/blender/cmd/Merge.java @@ -25,6 +25,7 @@ import com.amartus.sonata.blender.impl.util.IdSchemaResolver; import com.amartus.sonata.blender.impl.util.PathResolver; import com.amartus.sonata.blender.impl.util.SerializationUtils; +import com.amartus.sonata.blender.parser.DeserializerProvider; import com.github.rvesse.airline.annotations.Command; import com.github.rvesse.airline.annotations.Option; import com.github.rvesse.airline.annotations.restrictions.Once; @@ -162,7 +163,7 @@ protected Map toProductSpecifications() { var paths = resolver.toSchemaPaths(blendedSchema.stream()); return paths - .flatMap(schema -> new ProductSpecReader(modelToAugment, schema.first(), schema.second()).readSchemas().entrySet().stream()) + .flatMap(schema -> new ProductSpecReader(modelToAugment, schema.first(), schema.second(), new DeserializerProvider(), ProductSpecReader.defaultOptions()).readSchemas().entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> { if (a.equals(b)) return a; throw new IllegalArgumentException(String.format("Object for the same key does not match %s %s", a, b)); diff --git a/src/main/java/com/amartus/sonata/blender/impl/ProductSpecReader.java b/src/main/java/com/amartus/sonata/blender/impl/ProductSpecReader.java index f2b8263..a5ca033 100644 --- a/src/main/java/com/amartus/sonata/blender/impl/ProductSpecReader.java +++ b/src/main/java/com/amartus/sonata/blender/impl/ProductSpecReader.java @@ -56,14 +56,23 @@ public class ProductSpecReader { private final List namingStrategies; private final Charset charset = StandardCharsets.UTF_8; private final String fragment; + private final DeserializerProvider deserializerProvider; + + private final ParseOptions options; public ProductSpecReader(String modelToAugment, Path schemaLocation) { - this(modelToAugment, schemaLocation, ""); + this(modelToAugment, schemaLocation, "", new DeserializerProvider(), defaultOptions()); + } + + public ProductSpecReader(String modelToAugment, Path schemaLocation, DeserializerProvider deserializerProvider) { + this(modelToAugment, schemaLocation, "", deserializerProvider, defaultOptions()); } - public ProductSpecReader(String modelToAugment, Path schemaLocation, String fragment) { + public ProductSpecReader(String modelToAugment, Path schemaLocation, String fragment, DeserializerProvider deserializerProvider, ParseOptions options) { this.schemaPath = Objects.requireNonNull(schemaLocation).toAbsolutePath(); this.fragment = Objects.requireNonNull(fragment); + this.deserializerProvider = Objects.requireNonNull(deserializerProvider); + this.options = Objects.requireNonNull(options); if (!Files.exists(this.schemaPath)) { throw new IllegalArgumentException("Path " + this.schemaPath + " does not exists"); } @@ -77,6 +86,13 @@ public ProductSpecReader(String modelToAugment, Path schemaLocation, String frag ).collect(Collectors.toList()); } + public static ParseOptions defaultOptions() { + var options = new ParseOptions(); + options.setResolve(true); + options.setValidateExternalRefs(true); + return options; + } + public Map> readSchemas() { log.info("Resolving {}", this.schemaPath); OpenAPI api = new OpenAPI(); @@ -172,11 +188,8 @@ private String toRefName(Schema schema) { protected Map> resolve(Schema schema) { var parentFile = schemaPath.toString(); - var options = new ParseOptions(); - options.setResolve(true); - options.setValidateExternalRefs(true); var oas = new OpenAPI().schema(KEY, schema); - var cache = new ResolverCache(oas, parentFile, options, new DeserializerProvider()); + var cache = new ResolverCache(oas, parentFile, options, deserializerProvider); OpenAPIResolver r = new OpenAPIResolver(new OpenAPI().schema(KEY, schema), cache, null); var res = new SwaggerParseResult().messages(new ArrayList<>()); diff --git a/src/main/java/com/amartus/sonata/blender/parser/DeserializerProvider.java b/src/main/java/com/amartus/sonata/blender/parser/DeserializerProvider.java index c5de9e1..03f6286 100644 --- a/src/main/java/com/amartus/sonata/blender/parser/DeserializerProvider.java +++ b/src/main/java/com/amartus/sonata/blender/parser/DeserializerProvider.java @@ -30,7 +30,7 @@ public Schema getSchema(JsonNode node, String location, ParseResult result) { return schema; } } - OpenAPIDeserializer deserializer() { + public OpenAPIDeserializer deserializer() { return new AmartusDeserializer(); } } diff --git a/src/test/java/com/amartus/sonata/blender/impl/ProductSpecReaderTest.java b/src/test/java/com/amartus/sonata/blender/impl/ProductSpecReaderTest.java index 9e1f5a5..9f6594f 100644 --- a/src/test/java/com/amartus/sonata/blender/impl/ProductSpecReaderTest.java +++ b/src/test/java/com/amartus/sonata/blender/impl/ProductSpecReaderTest.java @@ -19,6 +19,7 @@ package com.amartus.sonata.blender.impl; import com.amartus.Utils; +import com.amartus.sonata.blender.parser.DeserializerProvider; import io.swagger.v3.oas.models.media.ObjectSchema; import io.swagger.v3.oas.models.media.Schema; import org.junit.jupiter.api.Test; @@ -35,7 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; class ProductSpecReaderTest { - + private final DeserializerProvider deserializerProvider = new DeserializerProvider(); @Test public void testReaderForSchema() { var dirPath = Utils.toPath("mini-model").toAbsolutePath(); @@ -58,7 +59,7 @@ public void testReaderForSchemaUsingRelativePaths() { @Test public void testReaderForSchemaOas() { var dirPath = Utils.toPath("mini-model"); - var schemas = new ProductSpecReader("testToAugment", dirPath.resolve("model-oas.yaml"), "#/components/schemas/ModelOAS") + var schemas = new ProductSpecReader("testToAugment", dirPath.resolve("model-oas.yaml"), "#/components/schemas/ModelOAS", deserializerProvider, ProductSpecReader.defaultOptions()) .readSchemas(); singleRootSchema(schemas); assertEquals(7, schemas.size()); @@ -67,7 +68,7 @@ public void testReaderForSchemaOas() { @Test public void testReadComposedModel() { var dirPath = Utils.toPath("ref-model"); - var schemas = new ProductSpecReader("testToAugment", dirPath.resolve("root.yaml"), "#/components/schemas/Root") + var schemas = new ProductSpecReader("testToAugment", dirPath.resolve("root.yaml"), "#/components/schemas/Root", deserializerProvider, ProductSpecReader.defaultOptions()) .readSchemas(); singleRootSchema(schemas); assertEquals(6, schemas.size());