Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.apache.juneau.dto.jsonschema.JsonSchema Maven / Gradle / Ivy
// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
// * with the License. You may obtain a copy of the License at *
// * *
// * http://www.apache.org/licenses/LICENSE-2.0 *
// * *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
package org.apache.juneau.dto.jsonschema;
import static org.apache.juneau.common.internal.StringUtils.*;
import static org.apache.juneau.internal.ClassUtils.*;
import static org.apache.juneau.internal.CollectionUtils.*;
import java.net.*;
import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.json.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.swap.*;
/**
* Represents a top-level schema object bean in the JSON-Schema core specification.
*/
@Bean(typeName="schema",
properties="id,$schema,$ref, title,description,type,definitions,properties,"
+ "patternProperties,dependencies,items,multipleOf,maximum,exclusiveMaximum,"
+ "minimum,exclusiveMinimum,maxLength,minLength,pattern,additionalItems,"
+ "maxItems,minItems,uniqueItems,maxProperties,minProperties,required,"
+ "additionalProperties,enum,allOf,anyOf,oneOf,not"
)
public class JsonSchema {
private String name; // Property name. Not serialized.
private URI id;
private URI schemaVersion;
private String title;
private String description;
private JsonType typeJsonType; // JsonType representation of type
private JsonTypeArray typeJsonTypeArray; // JsonTypeArray representation of type
private Map definitions;
private Map properties;
private Map patternProperties;
private Map dependencies;
private JsonSchema itemsSchema; // JsonSchema representation of items
private JsonSchemaArray itemsSchemaArray; // JsonSchemaArray representation of items
private Number multipleOf;
private Number maximum;
private Boolean exclusiveMaximum;
private Number minimum;
private Boolean exclusiveMinimum;
private Integer maxLength;
private Integer minLength;
private String pattern;
private Boolean additionalItemsBoolean; // Boolean representation of additionalItems
private JsonSchemaArray additionalItemsSchemaArray; // JsonSchemaArray representation of additionalItems
private Integer maxItems;
private Integer minItems;
private Boolean uniqueItems;
private Integer maxProperties;
private Integer minProperties;
private List required;
private Boolean additionalPropertiesBoolean; // Boolean representation of additionalProperties
private JsonSchema additionalPropertiesSchema; // JsonSchema representation of additionalProperties
private List _enum;
private List allOf;
private List anyOf;
private List oneOf;
private JsonSchema not;
private URI ref;
private JsonSchemaMap schemaMap;
private JsonSchema master = this;
/**
* Default constructor.
*/
public JsonSchema() {}
//-----------------------------------------------------------------------------------------------------------------
// Bean properties
//-----------------------------------------------------------------------------------------------------------------
/**
* Bean property getter: name .
*
* @return The value of the name property on this bean, or null if it is not set.
*/
public String getName() {
return name;
}
/**
* Bean property setter: name .
*
* @param name The new value for the name property on this bean.
* @return This object.
*/
public JsonSchema setName(String name) {
this.name = name;
return this;
}
/**
* Bean property getter: id .
*
* @return The value of the id property on this bean, or null if it is not set.
*/
public URI getId() {
return id;
}
/**
* Bean property setter: id .
*
*
* The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
* Strings must be valid URIs.
*
*
* URIs defined by {@link UriResolver} can be used for values.
*
* @param id The new value for the id property on this bean.
* @return This object.
*/
public JsonSchema setId(Object id) {
this.id = toURI(id);
return this;
}
/**
* Bean property getter: $schema .
*
* @return The value of the $schema property on this bean, or null if it is not set.
*/
@Beanp("$schema")
public URI getSchemaVersionUri() {
return schemaVersion;
}
/**
* Bean property setter: $schema .
*
*
* The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
* Strings must be valid URIs.
*
*
* URIs defined by {@link UriResolver} can be used for values.
*
* @param schemaVersion The new value for the schemaVersion property on this bean.
* @return This object.
*/
@Beanp("$schema")
public JsonSchema setSchemaVersionUri(Object schemaVersion) {
this.schemaVersion = toURI(schemaVersion);
return this;
}
/**
* Bean property getter: title .
*
* @return The value of the title property, or null if it is not set.
*/
public String getTitle() {
return title;
}
/**
* Bean property setter: title .
*
* @param title The new value for the title property on this bean.
* @return This object.
*/
public JsonSchema setTitle(String title) {
this.title = title;
return this;
}
/**
* Bean property getter: description .
*
* @return The value of the description property, or null if it is not set.
*/
public String getDescription() {
return description;
}
/**
* Bean property setter: description .
*
* @param description The new value for the description property on this bean.
* @return This object.
*/
public JsonSchema setDescription(String description) {
this.description = description;
return this;
}
/**
* Bean property getter: type .
*
* @return
* The value of the type property on this bean, or null if it is not set.
* Can be either a {@link JsonType} or {@link JsonTypeArray} depending on what value was used to set it.
*/
@Swap(JsonTypeOrJsonTypeArraySwap.class)
public Object getType() {
if (typeJsonType != null)
return typeJsonType;
return typeJsonTypeArray;
}
/**
* Bean property getter: type .
*
*
* Convenience method for returning the type property when it is a {@link JsonType} value.
*
* @return
* The currently set value, or null if the property is not set, or is set as a {@link JsonTypeArray}.
*/
public JsonType getTypeAsJsonType() {
return typeJsonType;
}
/**
* Bean property getter: type .
*
*
* Convenience method for returning the type property when it is a {@link JsonTypeArray} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link JsonType}.
*/
public JsonTypeArray getTypeAsJsonTypeArray() {
return typeJsonTypeArray;
}
/**
* Bean property setter: type .
*
* @param type
* The new value for the type property on this bean.
* This object must be of type {@link JsonType} or {@link JsonTypeArray}.
* @return This object.
* @throws BeanRuntimeException If invalid object type passed in.
*/
public JsonSchema setType(Object type) {
this.typeJsonType = null;
this.typeJsonTypeArray = null;
if (type != null) {
if (type instanceof JsonType)
this.typeJsonType = (JsonType)type;
else if (type instanceof JsonTypeArray)
this.typeJsonTypeArray = (JsonTypeArray)type;
else
throw new BeanRuntimeException(JsonSchemaProperty.class, "Invalid attribute type ''{0}'' passed in. Must be one of the following: SimpleType, SimpleTypeArray", className(type));
}
return this;
}
/**
* Bean property appender: type .
*
* @param types The list of items to append to the type property on this bean.
* @return This object.
*/
public JsonSchema addTypes(JsonType...types) {
if (this.typeJsonTypeArray == null)
this.typeJsonTypeArray = new JsonTypeArray();
this.typeJsonTypeArray.addAll(types);
return this;
}
/**
* Used during parsing to convert the type property to the correct class type.
*
*
*
* If parsing a JSON-array, converts to a {@link JsonTypeArray}.
*
* If parsing a JSON-object, converts to a {@link JsonType}.
*
*
*
* Serialization method is a no-op.
*/
public static class JsonTypeOrJsonTypeArraySwap extends ObjectSwap {
@Override /* ObjectSwap */
public Object swap(BeanSession session, Object o) throws SerializeException {
return o;
}
@Override /* ObjectSwap */
public Object unswap(BeanSession session, Object o, ClassMeta> hint) throws ParseException {
ClassMeta> cm = (
o instanceof Collection
? session.getClassMeta(JsonTypeArray.class)
: session.getClassMeta(JsonType.class)
);
return session.convertToType(o, cm);
}
}
/**
* Bean property getter: definitions .
*
* @return
* The value of the definitions property on this bean, or null if it is not set.
*/
public Map getDefinitions() {
return definitions;
}
/**
* Bean property setter: definitions .
*
* @param definitions The new value for the definitions property on this bean.
* @return This object.
*/
public JsonSchema setDefinitions(Map definitions) {
this.definitions = definitions;
if (definitions != null)
setMasterOn(definitions.values());
return this;
}
/**
* Bean property appender: definitions .
*
* @param name The key in the definitions map entry.
* @param definition The value in the definitions map entry.
* @return This object.
*/
public JsonSchema addDefinition(String name, JsonSchema definition) {
if (this.definitions == null)
this.definitions = map();
this.definitions.put(name, definition);
setMasterOn(definition);
return this;
}
/**
* Bean property getter: properties .
*
* @return The value of the properties property on this bean, or null if it is not set.
*/
public Map getProperties() {
return properties;
}
/**
* Returns the property with the specified name.
*
*
* This is equivalent to calling getProperty(name, false ) .
*
* @param name The property name.
* @return The property with the specified name, or null if no property is specified.
*/
public JsonSchema getProperty(String name) {
return getProperty(name, false);
}
/**
* Returns the property with the specified name.
*
*
* If resolve is true , the property object will automatically be resolved by calling
* {@link #resolve()}.
* Therefore, getProperty(name, true ) is equivalent to calling
* getProperty(name).resolve() , except it's safe from a potential
* NullPointerException .
*
* @param name The property name.
* @param resolve If true , calls {@link #resolve()} on object before returning.
* @return The property with the specified name, or null if no property is specified.
*/
public JsonSchema getProperty(String name, boolean resolve) {
if (properties == null)
return null;
JsonSchema s = properties.get(name);
if (s == null)
return null;
if (resolve)
s = s.resolve();
return s;
}
/**
* Bean property setter: properties .
*
* @param properties The new value for the properties property on this bean.
* @return This object.
*/
public JsonSchema setProperties(Map properties) {
this.properties = properties;
if (properties != null) {
properties.entrySet().forEach(x -> {
JsonSchema value = x.getValue();
setMasterOn(value);
value.setName(x.getKey());
});
}
return this;
}
/**
* Bean property appender: properties .
*
*
* Properties must have their name property set on them when using this method.
*
* @param properties The list of items to append to the properties property on this bean.
* @return This object.
* @throws BeanRuntimeException If property is found without a set name property.
*/
public JsonSchema addProperties(JsonSchema...properties) {
if (this.properties == null)
this.properties = map();
for (JsonSchema p : properties) {
if (p.getName() == null)
throw new BeanRuntimeException(JsonSchema.class,
"Invalid property passed to JsonSchema.addProperties(). Property name was null.");
setMasterOn(p);
this.properties.put(p.getName(), p);
}
return this;
}
/**
* Bean property getter: patternProperties .
*
* @return
* The value of the patternProperties property on this bean, or null if it is
* not set.
*/
public Map getPatternProperties() {
return patternProperties;
}
/**
* Bean property setter: patternProperties .
*
* @param patternProperties The new value for the patternProperties property on this bean.
* @return This object.
*/
public JsonSchema setPatternProperties(Map patternProperties) {
this.patternProperties = patternProperties;
if (patternProperties != null) {
patternProperties.entrySet().forEach(x -> {
JsonSchema s = x.getValue();
setMasterOn(s);
s.setName(x.getKey());
});
}
return this;
}
/**
* Bean property appender: patternProperties .
*
*
* Properties must have their name property set to the pattern string when using this method.
*
* @param properties The list of items to append to the patternProperties property on this bean.
* @return This object.
* @throws BeanRuntimeException If property is found without a set name property.
*/
public JsonSchema addPatternProperties(JsonSchemaProperty...properties) {
if (this.patternProperties == null)
this.patternProperties = map();
for (JsonSchema p : properties) {
if (p.getName() == null)
throw new BeanRuntimeException(JsonSchema.class,
"Invalid property passed to JsonSchema.addProperties(). Property name was null.");
setMasterOn(p);
this.patternProperties.put(p.getName(), p);
}
return this;
}
/**
* Bean property getter: dependencies .
*
* @return
* The value of the dependencies property on this bean, or null if it is not set.
*/
public Map getDependencies() {
return dependencies;
}
/**
* Bean property setter: dependencies .
*
* @param dependencies The new value for the dependencies property on this bean.
* @return This object.
*/
public JsonSchema setDependencies(Map dependencies) {
this.dependencies = dependencies;
if (dependencies != null)
setMasterOn(dependencies.values());
return this;
}
/**
* Bean property appender: dependencies .
*
* @param name The key of the entry in the dependencies map.
* @param dependency The value of the entry in the dependencies map.
* @return This object.
*/
public JsonSchema addDependency(String name, JsonSchema dependency) {
if (this.dependencies == null)
this.dependencies = map();
this.dependencies.put(name, dependency);
setMasterOn(dependency);
return this;
}
/**
* Bean property getter: items .
*
* @return
* The value of the items property on this bean, or null if it is not set.
* Can be either a {@link JsonSchema} or {@link JsonSchemaArray} depending on what value was used to set it.
*/
@Swap(JsonSchemaOrSchemaArraySwap.class)
public Object getItems() {
if (itemsSchema != null)
return itemsSchema;
return itemsSchemaArray;
}
/**
* Bean property getter: items .
*
*
* Convenience method for returning the items property when it is a {@link JsonSchema} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link JsonSchemaArray}.
*/
public JsonSchema getItemsAsSchema() {
return itemsSchema;
}
/**
* Bean property getter: items .
*
*
* Convenience method for returning the items property when it is a {@link JsonSchemaArray} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link JsonSchema}.
*/
public JsonSchemaArray getItemsAsSchemaArray() {
return itemsSchemaArray;
}
/**
* Used during parsing to convert the items property to the correct class type.
*
*
*
* If parsing a JSON-array, converts to a {@link JsonSchemaArray}.
*
* If parsing a JSON-object, converts to a {@link JsonSchema}.
*
*
*
* Serialization method is a no-op.
*/
public static class JsonSchemaOrSchemaArraySwap extends ObjectSwap {
@Override /* ObjectSwap */
public Object swap(BeanSession session, Object o) throws SerializeException {
return o;
}
@Override /* ObjectSwap */
public Object unswap(BeanSession session, Object o, ClassMeta> hint) throws ParseException {
ClassMeta> cm = (
o instanceof Collection
? session.getClassMeta(JsonSchemaArray.class)
: session.getClassMeta(JsonSchema.class)
);
return session.convertToType(o, cm);
}
}
/**
* Bean property setter: items .
*
* @param
* items The new value for the items property on this bean.
* This object must be of type {@link JsonSchema} or {@link JsonSchemaArray}.
* @return This object.
* @throws BeanRuntimeException If invalid object type passed in.
*/
public JsonSchema setItems(Object items) {
this.itemsSchema = null;
this.itemsSchemaArray = null;
if (items != null) {
if (items instanceof JsonSchema) {
this.itemsSchema = (JsonSchema)items;
setMasterOn(this.itemsSchema);
} else if (items instanceof JsonSchemaArray) {
this.itemsSchemaArray = (JsonSchemaArray)items;
setMasterOn(this.itemsSchemaArray);
} else {
throw new BeanRuntimeException(JsonSchemaProperty.class, "Invalid attribute type ''{0}'' passed in. Must be one of the following: JsonSchema, JsonSchemaArray", className(items));
}
}
return this;
}
/**
* Bean property appender: items .
*
* @param items The list of items to append to the items property on this bean.
* @return This object.
*/
public JsonSchema addItems(JsonSchema...items) {
if (this.itemsSchemaArray == null)
this.itemsSchemaArray = new JsonSchemaArray();
this.itemsSchemaArray.addAll(items);
setMasterOn(items);
return this;
}
/**
* Bean property getter: multipleOf .
*
* @return The value of the multipleOf property on this bean, or null if it is not set.
*/
public Number getMultipleOf() {
return multipleOf;
}
/**
* Bean property setter: multipleOf .
*
* @param multipleOf The new value for the multipleOf property on this bean.
* @return This object.
*/
public JsonSchema setMultipleOf(Number multipleOf) {
this.multipleOf = multipleOf;
return this;
}
/**
* Bean property getter: maximum .
*
* @return The value of the maximum property on this bean, or null if it is not set.
*/
public Number getMaximum() {
return maximum;
}
/**
* Bean property setter: maximum .
*
* @param maximum The new value for the maximum property on this bean.
* @return This object.
*/
public JsonSchema setMaximum(Number maximum) {
this.maximum = maximum;
return this;
}
/**
* Bean property getter: exclusiveMaximum .
*
* @return
* The value of the exclusiveMaximum property on this bean, or null if it is
* not set.
*/
public Boolean isExclusiveMaximum() {
return exclusiveMaximum;
}
/**
* Bean property setter: exclusiveMaximum .
*
* @param exclusiveMaximum The new value for the exclusiveMaximum property on this bean.
* @return This object.
*/
public JsonSchema setExclusiveMaximum(Boolean exclusiveMaximum) {
this.exclusiveMaximum = exclusiveMaximum;
return this;
}
/**
* Bean property getter: minimum .
*
* @return The value of the minimum property on this bean, or null if it is not set.
*/
public Number getMinimum() {
return minimum;
}
/**
* Bean property setter: minimum .
*
* @param minimum The new value for the minimum property on this bean.
* @return This object.
*/
public JsonSchema setMinimum(Number minimum) {
this.minimum = minimum;
return this;
}
/**
* Bean property getter: exclusiveMinimum .
*
* @return
* The value of the exclusiveMinimum property on this bean, or null if it is
* not set.
*/
public Boolean isExclusiveMinimum() {
return exclusiveMinimum;
}
/**
* Bean property setter: exclusiveMinimum .
*
* @param exclusiveMinimum The new value for the exclusiveMinimum property on this bean.
* @return This object.
*/
public JsonSchema setExclusiveMinimum(Boolean exclusiveMinimum) {
this.exclusiveMinimum = exclusiveMinimum;
return this;
}
/**
* Bean property getter: maxLength .
*
* @return The value of the maxLength property on this bean, or null if it is not set.
*/
public Integer getMaxLength() {
return maxLength;
}
/**
* Bean property setter: maxLength .
*
* @param maxLength The new value for the maxLength property on this bean.
* @return This object.
*/
public JsonSchema setMaxLength(Integer maxLength) {
this.maxLength = maxLength;
return this;
}
/**
* Bean property getter: minLength .
*
* @return The value of the minLength property on this bean, or null if it is not set.
*/
public Integer getMinLength() {
return minLength;
}
/**
* Bean property setter: minLength .
*
* @param minLength The new value for the minLength property on this bean.
* @return This object.
*/
public JsonSchema setMinLength(Integer minLength) {
this.minLength = minLength;
return this;
}
/**
* Bean property getter: pattern .
*
* @return The value of the pattern property on this bean, or null if it is not set.
*/
public String getPattern() {
return pattern;
}
/**
* Bean property setter: pattern .
*
* @param pattern The new value for the pattern property on this bean.
* @return This object.
*/
public JsonSchema setPattern(String pattern) {
this.pattern = pattern;
return this;
}
/**
* Bean property getter: additionalItems .
*
* @return
* The value of the additionalItems property on this bean, or null if it is
* not set.
* Can be either a {@link Boolean} or {@link JsonSchemaArray} depending on what value was used to set it.
*/
@Swap(BooleanOrSchemaArraySwap.class)
public Object getAdditionalItems() {
if (additionalItemsBoolean != null)
return additionalItemsBoolean;
return additionalItemsSchemaArray;
}
/**
* Bean property getter: additionalItems .
*
*
* Convenience method for returning the additionalItems property when it is a {@link Boolean}
* value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link JsonSchemaArray}.
*/
public Boolean getAdditionalItemsAsBoolean() {
return additionalItemsBoolean;
}
/**
* Bean property getter: additionalItems .
*
*
* Convenience method for returning the additionalItems property when it is a
* {@link JsonSchemaArray} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link Boolean}.
*/
public List getAdditionalItemsAsSchemaArray() {
return additionalItemsSchemaArray;
}
/**
* Bean property setter: additionalItems .
*
* @param additionalItems
* The new value for the additionalItems property on this bean.
* This object must be of type {@link Boolean} or {@link JsonSchemaArray}.
* @return This object.
* @throws BeanRuntimeException If invalid object type passed in.
*/
public JsonSchema setAdditionalItems(Object additionalItems) {
this.additionalItemsBoolean = null;
this.additionalItemsSchemaArray = null;
if (additionalItems != null) {
if (additionalItems instanceof Boolean)
this.additionalItemsBoolean = (Boolean)additionalItems;
else if (additionalItems instanceof JsonSchemaArray) {
this.additionalItemsSchemaArray = (JsonSchemaArray)additionalItems;
setMasterOn(this.additionalItemsSchemaArray);
} else {
throw new BeanRuntimeException(JsonSchemaProperty.class, "Invalid attribute type ''{0}'' passed in. Must be one of the following: Boolean, JsonSchemaArray", className(additionalItems));
}
}
return this;
}
/**
* Bean property appender: additionalItems .
*
* @param additionalItems
* The list of items to append to the additionalItems property on this bean.
* @return This object.
*/
public JsonSchema addAdditionalItems(JsonSchema...additionalItems) {
if (this.additionalItemsSchemaArray == null)
this.additionalItemsSchemaArray = new JsonSchemaArray();
this.additionalItemsSchemaArray.addAll(additionalItems);
setMasterOn(additionalItems);
return this;
}
/**
* Used during parsing to convert the additionalItems property to the correct class type.
*
*
*
* If parsing a JSON-array, converts to a {@link JsonSchemaArray}.
*
* If parsing a JSON-boolean, converts to a {@link Boolean}.
*
*
*
* Serialization method is a no-op.
*/
public static class BooleanOrSchemaArraySwap extends ObjectSwap {
@Override /* ObjectSwap */
public Object swap(BeanSession session, Object o) throws SerializeException {
return o;
}
@Override /* ObjectSwap */
public Object unswap(BeanSession session, Object o, ClassMeta> hint) throws ParseException {
ClassMeta> cm = (
o instanceof Collection
? session.getClassMeta(JsonSchemaArray.class)
: session.getClassMeta(Boolean.class)
);
return session.convertToType(o, cm);
}
}
/**
* Bean property getter: maxItems .
*
* @return The value of the maxItems property on this bean, or null if it is not set.
*/
public Integer getMaxItems() {
return maxItems;
}
/**
* Bean property setter: maxItems .
*
* @param maxItems The new value for the maxItems property on this bean.
* @return This object.
*/
public JsonSchema setMaxItems(Integer maxItems) {
this.maxItems = maxItems;
return this;
}
/**
* Bean property getter: minItems .
*
* @return The value of the minItems property on this bean, or null if it is not set.
*/
public Integer getMinItems() {
return minItems;
}
/**
* Bean property setter: minItems .
*
* @param minItems The new value for the minItems property on this bean.
* @return This object.
*/
public JsonSchema setMinItems(Integer minItems) {
this.minItems = minItems;
return this;
}
/**
* Bean property getter: uniqueItems .
*
* @return
* The value of the uniqueItems property on this bean, or null if it is not set.
*/
public Boolean getUniqueItems() {
return uniqueItems;
}
/**
* Bean property setter: uniqueItems .
*
* @param uniqueItems The new value for the uniqueItems property on this bean.
* @return This object.
*/
public JsonSchema setUniqueItems(Boolean uniqueItems) {
this.uniqueItems = uniqueItems;
return this;
}
/**
* Bean property getter: maxProperties .
*
* @return
* The value of the maxProperties property on this bean, or null if it is not set.
*/
public Integer getMaxProperties() {
return maxProperties;
}
/**
* Bean property setter: maxProperties .
*
* @param maxProperties The new value for the maxProperties property on this bean.
* @return This object.
*/
public JsonSchema setMaxProperties(Integer maxProperties) {
this.maxProperties = maxProperties;
return this;
}
/**
* Bean property getter: minProperties .
*
* @return
* The value of the minProperties property on this bean, or null if it is not set.
*/
public Integer getMinProperties() {
return minProperties;
}
/**
* Bean property setter: minProperties .
*
* @param minProperties The new value for the minProperties property on this bean.
* @return This object.
*/
public JsonSchema setMinProperties(Integer minProperties) {
this.minProperties = minProperties;
return this;
}
/**
* Bean property getter: required .
*
* @return The value of the required property on this bean, or null if it is not set.
*/
public List getRequired() {
return required;
}
/**
* Bean property setter: required .
*
* @param required The new value for the required property on this bean.
* @return This object.
*/
public JsonSchema setRequired(List required) {
this.required = required;
return this;
}
/**
* Bean property appender: required .
*
* @param required The list of items to append to the required property on this bean.
* @return This object.
*/
public JsonSchema addRequired(List required) {
if (this.required == null)
this.required = new LinkedList<>();
required.forEach(x -> this.required.add(x));
return this;
}
/**
* Bean property appender: required .
*
* @param required The list of items to append to the required property on this bean.
* @return This object.
*/
public JsonSchema addRequired(String...required) {
if (this.required == null)
this.required = new LinkedList<>();
for (String r : required)
this.required.add(r);
return this;
}
/**
* Bean property appender: required .
*
* @param properties The list of items to append to the required property on this bean.
* @return This object.
*/
public JsonSchema addRequired(JsonSchemaProperty...properties) {
if (this.required == null)
this.required = new LinkedList<>();
for (JsonSchemaProperty p : properties)
this.required.add(p.getName());
return this;
}
/**
* Bean property getter: additionalProperties .
*
* @return
* The value of the additionalProperties property on this bean, or null if it
* is not set.
* Can be either a {@link Boolean} or {@link JsonSchemaArray} depending on what value was used to set it.
*/
@Swap(BooleanOrSchemaSwap.class)
public Object getAdditionalProperties() {
if (additionalPropertiesBoolean != null)
return additionalItemsBoolean;
return additionalPropertiesSchema;
}
/**
* Bean property getter: additionalProperties .
*
*
* Convenience method for returning the additionalProperties property when it is a
* {@link Boolean} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link JsonSchema}.
*/
public Boolean getAdditionalPropertiesAsBoolean() {
return additionalPropertiesBoolean;
}
/**
* Bean property getter: additionalProperties .
*
*
* Convenience method for returning the additionalProperties property when it is a
* {@link JsonSchema} value.
*
* @return The currently set value, or null if the property is not set, or is set as a {@link Boolean}.
*/
public JsonSchema getAdditionalPropertiesAsSchema() {
return additionalPropertiesSchema;
}
/**
* Bean property setter: additionalProperties .
*
* @param additionalProperties
* The new value for the additionalProperties property on this bean.
* This object must be of type {@link Boolean} or {@link JsonSchema}.
* @return This object.
* @throws BeanRuntimeException If invalid object type passed in.
*/
@Beanp(dictionary={JsonSchema.class})
public JsonSchema setAdditionalProperties(Object additionalProperties) {
this.additionalPropertiesBoolean = null;
this.additionalPropertiesSchema = null;
if (additionalProperties != null) {
if (additionalProperties instanceof Boolean)
this.additionalPropertiesBoolean = (Boolean)additionalProperties;
else if (additionalProperties instanceof JsonSchema) {
this.additionalPropertiesSchema = (JsonSchema)additionalProperties;
setMasterOn(this.additionalPropertiesSchema);
} else
throw new BeanRuntimeException(JsonSchemaProperty.class,
"Invalid attribute type ''{0}'' passed in. Must be one of the following: Boolean, JsonSchema",
className(additionalProperties));
}
return this;
}
/**
* Used during parsing to convert the additionalProperties property to the correct class type.
*
*
*
* If parsing a JSON-object, converts to a {@link JsonSchema}.
*
* If parsing a JSON-boolean, converts to a {@link Boolean}.
*
*
*
* Serialization method is a no-op.
*/
public static class BooleanOrSchemaSwap extends ObjectSwap {
@Override /* ObjectSwap */
public Object swap(BeanSession session, Object o) throws SerializeException {
return o;
}
@Override /* ObjectSwap */
public Object unswap(BeanSession session, Object o, ClassMeta> hint) throws ParseException {
ClassMeta> cm = (
o instanceof Boolean
? session.getClassMeta(Boolean.class)
: session.getClassMeta(JsonSchema.class)
);
return session.convertToType(o, cm);
}
}
/**
* Bean property getter: enum .
*
* @return The value of the enum property on this bean, or null if it is not set.
*/
public List getEnum() {
return _enum;
}
/**
* Bean property setter: enum .
*
* @param _enum The new value for the enum property on this bean.
* @return This object.
*/
public JsonSchema setEnum(List _enum) {
this._enum = _enum;
return this;
}
/**
* Bean property appender: enum .
*
* @param _enum The list of items to append to the enum property on this bean.
* @return This object.
*/
public JsonSchema addEnum(String..._enum) {
if (this._enum == null)
this._enum = new LinkedList<>();
for (String e : _enum)
this._enum.add(e);
return this;
}
/**
* Bean property getter: allOf .
*
* @return The value of the allOf property on this bean, or null if it is not set.
*/
public List getAllOf() {
return allOf;
}
/**
* Bean property setter: allOf .
*
* @param allOf The new value for the allOf property on this bean.
* @return This object.
*/
public JsonSchema setAllOf(List allOf) {
this.allOf = allOf;
setMasterOn(allOf);
return this;
}
/**
* Bean property appender: allOf .
*
* @param allOf The list of items to append to the allOf property on this bean.
* @return This object.
*/
public JsonSchema addAllOf(JsonSchema...allOf) {
setMasterOn(allOf);
this.allOf = addAll(this.allOf, allOf);
return this;
}
/**
* Bean property getter: anyOf .
*
* @return The value of the anyOf property on this bean, or null if it is not set.
*/
public List getAnyOf() {
return anyOf;
}
/**
* Bean property setter: anyOf .
*
* @param anyOf The new value of the anyOf property on this bean.
* @return This object.
*/
public JsonSchema setAnyOf(List anyOf) {
this.anyOf = anyOf;
setMasterOn(anyOf);
return this;
}
/**
* Bean property appender: anyOf .
*
* @param anyOf The list of items to append to the anyOf property on this bean.
* @return This object.
*/
public JsonSchema addAnyOf(JsonSchema...anyOf) {
if (this.anyOf == null)
this.anyOf = new LinkedList<>();
setMasterOn(anyOf);
for (JsonSchema s : anyOf)
this.anyOf.add(s);
return this;
}
/**
* Bean property getter: oneOf .
*
* @return The value of the oneOf property on this bean, or null if it is not set.
*/
public List getOneOf() {
return oneOf;
}
/**
* Bean property setter: oneOf .
*
* @param oneOf The new value for the oneOf property on this bean.
* @return This object.
*/
public JsonSchema setOneOf(List oneOf) {
this.oneOf = oneOf;
setMasterOn(oneOf);
return this;
}
/**
* Bean property appender: oneOf .
*
* @param oneOf The list of items to append to the oneOf property on this bean.
* @return This object.
*/
public JsonSchema addOneOf(JsonSchema...oneOf) {
if (this.oneOf == null)
this.oneOf = new LinkedList<>();
setMasterOn(oneOf);
for (JsonSchema s : oneOf)
this.oneOf.add(s);
return this;
}
/**
* Bean property getter: not .
*
* @return The value of the not property on this bean, or null if it is not set.
*/
public JsonSchema getNot() {
return not;
}
/**
* Bean property setter: not .
*
* @param not The new value for the not property on this bean.
* @return This object.
*/
public JsonSchema setNot(JsonSchema not) {
this.not = not;
setMasterOn(not);
return this;
}
/**
* Bean property getter: $ref .
*
* @return The value of the $ref property on this bean, or null if it is not set.
*/
@Beanp("$ref")
public URI getRef() {
return ref;
}
/**
* Bean property setter: $ref .
*
*
* The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
* Strings must be valid URIs.
*
*
* URIs defined by {@link UriResolver} can be used for values.
*
* @param ref The new value for the $ref property on this bean.
* @return This object.
*/
@Beanp("$ref")
public JsonSchema setRef(Object ref) {
this.ref = toURI(ref);
return this;
}
private void setMasterOn(JsonSchema s) {
if (s != null)
s.setMaster(this);
}
private void setMasterOn(JsonSchema[] ss) {
if (ss != null)
for (JsonSchema s : ss)
setMasterOn(s);
}
private void setMasterOn(Collection ss) {
if (ss != null)
ss.forEach(this::setMasterOn);
}
private void setMasterOn(JsonSchemaArray ss) {
if (ss != null)
ss.forEach(this::setMasterOn);
}
/**
* Sets the master schema for this schema and all child schema objects.
*
*
* All child elements in a schema should point to a single "master" schema in order to locate registered JsonSchemaMap
* objects for resolving external schemas.
*
* @param master The master schema to associate on this and all children. Can be null .
*/
protected void setMaster(JsonSchema master) {
this.master = master;
if (definitions != null)
definitions.values().forEach(x -> x.setMaster(master));
if (properties != null)
properties.values().forEach(x -> x.setMaster(master));
if (patternProperties != null)
patternProperties.values().forEach(x -> x.setMaster(master));
if (dependencies != null)
dependencies.values().forEach(x -> x.setMaster(master));
if (itemsSchema != null)
itemsSchema.setMaster(master);
if (itemsSchemaArray != null)
itemsSchemaArray.forEach(x -> x.setMaster(master));
if (additionalItemsSchemaArray != null)
additionalItemsSchemaArray.forEach(x -> x.setMaster(master));
if (additionalPropertiesSchema != null)
additionalPropertiesSchema.setMaster(master);
if (allOf != null)
allOf.forEach(x -> x.setMaster(master));
if (anyOf != null)
anyOf.forEach(x -> x.setMaster(master));
if (oneOf != null)
oneOf.forEach(x -> x.setMaster(master));
if (not != null)
not.setMaster(master);
}
/**
* Resolve schema if reference.
*
*
* If this schema is a reference to another schema (has its $ref property set), this
* method will retrieve the referenced schema from the schema map registered with this schema.
*
*
* If this schema is not a reference, or no schema map is registered with this schema, this method is a no-op and
* simply returns this object.
*
* @return The referenced schema, or null .
*/
public JsonSchema resolve() {
if (ref == null || master.schemaMap == null)
return this;
return master.schemaMap.get(ref);
}
/**
* Associates a schema map with this schema for resolving other schemas identified through $ref
* properties.
*
* @param schemaMap The schema map to associate with this schema. Can be null .
* @return This object.
*/
public JsonSchema setSchemaMap(JsonSchemaMap schemaMap) {
this.schemaMap = schemaMap;
return this;
}
@Override /* Object */
public String toString() {
return JsonSerializer.DEFAULT.toString(this);
}
}