From 603fd2e75e78c6bb601a75e502fd356c3d0aba71 Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Wed, 6 Jan 2021 20:15:49 -0500 Subject: [PATCH] add (crude) definition schema functionality --- .../org/everit/json/schema/ObjectSchema.java | 31 +++++++++++++++++-- .../everit/json/schema/ToStringVisitor.java | 7 +++++ .../java/org/everit/json/schema/Visitor.java | 10 ++++++ 3 files changed, 46 insertions(+), 2 deletions(-) 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 0aa340f06..b1be0268b 100644 --- a/core/src/main/java/org/everit/json/schema/ObjectSchema.java +++ b/core/src/main/java/org/everit/json/schema/ObjectSchema.java @@ -39,6 +39,8 @@ private static Regexp toRegexp(String pattern) { private boolean requiresObject = true; + private final Map definitionSchemas = new HashMap<>(); + private final Map propertySchemas = new HashMap<>(); private boolean additionalProperties = true; @@ -70,6 +72,22 @@ public Builder additionalProperties(boolean additionalProperties) { return this; } + /** + * Adds a definition schema. + * + * @param definitionName + * the name of the definition + * @param schema + * the definition of the {@code schema} + * @return {@code this} + */ + public Builder addDefinitionSchema(String definitionName, Schema schema) { + requireNonNull(definitionName, "definitionName cannot be null"); + requireNonNull(schema, "schema cannot be null"); + definitionSchemas.put(definitionName, schema); + return this; + } + /** * Adds a property schema. * @@ -175,6 +193,8 @@ private static Map copyMap(Map original) { return Collections.unmodifiableMap(new HashMap<>(original)); } + private final Map definitionSchemas; + private final Map propertySchemas; private final boolean additionalProperties; @@ -207,8 +227,10 @@ private static Map copyMap(Map original) { */ public ObjectSchema(Builder builder) { super(builder); + this.definitionSchemas = builder.definitionSchemas == null ? null + : Collections.unmodifiableMap(builder.definitionSchemas); this.propertySchemas = builder.propertySchemas == null ? null - : Collections.unmodifiableMap(builder.propertySchemas); + : Collections.unmodifiableMap(builder.propertySchemas); this.additionalProperties = builder.additionalProperties; this.schemaOfAdditionalProperties = builder.schemaOfAdditionalProperties; if (!additionalProperties && schemaOfAdditionalProperties != null) { @@ -253,6 +275,10 @@ public Map> getPropertyDependencies() { return propertyDependencies; } + public Map getDefinitionSchemas() { + return definitionSchemas; + } + public Map getPropertySchemas() { return propertySchemas; } @@ -349,6 +375,7 @@ public boolean equals(Object o) { return that.canEqual(this) && additionalProperties == that.additionalProperties && requiresObject == that.requiresObject && + Objects.equals(definitionSchemas, that.definitionSchemas) && Objects.equals(propertySchemas, that.propertySchemas) && Objects.equals(schemaOfAdditionalProperties, that.schemaOfAdditionalProperties) && Objects.equals(requiredProperties, that.requiredProperties) && @@ -367,7 +394,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(super.hashCode(), propertySchemas, propertyNameSchema, additionalProperties, + return Objects.hash(super.hashCode(), definitionSchemas, propertySchemas, propertyNameSchema, additionalProperties, schemaOfAdditionalProperties, requiredProperties, minProperties, maxProperties, propertyDependencies, schemaDependencies, requiresObject, patternProperties, oneOrMoreDefaultProperty); } diff --git a/core/src/main/java/org/everit/json/schema/ToStringVisitor.java b/core/src/main/java/org/everit/json/schema/ToStringVisitor.java index a66d69bed..262b4c15b 100644 --- a/core/src/main/java/org/everit/json/schema/ToStringVisitor.java +++ b/core/src/main/java/org/everit/json/schema/ToStringVisitor.java @@ -227,6 +227,13 @@ private void describePropertyDependencies(Map> propertyDepen visit(propertyNameSchema); } + @Override void visitDefinitionSchemas(Map definitionSchemas) { + if (!definitionSchemas.isEmpty()) { + writer.key("definitions"); + printSchemaMap(definitionSchemas); + } + } + @Override void visitPropertySchemas(Map propertySchemas) { if (!propertySchemas.isEmpty()) { writer.key("properties"); diff --git a/core/src/main/java/org/everit/json/schema/Visitor.java b/core/src/main/java/org/everit/json/schema/Visitor.java index baef5333e..1a8535934 100644 --- a/core/src/main/java/org/everit/json/schema/Visitor.java +++ b/core/src/main/java/org/everit/json/schema/Visitor.java @@ -159,6 +159,10 @@ void visitObjectSchema(ObjectSchema objectSchema) { for (Map.Entry schemaDep : objectSchema.getSchemaDependencies().entrySet()) { visitSchemaDependency(schemaDep.getKey(), schemaDep.getValue()); } + Map definitionSchemas = objectSchema.getDefinitionSchemas(); + if (definitionSchemas != null) { + visitDefinitionSchemas(definitionSchemas); + } Map propertySchemas = objectSchema.getPropertySchemas(); if (propertySchemas != null) { visitPropertySchemas(propertySchemas); @@ -177,6 +181,12 @@ void visitPatternProperties(Map patternProperties) { } } + void visitDefinitionSchemas(Map definitionSchemas) { + for (Map.Entry entry : definitionSchemas.entrySet()) { + visitPropertySchema(entry.getKey(), entry.getValue()); + } + } + void visitPropertySchemas(Map propertySchemas) { for (Map.Entry entry : propertySchemas.entrySet()) { visitPropertySchema(entry.getKey(), entry.getValue());