From 093994da02c1b7e05c23a320c8762d87e3012fa1 Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Tue, 17 Nov 2020 10:01:57 -0500 Subject: [PATCH 1/4] update Schema.Builder to return subclassed builder --- .../org/everit/json/schema/ArraySchema.java | 8 ++- .../org/everit/json/schema/BooleanSchema.java | 8 ++- .../everit/json/schema/CombinedSchema.java | 8 ++- .../everit/json/schema/ConditionalSchema.java | 8 ++- .../org/everit/json/schema/ConstSchema.java | 8 ++- .../org/everit/json/schema/EmptySchema.java | 8 ++- .../org/everit/json/schema/EnumSchema.java | 8 ++- .../org/everit/json/schema/FalseSchema.java | 8 ++- .../org/everit/json/schema/NotSchema.java | 8 ++- .../org/everit/json/schema/NullSchema.java | 8 ++- .../org/everit/json/schema/NumberSchema.java | 8 ++- .../org/everit/json/schema/ObjectSchema.java | 11 ++- .../everit/json/schema/ReferenceSchema.java | 8 ++- .../java/org/everit/json/schema/Schema.java | 44 ++++++------ .../org/everit/json/schema/StringSchema.java | 8 ++- .../org/everit/json/schema/TrueSchema.java | 6 ++ .../loader/AdjacentSchemaExtractionState.java | 8 +-- .../schema/loader/CombinedSchemaLoader.java | 2 +- .../json/schema/loader/ReferenceLookup.java | 6 +- .../json/schema/loader/SchemaExtractor.java | 24 +++---- .../json/schema/loader/SchemaLoader.java | 6 +- .../everit/json/schema/NumberSchemaTest.java | 2 +- .../json/schema/SchemaBuilderFluencyTest.java | 70 +++++++++++++++++++ .../org/everit/json/schema/TestSupport.java | 4 +- .../org/everit/json/schema/ToStringTest.java | 12 +++- .../schema/loader/ReferenceLookupTest.java | 2 +- 26 files changed, 234 insertions(+), 67 deletions(-) create mode 100644 core/src/test/java/org/everit/json/schema/SchemaBuilderFluencyTest.java diff --git a/core/src/main/java/org/everit/json/schema/ArraySchema.java b/core/src/main/java/org/everit/json/schema/ArraySchema.java index f7263dd6b..44743a527 100644 --- a/core/src/main/java/org/everit/json/schema/ArraySchema.java +++ b/core/src/main/java/org/everit/json/schema/ArraySchema.java @@ -19,7 +19,7 @@ public class ArraySchema * Builder class for {@link ArraySchema}. */ public static class Builder - extends Schema.Builder { + extends Schema.Builder { private boolean requiresArray = true; @@ -39,6 +39,12 @@ public static class Builder private Schema containedItemSchema; + @Override + protected Builder getBuilder() + { + return this; + } + /** * Adds an item schema for tuple validation. The array items of the subject under validation * will be matched to expected schemas by their index. In other words the {n}th diff --git a/core/src/main/java/org/everit/json/schema/BooleanSchema.java b/core/src/main/java/org/everit/json/schema/BooleanSchema.java index 73ae4dbec..b7d2584bb 100644 --- a/core/src/main/java/org/everit/json/schema/BooleanSchema.java +++ b/core/src/main/java/org/everit/json/schema/BooleanSchema.java @@ -12,7 +12,13 @@ public class BooleanSchema extends Schema { /** * Builder class for {@link BooleanSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } @Override public BooleanSchema build() { diff --git a/core/src/main/java/org/everit/json/schema/CombinedSchema.java b/core/src/main/java/org/everit/json/schema/CombinedSchema.java index 75e4a92a8..027d7d5e0 100644 --- a/core/src/main/java/org/everit/json/schema/CombinedSchema.java +++ b/core/src/main/java/org/everit/json/schema/CombinedSchema.java @@ -17,7 +17,7 @@ public class CombinedSchema extends Schema { /** * Builder class for {@link CombinedSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private ValidationCriterion criterion; @@ -25,6 +25,12 @@ public static class Builder extends Schema.Builder { private boolean synthetic; + @Override + protected Builder getBuilder() + { + return this; + } + @Override public CombinedSchema build() { return new CombinedSchema(this); diff --git a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java index f0e5a6988..ec6059758 100644 --- a/core/src/main/java/org/everit/json/schema/ConditionalSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConditionalSchema.java @@ -10,11 +10,17 @@ public class ConditionalSchema extends Schema { /** * Builder class for {@link ConditionalSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private Schema ifSchema; private Schema thenSchema; private Schema elseSchema; + @Override + protected Builder getBuilder() + { + return this; + } + public Builder ifSchema(final Schema ifSchema) { this.ifSchema = ifSchema; return this; diff --git a/core/src/main/java/org/everit/json/schema/ConstSchema.java b/core/src/main/java/org/everit/json/schema/ConstSchema.java index 0496e73e5..c2172139b 100644 --- a/core/src/main/java/org/everit/json/schema/ConstSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConstSchema.java @@ -4,7 +4,7 @@ public class ConstSchema extends Schema { - public static class ConstSchemaBuilder extends Schema.Builder { + public static class ConstSchemaBuilder extends Schema.Builder { private Object permittedValue; @@ -13,6 +13,12 @@ public ConstSchemaBuilder permittedValue(Object permittedValue) { return this; } + @Override + protected ConstSchemaBuilder getBuilder() + { + return this; + } + @Override public ConstSchema build() { return new ConstSchema(this); } diff --git a/core/src/main/java/org/everit/json/schema/EmptySchema.java b/core/src/main/java/org/everit/json/schema/EmptySchema.java index 9aa4bcf30..bafb91d93 100644 --- a/core/src/main/java/org/everit/json/schema/EmptySchema.java +++ b/core/src/main/java/org/everit/json/schema/EmptySchema.java @@ -10,7 +10,13 @@ public class EmptySchema extends Schema { /** * Builder class for {@link EmptySchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } @Override public EmptySchema build() { diff --git a/core/src/main/java/org/everit/json/schema/EnumSchema.java b/core/src/main/java/org/everit/json/schema/EnumSchema.java index c74c723e3..91eccad5b 100644 --- a/core/src/main/java/org/everit/json/schema/EnumSchema.java +++ b/core/src/main/java/org/everit/json/schema/EnumSchema.java @@ -38,7 +38,13 @@ static List toJavaValues(List orgJsons) { /** * Builder class for {@link EnumSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } private List possibleValues = new ArrayList<>(); diff --git a/core/src/main/java/org/everit/json/schema/FalseSchema.java b/core/src/main/java/org/everit/json/schema/FalseSchema.java index 29c0145d0..ff9e768f6 100644 --- a/core/src/main/java/org/everit/json/schema/FalseSchema.java +++ b/core/src/main/java/org/everit/json/schema/FalseSchema.java @@ -5,7 +5,13 @@ */ public class FalseSchema extends Schema { - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } @Override public FalseSchema build() { return new FalseSchema(this); diff --git a/core/src/main/java/org/everit/json/schema/NotSchema.java b/core/src/main/java/org/everit/json/schema/NotSchema.java index 6f4e57c4f..7c4f8aad0 100644 --- a/core/src/main/java/org/everit/json/schema/NotSchema.java +++ b/core/src/main/java/org/everit/json/schema/NotSchema.java @@ -12,7 +12,13 @@ public class NotSchema extends Schema { /** * Builder class for {@link NotSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } private Schema mustNotMatch; diff --git a/core/src/main/java/org/everit/json/schema/NullSchema.java b/core/src/main/java/org/everit/json/schema/NullSchema.java index f56f14f52..36c09209b 100644 --- a/core/src/main/java/org/everit/json/schema/NullSchema.java +++ b/core/src/main/java/org/everit/json/schema/NullSchema.java @@ -8,7 +8,13 @@ public class NullSchema extends Schema { /** * Builder class for {@link NullSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } @Override public NullSchema build() { diff --git a/core/src/main/java/org/everit/json/schema/NumberSchema.java b/core/src/main/java/org/everit/json/schema/NumberSchema.java index c60d98bbe..c70f9109f 100644 --- a/core/src/main/java/org/everit/json/schema/NumberSchema.java +++ b/core/src/main/java/org/everit/json/schema/NumberSchema.java @@ -10,7 +10,7 @@ public class NumberSchema extends Schema { /** * Builder class for {@link NumberSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private Number minimum; @@ -30,6 +30,12 @@ public static class Builder extends Schema.Builder { private boolean requiresInteger = false; + @Override + protected Builder getBuilder() + { + return this; + } + @Override public NumberSchema build() { return new NumberSchema(this); diff --git a/core/src/main/java/org/everit/json/schema/ObjectSchema.java b/core/src/main/java/org/everit/json/schema/ObjectSchema.java index 3f13851cc..0aa340f06 100644 --- a/core/src/main/java/org/everit/json/schema/ObjectSchema.java +++ b/core/src/main/java/org/everit/json/schema/ObjectSchema.java @@ -27,11 +27,11 @@ public class ObjectSchema extends Schema { /** * Builder class for {@link ObjectSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private static final RegexpFactory DEFAULT_REGEXP_FACTORY = new JavaUtilRegexpFactory(); - private static final Regexp toRegexp(String pattern) { + private static Regexp toRegexp(String pattern) { return DEFAULT_REGEXP_FACTORY.createHandler(pattern); } @@ -59,6 +59,12 @@ private static final Regexp toRegexp(String pattern) { public boolean oneOrMoreDefaultProperty = false; + @Override + protected Builder getBuilder() + { + return this; + } + public Builder additionalProperties(boolean additionalProperties) { this.additionalProperties = additionalProperties; return this; @@ -159,7 +165,6 @@ public Builder propertyNameSchema(Schema propertyNameSchema) { this.propertyNameSchema = propertyNameSchema; return this; } - } public static Builder builder() { diff --git a/core/src/main/java/org/everit/json/schema/ReferenceSchema.java b/core/src/main/java/org/everit/json/schema/ReferenceSchema.java index e3b7b6a01..76b05053a 100644 --- a/core/src/main/java/org/everit/json/schema/ReferenceSchema.java +++ b/core/src/main/java/org/everit/json/schema/ReferenceSchema.java @@ -16,7 +16,7 @@ public class ReferenceSchema extends Schema { /** * Builder class for {@link ReferenceSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private ReferenceSchema retval; @@ -25,6 +25,12 @@ public static class Builder extends Schema.Builder { */ private String refValue = ""; + @Override + protected Builder getBuilder() + { + return this; + } + /** * This method caches its result, so multiple invocations will return referentially the same * {@link ReferenceSchema} instance. diff --git a/core/src/main/java/org/everit/json/schema/Schema.java b/core/src/main/java/org/everit/json/schema/Schema.java index 7fada2c30..134a67578 100644 --- a/core/src/main/java/org/everit/json/schema/Schema.java +++ b/core/src/main/java/org/everit/json/schema/Schema.java @@ -23,7 +23,7 @@ public abstract class Schema { * @param * the type of the schema being built by the builder subclass. */ - public abstract static class Builder { + public abstract static class Builder> { private String title; @@ -43,61 +43,63 @@ public abstract static class Builder { public Map unprocessedProperties = new HashMap<>(0); - public Builder title(String title) { + public B title(String title) { this.title = title; - return this; + return getBuilder(); } - public Builder description(String description) { + public B description(String description) { this.description = description; - return this; + return getBuilder(); } - public Builder id(String id) { + public B id(String id) { this.id = id; - return this; + return getBuilder(); } /** * @deprecated Use {@link #schemaLocation(SchemaLocation)} instead. */ @Deprecated - public Builder schemaLocation(String schemaLocation) { + public B schemaLocation(String schemaLocation) { return schemaLocation(SchemaLocation.parseURI(schemaLocation)); } - public Builder schemaLocation(SchemaLocation location) { + public B schemaLocation(SchemaLocation location) { this.schemaLocation = location; - return this; + return getBuilder(); } - public Builder defaultValue(Object defaultValue) { + public B defaultValue(Object defaultValue) { this.defaultValue = defaultValue; - return this; + return getBuilder(); } - public Builder nullable(Boolean nullable) { + public B nullable(Boolean nullable) { this.nullable = nullable; - return this; + return getBuilder(); } - public Builder readOnly(Boolean readOnly) { + public B readOnly(Boolean readOnly) { this.readOnly = readOnly; - return this; + return getBuilder(); } - public Builder writeOnly(Boolean writeOnly) { + public B writeOnly(Boolean writeOnly) { this.writeOnly = writeOnly; - return this; + return getBuilder(); } - public Builder unprocessedProperties(Map unprocessedProperties) { + public B unprocessedProperties(Map unprocessedProperties) { this.unprocessedProperties = unprocessedProperties; - return this; + return getBuilder(); } public abstract S build(); + protected abstract B getBuilder(); + } private final String title; @@ -127,7 +129,7 @@ public Builder unprocessedProperties(Map unprocessedPropertie * @param builder * the builder containing the optional title, description and id attributes of the schema */ - protected Schema(Builder builder) { + protected Schema(Builder builder) { this.title = builder.title; this.description = builder.description; this.id = builder.id; diff --git a/core/src/main/java/org/everit/json/schema/StringSchema.java b/core/src/main/java/org/everit/json/schema/StringSchema.java index 4bfb7493c..0de898ea0 100644 --- a/core/src/main/java/org/everit/json/schema/StringSchema.java +++ b/core/src/main/java/org/everit/json/schema/StringSchema.java @@ -16,7 +16,7 @@ public class StringSchema extends Schema { /** * Builder class for {@link StringSchema}. */ - public static class Builder extends Schema.Builder { + public static class Builder extends Schema.Builder { private Integer minLength; @@ -28,6 +28,12 @@ public static class Builder extends Schema.Builder { private FormatValidator formatValidator = NONE; + @Override + protected Builder getBuilder() + { + return this; + } + @Override public StringSchema build() { return new StringSchema(this); diff --git a/core/src/main/java/org/everit/json/schema/TrueSchema.java b/core/src/main/java/org/everit/json/schema/TrueSchema.java index c0ed13173..b410be5d1 100644 --- a/core/src/main/java/org/everit/json/schema/TrueSchema.java +++ b/core/src/main/java/org/everit/json/schema/TrueSchema.java @@ -9,6 +9,12 @@ public class TrueSchema extends EmptySchema { public static class Builder extends EmptySchema.Builder { + @Override + protected Builder getBuilder() + { + return this; + } + @Override public TrueSchema build() { return new TrueSchema(this); } diff --git a/core/src/main/java/org/everit/json/schema/loader/AdjacentSchemaExtractionState.java b/core/src/main/java/org/everit/json/schema/loader/AdjacentSchemaExtractionState.java index 5cac0094f..b71b2f250 100644 --- a/core/src/main/java/org/everit/json/schema/loader/AdjacentSchemaExtractionState.java +++ b/core/src/main/java/org/everit/json/schema/loader/AdjacentSchemaExtractionState.java @@ -10,19 +10,19 @@ class AdjacentSchemaExtractionState { private final JsonObject context; - private final Set> extractedSchemas; + private final Set> extractedSchemas; AdjacentSchemaExtractionState(JsonObject context) { this(context, new HashSet<>()); } - private AdjacentSchemaExtractionState(JsonObject context, Set> extractedSchemas) { + private AdjacentSchemaExtractionState(JsonObject context, Set> extractedSchemas) { this.context = context; this.extractedSchemas = extractedSchemas; } AdjacentSchemaExtractionState reduce(ExtractionResult result) { - Set> newExtractedSchemas = new HashSet<>(extractedSchemas.size() + result.extractedSchemas.size()); + Set> newExtractedSchemas = new HashSet<>(extractedSchemas.size() + result.extractedSchemas.size()); newExtractedSchemas.addAll(extractedSchemas); newExtractedSchemas.addAll(result.extractedSchemas); JsonObject projectedContext = new ProjectedJsonObject(context, result.consumedKeys); @@ -33,7 +33,7 @@ public JsonObject projectedSchemaJson() { return context; } - public Collection> extractedSchemaBuilders() { + public Collection> extractedSchemaBuilders() { return extractedSchemas; } } diff --git a/core/src/main/java/org/everit/json/schema/loader/CombinedSchemaLoader.java b/core/src/main/java/org/everit/json/schema/loader/CombinedSchemaLoader.java index f5a57469b..c001b4150 100644 --- a/core/src/main/java/org/everit/json/schema/loader/CombinedSchemaLoader.java +++ b/core/src/main/java/org/everit/json/schema/loader/CombinedSchemaLoader.java @@ -47,7 +47,7 @@ public ExtractionResult extract(JsonObject schemaJson) { Set presentKeys = COMB_SCHEMA_PROVIDERS.keySet().stream() .filter(schemaJson::containsKey) .collect(toSet()); - Collection> extractedSchemas = presentKeys.stream().map(key -> loadCombinedSchemaForKeyword(schemaJson, key)) + Collection> extractedSchemas = presentKeys.stream().map(key -> loadCombinedSchemaForKeyword(schemaJson, key)) .collect(toList()); return new ExtractionResult(presentKeys, extractedSchemas); } diff --git a/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java b/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java index c5e1c7bd1..25348b871 100644 --- a/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java +++ b/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java @@ -118,7 +118,7 @@ Map withoutRef(JsonObject original) { return rawObj; } - private Schema.Builder performQueryEvaluation(String mapKey, JsonPointerEvaluator pointerEvaluator) { + private Schema.Builder performQueryEvaluation(String mapKey, JsonPointerEvaluator pointerEvaluator) { String absolutePointer = ReferenceResolver.resolve(ls.id, mapKey).toString(); if (ls.pointerSchemas.containsKey(absolutePointer)) { return ls.pointerSchemas.get(absolutePointer).initReference(absolutePointer); @@ -130,7 +130,7 @@ private Schema.Builder performQueryEvaluation(String mapKey, JsonPointerEvalu /** * Returns a schema builder instance after looking up the JSON pointer. */ - Schema.Builder lookup(String relPointerString, JsonObject ctx) { + Schema.Builder lookup(String relPointerString, JsonObject ctx) { String absPointerString = ReferenceResolver.resolve(ls.id, relPointerString).toString(); if (ls.pointerSchemas.containsKey(absPointerString)) { return ls.pointerSchemas.get(absPointerString).initReference(absPointerString); @@ -162,7 +162,7 @@ Schema.Builder lookup(String relPointerString, JsonObject ctx) { return refBuilder; } - private Schema.Builder createReferenceSchema(String relPointerString, String absPointerString, JsonValue rawReferenced) { + private Schema.Builder createReferenceSchema(String relPointerString, String absPointerString, JsonValue rawReferenced) { ReferenceKnot knot = new ReferenceKnot(); ReferenceSchema.Builder refBuilder = knot.initReference(relPointerString); ls.pointerSchemas.put(absPointerString, knot); diff --git a/core/src/main/java/org/everit/json/schema/loader/SchemaExtractor.java b/core/src/main/java/org/everit/json/schema/loader/SchemaExtractor.java index f721c7dfa..ef5891871 100644 --- a/core/src/main/java/org/everit/json/schema/loader/SchemaExtractor.java +++ b/core/src/main/java/org/everit/json/schema/loader/SchemaExtractor.java @@ -67,14 +67,14 @@ class ExtractionResult { final Set consumedKeys; - final Collection> extractedSchemas; + final Collection> extractedSchemas; - ExtractionResult(Set consumedKeys, Collection> extractedSchemas) { + ExtractionResult(Set consumedKeys, Collection> extractedSchemas) { this.consumedKeys = requireNonNull(consumedKeys, "consumedKeys cannot be null"); this.extractedSchemas = requireNonNull(extractedSchemas, "extractedSchemas cannot be null"); } - ExtractionResult(String consumedKeys, Collection> extactedSchemas) { + ExtractionResult(String consumedKeys, Collection> extactedSchemas) { this(singleton(consumedKeys), extactedSchemas); } @@ -165,7 +165,7 @@ StringSchema.Builder buildStringSchema() { return new StringSchemaLoader(schemaJson.ls, config().formatValidators).load(); } - abstract List> extract(); + abstract List> extract(); } class EnumSchemaExtractor extends AbstractSchemaExtractor { @@ -174,7 +174,7 @@ class EnumSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { + @Override List> extract() { if (!containsKey("enum")) { return emptyList(); } @@ -193,7 +193,7 @@ class ReferenceSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { + @Override List> extract() { if (containsKey("$ref")) { String ref = require("$ref").requireString(); return singletonList(new ReferenceLookup(schemaJson.ls).lookup(ref, schemaJson)); @@ -210,8 +210,8 @@ class PropertySnifferSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { - List> builders = new ArrayList<>(1); + @Override List> extract() { + List> builders = new ArrayList<>(1); if (schemaHasAnyOf(config().specVersion.arrayKeywords())) { builders.add(buildArraySchema().requiresArray(false)); } @@ -246,7 +246,7 @@ class TypeBasedSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { + @Override List> extract() { if (containsKey("type")) { return singletonList(require("type").canBeMappedTo(JsonArray.class, arr -> (Schema.Builder) buildAnyOfSchemaForMultipleTypes()) .orMappedTo(String.class, this::loadForExplicitType) @@ -265,7 +265,7 @@ private CombinedSchema.Builder buildAnyOfSchemaForMultipleTypes() { return CombinedSchema.anyOf(subschemas); } - private Schema.Builder loadForExplicitType(String typeString) { + private Schema.Builder loadForExplicitType(String typeString) { switch (typeString) { case "string": return buildStringSchema().requiresString(true); @@ -294,7 +294,7 @@ class NotSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { + @Override List> extract() { if (containsKey("not")) { Schema mustNotMatch = defaultLoader.loadChild(require("not")).build(); return singletonList(NotSchema.builder().mustNotMatch(mustNotMatch)); @@ -309,7 +309,7 @@ class ConstSchemaExtractor extends AbstractSchemaExtractor { super(defaultLoader); } - @Override List> extract() { + @Override List> extract() { if (config().specVersion != DRAFT_4 && containsKey("const")) { return singletonList(ConstSchema.builder().permittedValue(require("const").unwrap())); } else { diff --git a/core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java b/core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java index 17090aa78..e2209b371 100644 --- a/core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java +++ b/core/src/main/java/org/everit/json/schema/loader/SchemaLoader.java @@ -386,7 +386,7 @@ private Schema.Builder loadSchemaBoolean(Boolean rawBoolean) { private Schema.Builder loadSchemaObject(JsonObject o) { AdjacentSchemaExtractionState postExtractionState = runSchemaExtractors(o); - Collection> extractedSchemas = postExtractionState.extractedSchemaBuilders(); + Collection> extractedSchemas = postExtractionState.extractedSchemaBuilders(); Schema.Builder effectiveReturnedSchema; if (extractedSchemas.isEmpty()) { effectiveReturnedSchema = EmptySchema.builder(); @@ -455,14 +455,14 @@ private AdjacentSchemaExtractionState loadCommonSchemaProperties(Schema.Builder * {@link Schema.Builder#build()} can be immediately used to acquire the {@link Schema} * instance to be used for validation */ - public Schema.Builder load() { + public Schema.Builder load() { return ls.schemaJson .canBeMappedTo(Boolean.class, this::loadSchemaBoolean) .orMappedTo(JsonObject.class, this::loadSchemaObject) .requireAny(); } - Schema.Builder loadChild(JsonValue childJson) { + Schema.Builder loadChild(JsonValue childJson) { return new SchemaLoader(childJson.ls).load(); } diff --git a/core/src/test/java/org/everit/json/schema/NumberSchemaTest.java b/core/src/test/java/org/everit/json/schema/NumberSchemaTest.java index ec51dfd5b..4938c1095 100644 --- a/core/src/test/java/org/everit/json/schema/NumberSchemaTest.java +++ b/core/src/test/java/org/everit/json/schema/NumberSchemaTest.java @@ -290,7 +290,7 @@ public void requiresInteger_nullable() { @Test public void requiresInteger_nonNullable() { - Schema.Builder subject = NumberSchema.builder().requiresInteger(true).nullable(false); + Schema.Builder subject = NumberSchema.builder().requiresInteger(true).nullable(false); TestSupport.failureOf(subject) .input(JSONObject.NULL) .expect(); diff --git a/core/src/test/java/org/everit/json/schema/SchemaBuilderFluencyTest.java b/core/src/test/java/org/everit/json/schema/SchemaBuilderFluencyTest.java new file mode 100644 index 000000000..37bd0f045 --- /dev/null +++ b/core/src/test/java/org/everit/json/schema/SchemaBuilderFluencyTest.java @@ -0,0 +1,70 @@ +package org.everit.json.schema; + +import org.junit.jupiter.api.Test; + +/** + * These tests are actually compile-time validation that the superclass `Schema.Builder` returns the subclassed builder + * so that additional method chaining is possible. Tests are executed via `ObjectSchema.Builder` for no specific reason. + */ +public class SchemaBuilderFluencyTest +{ + @Test + public void title__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().title(null); + } + + @Test + public void description__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().description(null); + } + + @Test + public void id__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().id(null); + } + + @Test + public void schemaLocation__when_called_from_subclass_with_String__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().schemaLocation("https://example.com/schema"); + } + + @Test + public void schemaLocation__when_called_from_subclass_with_SchemaLocation__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().schemaLocation((SchemaLocation.empty())); + } + + @Test + public void defaultValue__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().defaultValue(null); + } + + @Test + public void nullable__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().nullable(null); + } + + @Test + public void readOnly__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().readOnly(null); + } + + @Test + public void writeOnly__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().writeOnly(null); + } + + @Test + public void unprocessedProperties__when_called_from_subclass__returns_subclass_instance() + { + final ObjectSchema.Builder builder = ObjectSchema.builder().unprocessedProperties(null); + } +} diff --git a/core/src/test/java/org/everit/json/schema/TestSupport.java b/core/src/test/java/org/everit/json/schema/TestSupport.java index 96944b2a7..8bcdecd3c 100644 --- a/core/src/test/java/org/everit/json/schema/TestSupport.java +++ b/core/src/test/java/org/everit/json/schema/TestSupport.java @@ -105,11 +105,11 @@ public static Failure failureOf(Schema subject) { return new Failure().subject(subject); } - public static Failure failureOf(Schema.Builder subjectBuilder) { + public static Failure failureOf(Schema.Builder subjectBuilder) { return failureOf(buildWithLocation(subjectBuilder)); } - public static S buildWithLocation(Schema.Builder builder) { + public static S buildWithLocation(Schema.Builder builder) { return builder.schemaLocation("#").build(); } diff --git a/core/src/test/java/org/everit/json/schema/ToStringTest.java b/core/src/test/java/org/everit/json/schema/ToStringTest.java index 12f9d6406..57b61d74e 100644 --- a/core/src/test/java/org/everit/json/schema/ToStringTest.java +++ b/core/src/test/java/org/everit/json/schema/ToStringTest.java @@ -18,7 +18,13 @@ public class ToStringTest { static class CustomSchema extends Schema { - static class CustomSchemaBuilder extends Schema.Builder { + static class Builder extends Schema.Builder { + + @Override + protected Builder getBuilder() + { + return this; + } @Override public CustomSchema build() { return new CustomSchema(this); @@ -31,7 +37,7 @@ static class CustomSchemaBuilder extends Schema.Builder { * @param builder * the builder containing the optional title, description and id attributes of the schema */ - protected CustomSchema(Builder builder) { + protected CustomSchema(Schema.Builder builder) { super(builder); } @@ -49,7 +55,7 @@ protected CustomSchema(Builder builder) { @Test public void testCustomSchemaWithDescribePropertiesTo() { - String actual = new CustomSchema(new CustomSchema.CustomSchemaBuilder().description("descr-custom")).toString(); + String actual = new CustomSchema(new CustomSchema.Builder().description("descr-custom")).toString(); assertThat(new JSONObject(actual), sameJsonAs(LOADER.readObj("custom-schema.json"))); } diff --git a/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java b/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java index 338b6781f..ea5b4c7dc 100644 --- a/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java +++ b/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java @@ -43,7 +43,7 @@ private ReferenceSchema obtainReferenceSchema(String pointerToRef) { JsonObject jsonValue = query(pointerToRef).requireObject(); ReferenceLookup subject = new ReferenceLookup(jsonValue.ls); String refPointer = jsonValue.require("$ref").requireString(); - Schema.Builder actual = subject.lookup(refPointer, jsonValue); + Schema.Builder actual = subject.lookup(refPointer, jsonValue); return (ReferenceSchema) actual.build(); } From edee5cef084655fc8cf49fb9f6ec02661635963c Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Tue, 17 Nov 2020 10:02:32 -0500 Subject: [PATCH 2/4] rename ConstSchema.ConstSchemaBuilder to Builder for consistency --- .../org/everit/json/schema/ConstSchema.java | 19 +++++++++++++------ .../AdjacentSchemaExtractionStateTest.java | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/ConstSchema.java b/core/src/main/java/org/everit/json/schema/ConstSchema.java index c2172139b..7a5c165d8 100644 --- a/core/src/main/java/org/everit/json/schema/ConstSchema.java +++ b/core/src/main/java/org/everit/json/schema/ConstSchema.java @@ -4,17 +4,24 @@ public class ConstSchema extends Schema { - public static class ConstSchemaBuilder extends Schema.Builder { + /** + * @deprecated This class has been renamed to "Builder". + */ + @Deprecated + public static class ConstSchemaBuilder extends Builder { + } + + public static class Builder extends Schema.Builder { private Object permittedValue; - public ConstSchemaBuilder permittedValue(Object permittedValue) { + public Builder permittedValue(Object permittedValue) { this.permittedValue = permittedValue; return this; } @Override - protected ConstSchemaBuilder getBuilder() + protected Builder getBuilder() { return this; } @@ -24,13 +31,13 @@ protected ConstSchemaBuilder getBuilder() } } - public static ConstSchemaBuilder builder() { - return new ConstSchemaBuilder(); + public static Builder builder() { + return new Builder(); } private final Object permittedValue; - protected ConstSchema(ConstSchemaBuilder builder) { + protected ConstSchema(Builder builder) { super(builder); this.permittedValue = toJavaValue(builder.permittedValue); } diff --git a/core/src/test/java/org/everit/json/schema/loader/AdjacentSchemaExtractionStateTest.java b/core/src/test/java/org/everit/json/schema/loader/AdjacentSchemaExtractionStateTest.java index 188f6a908..8e998ec9a 100644 --- a/core/src/test/java/org/everit/json/schema/loader/AdjacentSchemaExtractionStateTest.java +++ b/core/src/test/java/org/everit/json/schema/loader/AdjacentSchemaExtractionStateTest.java @@ -18,7 +18,7 @@ public void testReduce() { .put("minimum", 1) .build() ).requireObject()); - ConstSchema.ConstSchemaBuilder schemaBuilder = ConstSchema.builder().permittedValue("2"); + ConstSchema.Builder schemaBuilder = ConstSchema.builder().permittedValue("2"); AdjacentSchemaExtractionState actual = original.reduce(new ExtractionResult("const", asList(schemaBuilder))); From 3063125d0baf16dcdcb9ca640525d603dd33b4a0 Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Tue, 17 Nov 2020 10:32:02 -0500 Subject: [PATCH 3/4] add japicmp config --- core/pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index b3efc81ab..1ea7490c6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -166,6 +166,24 @@ true true + + METHOD_RETURN_TYPE_CHANGED + true + true + MAJOR + + + CONSTRUCTOR_REMOVED + true + true + MAJOR + + + METHOD_ABSTRACT_ADDED_TO_CLASS + true + true + MAJOR + From 490a18b335077a36e2b0d3c6659c70b9771785ed Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Tue, 17 Nov 2020 10:42:26 -0500 Subject: [PATCH 4/4] add missed japicmp config --- core/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/pom.xml b/core/pom.xml index 1ea7490c6..1e1a3cfb8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -166,6 +166,12 @@ true true + + METHOD_REMOVED + true + true + MAJOR + METHOD_RETURN_TYPE_CHANGED true