Packages

  • package root

    Documentation for the Axiell Schema Project

    Documentation for the Axiell Schema Project

    Overview

    The Axiell Schema Project provides a small library for validating JSON documents against a JSON Schema. The library conforms to the JSON Schema Draft #7 specification.

    The library is based on a few simple principles, namely:

    • referential transparency. Each of the methods in the library is referentially transparent, that is if the method is called with the same arguments it will always return the same value and the method does not have any side effect (e.g. update globals, change the operating environment, etc).
    • minimal functionality. The library is designed to be small incorporating a small number of dependencies. The number of methods associated with a class/object is restricted to those that provide a base level of functionality.
    • support multiple JSON libraries. It should be possible to use the library with any number of different JSON library packages (e.g json4s, jackson, etc). The current library only supports json4s, but a facade approach should be added to hide individual library implementations.
    • generic "format" implementations. The JSON Schema specification mandates a standard set of "format" types that can be used to validate string values. Each "format" type is implemented as a class with the components of the type available.
    • full error handling. Error resulting from the validation process are returned as a list of validation failures. All possible errors should be returned for a single call, eliminating the need to fix a single error and then recall a method.

    Package structure

    The com.axiell.schema packages consists of a number of utilities, where each utility provides a single piece of functionality. Since the library validates JSON structures two main components are provided. The first component (com.axiell.schema.Schema) allows JSON documents conforming to the JSON Schema specification to be read. Once read a resolution process may be required to resolve any external references defined in the document.

    The second component (com.axiell.schema.SchemaValidator) takes a resolved schema and allows JSON documents to be validated against that schema. When creating a validator it is also possible to incorporate your own "format" types for validation.

    A set of auxiliary components implement parsers for many of the "format" types and can be used independently of the validator itself.

    Notable utilities are:

    • Schema wrapper around a JSON document containing the document itself, its $id value and resolution mappings for all $id and $ref directives.
    • SchemaValidator takes a Schema and an optional handler for "format" types and provides a validation method for arbitrary JSON documents.
    • Implicits implements implicit methods and classes used to convert one class to another or pimp methods onto existing classes (e.g. same() method to JValue class).
    • various auxiliary classes for handling "format" types including:

    Dependencies

    The list of dependencies are:

    • Axiell Util Library provides error handling classes and methods that allow multilingual error messages to be generated.
    • JSON for Scala Library provides mthods for dealing with JSON structures. The routines work around an AST (Abstract Syntax Tree) used to represent a JSON document.
    • Cats Functional Programming Library provides various traits, classes and methods that simplify functional programming in Scala. Also provides the Validated class used to return lists of validation errors.
    Definition Classes
    root
  • package com
    Definition Classes
    root
  • package axiell
    Definition Classes
    com
  • package schema

    Contains types used by the library.

    Contains types used by the library.

    In order to simplify method signatures a series of types are defined. The types are used throughout the library.

    Definition Classes
    axiell
  • package instances
    Definition Classes
    schema
  • package syntax
    Definition Classes
    schema
  • Assertions
  • Context
  • EmailAddress
  • Formats
  • Hostname
  • Implicits
  • Ipv4Address
  • Ipv6Address
  • JsonPointer
  • RelativeJsonPointer
  • Resolver
  • Schema
  • SchemaValidator
  • SchemaWalker
  • Validator

final case class Context(baseUri: URI, path: JsonPointer, schemaPath: JsonPointer, readOnly: Boolean, refs: Refs, formats: Formats) extends Product with Serializable

Contains context information as validator is executed.

When schema validation is invoked the JSON Schema document is traversed and as the traversal occurs the JSON data is matched against the relevant constraints. The traversal of the Schema document needs to track the current base URI so it can resolve relative $id properties in the document itself. The paths of the current constraint and data are also maintained so that error messages can indicate the location within the data and also the location of the constraint of a failure.

Other environment based information is kept to avoid passing implicit values to all validation methods. The information includes whether readOnly properties should be honoured and also a partial function used to validate format properties.

Since the context is only used internally by the validation routines it is declare to be private within the project.

baseUri

for the current JSON Schema node

path

of the current JSON data node

schemaPath

of the current JSON Schema node

readOnly

true if the readOnly property should be honoured

refs

map containing reference resolution entries

formats

partial function used to validate format properties

Source
Context.scala
Linear Supertypes
Serializable, Product, Equals, AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. Context
  2. Serializable
  3. Product
  4. Equals
  5. AnyRef
  6. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Instance Constructors

  1. new Context(baseUri: URI, path: JsonPointer, schemaPath: JsonPointer, readOnly: Boolean, refs: Refs, formats: Formats)

    baseUri

    for the current JSON Schema node

    path

    of the current JSON data node

    schemaPath

    of the current JSON Schema node

    readOnly

    true if the readOnly property should be honoured

    refs

    map containing reference resolution entries

    formats

    partial function used to validate format properties

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. def appendPath(token: String): Context

    Appends a new path component to the current data path.

    Appends a new path component to the current data path.

    The JSON data path is updated as it is traversed. When a JSON object is encountered each property needs to be appended to the parent path so that the path for the current node is correct.

    token

    path component to append to existing JSON data path

    returns

    new Context containing updated data path

  5. def appendPath(index: Int): Context

    Appends a new array index to the current data path.

    Appends a new array index to the current data path.

    When traversing the JSON data and an array is encountered, the index of the current array node being processed is added to the current data path.

    index

    of the array entry to append to the current data path

    returns

    new Context containing updated data path

  6. def appendSchemaPath(token: String): Context

    Appends a new path component to the current schema path.

    Appends a new path component to the current schema path.

    The JSON schema path is updated as the schema is traversed. When a JSON object is encountered the current property is appended to the schema path as its assertions are evaluated.

    token

    path component to append to existing JSON schema path

    returns

    new Context containing updated schema path

  7. def appendSchemaPath(index: Int): Context

    Appends a new array index to the current schema path.

    Appends a new array index to the current schema path.

    When the JSON schema is traversed the path of the current node is maintained. In the case of an array an index into the current entry is appended to the existing path.

    index

    of the array entry to append to the current schema path

    returns

    new Context containing updated schema path

  8. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  9. val baseUri: URI
  10. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native()
  11. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  12. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable])
  13. val formats: Formats
  14. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  15. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  16. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  17. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  18. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  19. val path: JsonPointer
  20. def productElementNames: Iterator[String]
    Definition Classes
    Product
  21. val readOnly: Boolean
  22. val refs: Refs
  23. val schemaPath: JsonPointer
  24. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  25. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  26. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  27. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException]) @native()
  28. def withId(uri: URI): Context

    Updates the base URI within the Context.

    Updates the base URI within the Context.

    The current base URI is maintained as the schema is traversed. The base URI is used to resolve any relative URI values found with $id properties.

    uri

    to set and the base URI

    returns

    new Context containing updated base URI value

Inherited from Serializable

Inherited from Product

Inherited from Equals

Inherited from AnyRef

Inherited from Any

Ungrouped