{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "4.3.1-timeStateValid.json",
  "assertionType": "must",
  "expectedResult": "valid",
  "onUnexpectedResult" : "failAndContinue",
  "errorMessage": "ERROR: Annotation contains a Time State that is NOT of format uri and NOT an object having sourceDate key or (alternatively, non concurrently) both sourceDateStart and sourceDateEnd keys.",
  "title": "If present all **States of _type_ TimeState** each have either (but not both) a **_souceDate_ key** or paired **_sourceDateStart_ and _sourceDateEnd_ keys,** each of which is a **single value** of **format date-time**- [model 4.3.1](https://www.w3.org/TR/annotation-model/#time-state)",
  "description": "True when no Time States present or all such states values are of format uri or are objects having sourceDate key or (alternatively, non concurrently) both sourceDateStart and sourceDateEnd keys. (Section 4.3.1)",
  "type": "object",
  "patternProperties":
  {
    "^(body|target)$":
    {
      "oneOf":
      [
        {"$ref": "id.json#/definitions/stringUri" },
        {
            "allOf":
            [
              { "$ref": "#/definitions/stateSchema" },
              { "$ref": "#/definitions/itemsSchema" }
            ]
        },
        {
            "type": "array",
            "minItems": 1,
            "items":
            {
                "oneOf":
                [
                    {"$ref": "id.json#/definitions/stringUri" },
                    {
                        "allOf":
                        [
                          { "$ref": "#/definitions/stateSchema" },
                          { "$ref": "#/definitions/itemsSchema" }
                        ]
                    }
                ]
            }
        }
      ]
    }
  },
  "definitions":
  {
      "stateSchema":
      {
        "type": "object",
        "properties":
         {
           "state":
            {
             "oneOf":
              [
                {"$ref": "id.json#/definitions/stringUri" },
                {
                 "type":"object",
                 "allOf":
                 [
                  { "$ref": "specificResource.json#/definitions/timeStateTypeValidIfPresent" }
                 ]
                },
                {
                 "type": "array",
                 "minItems": 1,
                 "items":
                 {
                   "oneOf":
                   [
                    {"$ref": "id.json#/definitions/stringUri" },
                    {
                     "type":"object",
                     "allOf":
                     [
                      { "$ref": "specificResource.json#/definitions/timeStateTypeValidIfPresent" }                     ]
                    }
                   ]
                 }
                }
              ]
            }
         }
      },

      "itemsSchema":
      {
        "type": "object",
        "properties":
        {
            "items":
            {
                "type": "array",
                "minItems": 1,
                "items": {
                  "oneOf":
                    [
                        {"$ref": "id.json#/definitions/stringUri" },
                        {"$ref": "#/definitions/stateSchema" }
                    ]
                }
            }
        }
      }
  }
}
