298 lines
8.3 KiB
JSON
298 lines
8.3 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://jetlumen.com/ordo/schema/process-definition.json",
|
|
"title": "Ordo process definition document",
|
|
"$comment": "Document shape for ProcessDefinitionParser.fromJson. Graph connectivity, unique ids, PARALLEL membership, due.goto branch rules, and predicate depth/leaf limits are enforced only by the parser.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "name", "steps", "transitions"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"name": { "$ref": "#/$defs/nonEmptyString" },
|
|
"version": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"$comment": "Ignored by fromJson; written by toJson after publish."
|
|
},
|
|
"startStep": { "$ref": "#/$defs/nonEmptyString" },
|
|
"steps": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/topStep" }
|
|
},
|
|
"transitions": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/transition" }
|
|
}
|
|
},
|
|
"$defs": {
|
|
"nonEmptyString": {
|
|
"type": "string",
|
|
"pattern": ".*\\S.*"
|
|
},
|
|
"literal": {
|
|
"type": ["string", "number", "boolean"]
|
|
},
|
|
"topStep": {
|
|
"oneOf": [
|
|
{ "$ref": "#/$defs/approvalStep" },
|
|
{ "$ref": "#/$defs/actionStep" },
|
|
{ "$ref": "#/$defs/parallelStep" }
|
|
]
|
|
},
|
|
"leafStep": {
|
|
"oneOf": [
|
|
{ "$ref": "#/$defs/approvalStep" },
|
|
{ "$ref": "#/$defs/actionStep" }
|
|
]
|
|
},
|
|
"approvalStep": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "name", "candidates"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"name": { "$ref": "#/$defs/nonEmptyString" },
|
|
"kind": { "const": "APPROVAL" },
|
|
"candidates": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"uniqueItems": true,
|
|
"items": { "$ref": "#/$defs/nonEmptyString" }
|
|
},
|
|
"policy": { "type": "string", "enum": ["ANY", "ALL"] },
|
|
"due": { "$ref": "#/$defs/due" }
|
|
}
|
|
},
|
|
"actionStep": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "name", "kind", "action"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"name": { "$ref": "#/$defs/nonEmptyString" },
|
|
"kind": { "const": "ACTION" },
|
|
"action": { "$ref": "#/$defs/nonEmptyString" },
|
|
"policy": { "type": "string", "enum": ["ANY", "ALL"] }
|
|
}
|
|
},
|
|
"parallelStep": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "name", "kind", "branches"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"name": { "$ref": "#/$defs/nonEmptyString" },
|
|
"kind": { "const": "PARALLEL" },
|
|
"policy": { "type": "string", "enum": ["ANY", "ALL"] },
|
|
"branches": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"items": { "$ref": "#/$defs/branch" }
|
|
}
|
|
}
|
|
},
|
|
"branch": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["id", "steps", "transitions"],
|
|
"properties": {
|
|
"id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"steps": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/leafStep" }
|
|
},
|
|
"transitions": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/transition" }
|
|
}
|
|
}
|
|
},
|
|
"due": {
|
|
"oneOf": [
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["after", "then", "to"],
|
|
"properties": {
|
|
"after": { "$ref": "#/$defs/isoDuration" },
|
|
"then": { "const": "reassign" },
|
|
"to": { "$ref": "#/$defs/nonEmptyString" }
|
|
}
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["after", "then"],
|
|
"properties": {
|
|
"after": { "$ref": "#/$defs/isoDuration" },
|
|
"then": { "const": "notify" },
|
|
"action": { "$ref": "#/$defs/nonEmptyString" }
|
|
}
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["after", "then", "to"],
|
|
"properties": {
|
|
"after": { "$ref": "#/$defs/isoDuration" },
|
|
"then": { "const": "goto" },
|
|
"to": { "$ref": "#/$defs/nonEmptyString" }
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"isoDuration": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"$comment": "java.time.Duration.parse; must be positive after parse."
|
|
},
|
|
"transition": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["from"],
|
|
"properties": {
|
|
"from": { "$ref": "#/$defs/nonEmptyString" },
|
|
"to": {
|
|
"type": ["string", "null"],
|
|
"minLength": 1
|
|
},
|
|
"when": { "$ref": "#/$defs/when" },
|
|
"priority": { "type": "integer" }
|
|
}
|
|
},
|
|
"when": {
|
|
"oneOf": [
|
|
{ "$ref": "#/$defs/refWhen" },
|
|
{ "$ref": "#/$defs/predicate" }
|
|
]
|
|
},
|
|
"refWhen": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["ref"],
|
|
"properties": {
|
|
"ref": { "$ref": "#/$defs/nonEmptyString" },
|
|
"args": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
}
|
|
}
|
|
},
|
|
"predicate": {
|
|
"oneOf": [
|
|
{ "$ref": "#/$defs/compareEq" },
|
|
{ "$ref": "#/$defs/compareNe" },
|
|
{ "$ref": "#/$defs/compareGt" },
|
|
{ "$ref": "#/$defs/compareGte" },
|
|
{ "$ref": "#/$defs/compareLt" },
|
|
{ "$ref": "#/$defs/compareLte" },
|
|
{ "$ref": "#/$defs/inPredicate" },
|
|
{ "$ref": "#/$defs/andPredicate" },
|
|
{ "$ref": "#/$defs/orPredicate" },
|
|
{ "$ref": "#/$defs/notPredicate" }
|
|
]
|
|
},
|
|
"comparePair": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"maxItems": 2,
|
|
"prefixItems": [
|
|
{ "$ref": "#/$defs/nonEmptyString" },
|
|
{ "$ref": "#/$defs/literal" }
|
|
]
|
|
},
|
|
"compareEq": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["eq"],
|
|
"properties": { "eq": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"compareNe": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["ne"],
|
|
"properties": { "ne": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"compareGt": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["gt"],
|
|
"properties": { "gt": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"compareGte": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["gte"],
|
|
"properties": { "gte": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"compareLt": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["lt"],
|
|
"properties": { "lt": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"compareLte": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["lte"],
|
|
"properties": { "lte": { "$ref": "#/$defs/comparePair" } }
|
|
},
|
|
"inPredicate": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["in"],
|
|
"properties": {
|
|
"in": {
|
|
"type": "array",
|
|
"minItems": 2,
|
|
"maxItems": 2,
|
|
"prefixItems": [
|
|
{ "$ref": "#/$defs/nonEmptyString" },
|
|
{
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/literal" }
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"andPredicate": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["and"],
|
|
"properties": {
|
|
"and": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/predicate" }
|
|
}
|
|
}
|
|
},
|
|
"orPredicate": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["or"],
|
|
"properties": {
|
|
"or": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": { "$ref": "#/$defs/predicate" }
|
|
}
|
|
}
|
|
},
|
|
"notPredicate": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["not"],
|
|
"properties": {
|
|
"not": { "$ref": "#/$defs/predicate" }
|
|
}
|
|
}
|
|
}
|
|
}
|