com.fasterxml.jackson.module.jsonSchema.types.ArraySchema.java Source code

Java tutorial

Introduction

Here is the source code for com.fasterxml.jackson.module.jsonSchema.types.ArraySchema.java

Source

package com.fasterxml.jackson.module.jsonSchema.types;

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;

/*
 * This attribute defines the allowed items in an instance array, and
   MUST be a jsonSchema or an array of jsonSchemas.  The default value is an
   empty jsonSchema which allows any value for items in the instance array.
 */
public class ArraySchema extends ContainerTypeSchema {
    /**
     * see {@link AdditionalItems}
     */
    @JsonProperty
    private ArraySchema.AdditionalItems additionalItems;

    /**
     * see {@link Items}
     */
    @JsonProperty
    private ArraySchema.Items items;

    /**This attribute defines the maximum number of values in an array*/
    @JsonProperty
    private Integer maxItems;

    /**This attribute defines the minimum number of values in an array*/
    @JsonProperty
    private Integer minItems;

    /**
     * This attribute indicates that all items in an array instance MUST be
       unique (contains no two identical values).
        
       Two instance are consider equal if they are both of the same type
       and:
        
     are null; or are booleans/numbers/strings and have the same value; or
        
     are arrays, contains the same number of items, and each item in
     the array is equal to the corresponding item in the other array;
     or
        
     are objects, contains the same property names, and each property
     in the object is equal to the corresponding property in the other
     object.
     */
    @JsonProperty
    private Boolean uniqueItems = null;

    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.jsonSchema.types.JsonSchema#asArraySchema()
     */
    @Override
    public ArraySchema asArraySchema() {
        return this;
    }

    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.jsonSchema.types.JsonSchema#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ArraySchema) {
            ArraySchema that = (ArraySchema) obj;
            return equals(getAdditionalItems(), that.getAdditionalItems()) && equals(getItems(), that.getItems())
                    && equals(getMaxItems(), that.getMaxItems()) && equals(getMinItems(), that.getMinItems())
                    && equals(getUniqueItems(), that.getUniqueItems()) && super.equals(obj);
        } else {
            return false;
        }
    }

    public ArraySchema.AdditionalItems getAdditionalItems() {
        return additionalItems;
    }

    public ArraySchema.Items getItems() {
        return items;
    }

    public Integer getMaxItems() {
        return maxItems;
    }

    public Integer getMinItems() {
        return minItems;
    }

    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.jsonSchema.types.JsonSchema#getType()
     */
    @Override
    public JsonFormatTypes getType() {
        return JsonFormatTypes.ARRAY;
    }

    public Boolean getUniqueItems() {
        return uniqueItems;
    }

    @Override
    public boolean isArraySchema() {
        return true;
    }

    public void setAdditionalItems(ArraySchema.AdditionalItems additionalItems) {
        this.additionalItems = additionalItems;
    }

    public void setItems(ArraySchema.Items items) {
        this.items = items;
    }

    public void setItemsSchema(JsonSchema jsonSchema) {
        items = new SingleItems(jsonSchema);
    }

    public void setMaxItems(Integer maxItems) {
        this.maxItems = maxItems;
    }

    public void setMinItems(Integer minItems) {
        this.minItems = minItems;
    }

    public void setUniqueItems(Boolean uniqueItems) {
        this.uniqueItems = uniqueItems;
    }

    /**
     * This provides a definition for additional items in an array instance
    when tuple definitions of the items is provided.
     */
    @JsonDeserialize(using = AdditionalItemsDeserializer.class)
    public static abstract class AdditionalItems {

        @JsonCreator
        public static Items jsonCreator(Map<String, Object> props) {
            // not implemented for jsonSchema
            return null;
            //KNOWN ISSUE: pending https://github.com/FasterXML/jackson-databind/issues/43
        }
    }

    /**
     * When this attribute value is an array of jsonSchemas and the instance
       value is an array, each position in the instance array MUST conform
       to the jsonSchema in the corresponding position for this array.  This
       called tuple typing.  When tuple typing is used, additional items are
       allowed, disallowed, or constrained by the "additionalItems"
     */
    public static class ArrayItems extends ArraySchema.Items {
        @JsonProperty
        private JsonSchema[] jsonSchemas;

        /* (non-Javadoc)
         * @see com.fasterxml.jackson.databind.jsonSchema.types.ArraySchema.Items#asArrayItems()
         */
        @Override
        public ArrayItems asArrayItems() {
            return this;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Items) {
                ArrayItems that = (ArrayItems) obj;
                return JsonSchema.equals(getJsonSchemas(), that.getJsonSchemas());
            } else {
                return false;
            }
        }

        public JsonSchema[] getJsonSchemas() {
            return jsonSchemas;
        }

        /* (non-Javadoc)
         * @see com.fasterxml.jackson.databind.jsonSchema.types.ArraySchema.Items#isArrayItems()
         */
        @Override
        public boolean isArrayItems() {
            return true;
        }
    }

    /**
     * This attribute defines the allowed items in an instance array, and
       MUST be a jsonSchema or an array of jsonSchemas.  The default value is an
       empty jsonSchema which allows any value for items in the instance array.
     */
    public static abstract class Items {

        @JsonIgnore
        public boolean isSingleItems() {
            return false;
        }

        @JsonIgnore
        public boolean isArrayItems() {
            return false;
        }

        public SingleItems asSingleItems() {
            return null;
        }

        public ArrayItems asArrayItems() {
            return null;
        }

        @JsonCreator
        public static Items jsonCreator(Map<String, Object> props) {
            //for now only support deserialization of singleItems
            Object typeFound = props.get("type");
            if (typeFound == null || !(typeFound instanceof String)) {
                return null;
            }
            String type = (String) typeFound;
            JsonSchema schema = JsonSchema.minimalForFormat(JsonFormatTypes.forValue(type));
            //KNOWN ISSUE: pending https://github.com/FasterXML/jackson-databind/issues/43
            //only deserialize items as minimal schema for type
            return new SingleItems(schema);
        }

    }

    /**
     *  This can be false
     to indicate additional items in the array are not allowed
     */
    public static class NoAdditionalItems extends AdditionalItems {

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            return obj instanceof NoAdditionalItems;
        }

        @JsonValue
        public Boolean value() {
            return false;
        }
    }

    /**
     * or it can
     be a jsonSchema that defines the jsonSchema of the additional items.
     */
    public static class SchemaAdditionalItems extends AdditionalItems {

        @JsonIgnore
        private JsonSchema jsonSchema;

        public SchemaAdditionalItems(JsonSchema schema) {
            jsonSchema = schema;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            return obj instanceof SchemaAdditionalItems
                    && JsonSchema.equals(getJsonSchema(), ((SchemaAdditionalItems) obj).getJsonSchema());
        }

        @JsonValue
        public JsonSchema getJsonSchema() {
            return jsonSchema;
        }
    }

    /**
     * When this attribute value is a jsonSchema and the instance value is an
       array, then all the items in the array MUST be valid according to the
       jsonSchema.
     */
    public static class SingleItems extends ArraySchema.Items {
        @JsonIgnore
        private JsonSchema jsonSchema;

        public SingleItems(JsonSchema jsonSchema) {
            this.jsonSchema = jsonSchema;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            return obj instanceof SingleItems && JsonSchema.equals(getSchema(), ((SingleItems) obj).getSchema());
        }

        @JsonValue
        public JsonSchema getSchema() {
            return jsonSchema;
        }

        public void setSchema(JsonSchema jsonSchema) {
            this.jsonSchema = jsonSchema;
        }

        /* (non-Javadoc)
         * @see com.fasterxml.jackson.databind.jsonSchema.types.ArraySchema.Items#isSingleItems()
         */
        @Override
        public boolean isSingleItems() {
            return true;
        }

        /* (non-Javadoc)
         * @see com.fasterxml.jackson.databind.jsonSchema.types.ArraySchema.Items#asSingleItems()
         */
        @Override
        public SingleItems asSingleItems() {
            return this;
        }
    }

}