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 3f13851c..cc78d259 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 final Regexp toRegexp(String pattern) { private boolean requiresObject = true; + private final Map definitionSchemas = new HashMap<>(); + private final Map propertySchemas = new HashMap<>(); private boolean additionalProperties = true; @@ -64,6 +66,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. * @@ -170,6 +188,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; @@ -202,8 +222,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) { @@ -248,6 +270,10 @@ public Map> getPropertyDependencies() { return propertyDependencies; } + public Map getDefinitionSchemas() { + return definitionSchemas; + } + public Map getPropertySchemas() { return propertySchemas; } @@ -344,6 +370,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) && @@ -362,7 +389,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 a66d69be..262b4c15 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 baef5333..1a853593 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());