From 314bdf9b1971eb366cdb1bc85b5d9cea89576145 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 18 May 2023 11:58:07 +0100 Subject: [PATCH 01/18] Using xmltodict to generate json --- 103120/examples/request1.json | 92 ++++++++ 103120/utils/validate.py | 94 +++++++++ 103120/utils/xml_to_json.py | 12 ++ 103280/TS_103_280.schema.json | 387 ++++++++++++++++++++++++++++++++++ 4 files changed, 585 insertions(+) create mode 100644 103120/examples/request1.json create mode 100644 103120/utils/validate.py create mode 100644 103120/utils/xml_to_json.py create mode 100644 103280/TS_103_280.schema.json diff --git a/103120/examples/request1.json b/103120/examples/request1.json new file mode 100644 index 0000000..a73501e --- /dev/null +++ b/103120/examples/request1.json @@ -0,0 +1,92 @@ +{ + "HI1Message": { + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": "0", + "CREATE": { + "HI1Object": { + "@xsi:type": "auth:AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "auth:AuthorisationReference": "W000001", + "auth:AuthorisationTimespan": { + "auth:StartTime": "2015-09-01T12:00:00Z", + "auth:EndTime": "2015-12-01T12:00:00Z" + } + } + } + }, + { + "ActionIdentifier": "1", + "CREATE": { + "HI1Object": { + "@xsi:type": "task:LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "AssociatedObjects": { + "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" + }, + "task:Reference": "LIID1", + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": { + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" + } + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": { + "task:DeliveryAddress": { + "task:IPv4Address": "192.0.2.0" + } + } + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "RECVER01" + } + } + } + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/103120/utils/validate.py b/103120/utils/validate.py new file mode 100644 index 0000000..a290ed3 --- /dev/null +++ b/103120/utils/validate.py @@ -0,0 +1,94 @@ +import sys +from jsonschema import validate, RefResolver, Draft202012Validator +import json +from pathlib import Path +import logging +import argparse + + + +# filename = sys.argv[1] + +# def load_json (path): +# with open(path) as f: +# s = json.load(f) +# return s + +# schema_store = {} + +# json_instance = load_json(filename) +# print (json_instance) + +# etsi_schema = load_json('response.schema.json') +# ext_schema = load_json('extended.schema.json') +# ext_ent_schema = load_json("extended_entities.schema.json") +# schema_store = { +# etsi_schema['$id'] : etsi_schema, +# ext_schema['$id'] : ext_schema, +# ext_ent_schema['$id'] : ext_ent_schema +# } + +# resolver = RefResolver(None, referrer=None, store=schema_store) + +# print (etsi_schema) + +# v = Draft202012Validator(ext_schema, resolver=resolver) +# v.validate(json_instance) + +# validate(json_instance, ext_schema) +# print ("OK") + +def handle_uri(u): + print(u) + +def load_json(path : str): + with open(path) as f: + return json.load(f) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument('-s','--schemadir', action="append", help="Directory containing supporting schema files to use for validation") + parser.add_argument('-v', '--verbose', action="count", help="Verbose logging (can be specified multiple times)") + parser.add_argument('schema', help="Primary schema to validate against") + parser.add_argument('filename', help="JSON instance document to validate") + + args = parser.parse_args() + + match args.verbose: + case v if v and v >= 2: + logging.basicConfig(level=logging.DEBUG) + case 1: + logging.basicConfig(level=logging.INFO) + case _: + logging.basicConfig(level=logging.WARNING) + + logging.debug(f"Arguments: {args}") + + instance_doc = load_json(args.filename) + main_schema = load_json(args.schema) + schema_dict = { main_schema['$id'] : main_schema } + + if args.schemadir: + schema_paths = [] + for d in args.schemadir: + schema_paths += [f for f in Path(d).rglob("*.schema.json")] + logging.info(f"Schema files loaded: {schema_paths}") + + schemas_json = [json.load(p.open()) for p in schema_paths] + schema_dict = schema_dict | { s['$id'] : s for s in schemas_json } + + logging.info(f"Schema IDs loaded: {[k for k in schema_dict.keys()]}") + + logging.debug (f"Instance doc: {instance_doc}") + logging.debug (f"Main schema: {main_schema}") + + resolver = RefResolver(None, + referrer=None, + store=schema_dict) + + v = Draft202012Validator(main_schema, resolver=resolver) + + v.validate(instance_doc) + + logging.info("Done") \ No newline at end of file diff --git a/103120/utils/xml_to_json.py b/103120/utils/xml_to_json.py new file mode 100644 index 0000000..0615a03 --- /dev/null +++ b/103120/utils/xml_to_json.py @@ -0,0 +1,12 @@ +import xmltodict +from pprint import pprint +import json + +with open('../examples/request1.xml') as f: + s = f.read() + +d = xmltodict.parse(s) +pprint (d) + +with open('../examples/request.json', 'w') as f2: + f2.write(json.dumps(d)) \ No newline at end of file diff --git a/103280/TS_103_280.schema.json b/103280/TS_103_280.schema.json new file mode 100644 index 0000000..523a1a5 --- /dev/null +++ b/103280/TS_103_280.schema.json @@ -0,0 +1,387 @@ +{ + "$id" : "http://etsi.org/temp/280", + "$schema" : "https://json-schema.org/draft/2020-12/schema", + "title" : "ETSI TS 103 280 (temp)", + "description" : "A stubbed version of TS 103 280 definitions (need a CR to 280 for this)", + "$defs": { + "ShortString": { + "type": "string", + "maxLength": 255 + }, + "LongString": { + "type": "string", + "maxLength": 65535 + }, + "LIID": { + "type": "string", + "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" + }, + "UTCDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" + }, + "UTCMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" + }, + "QualifiedDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "QualifiedMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "InternationalE164": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "IMSI": { + "type": "string", + "pattern": "^[0-9]{6,15}$" + }, + "IMEI": { + "type": "string", + "pattern": "^[0-9]{14}$" + }, + "IMEICheckDigit": { + "type": "string", + "pattern": "^[0-9]{15}$" + }, + "IMEISV": { + "type": "string", + "pattern": "^[0-9]{16}$" + }, + "IPv4Address": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" + }, + "IPv4CIDR": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" + }, + "IPv6Address": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" + }, + "IPv6CIDR": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" + }, + "TCPPort": { + "type": "integer", + "exclusiveMinimum": 1, + "maximum": 65535 + }, + "UDPPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "MACAddress": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" + }, + "EmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" + } + ] + }, + "UUID": { + "type": "string", + "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" + }, + "ISOCountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "SIPURI": { + "type": "string", + "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "TELURI": { + "type": "string", + "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "WGS84LatitudeDecimal": { + "type": "string", + "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" + }, + "WGS84LongitudeDecimal": { + "type": "string", + "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" + }, + "WGS84LatitudeAngular": { + "type": "string", + "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" + }, + "WGS84LongitudeAngular": { + "type": "string", + "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" + }, + "SUPIIMSI": { + "$ref": "#/$defs/IMSI" + }, + "SUPINAI": { + "$ref": "#/$defs/NAI" + }, + "SUCI": { + "type": "string", + "pattern": "^([a-fA-F0-9]{2})*$" + }, + "PEIIMEI": { + "$ref": "#/$defs/IMEI" + }, + "PEIIMEICheckDigit": { + "$ref": "#/$defs/IMEICheckDigit" + }, + "PEIIMEISV": { + "$ref": "#/$defs/IMEISV" + }, + "GPSIMSISDN": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "GPSINAI": { + "$ref": "#/$defs/NAI" + }, + "NAI": { + "type": "string" + }, + "LDID": { + "type": "string", + "pattern": "^([A-Z]{2}-.+-.+)$" + }, + "InternationalizedEmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^.+@.+$" + } + ] + }, + "EUI64": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" + }, + "CGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" + }, + "ECGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" + }, + "NCGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" + }, + "ICCID": { + "type": "string", + "pattern": "^[0-9]{19,20}$" + }, + "IPAddress": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4Address": { + "$ref": "#/$defs/IPv4Address" + } + }, + "required": [ + "IPv4Address" + ] + }, + { + "type": "object", + "properties": { + "IPv6Address": { + "$ref": "#/$defs/IPv6Address" + } + }, + "required": [ + "IPv6Address" + ] + } + ] + }, + "IPCIDR": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4CIDR": { + "$ref": "#/$defs/IPv4CIDR" + } + }, + "required": [ + "IPv4CIDR" + ] + }, + { + "type": "object", + "properties": { + "IPv6CIDR": { + "$ref": "#/$defs/IPv6CIDR" + } + }, + "required": [ + "IPv6CIDR" + ] + } + ] + }, + "TCPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/TCPPort" + }, + "end": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "UDPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/UDPPort" + }, + "end": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "Port": { + "oneOf": [ + { + "type": "object", + "properties": { + "TCPPort": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "TCPPort" + ] + }, + { + "type": "object", + "properties": { + "UDPPort": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "UDPPort" + ] + } + ] + }, + "PortRange": { + "oneOf": [ + { + "type": "object", + "properties": { + "TCPPortRange": { + "$ref": "#/$defs/TCPPortRange" + } + }, + "required": [ + "TCPPortRange" + ] + }, + { + "type": "object", + "properties": { + "UDPPortRange": { + "$ref": "#/$defs/UDPPortRange" + } + }, + "required": [ + "UDPPortRange" + ] + } + ] + }, + "IPAddressPort": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "port": { + "$ref": "#/$defs/Port" + } + }, + "required": [ + "address", + "port" + ] + }, + "IPAddressPortRange": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "portRange": { + "$ref": "#/$defs/PortRange" + } + }, + "required": [ + "address", + "portRange" + ] + }, + "WGS84CoordinateDecimal": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeDecimal" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeDecimal" + } + }, + "required": [ + "latitude", + "longitude" + ] + }, + "WGS84CoordinateAngular": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeAngular" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeAngular" + } + }, + "required": [ + "latitude", + "longitude" + ] + } + } +} \ No newline at end of file -- GitLab From fc63aa7835cc3848a26943d85ec6e580b492278a Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 18 May 2023 16:04:08 +0100 Subject: [PATCH 02/18] Getting a bit further --- utils/translate/ChoiceMapping.py | 42 ++++++ utils/translate/ComplexTypeMapping.py | 11 ++ utils/translate/SequenceMapping.py | 80 ++++++++++++ utils/translate/SimpleTypeMapping.py | 18 +++ utils/translate/TypeMapping.py | 70 ++++++++++ utils/translate/XSDNativeSimpleTypeMapping.py | 72 +++++++++++ utils/translate/__init__.py | 64 +++++++++ utils/translate_spec.py | 122 ++++++++++++++++++ utils/ts103120_config.json | 14 ++ utils/validate.py | 94 ++++++++++++++ utils/xml_to_json.py | 42 ++++++ 11 files changed, 629 insertions(+) create mode 100644 utils/translate/ChoiceMapping.py create mode 100644 utils/translate/ComplexTypeMapping.py create mode 100644 utils/translate/SequenceMapping.py create mode 100644 utils/translate/SimpleTypeMapping.py create mode 100644 utils/translate/TypeMapping.py create mode 100644 utils/translate/XSDNativeSimpleTypeMapping.py create mode 100644 utils/translate/__init__.py create mode 100644 utils/translate_spec.py create mode 100644 utils/ts103120_config.json create mode 100644 utils/validate.py create mode 100644 utils/xml_to_json.py diff --git a/utils/translate/ChoiceMapping.py b/utils/translate/ChoiceMapping.py new file mode 100644 index 0000000..fecadf8 --- /dev/null +++ b/utils/translate/ChoiceMapping.py @@ -0,0 +1,42 @@ +import logging + +from xmlschema.validators.simple_types import * +from xmlschema.validators.complex_types import * +from xmlschema.validators.groups import * +from xmlschema.validators.facets import * + +from .TypeMapping import TypeMapping +from .ComplexTypeMapping import ComplexTypeMapping + +log = logging.getLogger() + +class ChoiceMapping(ComplexTypeMapping): + @classmethod + def process_choice(cls, choice: XsdGroup, current_ns : str): + if choice.model != 'choice': + raise Exception(f"Wrong group type: {c.model}") + oneOf = [] + for c in choice.iter_model(): + if not (type(c) is XsdElement): + raise Exception (f"Non-element {c} encountered in choice {choice}") + t = TypeMapping.get_type_from_elem(c, current_ns) + oneOf.append({ + "type" : "object", + "properties" : { + c.local_name : t + }, + "required" : [c.local_name] + }) + return oneOf + + def map(self, xst : BaseXsdType): + log.debug(f"Attempting mapping of {xst} to choice") + j = super().map(xst) + if j is None: + log.debug("Not a complex type, giving up") + return None + content = xst.content + if (content.model != 'choice'): + log.debug("Not a choice, giving up") + return None + return { 'oneOf' : ChoiceMapping.process_choice(content, xst.namespaces[''])} diff --git a/utils/translate/ComplexTypeMapping.py b/utils/translate/ComplexTypeMapping.py new file mode 100644 index 0000000..e181909 --- /dev/null +++ b/utils/translate/ComplexTypeMapping.py @@ -0,0 +1,11 @@ +from xmlschema.validators.complex_types import * + +from .TypeMapping import TypeMapping + +class ComplexTypeMapping(TypeMapping): + def map(self, xst: BaseXsdType): + if not (type(xst) is XsdComplexType): + return None + return { + "type" : "object" + } diff --git a/utils/translate/SequenceMapping.py b/utils/translate/SequenceMapping.py new file mode 100644 index 0000000..91db5ea --- /dev/null +++ b/utils/translate/SequenceMapping.py @@ -0,0 +1,80 @@ +import logging + +from xmlschema.validators.simple_types import * +from xmlschema.validators.complex_types import * +from xmlschema.validators.groups import * +from xmlschema.validators.facets import * + +from .TypeMapping import TypeMapping +from .ChoiceMapping import ChoiceMapping +from .ComplexTypeMapping import ComplexTypeMapping + +log = logging.getLogger() + + +class SequenceMapping(ComplexTypeMapping): + def map(self, xst: BaseXsdType): + log.debug(f"Attempting mapping of {xst} to sequence") + j = super().map(xst) + if j is None: + log.debug("Not a complex type, giving up") + return None + content = xst.content + if (content.model != 'sequence'): + log.debug("Not a sequence, giving up") + return None + mapped_type = { + 'type' : 'object', + 'properties' : {}, + 'required' : [] + } + + # Not going to try and do all of this automatically for now + # Only make insert the xsiType parameter + if (xst.base_type): + # mapped_type['__DESCENDENT_OF__'] = TypeMapping.get_ref_for(xst.base_type, xst.namespaces['']) + mapped_type['properties']['@xsi:type'] = { + "type" : "string", + "enum" : xst.name + } + mapped_type['required'].append('@xsi:type') + # if xst.abstract: + # mapped_type['__ABSTRACT__'] = True + # pass + + inner_choice = None + for c in list(content.iter_model()): + log.debug(f"Processing model item {c}") + if type(c) is XsdElement: + if c.effective_max_occurs != 1: + mapped_type['properties'][c.local_name] = { + "type" : "array", + "items" : TypeMapping.get_type_from_elem(c, xst.namespaces['']) + } + if c.effective_max_occurs: + mapped_type['properties'][c.local_name]['maxItems'] = c.effective_max_occurs + if c.effective_min_occurs > 0: + mapped_type['properties'][c.local_name]['minItems'] = c.effective_min_occurs + else: + mapped_type['properties'][c.local_name] = TypeMapping.get_type_from_elem(c, xst.namespaces['']) + if c.effective_min_occurs == 1: + mapped_type['required'].append(c.local_name) + elif type(c) is XsdGroup: + if inner_choice: + raise Exception (f"Second group '{c.local_name}' encountered in {xst}") + if c.model != "choice": + raise Exception (f"Don't know what to do with inner group {c} in {xst} - not a choice") + inner_choice = ChoiceMapping.process_choice(c, xst.namespaces['']) + elif type(c) is XsdAnyElement: + mapped_type = {} + else: + raise Exception(f"Unknown element type {c}") + if (inner_choice): + return { + 'allOf' : [ + mapped_type, + {'oneOf' : inner_choice} + ] + } + else: + return mapped_type diff --git a/utils/translate/SimpleTypeMapping.py b/utils/translate/SimpleTypeMapping.py new file mode 100644 index 0000000..2e60f9c --- /dev/null +++ b/utils/translate/SimpleTypeMapping.py @@ -0,0 +1,18 @@ +import logging + +from xmlschema.validators.complex_types import * +from xmlschema.validators.simple_types import XsdAtomicRestriction + +from .TypeMapping import TypeMapping + +log = logging.getLogger() + +class SimpleTypeMapping(TypeMapping): + def map(self, xst: BaseXsdType): + log.debug(f"Attempting mapping of {xst} to simple type") + if not (type(xst) is XsdAtomicRestriction): + log.debug("Type is not an XsdAtomicRestriction, giving up") + return None + return { + "$ref" : xst.base_type.name + } \ No newline at end of file diff --git a/utils/translate/TypeMapping.py b/utils/translate/TypeMapping.py new file mode 100644 index 0000000..b796e66 --- /dev/null +++ b/utils/translate/TypeMapping.py @@ -0,0 +1,70 @@ +import logging +from abc import ABC, abstractmethod + +from xmlschema.validators.simple_types import * +from xmlschema.validators.complex_types import * +from xmlschema.validators.groups import * +from xmlschema.validators.facets import * + +log = logging.getLogger() + +class TypeMapping(ABC): + ns_to_id_map = {} + + XSD_NS = "http://www.w3.org/2001/XMLSchema" + + XSD_TYPE_MAP = { + "string" : { "type" : "string" }, + "normalizedString" : { "type" : "string", "pattern" : "^[^\r\n\t]*$"}, + "dateTime" : { "type" : "string"}, + "token" : { "type" : "string", "pattern" : "^[^\r\n\t]*$"}, + "anyURI" : { "type" : "string" }, + + "integer" : { "type" : "integer"}, + "nonNegativeInteger" : { "type" : "integer", "minimum" : 0}, + "positiveInteger" : { "type" : "integer", "minimum" : 1}, + + "boolean" : { "type" : "boolean" }, + + "hexBinary" : { "type" : "string", "pattern" : "^([a-fA-F0-9]{2})*$"}, + "base64Binary" : { "type" : "string", "pattern" : "^[-A-Za-z0-9+/]*={0,3}$"}, + + "anyType" : {} + } + + @abstractmethod + def map(self, xst : BaseXsdType): + return None + + @classmethod + def extract_namespace(cls, qname: str): + match = re.search(r'^\{([^\{\}]+)\}(([^\{\}]+))$', qname) + if match is None: + return None + return match.group(1) + + @classmethod + def get_ref_for(cls, xsd_type: XsdType, current_ns : str): + ns = cls.extract_namespace(xsd_type.name) + if ns == current_ns: + return { "$ref" : f"#/$defs/{xsd_type.local_name}" } + else: + mapped_id = cls.ns_to_id_map[ns] + return { "$ref" : f"{mapped_id}#/$defs/{xsd_type.local_name}"} + + @classmethod + def get_type_from_elem(cls, elem: XsdElement, current_ns : str): + ns = cls.extract_namespace(elem.type.name) + if (ns == TypeMapping.XSD_NS): + # this should be an XSD primitive type + return dict(TypeMapping.XSD_TYPE_MAP[elem.type.local_name]) + else: + return cls.get_ref_for(elem.type, current_ns) + + + + + + + + diff --git a/utils/translate/XSDNativeSimpleTypeMapping.py b/utils/translate/XSDNativeSimpleTypeMapping.py new file mode 100644 index 0000000..772ac10 --- /dev/null +++ b/utils/translate/XSDNativeSimpleTypeMapping.py @@ -0,0 +1,72 @@ +import logging + +from xmlschema.validators.simple_types import * +from xmlschema.validators.complex_types import * +from xmlschema.validators.groups import * +from xmlschema.validators.facets import * + +from .TypeMapping import TypeMapping +from .SimpleTypeMapping import SimpleTypeMapping + +log = logging.getLogger() + +class XSDNativeSimpleTypeMapping(SimpleTypeMapping): + + def map(self, xst: BaseXsdType): + log.debug(f"Attempting mapping of {xst} to XSD native type") + j = super().map(xst) + if j is None: + log.debug("Not a simple type, giving up") + return None + + mapped_type = TypeMapping.XSD_TYPE_MAP.get(xst.base_type.local_name) + parent_type = None + + if mapped_type is None: + ns = TypeMapping.extract_namespace(xst.base_type.name) + if ns == XSDNativeSimpleTypeMapping.XSD_NS: + print (xst) + print (xst.base_type) + raise Exception (f"No mapping for xs:{xst.base_type.local_name}") + if len(xst.facets) == 0: + mapped_type = TypeMapping.get_ref_for(xst.base_type, xst.namespaces['']) + else: + parent_type = TypeMapping.get_ref_for(xst.base_type, xst.namespaces['']) + mapped_type = TypeMapping.XSD_TYPE_MAP.get(xst.root_type.local_name) + if mapped_type is None: + raise Exception (f"Could not find mapping for root type xs:{xst.root_type.local_name}") + + mapped_type = dict(mapped_type) + + for k, v in xst.facets.items(): + log.debug(f"Mapping facet {v}") + if type(v) is XsdMaxLengthFacet: + mapped_type['maxLength'] = v.value + continue + if type(v) is XsdMinLengthFacet: + mapped_type['minLength'] = v.value + continue + if type(v) is XsdPatternFacets: + if len(v.regexps) > 1: + raise Exception (f"Multiple patterns given in facet {v} of {xst}") + p = v.regexps[0] + if (not p.startswith('^')) and (not p.endswith('$')): + p = f"^{p}$" + mapped_type['pattern'] = p + continue + if type (v) is XsdMinInclusiveFacet: + mapped_type['minimum'] = v.value + continue + if type (v) is XsdMaxInclusiveFacet: + mapped_type['maximum'] = v.value + continue + if type (v) is XsdMinExclusiveFacet: + mapped_type['exclusiveMinimum'] = v.value + continue + if type (v) is XsdMaxExclusiveFacet: + mapped_type['exclusiveMaximum'] = v.value + continue + raise Exception (f"Unhandled facet {v}") + if parent_type: + return { 'allOf' : [parent_type, mapped_type] } + return mapped_type diff --git a/utils/translate/__init__.py b/utils/translate/__init__.py new file mode 100644 index 0000000..983aa20 --- /dev/null +++ b/utils/translate/__init__.py @@ -0,0 +1,64 @@ +import logging + +from pathlib import Path +from xmlschema import * + +from .TypeMapping import * +from .XSDNativeSimpleTypeMapping import XSDNativeSimpleTypeMapping +from .ChoiceMapping import ChoiceMapping +from .SequenceMapping import SequenceMapping + + +log = logging.getLogger() + +mappings = [ + XSDNativeSimpleTypeMapping(), + ChoiceMapping(), + SequenceMapping(), +] + +def translate_schema (schema_path: str, ns_to_id_map: dict, schema_locations = []): + js = { + "$id" : "?", + "$defs" : {} + } + + logging.info(f"Translating schema {schema_path}") + xs = XMLSchema(schema_path, validation='lax', locations=schema_locations) + logging.info(f"Schema namespace: {xs.target_namespace}" ) + + schema_id = ns_to_id_map[xs.target_namespace] + js['$id'] = schema_id + + TypeMapping.ns_to_id_map = ns_to_id_map + + elementList = [] + for elementName, element in xs.elements.items(): + logging.info(f"Processing element {elementName} : {element}") + elementList.append(TypeMapping.get_ref_for(element.type, element.namespaces[''])) + if len(elementList) == 1: + js['$ref'] = elementList[0]['$ref'] + elif len(elementList) > 1: + js['oneOf'] = elementList + + descendent_types = {} + for type_name, xsd_type in xs.types.items(): + logging.info(f"Processing {type_name} : {xsd_type}") + + j = None + for mapping in mappings: + log.debug("\n----------------------------------------") + j = mapping.map(xsd_type) + if j is None: + continue + else: + break + if j is None: + raise Exception(f"Unmapped type {type_name} ({xsd_type})") + js["$defs"][xsd_type.local_name] = j + logging.debug (f"Mapped {type_name} to {j}") + + print (descendent_types) + return js + + diff --git a/utils/translate_spec.py b/utils/translate_spec.py new file mode 100644 index 0000000..8f89093 --- /dev/null +++ b/utils/translate_spec.py @@ -0,0 +1,122 @@ +import json +import os +import logging +from pathlib import Path +import sys + +from xmlschema import * + +from translate import * + +import jsonschema + +logging.basicConfig(level = logging.INFO) + +def build_schema_locations (paths): + schema_locations = [] + for schemaFile in paths: + try: + xs = XMLSchema(schemaFile, validation='skip') + schema_locations.append((xs.target_namespace, str(Path(schemaFile).resolve()))) + logging.debug (" [ {0} -> {1} ]".format(xs.target_namespace, schemaFile)) + except XMLSchemaParseError as ex: + logging.debug (" [ {0} failed to parse: {1} ]".format(schemaFile, ex)) + return schema_locations + +def get_json(filename): + with open(filename) as f: + j = json.load(f) + return j + +def convert_ns_to_id (ns): + if ns.startswith('http://uri.etsi.org'): + c = ns.split("/") + return f"ts_1{c[3]}{'_' + c[7] if len(c) > 7 else ''}_{c[5]}_{c[6]}" + else: + return ns.replace("http://","").replace("/","_") + +def convert_xsd_to_filename (xsd): + f = Path(xsd) + return f.name.replace('.xsd', '.schema.json') + +if __name__ == "__main__": + if len(sys.argv) < 2: + logging.error ("Usage: translate_spec.py path_to_config_file") + exit(-1) + + config = get_json(sys.argv[1]) + + schema_paths = config['schemas'] + logging.info("Bulding schema locations...") + schema_locations = build_schema_locations(schema_paths) + logging.debug(schema_locations) + + # ns_to_id_map = { + # schema[0]: schema[0].split('/')[-1].lower() + ".json" + # for schema in schema_locations if '03120' in schema[0] + # } | { + # 'http://uri.etsi.org/03280/common/2017/07' : 'etsi103280.json', + # 'http://www.w3.org/2000/09/xmldsig#' : 'xmldsig.json', + # } + logging.info("Constructing XSD NS to JSON Schema ID mapping...") + ns_to_id_map = { schema[0] : convert_ns_to_id(schema[0]) for schema in schema_locations} + logging.debug(ns_to_id_map) + + # # js = translate_schema("103280/TS_103_280.xsd", "103120.json") + # # print(json.dumps(js, indent=2)) + + output_path = Path(config['output']) + if not output_path.exists(): + logging.info("Creating output directory") + os.mkdir(str(output_path)) + + logging.info("Translating schemas...") + json_schemas = {} + for schema_tuple in schema_locations: + logging.info(f" Translating {schema_tuple}") + if 'xmldsig' in (schema_tuple[1]): + # TODO - work out what to do here + logging.info(" Skipping XML Dsig...") + continue + js = translate_schema(schema_tuple[1], ns_to_id_map, schema_locations) + if ns_to_id_map[schema_tuple[0]] == 'core.json': + js['$defs']['HI1Message']['properties'].pop('Signature') + js_path = output_path / convert_xsd_to_filename(schema_tuple[1]) + + # TODO - work out how to do this substitution automatically + # and build the graph of acceptable descendent types + if "Core" in schema_tuple[1]: + js["$defs"]['ConcreteHI1Object'] = { + 'oneOf' : [ + {'$ref' : 'ts_103120_Authorisation_2020_09#/$defs/AuthorisationObject'}, + {'$ref' : 'ts_103120_Task_2020_09#/$defs/LITaskObject'}, + {'$ref' : 'ts_103120_Task_2020_09#/$defs/LDTaskObject'}, + {'$ref' : 'ts_103120_Document_2020_09#/$defs/DocumentObject'}, + {'$ref' : 'ts_103120_Notification_2016_02#/$defs/NotificationObject'}, + {'$ref' : 'ts_103120_Delivery_2019_10#/$defs/DeliveryObject'}, + {'$ref' : 'ts_103120_TrafficPolicy_2022_07#/$defs/TrafficPolicyObject'}, + ] + } + + json_string = json.dumps(js, indent=2) + + if "Core" in schema_tuple[1]: + json_string = json_string.replace('"$ref": "#/$defs/HI1Object"', '"$ref": "#/$defs/ConcreteHI1Object"') + + with open(str(js_path), 'w') as f: + f.write(json_string) + json_schemas[js['$id']] = json.loads(json_string) + + # else: + # json_schemas = {} + # json_path = Path('json/') + # for json_file in json_path.glob("*.json"): + # json_schemas[json_file.name] = get_json(json_file) + + # resolver = jsonschema.RefResolver("", "", json_schemas) + + # instance = get_json("120.json") + # schema = json_schemas['core.json'] + # jsonschema.validate(instance, schema, resolver=resolver) + + # print(json.dumps(js, indent=2)) diff --git a/utils/ts103120_config.json b/utils/ts103120_config.json new file mode 100644 index 0000000..08aadb8 --- /dev/null +++ b/utils/ts103120_config.json @@ -0,0 +1,14 @@ +{ + "schemas" : [ "../103120/schema/ts_103120_Authorisation.xsd", + "../103120/schema/ts_103120_Common.xsd", + "../103120/schema/ts_103120_Core.xsd", + "../103120/schema/ts_103120_Delivery.xsd", + "../103120/schema/ts_103120_Document.xsd", + "../103120/schema/ts_103120_Notification.xsd", + "../103120/schema/ts_103120_Task.xsd", + "../103120/schema/ts_103120_TrafficPolicy.xsd", + "../103280/TS_103_280.xsd", + "../testing/deps/xmldsig/xmldsig-core-schema.xsd" + ], + "output" : "../103120/schema/json/" +} \ No newline at end of file diff --git a/utils/validate.py b/utils/validate.py new file mode 100644 index 0000000..a290ed3 --- /dev/null +++ b/utils/validate.py @@ -0,0 +1,94 @@ +import sys +from jsonschema import validate, RefResolver, Draft202012Validator +import json +from pathlib import Path +import logging +import argparse + + + +# filename = sys.argv[1] + +# def load_json (path): +# with open(path) as f: +# s = json.load(f) +# return s + +# schema_store = {} + +# json_instance = load_json(filename) +# print (json_instance) + +# etsi_schema = load_json('response.schema.json') +# ext_schema = load_json('extended.schema.json') +# ext_ent_schema = load_json("extended_entities.schema.json") +# schema_store = { +# etsi_schema['$id'] : etsi_schema, +# ext_schema['$id'] : ext_schema, +# ext_ent_schema['$id'] : ext_ent_schema +# } + +# resolver = RefResolver(None, referrer=None, store=schema_store) + +# print (etsi_schema) + +# v = Draft202012Validator(ext_schema, resolver=resolver) +# v.validate(json_instance) + +# validate(json_instance, ext_schema) +# print ("OK") + +def handle_uri(u): + print(u) + +def load_json(path : str): + with open(path) as f: + return json.load(f) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument('-s','--schemadir', action="append", help="Directory containing supporting schema files to use for validation") + parser.add_argument('-v', '--verbose', action="count", help="Verbose logging (can be specified multiple times)") + parser.add_argument('schema', help="Primary schema to validate against") + parser.add_argument('filename', help="JSON instance document to validate") + + args = parser.parse_args() + + match args.verbose: + case v if v and v >= 2: + logging.basicConfig(level=logging.DEBUG) + case 1: + logging.basicConfig(level=logging.INFO) + case _: + logging.basicConfig(level=logging.WARNING) + + logging.debug(f"Arguments: {args}") + + instance_doc = load_json(args.filename) + main_schema = load_json(args.schema) + schema_dict = { main_schema['$id'] : main_schema } + + if args.schemadir: + schema_paths = [] + for d in args.schemadir: + schema_paths += [f for f in Path(d).rglob("*.schema.json")] + logging.info(f"Schema files loaded: {schema_paths}") + + schemas_json = [json.load(p.open()) for p in schema_paths] + schema_dict = schema_dict | { s['$id'] : s for s in schemas_json } + + logging.info(f"Schema IDs loaded: {[k for k in schema_dict.keys()]}") + + logging.debug (f"Instance doc: {instance_doc}") + logging.debug (f"Main schema: {main_schema}") + + resolver = RefResolver(None, + referrer=None, + store=schema_dict) + + v = Draft202012Validator(main_schema, resolver=resolver) + + v.validate(instance_doc) + + logging.info("Done") \ No newline at end of file diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py new file mode 100644 index 0000000..2655bd7 --- /dev/null +++ b/utils/xml_to_json.py @@ -0,0 +1,42 @@ +import xmltodict +import sys +from pprint import pprint +import json +from pathlib import Path + + +def extract_prefixes (d): + return { k.split(':')[1]: d[k] for k in d.keys() if k.startswith("@xmlns:") } + +def removePrefixes (o, prefixes): + if not isinstance(o, dict): return + replacements = [] + for k,v in o.items(): + if isinstance(v, dict): + removePrefixes(v, prefixes) + if isinstance(v, list): + for i in v: + removePrefixes(i, prefixes) + if ":" in k: + prefix = k.split(':')[0] + if (prefix) in prefixes: + new_key = k.split(':')[1] + replacements.append( (k, new_key) ) + for r in replacements: + print(r) + o[r[1]] = o.pop(r[0]) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print ("Usage: xml_to_json.py filename") + + p = Path(sys.argv[1]) + s = p.read_text() + print(s) + + d = xmltodict.parse(s)['HI1Message'] + + prefixes = extract_prefixes(d) + removePrefixes(d, prefixes) + + print(d) -- GitLab From 140cfeaa6e59e735a914366e1af196f5ff3e2e4a Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 18 May 2023 16:04:56 +0100 Subject: [PATCH 03/18] Adding new stuff --- 103120/examples/fragment.json | 11 + 103120/examples/fragment.schema.json | 4 + 103120/examples/request1b.json | 43 ++ 103120/examples/request1c.json | 33 + 103120/examples/request1d.json | 47 ++ 103120/schema/json/TS_103_280.schema.json | 389 ++++++++++ .../json/ts_103120_Authorisation.schema.json | 148 ++++ .../schema/json/ts_103120_Common.schema.json | 164 +++++ 103120/schema/json/ts_103120_Core.schema.json | 589 +++++++++++++++ .../json/ts_103120_Delivery.schema.json | 209 ++++++ .../json/ts_103120_Document.schema.json | 148 ++++ .../json/ts_103120_Notification.schema.json | 103 +++ 103120/schema/json/ts_103120_Task.schema.json | 599 +++++++++++++++ .../json/ts_103120_TrafficPolicy.schema.json | 198 +++++ 103120/utils/validate.py | 94 --- 103120/utils/xml_to_json.py | 12 - 103280/TS_103_280.schema.json | 686 +++++++++--------- 17 files changed, 3029 insertions(+), 448 deletions(-) create mode 100644 103120/examples/fragment.json create mode 100644 103120/examples/fragment.schema.json create mode 100644 103120/examples/request1b.json create mode 100644 103120/examples/request1c.json create mode 100644 103120/examples/request1d.json create mode 100644 103120/schema/json/TS_103_280.schema.json create mode 100644 103120/schema/json/ts_103120_Authorisation.schema.json create mode 100644 103120/schema/json/ts_103120_Common.schema.json create mode 100644 103120/schema/json/ts_103120_Core.schema.json create mode 100644 103120/schema/json/ts_103120_Delivery.schema.json create mode 100644 103120/schema/json/ts_103120_Document.schema.json create mode 100644 103120/schema/json/ts_103120_Notification.schema.json create mode 100644 103120/schema/json/ts_103120_Task.schema.json create mode 100644 103120/schema/json/ts_103120_TrafficPolicy.schema.json delete mode 100644 103120/utils/validate.py delete mode 100644 103120/utils/xml_to_json.py diff --git a/103120/examples/fragment.json b/103120/examples/fragment.json new file mode 100644 index 0000000..98a6bfc --- /dev/null +++ b/103120/examples/fragment.json @@ -0,0 +1,11 @@ +{ + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "GB", + "OwnerIdentifier": "ACTOR01", + "AuthorisationReference": "W000001", + "AuthorisationTimespan": { + "StartTime": "2015-09-01T12:00:00Z", + "EndTime": "2015-12-01T12:00:00Z" + } +} \ No newline at end of file diff --git a/103120/examples/fragment.schema.json b/103120/examples/fragment.schema.json new file mode 100644 index 0000000..80124bc --- /dev/null +++ b/103120/examples/fragment.schema.json @@ -0,0 +1,4 @@ +{ + "$id": "ts_103120_Authorisation_2020_09", + "$ref" : "ts_103120_Authorisation_2020_09#/$defs/AuthorisationObject" +} \ No newline at end of file diff --git a/103120/examples/request1b.json b/103120/examples/request1b.json new file mode 100644 index 0000000..82b1a1e --- /dev/null +++ b/103120/examples/request1b.json @@ -0,0 +1,43 @@ +{ + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 0, + "CREATE": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "AuthorisationReference": "W000001", + "AuthorisationTimespan": { + "StartTime": "2015-09-01T12:00:00Z", + "EndTime": "2015-12-01T12:00:00Z" + } + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/103120/examples/request1c.json b/103120/examples/request1c.json new file mode 100644 index 0000000..645f706 --- /dev/null +++ b/103120/examples/request1c.json @@ -0,0 +1,33 @@ +{ + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 1, + "GET": { + "Identifier" : "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/103120/examples/request1d.json b/103120/examples/request1d.json new file mode 100644 index 0000000..bf34f7f --- /dev/null +++ b/103120/examples/request1d.json @@ -0,0 +1,47 @@ +{ + "Header" : { + "SenderIdentifier" : { + "CountryCode" : "XX", + "UniqueIdentifier" : "ACTOR01" + }, + "ReceiverIdentifier" : { + "CountryCode" : "YY", + "UniqueIdentifier" : "ACTOR02" + }, + "TransactionIdentifier" : "c4a09046-61da-485b-83f2-ca12caebf40b", + "Timestamp" : "2022-06-10T15:50:00.000000Z", + "Version" : { + "ETSIVersion" : "V1.11.2", + "NationalProfileOwner" : "NA", + "NationalProfileVersion" : "NA" + } + }, + "Payload" : { + "ResponsePayload" : { + "ActionResponses" : { + "ActionResponse" : [{ + "ActionIdentifier" : 0, + "CREATEResponse" : { + "Identifier" : "f25dec16-927c-433b-959c-1886182cac58", + "HI1Object" : { + "xsiType" : "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", + "ObjectIdentifier" : "d980e335-d17a-471f-bb40-cddf4457fd6b", + "Reference" : "LIID", + "TargetIdentifier" : { + "TargetIdentifierValues" : { + "TargetIdentifierValue" : [ { + "FormatType" : { + "FormatOwner" : "ETSI", + "FormatName" : "InternationalE164" + }, + "Value" : "447700900123" + } ] + } + } + } + } + }] + } + } + } +} diff --git a/103120/schema/json/TS_103_280.schema.json b/103120/schema/json/TS_103_280.schema.json new file mode 100644 index 0000000..474b3ee --- /dev/null +++ b/103120/schema/json/TS_103_280.schema.json @@ -0,0 +1,389 @@ +{ + "$id": "ts_103280_2017_07", + "$defs": { + "ShortString": { + "type": "string", + "maxLength": 255 + }, + "LongString": { + "type": "string", + "maxLength": 65535 + }, + "LIID": { + "type": "string", + "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" + }, + "UTCDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" + }, + "UTCMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" + }, + "QualifiedDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "QualifiedMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "InternationalE164": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "IMSI": { + "type": "string", + "pattern": "^[0-9]{6,15}$" + }, + "IMEI": { + "type": "string", + "pattern": "^[0-9]{14}$" + }, + "IMEICheckDigit": { + "type": "string", + "pattern": "^[0-9]{15}$" + }, + "IMEISV": { + "type": "string", + "pattern": "^[0-9]{16}$" + }, + "IPv4Address": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" + }, + "IPv4CIDR": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" + }, + "IPv6Address": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" + }, + "IPv6CIDR": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" + }, + "TCPPort": { + "type": "integer", + "exclusiveMinimum": 1, + "maximum": 65535 + }, + "UDPPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "MACAddress": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" + }, + "EmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" + } + ] + }, + "UUID": { + "type": "string", + "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" + }, + "ISOCountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "SIPURI": { + "type": "string", + "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "TELURI": { + "type": "string", + "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "WGS84LatitudeDecimal": { + "type": "string", + "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" + }, + "WGS84LongitudeDecimal": { + "type": "string", + "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" + }, + "WGS84LatitudeAngular": { + "type": "string", + "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" + }, + "WGS84LongitudeAngular": { + "type": "string", + "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" + }, + "SUPIIMSI": { + "$ref": "#/$defs/IMSI" + }, + "SUPINAI": { + "$ref": "#/$defs/NAI" + }, + "SUCI": { + "type": "string", + "pattern": "^([a-fA-F0-9]{2})*$" + }, + "PEIIMEI": { + "$ref": "#/$defs/IMEI" + }, + "PEIIMEICheckDigit": { + "$ref": "#/$defs/IMEICheckDigit" + }, + "PEIIMEISV": { + "$ref": "#/$defs/IMEISV" + }, + "GPSIMSISDN": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "GPSINAI": { + "$ref": "#/$defs/NAI" + }, + "NAI": { + "type": "string" + }, + "LDID": { + "type": "string", + "pattern": "^([A-Z]{2}-.+-.+)$" + }, + "InternationalizedEmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^.+@.+$" + } + ] + }, + "EUI64": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" + }, + "CGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" + }, + "ECGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" + }, + "NCGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" + }, + "ICCID": { + "type": "string", + "pattern": "^[0-9]{19,20}$" + }, + "IPProtocol": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "IPAddress": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4Address": { + "$ref": "#/$defs/IPv4Address" + } + }, + "required": [ + "IPv4Address" + ] + }, + { + "type": "object", + "properties": { + "IPv6Address": { + "$ref": "#/$defs/IPv6Address" + } + }, + "required": [ + "IPv6Address" + ] + } + ] + }, + "IPCIDR": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4CIDR": { + "$ref": "#/$defs/IPv4CIDR" + } + }, + "required": [ + "IPv4CIDR" + ] + }, + { + "type": "object", + "properties": { + "IPv6CIDR": { + "$ref": "#/$defs/IPv6CIDR" + } + }, + "required": [ + "IPv6CIDR" + ] + } + ] + }, + "TCPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/TCPPort" + }, + "end": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "UDPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/UDPPort" + }, + "end": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "Port": { + "oneOf": [ + { + "type": "object", + "properties": { + "TCPPort": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "TCPPort" + ] + }, + { + "type": "object", + "properties": { + "UDPPort": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "UDPPort" + ] + } + ] + }, + "PortRange": { + "oneOf": [ + { + "type": "object", + "properties": { + "TCPPortRange": { + "$ref": "#/$defs/TCPPortRange" + } + }, + "required": [ + "TCPPortRange" + ] + }, + { + "type": "object", + "properties": { + "UDPPortRange": { + "$ref": "#/$defs/UDPPortRange" + } + }, + "required": [ + "UDPPortRange" + ] + } + ] + }, + "IPAddressPort": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "port": { + "$ref": "#/$defs/Port" + } + }, + "required": [ + "address", + "port" + ] + }, + "IPAddressPortRange": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "portRange": { + "$ref": "#/$defs/PortRange" + } + }, + "required": [ + "address", + "portRange" + ] + }, + "WGS84CoordinateDecimal": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeDecimal" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeDecimal" + } + }, + "required": [ + "latitude", + "longitude" + ] + }, + "WGS84CoordinateAngular": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeAngular" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeAngular" + } + }, + "required": [ + "latitude", + "longitude" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Authorisation.schema.json b/103120/schema/json/ts_103120_Authorisation.schema.json new file mode 100644 index 0000000..a6f8162 --- /dev/null +++ b/103120/schema/json/ts_103120_Authorisation.schema.json @@ -0,0 +1,148 @@ +{ + "$id": "ts_103120_Authorisation_2020_09", + "$defs": { + "AuthorisationObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "AuthorisationReference": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AuthorisationLegalType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "AuthorisationPriority": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "AuthorisationStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "AuthorisationDesiredStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "AuthorisationTimespan": { + "$ref": "#/$defs/AuthorisationTimespan" + }, + "AuthorisationCSPID": { + "$ref": "#/$defs/AuthorisationCSPID" + }, + "AuthorisationCreationTimestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "AuthorisationServedTimestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "AuthorisationTerminationTimestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "AuthorisationApprovalDetails": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" + } + }, + "AuthorisationInvalidReason": { + "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" + }, + "AuthorisationFlags": { + "$ref": "#/$defs/AuthorisationFlags" + }, + "AuthorisationManualInformation": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "NationalAuthorisationParameters": { + "$ref": "#/$defs/NationalAuthorisationParameters" + }, + "AuthorisationJurisdiction": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AuthorisationTypeOfCase": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "AuthorisationLegalEntity": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "AuthorisationFlags": { + "type": "object", + "properties": { + "AuthorisationFlag": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + } + }, + "required": [] + }, + "AuthorisationTimespan": { + "type": "object", + "properties": { + "StartTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "EndTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "required": [] + }, + "AuthorisationCSPID": { + "type": "object", + "properties": { + "CSPID": { + "type": "array", + "items": { + "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" + }, + "minItems": 1 + } + }, + "required": [] + }, + "NationalAuthorisationParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Common.schema.json b/103120/schema/json/ts_103120_Common.schema.json new file mode 100644 index 0000000..2149684 --- /dev/null +++ b/103120/schema/json/ts_103120_Common.schema.json @@ -0,0 +1,164 @@ +{ + "$id": "ts_103120_Common_2016_02", + "$defs": { + "ETSIVersion": { + "allOf": [ + { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^V\\d+\\.\\d+\\.\\d+$" + } + ] + }, + "DictionaryEntry": { + "type": "object", + "properties": { + "Owner": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Name": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Value": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [ + "Owner", + "Name", + "Value" + ] + }, + "ApprovalDetails": { + "type": "object", + "properties": { + "ApprovalType": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApprovalDescription": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApprovalReference": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApproverDetails": { + "$ref": "#/$defs/ApproverDetails" + }, + "ApprovalTimestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "ApprovalIsEmergency": { + "type": "boolean" + }, + "ApprovalDigitalSignature": { + "$ref": "#/$defs/ApprovalDigitalSignature" + }, + "ApprovalNationalDetails": { + "$ref": "#/$defs/ApprovalNationalDetails" + } + }, + "required": [] + }, + "ApproverDetails": { + "type": "object", + "properties": { + "ApproverName": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApproverRole": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApproverIdentity": { + "$ref": "#/$defs/ApproverIdentity" + }, + "ApproverContactDetails": { + "type": "array", + "items": { + "$ref": "#/$defs/ApproverContactDetails" + } + } + }, + "required": [] + }, + "ApproverIdentity": { + "oneOf": [ + { + "type": "object", + "properties": { + "NationalApproverIdentity": { + "$ref": "#/$defs/NationalApproverIdentity" + } + }, + "required": [ + "NationalApproverIdentity" + ] + } + ] + }, + "ApproverContactDetails": { + "type": "object", + "properties": { + "ApproverAlternateName": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ApproverEmailAddress": { + "$ref": "ts_103280_2017_07#/$defs/InternationalizedEmailAddress" + }, + "ApproverPhoneNumber": { + "$ref": "ts_103280_2017_07#/$defs/InternationalE164" + } + }, + "required": [] + }, + "NationalApproverIdentity": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "ApprovalDigitalSignature": { + "oneOf": [ + { + "type": "object", + "properties": { + "NationalDigitalSignature": { + "$ref": "#/$defs/NationalDigitalSignature" + } + }, + "required": [ + "NationalDigitalSignature" + ] + } + ] + }, + "ApprovalNationalDetails": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "NationalDigitalSignature": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Core.schema.json b/103120/schema/json/ts_103120_Core.schema.json new file mode 100644 index 0000000..ee2852b --- /dev/null +++ b/103120/schema/json/ts_103120_Core.schema.json @@ -0,0 +1,589 @@ +{ + "$id": "ts_103120_Core_2019_10", + "$defs": { + "ObjectIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/UUID" + }, + "HI1Message": { + "type": "object", + "properties": { + "Header": { + "$ref": "#/$defs/MessageHeader" + }, + "Payload": { + "$ref": "#/$defs/MessagePayload" + }, + "Signature": { + "$ref": "www.w3.org_2000_09_xmldsig##/$defs/SignatureType" + } + }, + "required": [ + "Header", + "Payload" + ] + }, + "MessageHeader": { + "type": "object", + "properties": { + "SenderIdentifier": { + "$ref": "#/$defs/EndpointID" + }, + "ReceiverIdentifier": { + "$ref": "#/$defs/EndpointID" + }, + "TransactionIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/UUID" + }, + "Timestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedMicrosecondDateTime" + }, + "Version": { + "$ref": "#/$defs/Version" + } + }, + "required": [ + "SenderIdentifier", + "ReceiverIdentifier", + "TransactionIdentifier", + "Timestamp", + "Version" + ] + }, + "Version": { + "type": "object", + "properties": { + "ETSIVersion": { + "$ref": "ts_103120_Common_2016_02#/$defs/ETSIVersion" + }, + "NationalProfileOwner": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "NationalProfileVersion": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [ + "ETSIVersion", + "NationalProfileOwner", + "NationalProfileVersion" + ] + }, + "EndpointID": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "UniqueIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "CountryCode", + "UniqueIdentifier" + ] + }, + "MessagePayload": { + "oneOf": [ + { + "type": "object", + "properties": { + "RequestPayload": { + "$ref": "#/$defs/RequestPayload" + } + }, + "required": [ + "RequestPayload" + ] + }, + { + "type": "object", + "properties": { + "ResponsePayload": { + "$ref": "#/$defs/ResponsePayload" + } + }, + "required": [ + "ResponsePayload" + ] + } + ] + }, + "RequestPayload": { + "type": "object", + "properties": { + "ActionRequests": { + "$ref": "#/$defs/ActionRequests" + } + }, + "required": [ + "ActionRequests" + ] + }, + "ActionRequests": { + "type": "object", + "properties": { + "ActionRequest": { + "type": "array", + "items": { + "$ref": "#/$defs/ActionRequest" + }, + "minItems": 1 + } + }, + "required": [] + }, + "ResponsePayload": { + "oneOf": [ + { + "type": "object", + "properties": { + "ActionResponses": { + "$ref": "#/$defs/ActionResponses" + } + }, + "required": [ + "ActionResponses" + ] + }, + { + "type": "object", + "properties": { + "ErrorInformation": { + "$ref": "#/$defs/ActionUnsuccesfulInformation" + } + }, + "required": [ + "ErrorInformation" + ] + } + ] + }, + "ActionResponses": { + "type": "object", + "properties": { + "ActionResponse": { + "type": "array", + "items": { + "$ref": "#/$defs/ActionResponse" + }, + "minItems": 1 + } + }, + "required": [] + }, + "ActionRequest": { + "allOf": [ + { + "type": "object", + "properties": { + "ActionIdentifier": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "ActionIdentifier" + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "GET": { + "$ref": "#/$defs/GETRequest" + } + }, + "required": [ + "GET" + ] + }, + { + "type": "object", + "properties": { + "CREATE": { + "$ref": "#/$defs/CREATERequest" + } + }, + "required": [ + "CREATE" + ] + }, + { + "type": "object", + "properties": { + "UPDATE": { + "$ref": "#/$defs/UPDATERequest" + } + }, + "required": [ + "UPDATE" + ] + }, + { + "type": "object", + "properties": { + "LIST": { + "$ref": "#/$defs/LISTRequest" + } + }, + "required": [ + "LIST" + ] + }, + { + "type": "object", + "properties": { + "DELIVER": { + "$ref": "#/$defs/DELIVERRequest" + } + }, + "required": [ + "DELIVER" + ] + } + ] + } + ] + }, + "ActionResponse": { + "allOf": [ + { + "type": "object", + "properties": { + "ActionIdentifier": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "ActionIdentifier" + ] + }, + { + "oneOf": [ + { + "type": "object", + "properties": { + "GETResponse": { + "$ref": "#/$defs/GETResponse" + } + }, + "required": [ + "GETResponse" + ] + }, + { + "type": "object", + "properties": { + "CREATEResponse": { + "$ref": "#/$defs/CREATEResponse" + } + }, + "required": [ + "CREATEResponse" + ] + }, + { + "type": "object", + "properties": { + "UPDATEResponse": { + "$ref": "#/$defs/UPDATEResponse" + } + }, + "required": [ + "UPDATEResponse" + ] + }, + { + "type": "object", + "properties": { + "LISTResponse": { + "$ref": "#/$defs/LISTResponse" + } + }, + "required": [ + "LISTResponse" + ] + }, + { + "type": "object", + "properties": { + "ErrorInformation": { + "$ref": "#/$defs/ActionUnsuccesfulInformation" + } + }, + "required": [ + "ErrorInformation" + ] + }, + { + "type": "object", + "properties": { + "DELIVERResponse": { + "$ref": "#/$defs/DELIVERResponse" + } + }, + "required": [ + "DELIVERResponse" + ] + } + ] + } + ] + }, + "GETRequest": { + "type": "object", + "properties": { + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + } + }, + "required": [ + "Identifier" + ] + }, + "GETResponse": { + "type": "object", + "properties": { + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "HI1Object" + ] + }, + "CREATERequest": { + "type": "object", + "properties": { + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "HI1Object" + ] + }, + "CREATEResponse": { + "type": "object", + "properties": { + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + }, + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "Identifier" + ] + }, + "UPDATERequest": { + "type": "object", + "properties": { + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "HI1Object" + ] + }, + "UPDATEResponse": { + "type": "object", + "properties": { + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + }, + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "Identifier" + ] + }, + "LISTRequest": { + "type": "object", + "properties": { + "ObjectType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "required": [] + }, + "LISTResponse": { + "type": "object", + "properties": { + "ListResponseRecord": { + "type": "array", + "items": { + "$ref": "#/$defs/ListResponseRecord" + } + } + }, + "required": [] + }, + "ListResponseRecord": { + "type": "object", + "properties": { + "ObjectType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "required": [ + "ObjectType", + "Identifier", + "Generation" + ] + }, + "ActionUnsuccesfulInformation": { + "type": "object", + "properties": { + "ErrorCode": { + "type": "integer", + "minimum": 0 + }, + "ErrorDescription": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "ErrorCode", + "ErrorDescription" + ] + }, + "DELIVERRequest": { + "type": "object", + "properties": { + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + }, + "HI1Object": { + "$ref": "#/$defs/ConcreteHI1Object" + } + }, + "required": [ + "Identifier", + "HI1Object" + ] + }, + "DELIVERResponse": { + "type": "object", + "properties": { + "Identifier": { + "$ref": "#/$defs/ObjectIdentifier" + } + }, + "required": [ + "Identifier" + ] + }, + "HI1Object": { + "type": "object", + "properties": { + "ObjectIdentifier": { + "$ref": "#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "#/$defs/NationalHandlingParameters" + } + }, + "required": [ + "ObjectIdentifier" + ] + }, + "AssociatedObjects": { + "type": "object", + "properties": { + "AssociatedObject": { + "type": "array", + "items": { + "$ref": "#/$defs/ObjectIdentifier" + } + } + }, + "required": [] + }, + "NationalHandlingParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "ConcreteHI1Object": { + "oneOf": [ + { + "$ref": "ts_103120_Authorisation_2020_09#/$defs/AuthorisationObject" + }, + { + "$ref": "ts_103120_Task_2020_09#/$defs/LITaskObject" + }, + { + "$ref": "ts_103120_Task_2020_09#/$defs/LDTaskObject" + }, + { + "$ref": "ts_103120_Document_2020_09#/$defs/DocumentObject" + }, + { + "$ref": "ts_103120_Notification_2016_02#/$defs/NotificationObject" + }, + { + "$ref": "ts_103120_Delivery_2019_10#/$defs/DeliveryObject" + }, + { + "$ref": "ts_103120_TrafficPolicy_2022_07#/$defs/TrafficPolicyObject" + } + ] + } + }, + "$ref": "#/$defs/HI1Message" +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Delivery.schema.json b/103120/schema/json/ts_103120_Delivery.schema.json new file mode 100644 index 0000000..07ca697 --- /dev/null +++ b/103120/schema/json/ts_103120_Delivery.schema.json @@ -0,0 +1,209 @@ +{ + "$id": "ts_103120_Delivery_2019_10", + "$defs": { + "DeliveryObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2019/10/Delivery}DeliveryObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "Reference": { + "$ref": "#/$defs/Reference" + }, + "DeliveryID": { + "$ref": "ts_103280_2017_07#/$defs/UUID" + }, + "SequenceNumber": { + "type": "integer", + "minimum": 0 + }, + "LastSequence": { + "type": "boolean" + }, + "Manifest": { + "$ref": "#/$defs/Manifest" + }, + "Delivery": { + "$ref": "#/$defs/Delivery" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "Reference": { + "oneOf": [ + { + "type": "object", + "properties": { + "LDID": { + "$ref": "ts_103280_2017_07#/$defs/LDID" + } + }, + "required": [ + "LDID" + ] + }, + { + "type": "object", + "properties": { + "LIID": { + "$ref": "ts_103280_2017_07#/$defs/LIID" + } + }, + "required": [ + "LIID" + ] + } + ] + }, + "Manifest": { + "oneOf": [ + { + "type": "object", + "properties": { + "Specification": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + }, + "required": [ + "Specification" + ] + }, + { + "type": "object", + "properties": { + "ExternalSchema": { + "$ref": "#/$defs/ExternalSchema" + } + }, + "required": [ + "ExternalSchema" + ] + } + ] + }, + "ExternalSchema": { + "type": "object", + "properties": { + "ManifestID": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "ManifestContents": { + "$ref": "#/$defs/ManifestContents" + } + }, + "required": [] + }, + "ManifestContents": { + "oneOf": [ + { + "type": "object", + "properties": { + "BinaryData": { + "$ref": "#/$defs/EmbeddedBinaryData" + } + }, + "required": [ + "BinaryData" + ] + }, + { + "type": "object", + "properties": { + "XMLSchema": { + "$ref": "#/$defs/SchemaContent" + } + }, + "required": [ + "XMLSchema" + ] + } + ] + }, + "SchemaContent": { + "type": "object", + "properties": { + "schema": {} + }, + "required": [ + "schema" + ] + }, + "Delivery": { + "oneOf": [ + { + "type": "object", + "properties": { + "BinaryData": { + "$ref": "#/$defs/EmbeddedBinaryData" + } + }, + "required": [ + "BinaryData" + ] + }, + { + "type": "object", + "properties": { + "XMLData": { + "$ref": "#/$defs/EmbeddedXMLData" + } + }, + "required": [ + "XMLData" + ] + } + ] + }, + "EmbeddedBinaryData": { + "type": "object", + "properties": { + "Data": { + "type": "string", + "pattern": "^[-A-Za-z0-9+/]*={0,3}$" + }, + "ContentType": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Checksum": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "ChecksumType": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [ + "Data" + ] + }, + "EmbeddedXMLData": {} + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Document.schema.json b/103120/schema/json/ts_103120_Document.schema.json new file mode 100644 index 0000000..fc85e13 --- /dev/null +++ b/103120/schema/json/ts_103120_Document.schema.json @@ -0,0 +1,148 @@ +{ + "$id": "ts_103120_Document_2020_09", + "$defs": { + "DocumentObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2020/09/Document}DocumentObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "DocumentReference": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "DocumentName": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "DocumentStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DocumentDesiredStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DocumentTimespan": { + "$ref": "#/$defs/DocumentTimespan" + }, + "DocumentType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DocumentProperties": { + "$ref": "#/$defs/DocumentProperties" + }, + "DocumentBody": { + "$ref": "#/$defs/DocumentBody" + }, + "DocumentSignature": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" + } + }, + "DocumentInvalidReason": { + "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" + }, + "NationalDocumentParameters": { + "$ref": "#/$defs/NationalDocumentParameters" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "DocumentTimespan": { + "type": "object", + "properties": { + "StartTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "EndTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "required": [] + }, + "DocumentProperties": { + "type": "object", + "properties": { + "DocumentProperty": { + "type": "array", + "items": { + "$ref": "#/$defs/DocumentProperty" + } + } + }, + "required": [] + }, + "DocumentProperty": { + "type": "object", + "properties": { + "PropertyType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "PropertyValue": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "PropertyType", + "PropertyValue" + ] + }, + "DocumentBody": { + "type": "object", + "properties": { + "Contents": { + "type": "string", + "pattern": "^[-A-Za-z0-9+/]*={0,3}$" + }, + "ContentType": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Checksum": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "ChecksumType": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [] + }, + "NationalDocumentParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Notification.schema.json b/103120/schema/json/ts_103120_Notification.schema.json new file mode 100644 index 0000000..dffab1a --- /dev/null +++ b/103120/schema/json/ts_103120_Notification.schema.json @@ -0,0 +1,103 @@ +{ + "$id": "ts_103120_Notification_2016_02", + "$defs": { + "NotificationObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2016/02/Notification}NotificationObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "NotificationDetails": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "NotificationType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "NewNotification": { + "type": "boolean" + }, + "NotificationTimestamp": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "StatusOfAssociatedObjects": { + "$ref": "#/$defs/ListOfAssociatedObjectStatus" + }, + "NationalNotificationParameters": { + "$ref": "#/$defs/NationalNotificationParameters" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "ListOfAssociatedObjectStatus": { + "type": "object", + "properties": { + "AssociatedObjectStatus": { + "type": "array", + "items": { + "$ref": "#/$defs/AssociatedObjectStatus" + }, + "minItems": 1 + } + }, + "required": [] + }, + "AssociatedObjectStatus": { + "type": "object", + "properties": { + "AssociatedObject": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "Status": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "Details": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "AssociatedObject", + "Status" + ] + }, + "NationalNotificationParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Task.schema.json b/103120/schema/json/ts_103120_Task.schema.json new file mode 100644 index 0000000..d19e1ee --- /dev/null +++ b/103120/schema/json/ts_103120_Task.schema.json @@ -0,0 +1,599 @@ +{ + "$id": "ts_103120_Task_2020_09", + "$defs": { + "LITaskObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "Reference": { + "$ref": "ts_103280_2017_07#/$defs/LIID" + }, + "Status": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DesiredStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "Timespan": { + "$ref": "#/$defs/TaskTimespan" + }, + "TargetIdentifier": { + "$ref": "#/$defs/TargetIdentifier" + }, + "DeliveryType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DeliveryDetails": { + "$ref": "#/$defs/TaskDeliveryDetails" + }, + "ApprovalDetails": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" + } + }, + "CSPID": { + "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" + }, + "HandlingProfile": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "InvalidReason": { + "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" + }, + "Flags": { + "$ref": "#/$defs/TaskFlags" + }, + "NationalLITaskingParameters": { + "$ref": "#/$defs/NationalLITaskingParameters" + }, + "ListOfTrafficPolicyReferences": { + "$ref": "#/$defs/ListOfTrafficPolicyReferences" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "TaskTimespan": { + "type": "object", + "properties": { + "StartTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "EndTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "TerminationTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "ProvisioningTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "DeprovisioningTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "required": [] + }, + "TargetIdentifier": { + "type": "object", + "properties": { + "TargetIdentifierValues": { + "$ref": "#/$defs/TargetIdentifierValues" + }, + "ServiceType": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + }, + "required": [] + }, + "TargetIdentifierValues": { + "type": "object", + "properties": { + "TargetIdentifierValue": { + "type": "array", + "items": { + "$ref": "#/$defs/TargetIdentifierValue" + }, + "minItems": 1 + } + }, + "required": [] + }, + "TargetIdentifierValue": { + "type": "object", + "properties": { + "FormatType": { + "$ref": "#/$defs/FormatType" + }, + "Value": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "FormatType", + "Value" + ] + }, + "FormatType": { + "type": "object", + "properties": { + "FormatOwner": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "FormatName": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [ + "FormatOwner", + "FormatName" + ] + }, + "TaskDeliveryDetails": { + "type": "object", + "properties": { + "DeliveryDestination": { + "type": "array", + "items": { + "$ref": "#/$defs/DeliveryDestination" + }, + "minItems": 1 + } + }, + "required": [] + }, + "DeliveryDestination": { + "type": "object", + "properties": { + "DeliveryAddress": { + "$ref": "#/$defs/DeliveryAddress" + }, + "EncryptionDetails": { + "$ref": "#/$defs/NationalEncryptionDetails" + }, + "IRIorCC": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "HandoverFormat": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "DeliveryProfile": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "NationalDeliveryParameters": { + "$ref": "#/$defs/NationalDeliveryParameters" + } + }, + "required": [] + }, + "DeliveryAddress": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4Address": { + "$ref": "ts_103280_2017_07#/$defs/IPv4Address" + } + }, + "required": [ + "IPv4Address" + ] + }, + { + "type": "object", + "properties": { + "IPv6Address": { + "$ref": "ts_103280_2017_07#/$defs/IPv6Address" + } + }, + "required": [ + "IPv6Address" + ] + }, + { + "type": "object", + "properties": { + "IPAddressPort": { + "$ref": "ts_103280_2017_07#/$defs/IPAddressPort" + } + }, + "required": [ + "IPAddressPort" + ] + }, + { + "type": "object", + "properties": { + "IPAddressPortRange": { + "$ref": "ts_103280_2017_07#/$defs/IPAddressPortRange" + } + }, + "required": [ + "IPAddressPortRange" + ] + }, + { + "type": "object", + "properties": { + "E164Number": { + "$ref": "ts_103280_2017_07#/$defs/InternationalE164" + } + }, + "required": [ + "E164Number" + ] + }, + { + "type": "object", + "properties": { + "FTPAddress": { + "type": "string" + } + }, + "required": [ + "FTPAddress" + ] + }, + { + "type": "object", + "properties": { + "URL": { + "type": "string" + } + }, + "required": [ + "URL" + ] + }, + { + "type": "object", + "properties": { + "FQDN": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "FQDN" + ] + }, + { + "type": "object", + "properties": { + "EmailAddress": { + "$ref": "ts_103280_2017_07#/$defs/EmailAddress" + } + }, + "required": [ + "EmailAddress" + ] + }, + { + "type": "object", + "properties": { + "EndpointID": { + "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" + } + }, + "required": [ + "EndpointID" + ] + }, + { + "type": "object", + "properties": { + "DeliveryInformationID": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "DeliveryInformationID" + ] + } + ] + }, + "TaskFlags": { + "type": "object", + "properties": { + "TaskFlag": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + } + }, + "required": [] + }, + "NationalLITaskingParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "NationalDeliveryParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "NationalEncryptionDetails": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "LDTaskObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2020/09/Task}LDTaskObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "Reference": { + "$ref": "ts_103280_2017_07#/$defs/LDID" + }, + "Status": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "StatusReason": { + "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" + }, + "DesiredStatus": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "RequestDetails": { + "$ref": "#/$defs/RequestDetails" + }, + "DeliveryDetails": { + "$ref": "#/$defs/LDDeliveryDetails" + }, + "ApprovalDetails": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" + } + }, + "CSPID": { + "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" + }, + "HandlingProfile": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "Flags": { + "$ref": "#/$defs/LDTaskFlags" + }, + "NationalLDTaskingParameters": { + "$ref": "#/$defs/NationalLDTaskingParameters" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "RequestDetails": { + "type": "object", + "properties": { + "Type": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "StartTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "EndTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "ObservedTime": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "ObservedTimes": { + "type": "array", + "items": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + } + }, + "RequestValues": { + "$ref": "#/$defs/RequestValues" + }, + "Subtype": { + "$ref": "#/$defs/RequestSubtype" + } + }, + "required": [] + }, + "RequestValues": { + "type": "object", + "properties": { + "RequestValue": { + "type": "array", + "items": { + "$ref": "#/$defs/RequestValue" + }, + "minItems": 1 + } + }, + "required": [] + }, + "RequestValue": { + "type": "object", + "properties": { + "FormatType": { + "$ref": "#/$defs/FormatType" + }, + "Value": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + } + }, + "required": [ + "FormatType", + "Value" + ] + }, + "RequestSubtype": { + "type": "object", + "properties": { + "RequestSubtype": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "minItems": 1 + } + }, + "required": [] + }, + "LDDeliveryDetails": { + "type": "object", + "properties": { + "LDDeliveryDestination": { + "type": "array", + "items": { + "$ref": "#/$defs/LDDeliveryDestination" + }, + "minItems": 1 + } + }, + "required": [] + }, + "LDDeliveryDestination": { + "type": "object", + "properties": { + "DeliveryAddress": { + "$ref": "#/$defs/DeliveryAddress" + }, + "EncryptionDetails": { + "$ref": "#/$defs/NationalEncryptionDetails" + }, + "LDHandoverFormat": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "LDDeliveryProfile": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + }, + "NationalDeliveryParameters": { + "$ref": "#/$defs/NationalDeliveryParameters" + } + }, + "required": [] + }, + "LDTaskFlags": { + "type": "object", + "properties": { + "LDTaskFlag": { + "type": "array", + "items": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + } + }, + "required": [] + }, + "NationalLDTaskingParameters": { + "type": "object", + "properties": { + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + } + }, + "required": [ + "CountryCode" + ] + }, + "ListOfTrafficPolicyReferences": { + "type": "object", + "properties": { + "TrafficPolicyReference": { + "type": "array", + "items": { + "$ref": "#/$defs/TrafficPolicyReference" + }, + "minItems": 1 + } + }, + "required": [] + }, + "TrafficPolicyReference": { + "type": "object", + "properties": { + "Order": { + "type": "integer", + "minimum": 1 + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + } + }, + "required": [] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_TrafficPolicy.schema.json b/103120/schema/json/ts_103120_TrafficPolicy.schema.json new file mode 100644 index 0000000..53fe978 --- /dev/null +++ b/103120/schema/json/ts_103120_TrafficPolicy.schema.json @@ -0,0 +1,198 @@ +{ + "$id": "ts_103120_TrafficPolicy_2022_07", + "$defs": { + "TrafficPolicyObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2022/07/TrafficPolicy}TrafficPolicyObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "TrafficPolicyName": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "TrafficRules": { + "$ref": "#/$defs/ListOfTrafficRuleReferences" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "ListOfTrafficRuleReferences": { + "type": "object", + "properties": { + "TrafficRuleReference": { + "type": "array", + "items": { + "$ref": "#/$defs/TrafficRuleReference" + }, + "minItems": 1 + } + }, + "required": [] + }, + "TrafficRuleReference": { + "type": "object", + "properties": { + "Order": { + "type": "integer", + "minimum": 1 + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + } + }, + "required": [ + "Order", + "ObjectIdentifier" + ] + }, + "TrafficRuleObject": { + "type": "object", + "properties": { + "@xsi:type": { + "type": "string", + "enum": "{http://uri.etsi.org/03120/common/2022/07/TrafficPolicy}TrafficRuleObject" + }, + "ObjectIdentifier": { + "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" + }, + "CountryCode": { + "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" + }, + "OwnerIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "Generation": { + "type": "integer", + "minimum": 0 + }, + "ExternalIdentifier": { + "$ref": "ts_103280_2017_07#/$defs/LongString" + }, + "AssociatedObjects": { + "$ref": "ts_103120_Core_2019_10#/$defs/AssociatedObjects" + }, + "LastChanged": { + "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" + }, + "NationalHandlingParameters": { + "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" + }, + "Criteria": { + "$ref": "#/$defs/ListOfTrafficCriteria" + }, + "Action": { + "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" + } + }, + "required": [ + "@xsi:type", + "ObjectIdentifier" + ] + }, + "ListOfTrafficCriteria": { + "type": "object", + "properties": { + "Criteria": { + "type": "array", + "items": { + "$ref": "#/$defs/TrafficCriteria" + }, + "minItems": 1 + } + }, + "required": [] + }, + "TrafficCriteria": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPPolicyCriteria": { + "$ref": "#/$defs/IPPolicyCriteria" + } + }, + "required": [ + "IPPolicyCriteria" + ] + }, + { + "type": "object", + "properties": { + "MobileAccessPolicyCriteria": { + "$ref": "#/$defs/MobileAccessPolicyCriteria" + } + }, + "required": [ + "MobileAccessPolicyCriteria" + ] + } + ] + }, + "IPPolicyCriteria": { + "type": "object", + "properties": { + "IPProtocol": { + "type": "integer", + "minimum": 0 + }, + "SourceIPRange": { + "$ref": "ts_103280_2017_07#/$defs/IPCIDR" + }, + "SourcePortRange": { + "$ref": "ts_103280_2017_07#/$defs/PortRange" + }, + "DestinationIPRange": { + "$ref": "ts_103280_2017_07#/$defs/IPCIDR" + }, + "DestinationPortRange": { + "$ref": "ts_103280_2017_07#/$defs/PortRange" + }, + "BothDirections": { + "type": "boolean" + } + }, + "required": [] + }, + "MobileAccessPolicyCriteria": { + "type": "object", + "properties": { + "APN": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + }, + "DNN": { + "$ref": "ts_103280_2017_07#/$defs/ShortString" + } + }, + "required": [] + } + } +} \ No newline at end of file diff --git a/103120/utils/validate.py b/103120/utils/validate.py deleted file mode 100644 index a290ed3..0000000 --- a/103120/utils/validate.py +++ /dev/null @@ -1,94 +0,0 @@ -import sys -from jsonschema import validate, RefResolver, Draft202012Validator -import json -from pathlib import Path -import logging -import argparse - - - -# filename = sys.argv[1] - -# def load_json (path): -# with open(path) as f: -# s = json.load(f) -# return s - -# schema_store = {} - -# json_instance = load_json(filename) -# print (json_instance) - -# etsi_schema = load_json('response.schema.json') -# ext_schema = load_json('extended.schema.json') -# ext_ent_schema = load_json("extended_entities.schema.json") -# schema_store = { -# etsi_schema['$id'] : etsi_schema, -# ext_schema['$id'] : ext_schema, -# ext_ent_schema['$id'] : ext_ent_schema -# } - -# resolver = RefResolver(None, referrer=None, store=schema_store) - -# print (etsi_schema) - -# v = Draft202012Validator(ext_schema, resolver=resolver) -# v.validate(json_instance) - -# validate(json_instance, ext_schema) -# print ("OK") - -def handle_uri(u): - print(u) - -def load_json(path : str): - with open(path) as f: - return json.load(f) - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - - parser.add_argument('-s','--schemadir', action="append", help="Directory containing supporting schema files to use for validation") - parser.add_argument('-v', '--verbose', action="count", help="Verbose logging (can be specified multiple times)") - parser.add_argument('schema', help="Primary schema to validate against") - parser.add_argument('filename', help="JSON instance document to validate") - - args = parser.parse_args() - - match args.verbose: - case v if v and v >= 2: - logging.basicConfig(level=logging.DEBUG) - case 1: - logging.basicConfig(level=logging.INFO) - case _: - logging.basicConfig(level=logging.WARNING) - - logging.debug(f"Arguments: {args}") - - instance_doc = load_json(args.filename) - main_schema = load_json(args.schema) - schema_dict = { main_schema['$id'] : main_schema } - - if args.schemadir: - schema_paths = [] - for d in args.schemadir: - schema_paths += [f for f in Path(d).rglob("*.schema.json")] - logging.info(f"Schema files loaded: {schema_paths}") - - schemas_json = [json.load(p.open()) for p in schema_paths] - schema_dict = schema_dict | { s['$id'] : s for s in schemas_json } - - logging.info(f"Schema IDs loaded: {[k for k in schema_dict.keys()]}") - - logging.debug (f"Instance doc: {instance_doc}") - logging.debug (f"Main schema: {main_schema}") - - resolver = RefResolver(None, - referrer=None, - store=schema_dict) - - v = Draft202012Validator(main_schema, resolver=resolver) - - v.validate(instance_doc) - - logging.info("Done") \ No newline at end of file diff --git a/103120/utils/xml_to_json.py b/103120/utils/xml_to_json.py deleted file mode 100644 index 0615a03..0000000 --- a/103120/utils/xml_to_json.py +++ /dev/null @@ -1,12 +0,0 @@ -import xmltodict -from pprint import pprint -import json - -with open('../examples/request1.xml') as f: - s = f.read() - -d = xmltodict.parse(s) -pprint (d) - -with open('../examples/request.json', 'w') as f2: - f2.write(json.dumps(d)) \ No newline at end of file diff --git a/103280/TS_103_280.schema.json b/103280/TS_103_280.schema.json index 523a1a5..474b3ee 100644 --- a/103280/TS_103_280.schema.json +++ b/103280/TS_103_280.schema.json @@ -1,387 +1,389 @@ -{ - "$id" : "http://etsi.org/temp/280", - "$schema" : "https://json-schema.org/draft/2020-12/schema", - "title" : "ETSI TS 103 280 (temp)", - "description" : "A stubbed version of TS 103 280 definitions (need a CR to 280 for this)", - "$defs": { - "ShortString": { - "type": "string", - "maxLength": 255 - }, - "LongString": { - "type": "string", - "maxLength": 65535 - }, - "LIID": { - "type": "string", - "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" - }, - "UTCDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" - }, - "UTCMicrosecondDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" - }, - "QualifiedDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" - }, - "QualifiedMicrosecondDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" - }, - "InternationalE164": { - "type": "string", - "pattern": "^[0-9]{1,15}$" - }, - "IMSI": { - "type": "string", - "pattern": "^[0-9]{6,15}$" - }, - "IMEI": { - "type": "string", - "pattern": "^[0-9]{14}$" - }, - "IMEICheckDigit": { - "type": "string", - "pattern": "^[0-9]{15}$" - }, - "IMEISV": { - "type": "string", - "pattern": "^[0-9]{16}$" - }, - "IPv4Address": { - "type": "string", - "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" - }, - "IPv4CIDR": { - "type": "string", - "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" - }, - "IPv6Address": { - "type": "string", - "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" - }, - "IPv6CIDR": { - "type": "string", - "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" - }, - "TCPPort": { - "type": "integer", - "exclusiveMinimum": 1, - "maximum": 65535 - }, - "UDPPort": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "MACAddress": { - "type": "string", - "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" - }, - "EmailAddress": { - "allOf": [ - { - "$ref": "#/$defs/ShortString" - }, - { - "type": "string", - "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" - } - ] - }, - "UUID": { - "type": "string", - "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" - }, - "ISOCountryCode": { - "type": "string", - "pattern": "^[A-Z]{2}$" - }, - "SIPURI": { - "type": "string", - "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" - }, - "TELURI": { - "type": "string", - "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" - }, - "WGS84LatitudeDecimal": { - "type": "string", - "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" - }, - "WGS84LongitudeDecimal": { - "type": "string", - "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" - }, - "WGS84LatitudeAngular": { - "type": "string", - "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" - }, - "WGS84LongitudeAngular": { - "type": "string", - "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" - }, - "SUPIIMSI": { - "$ref": "#/$defs/IMSI" - }, - "SUPINAI": { - "$ref": "#/$defs/NAI" - }, - "SUCI": { - "type": "string", - "pattern": "^([a-fA-F0-9]{2})*$" - }, - "PEIIMEI": { - "$ref": "#/$defs/IMEI" - }, - "PEIIMEICheckDigit": { - "$ref": "#/$defs/IMEICheckDigit" - }, - "PEIIMEISV": { - "$ref": "#/$defs/IMEISV" - }, - "GPSIMSISDN": { - "type": "string", - "pattern": "^[0-9]{1,15}$" - }, - "GPSINAI": { - "$ref": "#/$defs/NAI" - }, - "NAI": { - "type": "string" - }, - "LDID": { - "type": "string", - "pattern": "^([A-Z]{2}-.+-.+)$" - }, - "InternationalizedEmailAddress": { - "allOf": [ - { - "$ref": "#/$defs/ShortString" - }, - { - "type": "string", - "pattern": "^.+@.+$" - } - ] - }, - "EUI64": { - "type": "string", - "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" - }, - "CGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" - }, - "ECGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" - }, - "NCGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" - }, - "ICCID": { - "type": "string", - "pattern": "^[0-9]{19,20}$" - }, - "IPAddress": { - "oneOf": [ - { - "type": "object", - "properties": { - "IPv4Address": { - "$ref": "#/$defs/IPv4Address" - } - }, - "required": [ - "IPv4Address" - ] - }, - { - "type": "object", - "properties": { - "IPv6Address": { - "$ref": "#/$defs/IPv6Address" - } - }, - "required": [ - "IPv6Address" - ] - } - ] - }, - "IPCIDR": { - "oneOf": [ - { - "type": "object", - "properties": { - "IPv4CIDR": { - "$ref": "#/$defs/IPv4CIDR" - } - }, - "required": [ - "IPv4CIDR" - ] - }, - { - "type": "object", - "properties": { - "IPv6CIDR": { - "$ref": "#/$defs/IPv6CIDR" - } - }, - "required": [ - "IPv6CIDR" - ] - } - ] - }, - "TCPPortRange": { +{ + "$id": "ts_103280_2017_07", + "$defs": { + "ShortString": { + "type": "string", + "maxLength": 255 + }, + "LongString": { + "type": "string", + "maxLength": 65535 + }, + "LIID": { + "type": "string", + "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" + }, + "UTCDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" + }, + "UTCMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" + }, + "QualifiedDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "QualifiedMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "InternationalE164": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "IMSI": { + "type": "string", + "pattern": "^[0-9]{6,15}$" + }, + "IMEI": { + "type": "string", + "pattern": "^[0-9]{14}$" + }, + "IMEICheckDigit": { + "type": "string", + "pattern": "^[0-9]{15}$" + }, + "IMEISV": { + "type": "string", + "pattern": "^[0-9]{16}$" + }, + "IPv4Address": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" + }, + "IPv4CIDR": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" + }, + "IPv6Address": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" + }, + "IPv6CIDR": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" + }, + "TCPPort": { + "type": "integer", + "exclusiveMinimum": 1, + "maximum": 65535 + }, + "UDPPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "MACAddress": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" + }, + "EmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" + } + ] + }, + "UUID": { + "type": "string", + "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" + }, + "ISOCountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "SIPURI": { + "type": "string", + "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "TELURI": { + "type": "string", + "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "WGS84LatitudeDecimal": { + "type": "string", + "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" + }, + "WGS84LongitudeDecimal": { + "type": "string", + "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" + }, + "WGS84LatitudeAngular": { + "type": "string", + "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" + }, + "WGS84LongitudeAngular": { + "type": "string", + "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" + }, + "SUPIIMSI": { + "$ref": "#/$defs/IMSI" + }, + "SUPINAI": { + "$ref": "#/$defs/NAI" + }, + "SUCI": { + "type": "string", + "pattern": "^([a-fA-F0-9]{2})*$" + }, + "PEIIMEI": { + "$ref": "#/$defs/IMEI" + }, + "PEIIMEICheckDigit": { + "$ref": "#/$defs/IMEICheckDigit" + }, + "PEIIMEISV": { + "$ref": "#/$defs/IMEISV" + }, + "GPSIMSISDN": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "GPSINAI": { + "$ref": "#/$defs/NAI" + }, + "NAI": { + "type": "string" + }, + "LDID": { + "type": "string", + "pattern": "^([A-Z]{2}-.+-.+)$" + }, + "InternationalizedEmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^.+@.+$" + } + ] + }, + "EUI64": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" + }, + "CGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" + }, + "ECGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" + }, + "NCGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" + }, + "ICCID": { + "type": "string", + "pattern": "^[0-9]{19,20}$" + }, + "IPProtocol": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "IPAddress": { + "oneOf": [ + { "type": "object", "properties": { - "start": { - "$ref": "#/$defs/TCPPort" - }, - "end": { - "$ref": "#/$defs/TCPPort" + "IPv4Address": { + "$ref": "#/$defs/IPv4Address" } }, "required": [ - "start", - "end" + "IPv4Address" ] }, - "UDPPortRange": { + { "type": "object", "properties": { - "start": { - "$ref": "#/$defs/UDPPort" - }, - "end": { - "$ref": "#/$defs/UDPPort" + "IPv6Address": { + "$ref": "#/$defs/IPv6Address" } }, "required": [ - "start", - "end" + "IPv6Address" ] - }, - "Port": { - "oneOf": [ - { - "type": "object", - "properties": { - "TCPPort": { - "$ref": "#/$defs/TCPPort" - } - }, - "required": [ - "TCPPort" - ] - }, - { - "type": "object", - "properties": { - "UDPPort": { - "$ref": "#/$defs/UDPPort" - } - }, - "required": [ - "UDPPort" - ] + } + ] + }, + "IPCIDR": { + "oneOf": [ + { + "type": "object", + "properties": { + "IPv4CIDR": { + "$ref": "#/$defs/IPv4CIDR" } + }, + "required": [ + "IPv4CIDR" ] }, - "PortRange": { - "oneOf": [ - { - "type": "object", - "properties": { - "TCPPortRange": { - "$ref": "#/$defs/TCPPortRange" - } - }, - "required": [ - "TCPPortRange" - ] - }, - { - "type": "object", - "properties": { - "UDPPortRange": { - "$ref": "#/$defs/UDPPortRange" - } - }, - "required": [ - "UDPPortRange" - ] + { + "type": "object", + "properties": { + "IPv6CIDR": { + "$ref": "#/$defs/IPv6CIDR" } + }, + "required": [ + "IPv6CIDR" ] - }, - "IPAddressPort": { + } + ] + }, + "TCPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/TCPPort" + }, + "end": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "UDPPortRange": { + "type": "object", + "properties": { + "start": { + "$ref": "#/$defs/UDPPort" + }, + "end": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "start", + "end" + ] + }, + "Port": { + "oneOf": [ + { "type": "object", "properties": { - "address": { - "$ref": "#/$defs/IPAddress" - }, - "port": { - "$ref": "#/$defs/Port" + "TCPPort": { + "$ref": "#/$defs/TCPPort" } }, "required": [ - "address", - "port" + "TCPPort" ] }, - "IPAddressPortRange": { + { "type": "object", "properties": { - "address": { - "$ref": "#/$defs/IPAddress" - }, - "portRange": { - "$ref": "#/$defs/PortRange" + "UDPPort": { + "$ref": "#/$defs/UDPPort" } }, "required": [ - "address", - "portRange" + "UDPPort" ] - }, - "WGS84CoordinateDecimal": { + } + ] + }, + "PortRange": { + "oneOf": [ + { "type": "object", "properties": { - "latitude": { - "$ref": "#/$defs/WGS84LatitudeDecimal" - }, - "longitude": { - "$ref": "#/$defs/WGS84LongitudeDecimal" + "TCPPortRange": { + "$ref": "#/$defs/TCPPortRange" } }, "required": [ - "latitude", - "longitude" + "TCPPortRange" ] }, - "WGS84CoordinateAngular": { + { "type": "object", "properties": { - "latitude": { - "$ref": "#/$defs/WGS84LatitudeAngular" - }, - "longitude": { - "$ref": "#/$defs/WGS84LongitudeAngular" + "UDPPortRange": { + "$ref": "#/$defs/UDPPortRange" } }, "required": [ - "latitude", - "longitude" + "UDPPortRange" ] } - } -} \ No newline at end of file + ] + }, + "IPAddressPort": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "port": { + "$ref": "#/$defs/Port" + } + }, + "required": [ + "address", + "port" + ] + }, + "IPAddressPortRange": { + "type": "object", + "properties": { + "address": { + "$ref": "#/$defs/IPAddress" + }, + "portRange": { + "$ref": "#/$defs/PortRange" + } + }, + "required": [ + "address", + "portRange" + ] + }, + "WGS84CoordinateDecimal": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeDecimal" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeDecimal" + } + }, + "required": [ + "latitude", + "longitude" + ] + }, + "WGS84CoordinateAngular": { + "type": "object", + "properties": { + "latitude": { + "$ref": "#/$defs/WGS84LatitudeAngular" + }, + "longitude": { + "$ref": "#/$defs/WGS84LongitudeAngular" + } + }, + "required": [ + "latitude", + "longitude" + ] + } + } +} \ No newline at end of file -- GitLab From 8767a24f118cecaa9e6f9eb3cb418ca0fa5ac5dc Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 19 May 2023 09:30:54 +0100 Subject: [PATCH 04/18] Preparing to keep namespaces --- utils/xml_to_json.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index 2655bd7..9d51972 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -23,7 +23,6 @@ def removePrefixes (o, prefixes): new_key = k.split(':')[1] replacements.append( (k, new_key) ) for r in replacements: - print(r) o[r[1]] = o.pop(r[0]) if __name__ == "__main__": @@ -32,11 +31,10 @@ if __name__ == "__main__": p = Path(sys.argv[1]) s = p.read_text() - print(s) d = xmltodict.parse(s)['HI1Message'] prefixes = extract_prefixes(d) removePrefixes(d, prefixes) - print(d) + print(json.dumps(d)) -- GitLab From 1c87ce5116143e7fef0f15055cc33edb59d637fa Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 23 May 2023 17:50:11 +0100 Subject: [PATCH 05/18] Updates to converter --- utils/xml_to_json.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index 9d51972..a85d48a 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -1,8 +1,12 @@ -import xmltodict import sys +import logging from pprint import pprint import json from pathlib import Path +import fileinput + +import xmltodict +import argparse def extract_prefixes (d): @@ -26,12 +30,32 @@ def removePrefixes (o, prefixes): o[r[1]] = o.pop(r[0]) if __name__ == "__main__": - if len(sys.argv) < 2: - print ("Usage: xml_to_json.py filename") + parser = argparse.ArgumentParser() + parser.add_argument('-v', '--verbose', action='count', help='Verbose logging (can be specified multiple times)') + parser.add_argument('-i', '--input', type=argparse.FileType('r'), default=sys.stdin, help="Path to input file (if absent, stdin is used)") + args = parser.parse_args() + + match args.verbose: + case v if v and v >= 2: + logging.basicConfig(level=logging.DEBUG) + case 1: + logging.basicConfig(level=logging.INFO) + case _: + logging.basicConfig(level=logging.WARNING) + + logging.debug(f"Arguments: {args}") - p = Path(sys.argv[1]) - s = p.read_text() + # if (args.input): + # logging.info(f"Reading from {args.input}") + # with open(args.input) as f: + # s = f.read() + # else: + # logging.info(f"Reading from stdin") + # s = sys.stdin.read() + s = args.input.read() + args.input.close() + logging.debug(s) d = xmltodict.parse(s)['HI1Message'] prefixes = extract_prefixes(d) -- GitLab From 46a6583adb46b9e93475c6fde2a9995900f70f70 Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 23 May 2023 17:52:47 +0100 Subject: [PATCH 06/18] Moving 280 schema --- 103120/schema/json/TS_103_280.schema.json | 389 ---------------------- 1 file changed, 389 deletions(-) delete mode 100644 103120/schema/json/TS_103_280.schema.json diff --git a/103120/schema/json/TS_103_280.schema.json b/103120/schema/json/TS_103_280.schema.json deleted file mode 100644 index 474b3ee..0000000 --- a/103120/schema/json/TS_103_280.schema.json +++ /dev/null @@ -1,389 +0,0 @@ -{ - "$id": "ts_103280_2017_07", - "$defs": { - "ShortString": { - "type": "string", - "maxLength": 255 - }, - "LongString": { - "type": "string", - "maxLength": 65535 - }, - "LIID": { - "type": "string", - "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" - }, - "UTCDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" - }, - "UTCMicrosecondDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" - }, - "QualifiedDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" - }, - "QualifiedMicrosecondDateTime": { - "type": "string", - "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" - }, - "InternationalE164": { - "type": "string", - "pattern": "^[0-9]{1,15}$" - }, - "IMSI": { - "type": "string", - "pattern": "^[0-9]{6,15}$" - }, - "IMEI": { - "type": "string", - "pattern": "^[0-9]{14}$" - }, - "IMEICheckDigit": { - "type": "string", - "pattern": "^[0-9]{15}$" - }, - "IMEISV": { - "type": "string", - "pattern": "^[0-9]{16}$" - }, - "IPv4Address": { - "type": "string", - "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" - }, - "IPv4CIDR": { - "type": "string", - "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" - }, - "IPv6Address": { - "type": "string", - "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" - }, - "IPv6CIDR": { - "type": "string", - "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" - }, - "TCPPort": { - "type": "integer", - "exclusiveMinimum": 1, - "maximum": 65535 - }, - "UDPPort": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "MACAddress": { - "type": "string", - "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" - }, - "EmailAddress": { - "allOf": [ - { - "$ref": "#/$defs/ShortString" - }, - { - "type": "string", - "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" - } - ] - }, - "UUID": { - "type": "string", - "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" - }, - "ISOCountryCode": { - "type": "string", - "pattern": "^[A-Z]{2}$" - }, - "SIPURI": { - "type": "string", - "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" - }, - "TELURI": { - "type": "string", - "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" - }, - "WGS84LatitudeDecimal": { - "type": "string", - "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" - }, - "WGS84LongitudeDecimal": { - "type": "string", - "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" - }, - "WGS84LatitudeAngular": { - "type": "string", - "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" - }, - "WGS84LongitudeAngular": { - "type": "string", - "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" - }, - "SUPIIMSI": { - "$ref": "#/$defs/IMSI" - }, - "SUPINAI": { - "$ref": "#/$defs/NAI" - }, - "SUCI": { - "type": "string", - "pattern": "^([a-fA-F0-9]{2})*$" - }, - "PEIIMEI": { - "$ref": "#/$defs/IMEI" - }, - "PEIIMEICheckDigit": { - "$ref": "#/$defs/IMEICheckDigit" - }, - "PEIIMEISV": { - "$ref": "#/$defs/IMEISV" - }, - "GPSIMSISDN": { - "type": "string", - "pattern": "^[0-9]{1,15}$" - }, - "GPSINAI": { - "$ref": "#/$defs/NAI" - }, - "NAI": { - "type": "string" - }, - "LDID": { - "type": "string", - "pattern": "^([A-Z]{2}-.+-.+)$" - }, - "InternationalizedEmailAddress": { - "allOf": [ - { - "$ref": "#/$defs/ShortString" - }, - { - "type": "string", - "pattern": "^.+@.+$" - } - ] - }, - "EUI64": { - "type": "string", - "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" - }, - "CGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" - }, - "ECGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" - }, - "NCGI": { - "type": "string", - "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" - }, - "ICCID": { - "type": "string", - "pattern": "^[0-9]{19,20}$" - }, - "IPProtocol": { - "type": "integer", - "minimum": 0, - "maximum": 255 - }, - "IPAddress": { - "oneOf": [ - { - "type": "object", - "properties": { - "IPv4Address": { - "$ref": "#/$defs/IPv4Address" - } - }, - "required": [ - "IPv4Address" - ] - }, - { - "type": "object", - "properties": { - "IPv6Address": { - "$ref": "#/$defs/IPv6Address" - } - }, - "required": [ - "IPv6Address" - ] - } - ] - }, - "IPCIDR": { - "oneOf": [ - { - "type": "object", - "properties": { - "IPv4CIDR": { - "$ref": "#/$defs/IPv4CIDR" - } - }, - "required": [ - "IPv4CIDR" - ] - }, - { - "type": "object", - "properties": { - "IPv6CIDR": { - "$ref": "#/$defs/IPv6CIDR" - } - }, - "required": [ - "IPv6CIDR" - ] - } - ] - }, - "TCPPortRange": { - "type": "object", - "properties": { - "start": { - "$ref": "#/$defs/TCPPort" - }, - "end": { - "$ref": "#/$defs/TCPPort" - } - }, - "required": [ - "start", - "end" - ] - }, - "UDPPortRange": { - "type": "object", - "properties": { - "start": { - "$ref": "#/$defs/UDPPort" - }, - "end": { - "$ref": "#/$defs/UDPPort" - } - }, - "required": [ - "start", - "end" - ] - }, - "Port": { - "oneOf": [ - { - "type": "object", - "properties": { - "TCPPort": { - "$ref": "#/$defs/TCPPort" - } - }, - "required": [ - "TCPPort" - ] - }, - { - "type": "object", - "properties": { - "UDPPort": { - "$ref": "#/$defs/UDPPort" - } - }, - "required": [ - "UDPPort" - ] - } - ] - }, - "PortRange": { - "oneOf": [ - { - "type": "object", - "properties": { - "TCPPortRange": { - "$ref": "#/$defs/TCPPortRange" - } - }, - "required": [ - "TCPPortRange" - ] - }, - { - "type": "object", - "properties": { - "UDPPortRange": { - "$ref": "#/$defs/UDPPortRange" - } - }, - "required": [ - "UDPPortRange" - ] - } - ] - }, - "IPAddressPort": { - "type": "object", - "properties": { - "address": { - "$ref": "#/$defs/IPAddress" - }, - "port": { - "$ref": "#/$defs/Port" - } - }, - "required": [ - "address", - "port" - ] - }, - "IPAddressPortRange": { - "type": "object", - "properties": { - "address": { - "$ref": "#/$defs/IPAddress" - }, - "portRange": { - "$ref": "#/$defs/PortRange" - } - }, - "required": [ - "address", - "portRange" - ] - }, - "WGS84CoordinateDecimal": { - "type": "object", - "properties": { - "latitude": { - "$ref": "#/$defs/WGS84LatitudeDecimal" - }, - "longitude": { - "$ref": "#/$defs/WGS84LongitudeDecimal" - } - }, - "required": [ - "latitude", - "longitude" - ] - }, - "WGS84CoordinateAngular": { - "type": "object", - "properties": { - "latitude": { - "$ref": "#/$defs/WGS84LatitudeAngular" - }, - "longitude": { - "$ref": "#/$defs/WGS84LongitudeAngular" - } - }, - "required": [ - "latitude", - "longitude" - ] - } - } -} \ No newline at end of file -- GitLab From fcf319170c39fcd9e54e8331ce0ea52e9c8cd44d Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 1 Jun 2023 11:46:23 +0100 Subject: [PATCH 07/18] validate can read from stdin --- utils/validate.py | 37 +++---------------------------------- utils/xml_to_json.py | 7 ------- 2 files changed, 3 insertions(+), 41 deletions(-) diff --git a/utils/validate.py b/utils/validate.py index a290ed3..c832631 100644 --- a/utils/validate.py +++ b/utils/validate.py @@ -6,38 +6,6 @@ import logging import argparse - -# filename = sys.argv[1] - -# def load_json (path): -# with open(path) as f: -# s = json.load(f) -# return s - -# schema_store = {} - -# json_instance = load_json(filename) -# print (json_instance) - -# etsi_schema = load_json('response.schema.json') -# ext_schema = load_json('extended.schema.json') -# ext_ent_schema = load_json("extended_entities.schema.json") -# schema_store = { -# etsi_schema['$id'] : etsi_schema, -# ext_schema['$id'] : ext_schema, -# ext_ent_schema['$id'] : ext_ent_schema -# } - -# resolver = RefResolver(None, referrer=None, store=schema_store) - -# print (etsi_schema) - -# v = Draft202012Validator(ext_schema, resolver=resolver) -# v.validate(json_instance) - -# validate(json_instance, ext_schema) -# print ("OK") - def handle_uri(u): print(u) @@ -50,8 +18,8 @@ if __name__ == "__main__": parser.add_argument('-s','--schemadir', action="append", help="Directory containing supporting schema files to use for validation") parser.add_argument('-v', '--verbose', action="count", help="Verbose logging (can be specified multiple times)") + parser.add_argument('-i', '--input', type=argparse.FileType('r'), default=sys.stdin, help="Path to input file (if absent, stdin is used)") parser.add_argument('schema', help="Primary schema to validate against") - parser.add_argument('filename', help="JSON instance document to validate") args = parser.parse_args() @@ -65,7 +33,8 @@ if __name__ == "__main__": logging.debug(f"Arguments: {args}") - instance_doc = load_json(args.filename) + instance_doc = json.loads(args.input.read()) + args.input.close() main_schema = load_json(args.schema) schema_dict = { main_schema['$id'] : main_schema } diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index a85d48a..b8c9e27 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -45,13 +45,6 @@ if __name__ == "__main__": logging.debug(f"Arguments: {args}") - # if (args.input): - # logging.info(f"Reading from {args.input}") - # with open(args.input) as f: - # s = f.read() - # else: - # logging.info(f"Reading from stdin") - # s = sys.stdin.read() s = args.input.read() args.input.close() -- GitLab From f73dee289c15e868e44c1e6da14e42207e76c115 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 2 Jun 2023 12:40:35 +0100 Subject: [PATCH 08/18] Validation giving more helpful messages --- 103120/examples/fragment.json | 41 ++++- 103120/examples/fragment.schema.json | 4 +- 103120/examples/request1.json | 154 +++++++++-------- .../json/ts_103120_Authorisation.schema.json | 48 +++--- .../schema/json/ts_103120_Common.schema.json | 54 +++--- 103120/schema/json/ts_103120_Core.schema.json | 3 +- .../json/ts_103120_Delivery.schema.json | 30 ++-- .../json/ts_103120_Document.schema.json | 48 +++--- .../json/ts_103120_Notification.schema.json | 28 +-- 103120/schema/json/ts_103120_Task.schema.json | 160 +++++++++--------- .../json/ts_103120_TrafficPolicy.schema.json | 36 ++-- test1.json | 90 ++++++++++ test2.json | 1 + utils/request.fragment.schema.json | 4 + utils/translate/SequenceMapping.py | 18 +- utils/translate/TypeMapping.py | 2 +- utils/translate/__init__.py | 2 +- utils/translate_spec.py | 57 +++---- utils/ts103120_config.json | 46 +++-- utils/validate.py | 59 ++++++- utils/xml_to_json.py | 16 +- 21 files changed, 548 insertions(+), 353 deletions(-) create mode 100644 test1.json create mode 100644 test2.json create mode 100644 utils/request.fragment.schema.json diff --git a/103120/examples/fragment.json b/103120/examples/fragment.json index 98a6bfc..44f2f88 100644 --- a/103120/examples/fragment.json +++ b/103120/examples/fragment.json @@ -1,11 +1,38 @@ { - "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", - "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", - "CountryCode": "GB", + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", "OwnerIdentifier": "ACTOR01", - "AuthorisationReference": "W000001", - "AuthorisationTimespan": { - "StartTime": "2015-09-01T12:00:00Z", - "EndTime": "2015-12-01T12:00:00Z" + "AssociatedObjects": { + "AssociatedObject": ["7dbbc880-8750-4d3c-abe7-ea4a17646045"] + }, + "task:Reference": "LIID1", + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": [{ + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" + }] + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": [{ + "task:DeliveryAddress": { + "IPv4Address": "192.0.2.0" + } + }] + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "RECVER01" } + } \ No newline at end of file diff --git a/103120/examples/fragment.schema.json b/103120/examples/fragment.schema.json index 80124bc..afb21c1 100644 --- a/103120/examples/fragment.schema.json +++ b/103120/examples/fragment.schema.json @@ -1,4 +1,4 @@ { - "$id": "ts_103120_Authorisation_2020_09", - "$ref" : "ts_103120_Authorisation_2020_09#/$defs/AuthorisationObject" + "$id": "ts_103120_Task_2020_09", + "$ref" : "#/$defs/RequestPayload" } \ No newline at end of file diff --git a/103120/examples/request1.json b/103120/examples/request1.json index a73501e..d5c90ab 100644 --- a/103120/examples/request1.json +++ b/103120/examples/request1.json @@ -1,91 +1,89 @@ { - "HI1Message": { - "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", - "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", - "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", - "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", - "Header": { - "SenderIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR01" - }, - "ReceiverIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR02" - }, - "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", - "Timestamp": "2015-09-01T12:00:00.000000Z", - "Version": { - "ETSIVersion": "V1.13.1", - "NationalProfileOwner": "XX", - "NationalProfileVersion": "v1.0" - } + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" }, - "Payload": { - "RequestPayload": { - "ActionRequests": { - "ActionRequest": [ - { - "ActionIdentifier": "0", - "CREATE": { - "HI1Object": { - "@xsi:type": "auth:AuthorisationObject", - "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "auth:AuthorisationReference": "W000001", - "auth:AuthorisationTimespan": { - "auth:StartTime": "2015-09-01T12:00:00Z", - "auth:EndTime": "2015-12-01T12:00:00Z" - } + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 0, + "CREATE": { + "HI1Object": { + "@xsi:type": "auth:AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "auth:AuthorisationReference": "W000001", + "auth:AuthorisationTimespan": { + "auth:StartTime": "2015-09-01T12:00:00Z", + "auth:EndTime": "2015-12-01T12:00:00Z" } } - }, - { - "ActionIdentifier": "1", - "CREATE": { - "HI1Object": { - "@xsi:type": "task:LITaskObject", - "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "AssociatedObjects": { - "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" - }, - "task:Reference": "LIID1", - "task:TargetIdentifier": { - "task:TargetIdentifierValues": { - "task:TargetIdentifierValue": { - "task:FormatType": { - "task:FormatOwner": "ETSI", - "task:FormatName": "InternationalE164" - }, - "task:Value": "442079460223" - } + } + }, + { + "ActionIdentifier": 1, + "CREATE": { + "HI1Object": { + "@xsi:type": "task:LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "AssociatedObjects": { + "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" + }, + "task:Reference": "LIID1", + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": { + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" } - }, - "task:DeliveryType": { - "common:Owner": "ETSI", - "common:Name": "TaskDeliveryType", - "common:Value": "IRIandCC" - }, - "task:DeliveryDetails": { - "task:DeliveryDestination": { - "task:DeliveryAddress": { - "task:IPv4Address": "192.0.2.0" - } + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": { + "task:DeliveryAddress": { + "task:IPv4Address": "192.0.2.0" } - }, - "task:CSPID": { - "CountryCode": "XX", - "UniqueIdentifier": "RECVER01" } + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "RECVER01" } } } - ] - } + } + ] } } } diff --git a/103120/schema/json/ts_103120_Authorisation.schema.json b/103120/schema/json/ts_103120_Authorisation.schema.json index a6f8162..1c9a68f 100644 --- a/103120/schema/json/ts_103120_Authorisation.schema.json +++ b/103120/schema/json/ts_103120_Authorisation.schema.json @@ -33,61 +33,61 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "AuthorisationReference": { + "auth:AuthorisationReference": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "AuthorisationLegalType": { + "auth:AuthorisationLegalType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "AuthorisationPriority": { + "auth:AuthorisationPriority": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "AuthorisationStatus": { + "auth:AuthorisationStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "AuthorisationDesiredStatus": { + "auth:AuthorisationDesiredStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "AuthorisationTimespan": { + "auth:AuthorisationTimespan": { "$ref": "#/$defs/AuthorisationTimespan" }, - "AuthorisationCSPID": { + "auth:AuthorisationCSPID": { "$ref": "#/$defs/AuthorisationCSPID" }, - "AuthorisationCreationTimestamp": { + "auth:AuthorisationCreationTimestamp": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "AuthorisationServedTimestamp": { + "auth:AuthorisationServedTimestamp": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "AuthorisationTerminationTimestamp": { + "auth:AuthorisationTerminationTimestamp": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "AuthorisationApprovalDetails": { + "auth:AuthorisationApprovalDetails": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" } }, - "AuthorisationInvalidReason": { + "auth:AuthorisationInvalidReason": { "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" }, - "AuthorisationFlags": { + "auth:AuthorisationFlags": { "$ref": "#/$defs/AuthorisationFlags" }, - "AuthorisationManualInformation": { + "auth:AuthorisationManualInformation": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "NationalAuthorisationParameters": { + "auth:NationalAuthorisationParameters": { "$ref": "#/$defs/NationalAuthorisationParameters" }, - "AuthorisationJurisdiction": { + "auth:AuthorisationJurisdiction": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "AuthorisationTypeOfCase": { + "auth:AuthorisationTypeOfCase": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "AuthorisationLegalEntity": { + "auth:AuthorisationLegalEntity": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, @@ -99,7 +99,7 @@ "AuthorisationFlags": { "type": "object", "properties": { - "AuthorisationFlag": { + "auth:AuthorisationFlag": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" @@ -111,10 +111,10 @@ "AuthorisationTimespan": { "type": "object", "properties": { - "StartTime": { + "auth:StartTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "EndTime": { + "auth:EndTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" } }, @@ -123,7 +123,7 @@ "AuthorisationCSPID": { "type": "object", "properties": { - "CSPID": { + "auth:CSPID": { "type": "array", "items": { "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" @@ -136,12 +136,12 @@ "NationalAuthorisationParameters": { "type": "object", "properties": { - "CountryCode": { + "auth:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "auth:CountryCode" ] } } diff --git a/103120/schema/json/ts_103120_Common.schema.json b/103120/schema/json/ts_103120_Common.schema.json index 2149684..2564e8d 100644 --- a/103120/schema/json/ts_103120_Common.schema.json +++ b/103120/schema/json/ts_103120_Common.schema.json @@ -15,47 +15,47 @@ "DictionaryEntry": { "type": "object", "properties": { - "Owner": { + "common:Owner": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "Name": { + "common:Name": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "Value": { + "common:Value": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, "required": [ - "Owner", - "Name", - "Value" + "common:Owner", + "common:Name", + "common:Value" ] }, "ApprovalDetails": { "type": "object", "properties": { - "ApprovalType": { + "common:ApprovalType": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApprovalDescription": { + "common:ApprovalDescription": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApprovalReference": { + "common:ApprovalReference": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApproverDetails": { + "common:ApproverDetails": { "$ref": "#/$defs/ApproverDetails" }, - "ApprovalTimestamp": { + "common:ApprovalTimestamp": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "ApprovalIsEmergency": { + "common:ApprovalIsEmergency": { "type": "boolean" }, - "ApprovalDigitalSignature": { + "common:ApprovalDigitalSignature": { "$ref": "#/$defs/ApprovalDigitalSignature" }, - "ApprovalNationalDetails": { + "common:ApprovalNationalDetails": { "$ref": "#/$defs/ApprovalNationalDetails" } }, @@ -64,16 +64,16 @@ "ApproverDetails": { "type": "object", "properties": { - "ApproverName": { + "common:ApproverName": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApproverRole": { + "common:ApproverRole": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApproverIdentity": { + "common:ApproverIdentity": { "$ref": "#/$defs/ApproverIdentity" }, - "ApproverContactDetails": { + "common:ApproverContactDetails": { "type": "array", "items": { "$ref": "#/$defs/ApproverContactDetails" @@ -100,13 +100,13 @@ "ApproverContactDetails": { "type": "object", "properties": { - "ApproverAlternateName": { + "common:ApproverAlternateName": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ApproverEmailAddress": { + "common:ApproverEmailAddress": { "$ref": "ts_103280_2017_07#/$defs/InternationalizedEmailAddress" }, - "ApproverPhoneNumber": { + "common:ApproverPhoneNumber": { "$ref": "ts_103280_2017_07#/$defs/InternationalE164" } }, @@ -115,12 +115,12 @@ "NationalApproverIdentity": { "type": "object", "properties": { - "CountryCode": { + "common:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "common:CountryCode" ] }, "ApprovalDigitalSignature": { @@ -141,23 +141,23 @@ "ApprovalNationalDetails": { "type": "object", "properties": { - "CountryCode": { + "common:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "common:CountryCode" ] }, "NationalDigitalSignature": { "type": "object", "properties": { - "CountryCode": { + "common:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "common:CountryCode" ] } } diff --git a/103120/schema/json/ts_103120_Core.schema.json b/103120/schema/json/ts_103120_Core.schema.json index ee2852b..f116d31 100644 --- a/103120/schema/json/ts_103120_Core.schema.json +++ b/103120/schema/json/ts_103120_Core.schema.json @@ -13,7 +13,8 @@ "Payload": { "$ref": "#/$defs/MessagePayload" }, - "Signature": { + "Signature": {}, + "xmldsig:Signature": { "$ref": "www.w3.org_2000_09_xmldsig##/$defs/SignatureType" } }, diff --git a/103120/schema/json/ts_103120_Delivery.schema.json b/103120/schema/json/ts_103120_Delivery.schema.json index 07ca697..3d79eb2 100644 --- a/103120/schema/json/ts_103120_Delivery.schema.json +++ b/103120/schema/json/ts_103120_Delivery.schema.json @@ -33,23 +33,23 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "Reference": { + "delivery:Reference": { "$ref": "#/$defs/Reference" }, - "DeliveryID": { + "delivery:DeliveryID": { "$ref": "ts_103280_2017_07#/$defs/UUID" }, - "SequenceNumber": { + "delivery:SequenceNumber": { "type": "integer", "minimum": 0 }, - "LastSequence": { + "delivery:LastSequence": { "type": "boolean" }, - "Manifest": { + "delivery:Manifest": { "$ref": "#/$defs/Manifest" }, - "Delivery": { + "delivery:Delivery": { "$ref": "#/$defs/Delivery" } }, @@ -113,10 +113,10 @@ "ExternalSchema": { "type": "object", "properties": { - "ManifestID": { + "delivery:ManifestID": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "ManifestContents": { + "delivery:ManifestContents": { "$ref": "#/$defs/ManifestContents" } }, @@ -151,10 +151,10 @@ "SchemaContent": { "type": "object", "properties": { - "schema": {} + "delivery:schema": {} }, "required": [ - "schema" + "delivery:schema" ] }, "Delivery": { @@ -186,22 +186,22 @@ "EmbeddedBinaryData": { "type": "object", "properties": { - "Data": { + "delivery:Data": { "type": "string", "pattern": "^[-A-Za-z0-9+/]*={0,3}$" }, - "ContentType": { + "delivery:ContentType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "Checksum": { + "delivery:Checksum": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "ChecksumType": { + "delivery:ChecksumType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, "required": [ - "Data" + "delivery:Data" ] }, "EmbeddedXMLData": {} diff --git a/103120/schema/json/ts_103120_Document.schema.json b/103120/schema/json/ts_103120_Document.schema.json index fc85e13..f5b850b 100644 --- a/103120/schema/json/ts_103120_Document.schema.json +++ b/103120/schema/json/ts_103120_Document.schema.json @@ -33,40 +33,40 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "DocumentReference": { + "document:DocumentReference": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "DocumentName": { + "document:DocumentName": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "DocumentStatus": { + "document:DocumentStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DocumentDesiredStatus": { + "document:DocumentDesiredStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DocumentTimespan": { + "document:DocumentTimespan": { "$ref": "#/$defs/DocumentTimespan" }, - "DocumentType": { + "document:DocumentType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DocumentProperties": { + "document:DocumentProperties": { "$ref": "#/$defs/DocumentProperties" }, - "DocumentBody": { + "document:DocumentBody": { "$ref": "#/$defs/DocumentBody" }, - "DocumentSignature": { + "document:DocumentSignature": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" } }, - "DocumentInvalidReason": { + "document:DocumentInvalidReason": { "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" }, - "NationalDocumentParameters": { + "document:NationalDocumentParameters": { "$ref": "#/$defs/NationalDocumentParameters" } }, @@ -78,10 +78,10 @@ "DocumentTimespan": { "type": "object", "properties": { - "StartTime": { + "document:StartTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "EndTime": { + "document:EndTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" } }, @@ -90,7 +90,7 @@ "DocumentProperties": { "type": "object", "properties": { - "DocumentProperty": { + "document:DocumentProperty": { "type": "array", "items": { "$ref": "#/$defs/DocumentProperty" @@ -102,32 +102,32 @@ "DocumentProperty": { "type": "object", "properties": { - "PropertyType": { + "document:PropertyType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "PropertyValue": { + "document:PropertyValue": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "PropertyType", - "PropertyValue" + "document:PropertyType", + "document:PropertyValue" ] }, "DocumentBody": { "type": "object", "properties": { - "Contents": { + "document:Contents": { "type": "string", "pattern": "^[-A-Za-z0-9+/]*={0,3}$" }, - "ContentType": { + "document:ContentType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "Checksum": { + "document:Checksum": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "ChecksumType": { + "document:ChecksumType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, @@ -136,12 +136,12 @@ "NationalDocumentParameters": { "type": "object", "properties": { - "CountryCode": { + "document:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "document:CountryCode" ] } } diff --git a/103120/schema/json/ts_103120_Notification.schema.json b/103120/schema/json/ts_103120_Notification.schema.json index dffab1a..84fbf04 100644 --- a/103120/schema/json/ts_103120_Notification.schema.json +++ b/103120/schema/json/ts_103120_Notification.schema.json @@ -33,22 +33,22 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "NotificationDetails": { + "notification:NotificationDetails": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "NotificationType": { + "notification:NotificationType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "NewNotification": { + "notification:NewNotification": { "type": "boolean" }, - "NotificationTimestamp": { + "notification:NotificationTimestamp": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "StatusOfAssociatedObjects": { + "notification:StatusOfAssociatedObjects": { "$ref": "#/$defs/ListOfAssociatedObjectStatus" }, - "NationalNotificationParameters": { + "notification:NationalNotificationParameters": { "$ref": "#/$defs/NationalNotificationParameters" } }, @@ -60,7 +60,7 @@ "ListOfAssociatedObjectStatus": { "type": "object", "properties": { - "AssociatedObjectStatus": { + "notification:AssociatedObjectStatus": { "type": "array", "items": { "$ref": "#/$defs/AssociatedObjectStatus" @@ -73,30 +73,30 @@ "AssociatedObjectStatus": { "type": "object", "properties": { - "AssociatedObject": { + "notification:AssociatedObject": { "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" }, - "Status": { + "notification:Status": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "Details": { + "notification:Details": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "AssociatedObject", - "Status" + "notification:AssociatedObject", + "notification:Status" ] }, "NationalNotificationParameters": { "type": "object", "properties": { - "CountryCode": { + "notification:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "notification:CountryCode" ] } } diff --git a/103120/schema/json/ts_103120_Task.schema.json b/103120/schema/json/ts_103120_Task.schema.json index d19e1ee..6854a61 100644 --- a/103120/schema/json/ts_103120_Task.schema.json +++ b/103120/schema/json/ts_103120_Task.schema.json @@ -33,49 +33,49 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "Reference": { + "task:Reference": { "$ref": "ts_103280_2017_07#/$defs/LIID" }, - "Status": { + "task:Status": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DesiredStatus": { + "task:DesiredStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "Timespan": { + "task:Timespan": { "$ref": "#/$defs/TaskTimespan" }, - "TargetIdentifier": { + "task:TargetIdentifier": { "$ref": "#/$defs/TargetIdentifier" }, - "DeliveryType": { + "task:DeliveryType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DeliveryDetails": { + "task:DeliveryDetails": { "$ref": "#/$defs/TaskDeliveryDetails" }, - "ApprovalDetails": { + "task:ApprovalDetails": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" } }, - "CSPID": { + "task:CSPID": { "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" }, - "HandlingProfile": { + "task:HandlingProfile": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "InvalidReason": { + "task:InvalidReason": { "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" }, - "Flags": { + "task:Flags": { "$ref": "#/$defs/TaskFlags" }, - "NationalLITaskingParameters": { + "task:NationalLITaskingParameters": { "$ref": "#/$defs/NationalLITaskingParameters" }, - "ListOfTrafficPolicyReferences": { + "task:ListOfTrafficPolicyReferences": { "$ref": "#/$defs/ListOfTrafficPolicyReferences" } }, @@ -87,19 +87,19 @@ "TaskTimespan": { "type": "object", "properties": { - "StartTime": { + "task:StartTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "EndTime": { + "task:EndTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "TerminationTime": { + "task:TerminationTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "ProvisioningTime": { + "task:ProvisioningTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "DeprovisioningTime": { + "task:DeprovisioningTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" } }, @@ -108,10 +108,10 @@ "TargetIdentifier": { "type": "object", "properties": { - "TargetIdentifierValues": { + "task:TargetIdentifierValues": { "$ref": "#/$defs/TargetIdentifierValues" }, - "ServiceType": { + "task:ServiceType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" } }, @@ -120,7 +120,7 @@ "TargetIdentifierValues": { "type": "object", "properties": { - "TargetIdentifierValue": { + "task:TargetIdentifierValue": { "type": "array", "items": { "$ref": "#/$defs/TargetIdentifierValue" @@ -133,37 +133,37 @@ "TargetIdentifierValue": { "type": "object", "properties": { - "FormatType": { + "task:FormatType": { "$ref": "#/$defs/FormatType" }, - "Value": { + "task:Value": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "FormatType", - "Value" + "task:FormatType", + "task:Value" ] }, "FormatType": { "type": "object", "properties": { - "FormatOwner": { + "task:FormatOwner": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "FormatName": { + "task:FormatName": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, "required": [ - "FormatOwner", - "FormatName" + "task:FormatOwner", + "task:FormatName" ] }, "TaskDeliveryDetails": { "type": "object", "properties": { - "DeliveryDestination": { + "task:DeliveryDestination": { "type": "array", "items": { "$ref": "#/$defs/DeliveryDestination" @@ -176,22 +176,22 @@ "DeliveryDestination": { "type": "object", "properties": { - "DeliveryAddress": { + "task:DeliveryAddress": { "$ref": "#/$defs/DeliveryAddress" }, - "EncryptionDetails": { + "task:EncryptionDetails": { "$ref": "#/$defs/NationalEncryptionDetails" }, - "IRIorCC": { + "task:IRIorCC": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "HandoverFormat": { + "task:HandoverFormat": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "DeliveryProfile": { + "task:DeliveryProfile": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "NationalDeliveryParameters": { + "task:NationalDeliveryParameters": { "$ref": "#/$defs/NationalDeliveryParameters" } }, @@ -325,7 +325,7 @@ "TaskFlags": { "type": "object", "properties": { - "TaskFlag": { + "task:TaskFlag": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" @@ -337,34 +337,34 @@ "NationalLITaskingParameters": { "type": "object", "properties": { - "CountryCode": { + "task:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "task:CountryCode" ] }, "NationalDeliveryParameters": { "type": "object", "properties": { - "CountryCode": { + "task:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "task:CountryCode" ] }, "NationalEncryptionDetails": { "type": "object", "properties": { - "CountryCode": { + "task:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "task:CountryCode" ] }, "LDTaskObject": { @@ -399,40 +399,40 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "Reference": { + "task:Reference": { "$ref": "ts_103280_2017_07#/$defs/LDID" }, - "Status": { + "task:Status": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "StatusReason": { + "task:StatusReason": { "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" }, - "DesiredStatus": { + "task:DesiredStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "RequestDetails": { + "task:RequestDetails": { "$ref": "#/$defs/RequestDetails" }, - "DeliveryDetails": { + "task:DeliveryDetails": { "$ref": "#/$defs/LDDeliveryDetails" }, - "ApprovalDetails": { + "task:ApprovalDetails": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" } }, - "CSPID": { + "task:CSPID": { "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" }, - "HandlingProfile": { + "task:HandlingProfile": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "Flags": { + "task:Flags": { "$ref": "#/$defs/LDTaskFlags" }, - "NationalLDTaskingParameters": { + "task:NationalLDTaskingParameters": { "$ref": "#/$defs/NationalLDTaskingParameters" } }, @@ -444,28 +444,28 @@ "RequestDetails": { "type": "object", "properties": { - "Type": { + "task:Type": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "StartTime": { + "task:StartTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "EndTime": { + "task:EndTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "ObservedTime": { + "task:ObservedTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "ObservedTimes": { + "task:ObservedTimes": { "type": "array", "items": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" } }, - "RequestValues": { + "task:RequestValues": { "$ref": "#/$defs/RequestValues" }, - "Subtype": { + "task:Subtype": { "$ref": "#/$defs/RequestSubtype" } }, @@ -474,7 +474,7 @@ "RequestValues": { "type": "object", "properties": { - "RequestValue": { + "task:RequestValue": { "type": "array", "items": { "$ref": "#/$defs/RequestValue" @@ -487,22 +487,22 @@ "RequestValue": { "type": "object", "properties": { - "FormatType": { + "task:FormatType": { "$ref": "#/$defs/FormatType" }, - "Value": { + "task:Value": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "FormatType", - "Value" + "task:FormatType", + "task:Value" ] }, "RequestSubtype": { "type": "object", "properties": { - "RequestSubtype": { + "task:RequestSubtype": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" @@ -515,7 +515,7 @@ "LDDeliveryDetails": { "type": "object", "properties": { - "LDDeliveryDestination": { + "task:LDDeliveryDestination": { "type": "array", "items": { "$ref": "#/$defs/LDDeliveryDestination" @@ -528,19 +528,19 @@ "LDDeliveryDestination": { "type": "object", "properties": { - "DeliveryAddress": { + "task:DeliveryAddress": { "$ref": "#/$defs/DeliveryAddress" }, - "EncryptionDetails": { + "task:EncryptionDetails": { "$ref": "#/$defs/NationalEncryptionDetails" }, - "LDHandoverFormat": { + "task:LDHandoverFormat": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "LDDeliveryProfile": { + "task:LDDeliveryProfile": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "NationalDeliveryParameters": { + "task:NationalDeliveryParameters": { "$ref": "#/$defs/NationalDeliveryParameters" } }, @@ -549,7 +549,7 @@ "LDTaskFlags": { "type": "object", "properties": { - "LDTaskFlag": { + "task:LDTaskFlag": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" @@ -561,18 +561,18 @@ "NationalLDTaskingParameters": { "type": "object", "properties": { - "CountryCode": { + "task:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "CountryCode" + "task:CountryCode" ] }, "ListOfTrafficPolicyReferences": { "type": "object", "properties": { - "TrafficPolicyReference": { + "task:TrafficPolicyReference": { "type": "array", "items": { "$ref": "#/$defs/TrafficPolicyReference" @@ -585,11 +585,11 @@ "TrafficPolicyReference": { "type": "object", "properties": { - "Order": { + "task:Order": { "type": "integer", "minimum": 1 }, - "ObjectIdentifier": { + "task:ObjectIdentifier": { "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" } }, diff --git a/103120/schema/json/ts_103120_TrafficPolicy.schema.json b/103120/schema/json/ts_103120_TrafficPolicy.schema.json index 53fe978..2bbfc17 100644 --- a/103120/schema/json/ts_103120_TrafficPolicy.schema.json +++ b/103120/schema/json/ts_103120_TrafficPolicy.schema.json @@ -33,10 +33,10 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "TrafficPolicyName": { + "tp:TrafficPolicyName": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "TrafficRules": { + "tp:TrafficRules": { "$ref": "#/$defs/ListOfTrafficRuleReferences" } }, @@ -48,7 +48,7 @@ "ListOfTrafficRuleReferences": { "type": "object", "properties": { - "TrafficRuleReference": { + "tp:TrafficRuleReference": { "type": "array", "items": { "$ref": "#/$defs/TrafficRuleReference" @@ -61,17 +61,17 @@ "TrafficRuleReference": { "type": "object", "properties": { - "Order": { + "tp:Order": { "type": "integer", "minimum": 1 }, - "ObjectIdentifier": { + "tp:ObjectIdentifier": { "$ref": "ts_103120_Core_2019_10#/$defs/ObjectIdentifier" } }, "required": [ - "Order", - "ObjectIdentifier" + "tp:Order", + "tp:ObjectIdentifier" ] }, "TrafficRuleObject": { @@ -106,10 +106,10 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "Criteria": { + "tp:Criteria": { "$ref": "#/$defs/ListOfTrafficCriteria" }, - "Action": { + "tp:Action": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" } }, @@ -121,7 +121,7 @@ "ListOfTrafficCriteria": { "type": "object", "properties": { - "Criteria": { + "tp:Criteria": { "type": "array", "items": { "$ref": "#/$defs/TrafficCriteria" @@ -160,23 +160,23 @@ "IPPolicyCriteria": { "type": "object", "properties": { - "IPProtocol": { + "tp:IPProtocol": { "type": "integer", "minimum": 0 }, - "SourceIPRange": { + "tp:SourceIPRange": { "$ref": "ts_103280_2017_07#/$defs/IPCIDR" }, - "SourcePortRange": { + "tp:SourcePortRange": { "$ref": "ts_103280_2017_07#/$defs/PortRange" }, - "DestinationIPRange": { + "tp:DestinationIPRange": { "$ref": "ts_103280_2017_07#/$defs/IPCIDR" }, - "DestinationPortRange": { + "tp:DestinationPortRange": { "$ref": "ts_103280_2017_07#/$defs/PortRange" }, - "BothDirections": { + "tp:BothDirections": { "type": "boolean" } }, @@ -185,10 +185,10 @@ "MobileAccessPolicyCriteria": { "type": "object", "properties": { - "APN": { + "tp:APN": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "DNN": { + "tp:DNN": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, diff --git a/test1.json b/test1.json new file mode 100644 index 0000000..6838b7d --- /dev/null +++ b/test1.json @@ -0,0 +1,90 @@ +{ + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 1, + "CREATE": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "auth:AuthorisationReference": "W000001", + "auth:AuthorisationTimespan": { + "auth:StartTime": "2015-09-01T12:00:00Z", + "auth:EndTime": "2015-12-01T12:00:00Z" + } + } + } + }, + { + "ActionIdentifier": 2, + "CREATE": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "AssociatedObjects": { + "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" + }, + "task:Reference": "LIID1", + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": { + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" + } + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": { + "task:DeliveryAddress": { + "task:IPv4Address": "192.0.2.0" + } + } + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "RECVER01" + } + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/test2.json b/test2.json new file mode 100644 index 0000000..bf5b94c --- /dev/null +++ b/test2.json @@ -0,0 +1 @@ +{"@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", "Header": {"SenderIdentifier": {"CountryCode": "XX", "UniqueIdentifier": "ACTOR01"}, "ReceiverIdentifier": {"CountryCode": "XX", "UniqueIdentifier": "ACTOR02"}, "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", "Timestamp": "2015-09-01T12:00:00.000000Z", "Version": {"ETSIVersion": "V1.13.1", "NationalProfileOwner": "XX", "NationalProfileVersion": "v1.0"}}, "Payload": {"RequestPayload": {"ActionRequests": {"ActionRequest": [{"ActionIdentifier": "0", "CREATE": {"HI1Object": {"@xsi:type": "auth:AuthorisationObject", "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", "CountryCode": "XX", "OwnerIdentifier": "ACTOR01", "auth:AuthorisationReference": "W000001", "auth:AuthorisationTimespan": {"auth:StartTime": "2015-09-01T12:00:00Z", "auth:EndTime": "2015-12-01T12:00:00Z"}}}}, {"ActionIdentifier": "1", "CREATE": {"HI1Object": {"@xsi:type": "task:LITaskObject", "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", "CountryCode": "XX", "OwnerIdentifier": "ACTOR01", "AssociatedObjects": {"AssociatedObject": ["7dbbc880-8750-4d3c-abe7-ea4a17646045", "7dbbc880-8750-4d3c-abe7-ea4a17646045"]}, "task:Reference": "LIID1", "task:TargetIdentifier": {"task:TargetIdentifierValues": {"task:TargetIdentifierValue": {"task:FormatType": {"task:FormatOwner": "ETSI", "task:FormatName": "InternationalE164"}, "task:Value": "442079460223"}}}, "task:DeliveryType": {"common:Owner": "ETSI", "common:Name": "TaskDeliveryType", "common:Value": "IRIandCC"}, "task:DeliveryDetails": {"task:DeliveryDestination": {"task:DeliveryAddress": {"task:IPv4Address": "192.0.2.0"}}}, "task:CSPID": {"CountryCode": "XX", "UniqueIdentifier": "RECVER01"}}}}]}}}} diff --git a/utils/request.fragment.schema.json b/utils/request.fragment.schema.json new file mode 100644 index 0000000..dc2bb14 --- /dev/null +++ b/utils/request.fragment.schema.json @@ -0,0 +1,4 @@ +{ + "$id": "fragment_request", + "$ref" : "#/$defs/RequestPayload" +} \ No newline at end of file diff --git a/utils/translate/SequenceMapping.py b/utils/translate/SequenceMapping.py index 91db5ea..9fd4d69 100644 --- a/utils/translate/SequenceMapping.py +++ b/utils/translate/SequenceMapping.py @@ -45,23 +45,29 @@ class SequenceMapping(ComplexTypeMapping): inner_choice = None for c in list(content.iter_model()): log.debug(f"Processing model item {c}") + print("Model item -------------") if type(c) is XsdElement: + element_name = c.local_name + if c.target_namespace in self.ns_to_id_map: + ns = self.ns_to_id_map[c.target_namespace] + if 'prefix' in ns: + element_name = ns['prefix'] + ":" + element_name if c.effective_max_occurs != 1: - mapped_type['properties'][c.local_name] = { + mapped_type['properties'][element_name] = { "type" : "array", "items" : TypeMapping.get_type_from_elem(c, xst.namespaces['']) } if c.effective_max_occurs: - mapped_type['properties'][c.local_name]['maxItems'] = c.effective_max_occurs + mapped_type['properties'][element_name]['maxItems'] = c.effective_max_occurs if c.effective_min_occurs > 0: - mapped_type['properties'][c.local_name]['minItems'] = c.effective_min_occurs + mapped_type['properties'][element_name]['minItems'] = c.effective_min_occurs else: - mapped_type['properties'][c.local_name] = TypeMapping.get_type_from_elem(c, xst.namespaces['']) + mapped_type['properties'][element_name] = TypeMapping.get_type_from_elem(c, xst.namespaces['']) if c.effective_min_occurs == 1: - mapped_type['required'].append(c.local_name) + mapped_type['required'].append(element_name) elif type(c) is XsdGroup: if inner_choice: - raise Exception (f"Second group '{c.local_name}' encountered in {xst}") + raise Exception (f"Second group '{element_name}' encountered in {xst}") if c.model != "choice": raise Exception (f"Don't know what to do with inner group {c} in {xst} - not a choice") inner_choice = ChoiceMapping.process_choice(c, xst.namespaces['']) diff --git a/utils/translate/TypeMapping.py b/utils/translate/TypeMapping.py index b796e66..e3daf62 100644 --- a/utils/translate/TypeMapping.py +++ b/utils/translate/TypeMapping.py @@ -50,7 +50,7 @@ class TypeMapping(ABC): return { "$ref" : f"#/$defs/{xsd_type.local_name}" } else: mapped_id = cls.ns_to_id_map[ns] - return { "$ref" : f"{mapped_id}#/$defs/{xsd_type.local_name}"} + return { "$ref" : f"{mapped_id['id']}#/$defs/{xsd_type.local_name}"} @classmethod def get_type_from_elem(cls, elem: XsdElement, current_ns : str): diff --git a/utils/translate/__init__.py b/utils/translate/__init__.py index 983aa20..ba05008 100644 --- a/utils/translate/__init__.py +++ b/utils/translate/__init__.py @@ -27,7 +27,7 @@ def translate_schema (schema_path: str, ns_to_id_map: dict, schema_locations = [ xs = XMLSchema(schema_path, validation='lax', locations=schema_locations) logging.info(f"Schema namespace: {xs.target_namespace}" ) - schema_id = ns_to_id_map[xs.target_namespace] + schema_id = ns_to_id_map[xs.target_namespace]["id"] js['$id'] = schema_id TypeMapping.ns_to_id_map = ns_to_id_map diff --git a/utils/translate_spec.py b/utils/translate_spec.py index 8f89093..54ac5cd 100644 --- a/utils/translate_spec.py +++ b/utils/translate_spec.py @@ -8,8 +8,6 @@ from xmlschema import * from translate import * -import jsonschema - logging.basicConfig(level = logging.INFO) def build_schema_locations (paths): @@ -46,24 +44,22 @@ if __name__ == "__main__": config = get_json(sys.argv[1]) - schema_paths = config['schemas'] - logging.info("Bulding schema locations...") - schema_locations = build_schema_locations(schema_paths) + + logging.info("Bulding ns map...") + ns_map = {} + for location, settings in config['schemas'].items(): + xs = XMLSchema(location, validation='skip') + ns = xs.target_namespace + id = convert_ns_to_id(ns) + ns_map[ns] = { + "id" : id, + "location" : str(Path(location).resolve()) + } | settings + logging.debug(ns_map) + + logging.info("Building schema locations") + schema_locations = [(k, v["location"]) for k,v in ns_map.items()] logging.debug(schema_locations) - - # ns_to_id_map = { - # schema[0]: schema[0].split('/')[-1].lower() + ".json" - # for schema in schema_locations if '03120' in schema[0] - # } | { - # 'http://uri.etsi.org/03280/common/2017/07' : 'etsi103280.json', - # 'http://www.w3.org/2000/09/xmldsig#' : 'xmldsig.json', - # } - logging.info("Constructing XSD NS to JSON Schema ID mapping...") - ns_to_id_map = { schema[0] : convert_ns_to_id(schema[0]) for schema in schema_locations} - logging.debug(ns_to_id_map) - - # # js = translate_schema("103280/TS_103_280.xsd", "103120.json") - # # print(json.dumps(js, indent=2)) output_path = Path(config['output']) if not output_path.exists(): @@ -78,13 +74,14 @@ if __name__ == "__main__": # TODO - work out what to do here logging.info(" Skipping XML Dsig...") continue - js = translate_schema(schema_tuple[1], ns_to_id_map, schema_locations) - if ns_to_id_map[schema_tuple[0]] == 'core.json': + js = translate_schema(schema_tuple[1], ns_map, schema_locations) + + # TODO - Special case, get rid of signature + if ns_map[schema_tuple[0]] == 'core.json': js['$defs']['HI1Message']['properties'].pop('Signature') js_path = output_path / convert_xsd_to_filename(schema_tuple[1]) - # TODO - work out how to do this substitution automatically - # and build the graph of acceptable descendent types + # TODO - Special case - abstract HI1Object if "Core" in schema_tuple[1]: js["$defs"]['ConcreteHI1Object'] = { 'oneOf' : [ @@ -106,17 +103,3 @@ if __name__ == "__main__": with open(str(js_path), 'w') as f: f.write(json_string) json_schemas[js['$id']] = json.loads(json_string) - - # else: - # json_schemas = {} - # json_path = Path('json/') - # for json_file in json_path.glob("*.json"): - # json_schemas[json_file.name] = get_json(json_file) - - # resolver = jsonschema.RefResolver("", "", json_schemas) - - # instance = get_json("120.json") - # schema = json_schemas['core.json'] - # jsonschema.validate(instance, schema, resolver=resolver) - - # print(json.dumps(js, indent=2)) diff --git a/utils/ts103120_config.json b/utils/ts103120_config.json index 08aadb8..ec32171 100644 --- a/utils/ts103120_config.json +++ b/utils/ts103120_config.json @@ -1,14 +1,36 @@ { - "schemas" : [ "../103120/schema/ts_103120_Authorisation.xsd", - "../103120/schema/ts_103120_Common.xsd", - "../103120/schema/ts_103120_Core.xsd", - "../103120/schema/ts_103120_Delivery.xsd", - "../103120/schema/ts_103120_Document.xsd", - "../103120/schema/ts_103120_Notification.xsd", - "../103120/schema/ts_103120_Task.xsd", - "../103120/schema/ts_103120_TrafficPolicy.xsd", - "../103280/TS_103_280.xsd", - "../testing/deps/xmldsig/xmldsig-core-schema.xsd" - ], - "output" : "../103120/schema/json/" + "schemas" : { + "./103120/schema/ts_103120_Authorisation.xsd" : { + "prefix" : "auth" + }, + "./103120/schema/ts_103120_Common.xsd" : { + "prefix" : "common" + }, + "./103120/schema/ts_103120_Core.xsd" : { + }, + "./103120/schema/ts_103120_Delivery.xsd" : { + "prefix" : "delivery" + }, + "./103120/schema/ts_103120_Document.xsd" : { + "prefix" : "document" + }, + "./103120/schema/ts_103120_Notification.xsd" : { + "prefix" : "notification" + }, + "./103120/schema/ts_103120_Task.xsd" : { + "prefix" : "task" + }, + "./103120/schema/ts_103120_TrafficPolicy.xsd" : { + "prefix" : "tp" + }, + "./103280/TS_103_280.xsd" : { + "prefix" : "etsi280", + "skip" : true + }, + "./testing/deps/xmldsig/xmldsig-core-schema.xsd" : { + "prefix" : "xmldsig", + "skip" : true + } + }, + "output" : "./103120/schema/json/" } \ No newline at end of file diff --git a/utils/validate.py b/utils/validate.py index c832631..17070bb 100644 --- a/utils/validate.py +++ b/utils/validate.py @@ -1,5 +1,6 @@ import sys from jsonschema import validate, RefResolver, Draft202012Validator +from jsonschema.exceptions import ValidationError import json from pathlib import Path import logging @@ -41,6 +42,8 @@ if __name__ == "__main__": if args.schemadir: schema_paths = [] for d in args.schemadir: + logging.info(f"Searching {d}") + logging.info(list(Path(d).rglob("*.schema.json"))) schema_paths += [f for f in Path(d).rglob("*.schema.json")] logging.info(f"Schema files loaded: {schema_paths}") @@ -57,7 +60,61 @@ if __name__ == "__main__": store=schema_dict) v = Draft202012Validator(main_schema, resolver=resolver) + try: + v.validate(instance_doc) + except ValidationError as ex: + # Any failure within the Payload element results in a failure against the oneOf constraint in the Payload element + # This isn't terribly helpful in working out what is actually wrong, so in this case we attempt an explicit + # validation against the relevant oneOf alternation to try and get a more useful validation error + if list(ex.schema_path) == ['properties', 'Payload', 'oneOf']: + logging.error ("Error detected validating payload oneOf - attempting explicit validation...") + try: + if 'RequestPayload' in instance_doc['Payload'].keys(): + request_fragment_schema = { "$ref" : "ts_103120_Core_2019_10#/$defs/RequestPayload" } + v = Draft202012Validator(request_fragment_schema, resolver=resolver) + v.validate(instance_doc['Payload']['RequestPayload']) + elif 'ResponsePayload' in instance_doc['Payload'].keys(): + request_fragment_schema = { "$ref" : "ts_103120_Core_2019_10#/$defs/ResponsePayload" } + v = Draft202012Validator(request_fragment_schema, resolver=resolver) + v.validate(instance_doc['Payload']['ResponsePayload']) + else: + logging.error("No RequestPayload or ResponsePayload found - is the Payload malformed?") + raise ex + except ValidationError as ex2: + # Similar to above, this is inner validation to try and get a more useful error in the event + # that something fails the verb oneOf constraint + logging.error("Error detected in ActionRequests/ActionResponses") + error_path = list(ex2.schema_path) + if error_path != ['properties', 'ActionRequests', 'properties', 'ActionRequest', 'items', 'allOf', 1, 'oneOf'] and error_path != ['properties', 'ActionResponses', 'properties', 'ActionResponse', 'items', 'allOf', 1, 'oneOf']: + logging.error("Error not in inner Request/Response allOf/oneOf constraint") + raise ex2 + j = ex2.instance + j.pop('ActionIdentifier') # Remove ActionIdentifier - one remaining key will be the verb + verb = list(j.keys())[0] + message = "Request" if error_path[1] == "ActionRequests" else "Response" + v = Draft202012Validator({"$ref" : f"ts_103120_Core_2019_10#/$defs/{verb}{message}"}, resolver=resolver) + try: + v.validate(j[verb]) + except ValidationError as ex3: + logging.error("Error detected in verb") + # The final level of validation is for the actual HI1Object validation + if list(ex3.schema_path) != ['properties', 'HI1Object', 'oneOf']: + logging.error("Error not inside HI1Object") + raise ex3 + object_type = ex3.instance['@xsi:type'].split('}')[-1] + object_ref = { + 'AuthorisationObject': 'ts_103120_Authorisation_2020_09#/$defs/AuthorisationObject', + 'LITaskObject': 'ts_103120_Task_2020_09#/$defs/LITaskObject', + 'LDTaskObject': 'ts_103120_Task_2020_09#/$defs/LDTaskObject', + 'DocumentObject': 'ts_103120_Document_2020_09#/$defs/DocumentObject', + 'NotificationObject': 'ts_103120_Notification_2016_02#/$defs/NotificationObject', + 'DeliveryObject': 'ts_103120_Delivery_2019_10#/$defs/DeliveryObject', + 'TrafficPolicyObject': 'ts_103120_TrafficPolicy_2022_07#/$defs/TrafficPolicyObject' + }[object_type] + v = Draft202012Validator({"$ref" : object_ref}, resolver=resolver) + v.validate(ex3.instance) + + exit(-1) - v.validate(instance_doc) logging.info("Done") \ No newline at end of file diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index b8c9e27..ac32d7e 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -49,9 +49,15 @@ if __name__ == "__main__": args.input.close() logging.debug(s) - d = xmltodict.parse(s)['HI1Message'] - - prefixes = extract_prefixes(d) - removePrefixes(d, prefixes) + # d = xmltodict.parse(s, + # force_list=('AssociatedObject',) + # )['HI1Message'] - print(json.dumps(d)) + d = xmltodict.parse(s, + force_list=('AssociatedObject',) + )['HI1Message'] + + # prefixes = extract_prefixes(d) + # removePrefixes(d, prefixes) + + print(json.dumps(d, indent=2)) -- GitLab From 25b554c8c8d54e2866643316da4bd65ef46dd437 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 2 Jun 2023 12:43:01 +0100 Subject: [PATCH 09/18] Tidying up a bit --- test1.json | 90 ------------------------------------------------------ test2.json | 1 - 2 files changed, 91 deletions(-) delete mode 100644 test1.json delete mode 100644 test2.json diff --git a/test1.json b/test1.json deleted file mode 100644 index 6838b7d..0000000 --- a/test1.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", - "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", - "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", - "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", - "Header": { - "SenderIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR01" - }, - "ReceiverIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR02" - }, - "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", - "Timestamp": "2015-09-01T12:00:00.000000Z", - "Version": { - "ETSIVersion": "V1.13.1", - "NationalProfileOwner": "XX", - "NationalProfileVersion": "v1.0" - } - }, - "Payload": { - "RequestPayload": { - "ActionRequests": { - "ActionRequest": [ - { - "ActionIdentifier": 1, - "CREATE": { - "HI1Object": { - "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", - "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "auth:AuthorisationReference": "W000001", - "auth:AuthorisationTimespan": { - "auth:StartTime": "2015-09-01T12:00:00Z", - "auth:EndTime": "2015-12-01T12:00:00Z" - } - } - } - }, - { - "ActionIdentifier": 2, - "CREATE": { - "HI1Object": { - "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", - "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "AssociatedObjects": { - "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" - }, - "task:Reference": "LIID1", - "task:TargetIdentifier": { - "task:TargetIdentifierValues": { - "task:TargetIdentifierValue": { - "task:FormatType": { - "task:FormatOwner": "ETSI", - "task:FormatName": "InternationalE164" - }, - "task:Value": "442079460223" - } - } - }, - "task:DeliveryType": { - "common:Owner": "ETSI", - "common:Name": "TaskDeliveryType", - "common:Value": "IRIandCC" - }, - "task:DeliveryDetails": { - "task:DeliveryDestination": { - "task:DeliveryAddress": { - "task:IPv4Address": "192.0.2.0" - } - } - }, - "task:CSPID": { - "CountryCode": "XX", - "UniqueIdentifier": "RECVER01" - } - } - } - } - ] - } - } - } -} \ No newline at end of file diff --git a/test2.json b/test2.json deleted file mode 100644 index bf5b94c..0000000 --- a/test2.json +++ /dev/null @@ -1 +0,0 @@ -{"@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", "Header": {"SenderIdentifier": {"CountryCode": "XX", "UniqueIdentifier": "ACTOR01"}, "ReceiverIdentifier": {"CountryCode": "XX", "UniqueIdentifier": "ACTOR02"}, "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", "Timestamp": "2015-09-01T12:00:00.000000Z", "Version": {"ETSIVersion": "V1.13.1", "NationalProfileOwner": "XX", "NationalProfileVersion": "v1.0"}}, "Payload": {"RequestPayload": {"ActionRequests": {"ActionRequest": [{"ActionIdentifier": "0", "CREATE": {"HI1Object": {"@xsi:type": "auth:AuthorisationObject", "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", "CountryCode": "XX", "OwnerIdentifier": "ACTOR01", "auth:AuthorisationReference": "W000001", "auth:AuthorisationTimespan": {"auth:StartTime": "2015-09-01T12:00:00Z", "auth:EndTime": "2015-12-01T12:00:00Z"}}}}, {"ActionIdentifier": "1", "CREATE": {"HI1Object": {"@xsi:type": "task:LITaskObject", "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", "CountryCode": "XX", "OwnerIdentifier": "ACTOR01", "AssociatedObjects": {"AssociatedObject": ["7dbbc880-8750-4d3c-abe7-ea4a17646045", "7dbbc880-8750-4d3c-abe7-ea4a17646045"]}, "task:Reference": "LIID1", "task:TargetIdentifier": {"task:TargetIdentifierValues": {"task:TargetIdentifierValue": {"task:FormatType": {"task:FormatOwner": "ETSI", "task:FormatName": "InternationalE164"}, "task:Value": "442079460223"}}}, "task:DeliveryType": {"common:Owner": "ETSI", "common:Name": "TaskDeliveryType", "common:Value": "IRIandCC"}, "task:DeliveryDetails": {"task:DeliveryDestination": {"task:DeliveryAddress": {"task:IPv4Address": "192.0.2.0"}}}, "task:CSPID": {"CountryCode": "XX", "UniqueIdentifier": "RECVER01"}}}}]}}}} -- GitLab From 6b3953e673df0a0cff727eeff5eb155dfd0a92ee Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 2 Jun 2023 14:07:08 +0100 Subject: [PATCH 10/18] Fixing namespace qualifiers for choice --- 103120/schema/json/TS_103_280.schema.json | 389 ++++++++++++++++++ .../schema/json/ts_103120_Common.schema.json | 8 +- .../json/ts_103120_Delivery.schema.json | 32 +- 103120/schema/json/ts_103120_Task.schema.json | 44 +- .../json/ts_103120_TrafficPolicy.schema.json | 8 +- utils/translate/ChoiceMapping.py | 13 +- utils/translate/SequenceMapping.py | 2 +- utils/xml_to_json.py | 60 ++- 8 files changed, 501 insertions(+), 55 deletions(-) create mode 100644 103120/schema/json/TS_103_280.schema.json diff --git a/103120/schema/json/TS_103_280.schema.json b/103120/schema/json/TS_103_280.schema.json new file mode 100644 index 0000000..02cd078 --- /dev/null +++ b/103120/schema/json/TS_103_280.schema.json @@ -0,0 +1,389 @@ +{ + "$id": "ts_103280_2017_07", + "$defs": { + "ShortString": { + "type": "string", + "maxLength": 255 + }, + "LongString": { + "type": "string", + "maxLength": 65535 + }, + "LIID": { + "type": "string", + "pattern": "^([!-~]{1,25})|([0-9a-f]{26,50})$" + }, + "UTCDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$" + }, + "UTCMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}Z$" + }, + "QualifiedDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "QualifiedMicrosecondDateTime": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{6}(Z|[+-][0-9]{2}:[0-9]{2})$" + }, + "InternationalE164": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "IMSI": { + "type": "string", + "pattern": "^[0-9]{6,15}$" + }, + "IMEI": { + "type": "string", + "pattern": "^[0-9]{14}$" + }, + "IMEICheckDigit": { + "type": "string", + "pattern": "^[0-9]{15}$" + }, + "IMEISV": { + "type": "string", + "pattern": "^[0-9]{16}$" + }, + "IPv4Address": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$" + }, + "IPv4CIDR": { + "type": "string", + "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/([1-2]?[0-9]|3[0-2])$" + }, + "IPv6Address": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})$" + }, + "IPv6CIDR": { + "type": "string", + "pattern": "^([0-9a-f]{4}:){7}([0-9a-f]{4})/(([1-9][0-9]?)|(1[0-1][0-9])|(12[0-8]))$" + }, + "TCPPort": { + "type": "integer", + "exclusiveMinimum": 1, + "maximum": 65535 + }, + "UDPPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "MACAddress": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){5}[a-f0-9]{2}$" + }, + "EmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^[a-zA-Z0-9\\.!#$%&'\\*\\+\\\\/=\\?\\^_`\\{\\|\\}~\\-]+@[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" + } + ] + }, + "UUID": { + "type": "string", + "pattern": "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" + }, + "ISOCountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "SIPURI": { + "type": "string", + "pattern": "^sips?:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "TELURI": { + "type": "string", + "pattern": "^tel:[a-zA-Z0-9!#$&-;=?-\\[\\]_~%]+$" + }, + "WGS84LatitudeDecimal": { + "type": "string", + "pattern": "^[NS][0-9]{2}\\.[0-9]{6}$" + }, + "WGS84LongitudeDecimal": { + "type": "string", + "pattern": "^[EW][0-9]{3}\\.[0-9]{6}$" + }, + "WGS84LatitudeAngular": { + "type": "string", + "pattern": "^[NS][0-9]{6}\\.[0-9]{2}$" + }, + "WGS84LongitudeAngular": { + "type": "string", + "pattern": "^[EW][0-9]{7}\\.[0-9]{2}$" + }, + "SUPIIMSI": { + "$ref": "#/$defs/IMSI" + }, + "SUPINAI": { + "$ref": "#/$defs/NAI" + }, + "SUCI": { + "type": "string", + "pattern": "^([a-fA-F0-9]{2})*$" + }, + "PEIIMEI": { + "$ref": "#/$defs/IMEI" + }, + "PEIIMEICheckDigit": { + "$ref": "#/$defs/IMEICheckDigit" + }, + "PEIIMEISV": { + "$ref": "#/$defs/IMEISV" + }, + "GPSIMSISDN": { + "type": "string", + "pattern": "^[0-9]{1,15}$" + }, + "GPSINAI": { + "$ref": "#/$defs/NAI" + }, + "NAI": { + "type": "string" + }, + "LDID": { + "type": "string", + "pattern": "^([A-Z]{2}-.+-.+)$" + }, + "InternationalizedEmailAddress": { + "allOf": [ + { + "$ref": "#/$defs/ShortString" + }, + { + "type": "string", + "pattern": "^.+@.+$" + } + ] + }, + "EUI64": { + "type": "string", + "pattern": "^([a-f0-9]{2}:){7}[a-f0-9]{2}$" + }, + "CGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{4}-[a-f0-9]{4}$" + }, + "ECGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{7}$" + }, + "NCGI": { + "type": "string", + "pattern": "^[0-9]{3}-[0-9]{2,3}-[a-f0-9]{9}$" + }, + "ICCID": { + "type": "string", + "pattern": "^[0-9]{19,20}$" + }, + "IPProtocol": { + "type": "integer", + "minimum": 0, + "maximum": 255 + }, + "IPAddress": { + "oneOf": [ + { + "type": "object", + "properties": { + "etsi280:IPv4Address": { + "$ref": "#/$defs/IPv4Address" + } + }, + "required": [ + "etsi280:IPv4Address" + ] + }, + { + "type": "object", + "properties": { + "etsi280:IPv6Address": { + "$ref": "#/$defs/IPv6Address" + } + }, + "required": [ + "etsi280:IPv6Address" + ] + } + ] + }, + "IPCIDR": { + "oneOf": [ + { + "type": "object", + "properties": { + "etsi280:IPv4CIDR": { + "$ref": "#/$defs/IPv4CIDR" + } + }, + "required": [ + "etsi280:IPv4CIDR" + ] + }, + { + "type": "object", + "properties": { + "etsi280:IPv6CIDR": { + "$ref": "#/$defs/IPv6CIDR" + } + }, + "required": [ + "etsi280:IPv6CIDR" + ] + } + ] + }, + "TCPPortRange": { + "type": "object", + "properties": { + "etsi280:start": { + "$ref": "#/$defs/TCPPort" + }, + "etsi280:end": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "etsi280:start", + "etsi280:end" + ] + }, + "UDPPortRange": { + "type": "object", + "properties": { + "etsi280:start": { + "$ref": "#/$defs/UDPPort" + }, + "etsi280:end": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "etsi280:start", + "etsi280:end" + ] + }, + "Port": { + "oneOf": [ + { + "type": "object", + "properties": { + "etsi280:TCPPort": { + "$ref": "#/$defs/TCPPort" + } + }, + "required": [ + "etsi280:TCPPort" + ] + }, + { + "type": "object", + "properties": { + "etsi280:UDPPort": { + "$ref": "#/$defs/UDPPort" + } + }, + "required": [ + "etsi280:UDPPort" + ] + } + ] + }, + "PortRange": { + "oneOf": [ + { + "type": "object", + "properties": { + "etsi280:TCPPortRange": { + "$ref": "#/$defs/TCPPortRange" + } + }, + "required": [ + "etsi280:TCPPortRange" + ] + }, + { + "type": "object", + "properties": { + "etsi280:UDPPortRange": { + "$ref": "#/$defs/UDPPortRange" + } + }, + "required": [ + "etsi280:UDPPortRange" + ] + } + ] + }, + "IPAddressPort": { + "type": "object", + "properties": { + "etsi280:address": { + "$ref": "#/$defs/IPAddress" + }, + "etsi280:port": { + "$ref": "#/$defs/Port" + } + }, + "required": [ + "etsi280:address", + "etsi280:port" + ] + }, + "IPAddressPortRange": { + "type": "object", + "properties": { + "etsi280:address": { + "$ref": "#/$defs/IPAddress" + }, + "etsi280:portRange": { + "$ref": "#/$defs/PortRange" + } + }, + "required": [ + "etsi280:address", + "etsi280:portRange" + ] + }, + "WGS84CoordinateDecimal": { + "type": "object", + "properties": { + "etsi280:latitude": { + "$ref": "#/$defs/WGS84LatitudeDecimal" + }, + "etsi280:longitude": { + "$ref": "#/$defs/WGS84LongitudeDecimal" + } + }, + "required": [ + "etsi280:latitude", + "etsi280:longitude" + ] + }, + "WGS84CoordinateAngular": { + "type": "object", + "properties": { + "etsi280:latitude": { + "$ref": "#/$defs/WGS84LatitudeAngular" + }, + "etsi280:longitude": { + "$ref": "#/$defs/WGS84LongitudeAngular" + } + }, + "required": [ + "etsi280:latitude", + "etsi280:longitude" + ] + } + } +} \ No newline at end of file diff --git a/103120/schema/json/ts_103120_Common.schema.json b/103120/schema/json/ts_103120_Common.schema.json index 2564e8d..d11b4b4 100644 --- a/103120/schema/json/ts_103120_Common.schema.json +++ b/103120/schema/json/ts_103120_Common.schema.json @@ -87,12 +87,12 @@ { "type": "object", "properties": { - "NationalApproverIdentity": { + "common:NationalApproverIdentity": { "$ref": "#/$defs/NationalApproverIdentity" } }, "required": [ - "NationalApproverIdentity" + "common:NationalApproverIdentity" ] } ] @@ -128,12 +128,12 @@ { "type": "object", "properties": { - "NationalDigitalSignature": { + "common:NationalDigitalSignature": { "$ref": "#/$defs/NationalDigitalSignature" } }, "required": [ - "NationalDigitalSignature" + "common:NationalDigitalSignature" ] } ] diff --git a/103120/schema/json/ts_103120_Delivery.schema.json b/103120/schema/json/ts_103120_Delivery.schema.json index 3d79eb2..9cfceae 100644 --- a/103120/schema/json/ts_103120_Delivery.schema.json +++ b/103120/schema/json/ts_103120_Delivery.schema.json @@ -63,23 +63,23 @@ { "type": "object", "properties": { - "LDID": { + "delivery:LDID": { "$ref": "ts_103280_2017_07#/$defs/LDID" } }, "required": [ - "LDID" + "delivery:LDID" ] }, { "type": "object", "properties": { - "LIID": { + "delivery:LIID": { "$ref": "ts_103280_2017_07#/$defs/LIID" } }, "required": [ - "LIID" + "delivery:LIID" ] } ] @@ -89,23 +89,23 @@ { "type": "object", "properties": { - "Specification": { + "delivery:Specification": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" } }, "required": [ - "Specification" + "delivery:Specification" ] }, { "type": "object", "properties": { - "ExternalSchema": { + "delivery:ExternalSchema": { "$ref": "#/$defs/ExternalSchema" } }, "required": [ - "ExternalSchema" + "delivery:ExternalSchema" ] } ] @@ -127,23 +127,23 @@ { "type": "object", "properties": { - "BinaryData": { + "delivery:BinaryData": { "$ref": "#/$defs/EmbeddedBinaryData" } }, "required": [ - "BinaryData" + "delivery:BinaryData" ] }, { "type": "object", "properties": { - "XMLSchema": { + "delivery:XMLSchema": { "$ref": "#/$defs/SchemaContent" } }, "required": [ - "XMLSchema" + "delivery:XMLSchema" ] } ] @@ -162,23 +162,23 @@ { "type": "object", "properties": { - "BinaryData": { + "delivery:BinaryData": { "$ref": "#/$defs/EmbeddedBinaryData" } }, "required": [ - "BinaryData" + "delivery:BinaryData" ] }, { "type": "object", "properties": { - "XMLData": { + "delivery:XMLData": { "$ref": "#/$defs/EmbeddedXMLData" } }, "required": [ - "XMLData" + "delivery:XMLData" ] } ] diff --git a/103120/schema/json/ts_103120_Task.schema.json b/103120/schema/json/ts_103120_Task.schema.json index 6854a61..24de4c5 100644 --- a/103120/schema/json/ts_103120_Task.schema.json +++ b/103120/schema/json/ts_103120_Task.schema.json @@ -202,122 +202,122 @@ { "type": "object", "properties": { - "IPv4Address": { + "task:IPv4Address": { "$ref": "ts_103280_2017_07#/$defs/IPv4Address" } }, "required": [ - "IPv4Address" + "task:IPv4Address" ] }, { "type": "object", "properties": { - "IPv6Address": { + "task:IPv6Address": { "$ref": "ts_103280_2017_07#/$defs/IPv6Address" } }, "required": [ - "IPv6Address" + "task:IPv6Address" ] }, { "type": "object", "properties": { - "IPAddressPort": { + "task:IPAddressPort": { "$ref": "ts_103280_2017_07#/$defs/IPAddressPort" } }, "required": [ - "IPAddressPort" + "task:IPAddressPort" ] }, { "type": "object", "properties": { - "IPAddressPortRange": { + "task:IPAddressPortRange": { "$ref": "ts_103280_2017_07#/$defs/IPAddressPortRange" } }, "required": [ - "IPAddressPortRange" + "task:IPAddressPortRange" ] }, { "type": "object", "properties": { - "E164Number": { + "task:E164Number": { "$ref": "ts_103280_2017_07#/$defs/InternationalE164" } }, "required": [ - "E164Number" + "task:E164Number" ] }, { "type": "object", "properties": { - "FTPAddress": { + "task:FTPAddress": { "type": "string" } }, "required": [ - "FTPAddress" + "task:FTPAddress" ] }, { "type": "object", "properties": { - "URL": { + "task:URL": { "type": "string" } }, "required": [ - "URL" + "task:URL" ] }, { "type": "object", "properties": { - "FQDN": { + "task:FQDN": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "FQDN" + "task:FQDN" ] }, { "type": "object", "properties": { - "EmailAddress": { + "task:EmailAddress": { "$ref": "ts_103280_2017_07#/$defs/EmailAddress" } }, "required": [ - "EmailAddress" + "task:EmailAddress" ] }, { "type": "object", "properties": { - "EndpointID": { + "task:EndpointID": { "$ref": "ts_103120_Core_2019_10#/$defs/EndpointID" } }, "required": [ - "EndpointID" + "task:EndpointID" ] }, { "type": "object", "properties": { - "DeliveryInformationID": { + "task:DeliveryInformationID": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "DeliveryInformationID" + "task:DeliveryInformationID" ] } ] diff --git a/103120/schema/json/ts_103120_TrafficPolicy.schema.json b/103120/schema/json/ts_103120_TrafficPolicy.schema.json index 2bbfc17..1d9619e 100644 --- a/103120/schema/json/ts_103120_TrafficPolicy.schema.json +++ b/103120/schema/json/ts_103120_TrafficPolicy.schema.json @@ -136,23 +136,23 @@ { "type": "object", "properties": { - "IPPolicyCriteria": { + "tp:IPPolicyCriteria": { "$ref": "#/$defs/IPPolicyCriteria" } }, "required": [ - "IPPolicyCriteria" + "tp:IPPolicyCriteria" ] }, { "type": "object", "properties": { - "MobileAccessPolicyCriteria": { + "tp:MobileAccessPolicyCriteria": { "$ref": "#/$defs/MobileAccessPolicyCriteria" } }, "required": [ - "MobileAccessPolicyCriteria" + "tp:MobileAccessPolicyCriteria" ] } ] diff --git a/utils/translate/ChoiceMapping.py b/utils/translate/ChoiceMapping.py index fecadf8..b477a33 100644 --- a/utils/translate/ChoiceMapping.py +++ b/utils/translate/ChoiceMapping.py @@ -12,20 +12,25 @@ log = logging.getLogger() class ChoiceMapping(ComplexTypeMapping): @classmethod - def process_choice(cls, choice: XsdGroup, current_ns : str): + def process_choice(cls, choice: XsdGroup, current_ns : str, ns_to_id_map): if choice.model != 'choice': raise Exception(f"Wrong group type: {c.model}") oneOf = [] for c in choice.iter_model(): if not (type(c) is XsdElement): raise Exception (f"Non-element {c} encountered in choice {choice}") + element_name = c.local_name + if c.target_namespace in ns_to_id_map: + ns = ns_to_id_map[c.target_namespace] + if 'prefix' in ns: + element_name = ns['prefix'] + ":" + element_name t = TypeMapping.get_type_from_elem(c, current_ns) oneOf.append({ "type" : "object", "properties" : { - c.local_name : t + element_name : t }, - "required" : [c.local_name] + "required" : [element_name] }) return oneOf @@ -39,4 +44,4 @@ class ChoiceMapping(ComplexTypeMapping): if (content.model != 'choice'): log.debug("Not a choice, giving up") return None - return { 'oneOf' : ChoiceMapping.process_choice(content, xst.namespaces[''])} + return { 'oneOf' : ChoiceMapping.process_choice(content, xst.namespaces[''], self.ns_to_id_map)} diff --git a/utils/translate/SequenceMapping.py b/utils/translate/SequenceMapping.py index 9fd4d69..670a3ba 100644 --- a/utils/translate/SequenceMapping.py +++ b/utils/translate/SequenceMapping.py @@ -70,7 +70,7 @@ class SequenceMapping(ComplexTypeMapping): raise Exception (f"Second group '{element_name}' encountered in {xst}") if c.model != "choice": raise Exception (f"Don't know what to do with inner group {c} in {xst} - not a choice") - inner_choice = ChoiceMapping.process_choice(c, xst.namespaces['']) + inner_choice = ChoiceMapping.process_choice(c, xst.namespaces[''], self.ns_to_id_map) elif type(c) is XsdAnyElement: mapped_type = {} else: diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index ac32d7e..92a0348 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -29,6 +29,58 @@ def removePrefixes (o, prefixes): for r in replacements: o[r[1]] = o.pop(r[0]) +object_namespaces = { + 'AuthorisationObject' : 'http://uri.etsi.org/03120/common/2020/09/Authorisation', + 'DeliveryObject' : 'http://uri.etsi.org/03120/common/2019/10/Delivery', + 'DocumentObject' : 'http://uri.etsi.org/03120/common/2020/09/Document', + 'NotificationObject' : 'http://uri.etsi.org/03120/common/2016/02/Notification', + 'LITaskObject' : 'http://uri.etsi.org/03120/common/2020/09/Task', + 'LDTaskObject' : 'http://uri.etsi.org/03120/common/2020/09/Task', + 'TrafficPolicyObject' : 'http://uri.etsi.org/03120/common/2022/07/TrafficPolicy', + 'TrafficRuleObject' : 'http://uri.etsi.org/03120/common/2022/07/TrafficPolicy' +} + +coerce_to_list = [ + 'auth:AuthorisationApprovalDetails', + 'auth:AuthorisationFlag', + 'auth:CSPID', + 'common:ApproverContactDetails', + 'ActionRequest', + 'ActionResponse', + 'ListResponseRecord', + 'AssociatedObject', + 'document:DocumentSignature', + 'document:DocumentProperty', + 'notification:AssociatedObjectStatus', + 'task:ApprovalDetails', + 'task:TargetIdentifierValue', + 'task:DeliveryDestination', + 'task:TaskFlag', + 'task:ApprovalDetails', + 'task:ObservedTimes', + 'task:RequestValue', + 'task:RequestSubtype', + 'task:LDDeliveryDestination', + 'task:LDTaskFlag', + 'task:TrafficPolicyReference', + 'tp:TrafficRuleReference', + 'tp:Criteria' +] + +coerce_to_int = [ + 'ActionIdentifier' +] + +def postprocessor (path, key, value): + if key == "@xsi:type": + object_name = value.split(":")[-1] + if object_name in object_namespaces.keys(): + value = "{" + object_namespaces[object_name] + "}" + object_name + return key, value + if key in coerce_to_int: + return key, int(value) + return key, value + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='count', help='Verbose logging (can be specified multiple times)') @@ -49,12 +101,12 @@ if __name__ == "__main__": args.input.close() logging.debug(s) - # d = xmltodict.parse(s, - # force_list=('AssociatedObject',) - # )['HI1Message'] d = xmltodict.parse(s, - force_list=('AssociatedObject',) + force_list=tuple(coerce_to_list), + # process_namespaces=True, + # namespaces = namespace_prefixes, + postprocessor=postprocessor )['HI1Message'] # prefixes = extract_prefixes(d) -- GitLab From 2c8079b496b7976cba9bfcfe8f29e48623e7cfa5 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 2 Jun 2023 15:38:06 +0100 Subject: [PATCH 11/18] Fixing doc prefix --- 103120/examples/request3.xml | 2 +- .../json/ts_103120_Document.schema.json | 48 +++++++++---------- utils/translate/SequenceMapping.py | 1 - utils/ts103120_config.json | 2 +- utils/xml_to_json.py | 4 +- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/103120/examples/request3.xml b/103120/examples/request3.xml index 718f621..7d9b7c3 100644 --- a/103120/examples/request3.xml +++ b/103120/examples/request3.xml @@ -29,7 +29,7 @@ ACTOR01 W000001 - 2015-09-01T12:00:00Z + 2015-09-01T12:00:00BlahBlahZ 2015-12-01T12:00:00Z diff --git a/103120/schema/json/ts_103120_Document.schema.json b/103120/schema/json/ts_103120_Document.schema.json index f5b850b..afeb421 100644 --- a/103120/schema/json/ts_103120_Document.schema.json +++ b/103120/schema/json/ts_103120_Document.schema.json @@ -33,40 +33,40 @@ "NationalHandlingParameters": { "$ref": "ts_103120_Core_2019_10#/$defs/NationalHandlingParameters" }, - "document:DocumentReference": { + "doc:DocumentReference": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "document:DocumentName": { + "doc:DocumentName": { "$ref": "ts_103280_2017_07#/$defs/LongString" }, - "document:DocumentStatus": { + "doc:DocumentStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "document:DocumentDesiredStatus": { + "doc:DocumentDesiredStatus": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "document:DocumentTimespan": { + "doc:DocumentTimespan": { "$ref": "#/$defs/DocumentTimespan" }, - "document:DocumentType": { + "doc:DocumentType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "document:DocumentProperties": { + "doc:DocumentProperties": { "$ref": "#/$defs/DocumentProperties" }, - "document:DocumentBody": { + "doc:DocumentBody": { "$ref": "#/$defs/DocumentBody" }, - "document:DocumentSignature": { + "doc:DocumentSignature": { "type": "array", "items": { "$ref": "ts_103120_Common_2016_02#/$defs/ApprovalDetails" } }, - "document:DocumentInvalidReason": { + "doc:DocumentInvalidReason": { "$ref": "ts_103120_Core_2019_10#/$defs/ActionUnsuccesfulInformation" }, - "document:NationalDocumentParameters": { + "doc:NationalDocumentParameters": { "$ref": "#/$defs/NationalDocumentParameters" } }, @@ -78,10 +78,10 @@ "DocumentTimespan": { "type": "object", "properties": { - "document:StartTime": { + "doc:StartTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" }, - "document:EndTime": { + "doc:EndTime": { "$ref": "ts_103280_2017_07#/$defs/QualifiedDateTime" } }, @@ -90,7 +90,7 @@ "DocumentProperties": { "type": "object", "properties": { - "document:DocumentProperty": { + "doc:DocumentProperty": { "type": "array", "items": { "$ref": "#/$defs/DocumentProperty" @@ -102,32 +102,32 @@ "DocumentProperty": { "type": "object", "properties": { - "document:PropertyType": { + "doc:PropertyType": { "$ref": "ts_103120_Common_2016_02#/$defs/DictionaryEntry" }, - "document:PropertyValue": { + "doc:PropertyValue": { "$ref": "ts_103280_2017_07#/$defs/LongString" } }, "required": [ - "document:PropertyType", - "document:PropertyValue" + "doc:PropertyType", + "doc:PropertyValue" ] }, "DocumentBody": { "type": "object", "properties": { - "document:Contents": { + "doc:Contents": { "type": "string", "pattern": "^[-A-Za-z0-9+/]*={0,3}$" }, - "document:ContentType": { + "doc:ContentType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "document:Checksum": { + "doc:Checksum": { "$ref": "ts_103280_2017_07#/$defs/ShortString" }, - "document:ChecksumType": { + "doc:ChecksumType": { "$ref": "ts_103280_2017_07#/$defs/ShortString" } }, @@ -136,12 +136,12 @@ "NationalDocumentParameters": { "type": "object", "properties": { - "document:CountryCode": { + "doc:CountryCode": { "$ref": "ts_103280_2017_07#/$defs/ISOCountryCode" } }, "required": [ - "document:CountryCode" + "doc:CountryCode" ] } } diff --git a/utils/translate/SequenceMapping.py b/utils/translate/SequenceMapping.py index 670a3ba..4dc5c93 100644 --- a/utils/translate/SequenceMapping.py +++ b/utils/translate/SequenceMapping.py @@ -45,7 +45,6 @@ class SequenceMapping(ComplexTypeMapping): inner_choice = None for c in list(content.iter_model()): log.debug(f"Processing model item {c}") - print("Model item -------------") if type(c) is XsdElement: element_name = c.local_name if c.target_namespace in self.ns_to_id_map: diff --git a/utils/ts103120_config.json b/utils/ts103120_config.json index ec32171..d213376 100644 --- a/utils/ts103120_config.json +++ b/utils/ts103120_config.json @@ -12,7 +12,7 @@ "prefix" : "delivery" }, "./103120/schema/ts_103120_Document.xsd" : { - "prefix" : "document" + "prefix" : "doc" }, "./103120/schema/ts_103120_Notification.xsd" : { "prefix" : "notification" diff --git a/utils/xml_to_json.py b/utils/xml_to_json.py index 92a0348..afc0f03 100644 --- a/utils/xml_to_json.py +++ b/utils/xml_to_json.py @@ -49,8 +49,8 @@ coerce_to_list = [ 'ActionResponse', 'ListResponseRecord', 'AssociatedObject', - 'document:DocumentSignature', - 'document:DocumentProperty', + 'doc:DocumentSignature', + 'doc:DocumentProperty', 'notification:AssociatedObjectStatus', 'task:ApprovalDetails', 'task:TargetIdentifierValue', -- GitLab From a8efd9a16acd84764345d468f090d9d2eb2155c3 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 2 Jun 2023 15:39:05 +0100 Subject: [PATCH 12/18] Fixing XML --- 103120/examples/request3.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/103120/examples/request3.xml b/103120/examples/request3.xml index 7d9b7c3..718f621 100644 --- a/103120/examples/request3.xml +++ b/103120/examples/request3.xml @@ -29,7 +29,7 @@ ACTOR01 W000001 - 2015-09-01T12:00:00BlahBlahZ + 2015-09-01T12:00:00Z 2015-12-01T12:00:00Z -- GitLab From ad6129a207fc5682a3b130192c86373a4afc384b Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Jun 2023 16:21:38 +0100 Subject: [PATCH 13/18] Changing extensions of interest for CI/CD --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8ec525..2cee538 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,7 @@ generate_artefacts: - echo $CI_MERGE_REQUEST_IID - echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - echo $ARTEFACT_NAME - - forgelib-changedocs -v -d -c -l --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID + - forgelib-changedocs -v -d -c -l -x asn -x asn1 -x xml -x xsd -x json --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID artifacts: untracked: true paths: -- GitLab From f5df1a9824194aa3e5cf0b8ca778e38fe5905531 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Jun 2023 16:27:27 +0100 Subject: [PATCH 14/18] Extensions --- .gitlab-ci.yml | 2 +- ...ce_diff_blocks_instead_of_track_changes.docx | Bin 0 -> 36570 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2cee538..bb69914 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,7 @@ generate_artefacts: - echo $CI_MERGE_REQUEST_IID - echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - echo $ARTEFACT_NAME - - forgelib-changedocs -v -d -c -l -x asn -x asn1 -x xml -x xsd -x json --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID + - forgelib-changedocs -v -d -c -l -x json --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID artifacts: untracked: true paths: diff --git a/Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx b/Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx new file mode 100644 index 0000000000000000000000000000000000000000..74b1d0ec85080a6d16d974d4c00ebabeba589c59 GIT binary patch literal 36570 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
7Y{e@NwfS){SCn9PkabA;tZqUl_K$| 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 IlDj}W0H0VWLjV8( literal 0 HcmV?d00001 -- GitLab From e1ace00f4176279aef5efb6be60d88e792dae338 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Jun 2023 16:35:51 +0100 Subject: [PATCH 15/18] Reverting CI/CD changes --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bb69914..a8ec525 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,7 @@ generate_artefacts: - echo $CI_MERGE_REQUEST_IID - echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - echo $ARTEFACT_NAME - - forgelib-changedocs -v -d -c -l -x json --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID + - forgelib-changedocs -v -d -c -l --startdelimiter coversheets/delimiter_start.docx --enddelimiter coversheets/delimiter_end.docx https://$CI_SERVER_HOST/rep $CI_PROJECT_ID $CI_PROJECT_PATH $CI_MERGE_REQUEST_IID artifacts: untracked: true paths: -- GitLab From 4b875dd80f1e2d70dccd0d24a6f01be8f0a6baa8 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Jun 2023 17:15:43 +0100 Subject: [PATCH 16/18] Refactoring examples etc --- 103120/examples/{ => json}/fragment.json | 0 103120/examples/{ => json}/fragment.schema.json | 0 103120/examples/{ => json}/request1.json | 0 103120/examples/{ => json}/request1b.json | 0 103120/examples/{ => json}/request1c.json | 0 103120/examples/{ => json}/request1d.json | 0 103120/examples/{ => xml}/FooServiceSchema.xsd | 0 103120/examples/{ => xml}/example.key | 0 103120/examples/{ => xml}/example.pem | 0 103120/examples/{ => xml}/mutliple-auth-example-request.xml | 0 103120/examples/{ => xml}/request1.xml | 0 103120/examples/{ => xml}/request2.xml | 0 103120/examples/{ => xml}/request3.xml | 0 103120/examples/{ => xml}/request4.xml | 0 103120/examples/{ => xml}/request5-Binary-Delivery.xml | 0 103120/examples/{ => xml}/request5-XML-Delivery.xml | 0 103120/examples/{ => xml}/request6.xml | 0 103120/examples/{ => xml}/request6_signed.xml | 0 103120/examples/{ => xml}/request7_TrafficPolicyObject.xml | 0 103120/examples/{ => xml}/response1.xml | 0 103120/examples/{ => xml}/response2.xml | 0 103120/examples/{ => xml}/response3.xml | 0 103120/examples/{ => xml}/response4.xml | 0 103120/examples/{ => xml}/response5.xml | 0 103120/examples/{ => xml}/response6.xml | 0 103120/schema/{ => xsd}/ts_103120_Authorisation.xsd | 0 103120/schema/{ => xsd}/ts_103120_Common.xsd | 0 103120/schema/{ => xsd}/ts_103120_Core.xsd | 0 103120/schema/{ => xsd}/ts_103120_Delivery.xsd | 0 103120/schema/{ => xsd}/ts_103120_Document.xsd | 0 103120/schema/{ => xsd}/ts_103120_Notification.xsd | 0 103120/schema/{ => xsd}/ts_103120_Task.xsd | 0 103120/schema/{ => xsd}/ts_103120_TrafficPolicy.xsd | 0 33 files changed, 0 insertions(+), 0 deletions(-) rename 103120/examples/{ => json}/fragment.json (100%) rename 103120/examples/{ => json}/fragment.schema.json (100%) rename 103120/examples/{ => json}/request1.json (100%) rename 103120/examples/{ => json}/request1b.json (100%) rename 103120/examples/{ => json}/request1c.json (100%) rename 103120/examples/{ => json}/request1d.json (100%) rename 103120/examples/{ => xml}/FooServiceSchema.xsd (100%) rename 103120/examples/{ => xml}/example.key (100%) rename 103120/examples/{ => xml}/example.pem (100%) rename 103120/examples/{ => xml}/mutliple-auth-example-request.xml (100%) rename 103120/examples/{ => xml}/request1.xml (100%) rename 103120/examples/{ => xml}/request2.xml (100%) rename 103120/examples/{ => xml}/request3.xml (100%) rename 103120/examples/{ => xml}/request4.xml (100%) rename 103120/examples/{ => xml}/request5-Binary-Delivery.xml (100%) rename 103120/examples/{ => xml}/request5-XML-Delivery.xml (100%) rename 103120/examples/{ => xml}/request6.xml (100%) rename 103120/examples/{ => xml}/request6_signed.xml (100%) rename 103120/examples/{ => xml}/request7_TrafficPolicyObject.xml (100%) rename 103120/examples/{ => xml}/response1.xml (100%) rename 103120/examples/{ => xml}/response2.xml (100%) rename 103120/examples/{ => xml}/response3.xml (100%) rename 103120/examples/{ => xml}/response4.xml (100%) rename 103120/examples/{ => xml}/response5.xml (100%) rename 103120/examples/{ => xml}/response6.xml (100%) rename 103120/schema/{ => xsd}/ts_103120_Authorisation.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Common.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Core.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Delivery.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Document.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Notification.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_Task.xsd (100%) rename 103120/schema/{ => xsd}/ts_103120_TrafficPolicy.xsd (100%) diff --git a/103120/examples/fragment.json b/103120/examples/json/fragment.json similarity index 100% rename from 103120/examples/fragment.json rename to 103120/examples/json/fragment.json diff --git a/103120/examples/fragment.schema.json b/103120/examples/json/fragment.schema.json similarity index 100% rename from 103120/examples/fragment.schema.json rename to 103120/examples/json/fragment.schema.json diff --git a/103120/examples/request1.json b/103120/examples/json/request1.json similarity index 100% rename from 103120/examples/request1.json rename to 103120/examples/json/request1.json diff --git a/103120/examples/request1b.json b/103120/examples/json/request1b.json similarity index 100% rename from 103120/examples/request1b.json rename to 103120/examples/json/request1b.json diff --git a/103120/examples/request1c.json b/103120/examples/json/request1c.json similarity index 100% rename from 103120/examples/request1c.json rename to 103120/examples/json/request1c.json diff --git a/103120/examples/request1d.json b/103120/examples/json/request1d.json similarity index 100% rename from 103120/examples/request1d.json rename to 103120/examples/json/request1d.json diff --git a/103120/examples/FooServiceSchema.xsd b/103120/examples/xml/FooServiceSchema.xsd similarity index 100% rename from 103120/examples/FooServiceSchema.xsd rename to 103120/examples/xml/FooServiceSchema.xsd diff --git a/103120/examples/example.key b/103120/examples/xml/example.key similarity index 100% rename from 103120/examples/example.key rename to 103120/examples/xml/example.key diff --git a/103120/examples/example.pem b/103120/examples/xml/example.pem similarity index 100% rename from 103120/examples/example.pem rename to 103120/examples/xml/example.pem diff --git a/103120/examples/mutliple-auth-example-request.xml b/103120/examples/xml/mutliple-auth-example-request.xml similarity index 100% rename from 103120/examples/mutliple-auth-example-request.xml rename to 103120/examples/xml/mutliple-auth-example-request.xml diff --git a/103120/examples/request1.xml b/103120/examples/xml/request1.xml similarity index 100% rename from 103120/examples/request1.xml rename to 103120/examples/xml/request1.xml diff --git a/103120/examples/request2.xml b/103120/examples/xml/request2.xml similarity index 100% rename from 103120/examples/request2.xml rename to 103120/examples/xml/request2.xml diff --git a/103120/examples/request3.xml b/103120/examples/xml/request3.xml similarity index 100% rename from 103120/examples/request3.xml rename to 103120/examples/xml/request3.xml diff --git a/103120/examples/request4.xml b/103120/examples/xml/request4.xml similarity index 100% rename from 103120/examples/request4.xml rename to 103120/examples/xml/request4.xml diff --git a/103120/examples/request5-Binary-Delivery.xml b/103120/examples/xml/request5-Binary-Delivery.xml similarity index 100% rename from 103120/examples/request5-Binary-Delivery.xml rename to 103120/examples/xml/request5-Binary-Delivery.xml diff --git a/103120/examples/request5-XML-Delivery.xml b/103120/examples/xml/request5-XML-Delivery.xml similarity index 100% rename from 103120/examples/request5-XML-Delivery.xml rename to 103120/examples/xml/request5-XML-Delivery.xml diff --git a/103120/examples/request6.xml b/103120/examples/xml/request6.xml similarity index 100% rename from 103120/examples/request6.xml rename to 103120/examples/xml/request6.xml diff --git a/103120/examples/request6_signed.xml b/103120/examples/xml/request6_signed.xml similarity index 100% rename from 103120/examples/request6_signed.xml rename to 103120/examples/xml/request6_signed.xml diff --git a/103120/examples/request7_TrafficPolicyObject.xml b/103120/examples/xml/request7_TrafficPolicyObject.xml similarity index 100% rename from 103120/examples/request7_TrafficPolicyObject.xml rename to 103120/examples/xml/request7_TrafficPolicyObject.xml diff --git a/103120/examples/response1.xml b/103120/examples/xml/response1.xml similarity index 100% rename from 103120/examples/response1.xml rename to 103120/examples/xml/response1.xml diff --git a/103120/examples/response2.xml b/103120/examples/xml/response2.xml similarity index 100% rename from 103120/examples/response2.xml rename to 103120/examples/xml/response2.xml diff --git a/103120/examples/response3.xml b/103120/examples/xml/response3.xml similarity index 100% rename from 103120/examples/response3.xml rename to 103120/examples/xml/response3.xml diff --git a/103120/examples/response4.xml b/103120/examples/xml/response4.xml similarity index 100% rename from 103120/examples/response4.xml rename to 103120/examples/xml/response4.xml diff --git a/103120/examples/response5.xml b/103120/examples/xml/response5.xml similarity index 100% rename from 103120/examples/response5.xml rename to 103120/examples/xml/response5.xml diff --git a/103120/examples/response6.xml b/103120/examples/xml/response6.xml similarity index 100% rename from 103120/examples/response6.xml rename to 103120/examples/xml/response6.xml diff --git a/103120/schema/ts_103120_Authorisation.xsd b/103120/schema/xsd/ts_103120_Authorisation.xsd similarity index 100% rename from 103120/schema/ts_103120_Authorisation.xsd rename to 103120/schema/xsd/ts_103120_Authorisation.xsd diff --git a/103120/schema/ts_103120_Common.xsd b/103120/schema/xsd/ts_103120_Common.xsd similarity index 100% rename from 103120/schema/ts_103120_Common.xsd rename to 103120/schema/xsd/ts_103120_Common.xsd diff --git a/103120/schema/ts_103120_Core.xsd b/103120/schema/xsd/ts_103120_Core.xsd similarity index 100% rename from 103120/schema/ts_103120_Core.xsd rename to 103120/schema/xsd/ts_103120_Core.xsd diff --git a/103120/schema/ts_103120_Delivery.xsd b/103120/schema/xsd/ts_103120_Delivery.xsd similarity index 100% rename from 103120/schema/ts_103120_Delivery.xsd rename to 103120/schema/xsd/ts_103120_Delivery.xsd diff --git a/103120/schema/ts_103120_Document.xsd b/103120/schema/xsd/ts_103120_Document.xsd similarity index 100% rename from 103120/schema/ts_103120_Document.xsd rename to 103120/schema/xsd/ts_103120_Document.xsd diff --git a/103120/schema/ts_103120_Notification.xsd b/103120/schema/xsd/ts_103120_Notification.xsd similarity index 100% rename from 103120/schema/ts_103120_Notification.xsd rename to 103120/schema/xsd/ts_103120_Notification.xsd diff --git a/103120/schema/ts_103120_Task.xsd b/103120/schema/xsd/ts_103120_Task.xsd similarity index 100% rename from 103120/schema/ts_103120_Task.xsd rename to 103120/schema/xsd/ts_103120_Task.xsd diff --git a/103120/schema/ts_103120_TrafficPolicy.xsd b/103120/schema/xsd/ts_103120_TrafficPolicy.xsd similarity index 100% rename from 103120/schema/ts_103120_TrafficPolicy.xsd rename to 103120/schema/xsd/ts_103120_TrafficPolicy.xsd -- GitLab From 83e5d635997f5538257d4c98c4b96bc21a2c762a Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 8 Jun 2023 17:23:07 +0100 Subject: [PATCH 17/18] Correcting location --- TS_103_120_CR045__JSON.docx | Bin 0 -> 75378 bytes ..._diff_blocks_instead_of_track_changes.docx | Bin 36570 -> 0 bytes testing/xsd_compile_targets.json | 20 +++++++++--------- 3 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 TS_103_120_CR045__JSON.docx delete mode 100644 Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx diff --git a/TS_103_120_CR045__JSON.docx b/TS_103_120_CR045__JSON.docx new file mode 100644 index 0000000000000000000000000000000000000000..c2ebfba7e9afb109da67671a09df40530f996558 GIT binary patch literal 75378 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

=BA+aH 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 literal 0 HcmV?d00001 diff --git a/Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx b/Update_artefacts_to_produce_diff_blocks_instead_of_track_changes.docx deleted file mode 100644 index 74b1d0ec85080a6d16d974d4c00ebabeba589c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36570 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

7Y{e@NwfS){SCn9PkabA;tZqUl_K$| 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 IlDj}W0H0VWLjV8( diff --git a/testing/xsd_compile_targets.json b/testing/xsd_compile_targets.json index a1bde12..5e12fb4 100644 --- a/testing/xsd_compile_targets.json +++ b/testing/xsd_compile_targets.json @@ -30,21 +30,21 @@ ] }, { - "coreSchema" : "103120/schema/ts_103120_Core.xsd", + "coreSchema" : "103120/schema/xsd/ts_103120_Core.xsd", "supportingSchemas" : [ - "103120/schema/ts_103120_Authorisation.xsd", - "103120/schema/ts_103120_Common.xsd", - "103120/schema/ts_103120_Delivery.xsd", - "103120/schema/ts_103120_Document.xsd", - "103120/schema/ts_103120_Notification.xsd", - "103120/schema/ts_103120_Task.xsd", - "103120/schema/ts_103120_TrafficPolicy.xsd", + "103120/schema/xsd/ts_103120_Authorisation.xsd", + "103120/schema/xsd/ts_103120_Common.xsd", + "103120/schema/xsd/ts_103120_Delivery.xsd", + "103120/schema/xsd/ts_103120_Document.xsd", + "103120/schema/xsd/ts_103120_Notification.xsd", + "103120/schema/xsd/ts_103120_Task.xsd", + "103120/schema/xsd/ts_103120_TrafficPolicy.xsd", "103280/TS_103_280.xsd", "testing/deps/xmldsig/xmldsig-core-schema.xsd", - "103120/examples/FooServiceSchema.xsd" + "103120/examples/xml/FooServiceSchema.xsd" ], "exampleFiles" : [ - "103120/examples" + "103120/examples/xml" ] } ] \ No newline at end of file -- GitLab From da43c4aac6d47378a1df0a20a2728ec0f1e276f1 Mon Sep 17 00:00:00 2001 From: mark Date: Wed, 21 Jun 2023 13:31:10 +0100 Subject: [PATCH 18/18] Removing temp files and adding initial examples --- 103120/examples/json/fragment.json | 38 ----- 103120/examples/json/fragment.schema.json | 4 - 103120/examples/json/request1.json | 174 +++++++++++----------- 103120/examples/json/request1b.json | 43 ------ 103120/examples/json/request1c.json | 33 ---- 103120/examples/json/request1d.json | 47 ------ 103120/examples/json/request2.json | 44 ++++++ 103120/examples/json/response1.xml | 44 ++++++ 103120/examples/json/response2.xml | 118 +++++++++++++++ TS_103_120_CR045__JSON.docx | Bin 75378 -> 0 bytes utils/request.fragment.schema.json | 4 - 11 files changed, 296 insertions(+), 253 deletions(-) delete mode 100644 103120/examples/json/fragment.json delete mode 100644 103120/examples/json/fragment.schema.json delete mode 100644 103120/examples/json/request1b.json delete mode 100644 103120/examples/json/request1c.json delete mode 100644 103120/examples/json/request1d.json create mode 100644 103120/examples/json/request2.json create mode 100644 103120/examples/json/response1.xml create mode 100644 103120/examples/json/response2.xml delete mode 100644 TS_103_120_CR045__JSON.docx delete mode 100644 utils/request.fragment.schema.json diff --git a/103120/examples/json/fragment.json b/103120/examples/json/fragment.json deleted file mode 100644 index 44f2f88..0000000 --- a/103120/examples/json/fragment.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", - "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "AssociatedObjects": { - "AssociatedObject": ["7dbbc880-8750-4d3c-abe7-ea4a17646045"] - }, - "task:Reference": "LIID1", - "task:TargetIdentifier": { - "task:TargetIdentifierValues": { - "task:TargetIdentifierValue": [{ - "task:FormatType": { - "task:FormatOwner": "ETSI", - "task:FormatName": "InternationalE164" - }, - "task:Value": "442079460223" - }] - } - }, - "task:DeliveryType": { - "common:Owner": "ETSI", - "common:Name": "TaskDeliveryType", - "common:Value": "IRIandCC" - }, - "task:DeliveryDetails": { - "task:DeliveryDestination": [{ - "task:DeliveryAddress": { - "IPv4Address": "192.0.2.0" - } - }] - }, - "task:CSPID": { - "CountryCode": "XX", - "UniqueIdentifier": "RECVER01" - } - -} \ No newline at end of file diff --git a/103120/examples/json/fragment.schema.json b/103120/examples/json/fragment.schema.json deleted file mode 100644 index afb21c1..0000000 --- a/103120/examples/json/fragment.schema.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$id": "ts_103120_Task_2020_09", - "$ref" : "#/$defs/RequestPayload" -} \ No newline at end of file diff --git a/103120/examples/json/request1.json b/103120/examples/json/request1.json index d5c90ab..71e5fa3 100644 --- a/103120/examples/json/request1.json +++ b/103120/examples/json/request1.json @@ -1,90 +1,96 @@ { - "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", - "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", - "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", - "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", - "Header": { - "SenderIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR01" - }, - "ReceiverIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR02" - }, - "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", - "Timestamp": "2015-09-01T12:00:00.000000Z", - "Version": { - "ETSIVersion": "V1.13.1", - "NationalProfileOwner": "XX", - "NationalProfileVersion": "v1.0" - } + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" }, - "Payload": { - "RequestPayload": { - "ActionRequests": { - "ActionRequest": [ - { - "ActionIdentifier": 0, - "CREATE": { - "HI1Object": { - "@xsi:type": "auth:AuthorisationObject", - "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "auth:AuthorisationReference": "W000001", - "auth:AuthorisationTimespan": { - "auth:StartTime": "2015-09-01T12:00:00Z", - "auth:EndTime": "2015-12-01T12:00:00Z" - } - } - } - }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 0, + "CREATE": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "auth:AuthorisationReference": "W000001", + "auth:AuthorisationTimespan": { + "auth:StartTime": "2015-09-01T12:00:00Z", + "auth:EndTime": "2015-12-01T12:00:00Z" + } + } + } + }, + { + "ActionIdentifier": 1, + "CREATE": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "AssociatedObjects": { + "AssociatedObject": [ + "7dbbc880-8750-4d3c-abe7-ea4a17646045" + ] + }, + "task:Reference": "LIID1", + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": [ + { + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" + } + ] + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": [ { - "ActionIdentifier": 1, - "CREATE": { - "HI1Object": { - "@xsi:type": "task:LITaskObject", - "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "AssociatedObjects": { - "AssociatedObject": "7dbbc880-8750-4d3c-abe7-ea4a17646045" - }, - "task:Reference": "LIID1", - "task:TargetIdentifier": { - "task:TargetIdentifierValues": { - "task:TargetIdentifierValue": { - "task:FormatType": { - "task:FormatOwner": "ETSI", - "task:FormatName": "InternationalE164" - }, - "task:Value": "442079460223" - } - } - }, - "task:DeliveryType": { - "common:Owner": "ETSI", - "common:Name": "TaskDeliveryType", - "common:Value": "IRIandCC" - }, - "task:DeliveryDetails": { - "task:DeliveryDestination": { - "task:DeliveryAddress": { - "task:IPv4Address": "192.0.2.0" - } - } - }, - "task:CSPID": { - "CountryCode": "XX", - "UniqueIdentifier": "RECVER01" - } - } - } + "task:DeliveryAddress": { + "task:IPv4Address": "192.0.2.0" + } } - ] + ] + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "RECVER01" + } + } } - } + } + ] + } } -} \ No newline at end of file + } +} diff --git a/103120/examples/json/request1b.json b/103120/examples/json/request1b.json deleted file mode 100644 index 82b1a1e..0000000 --- a/103120/examples/json/request1b.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "Header": { - "SenderIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR01" - }, - "ReceiverIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR02" - }, - "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", - "Timestamp": "2015-09-01T12:00:00.000000Z", - "Version": { - "ETSIVersion": "V1.13.1", - "NationalProfileOwner": "XX", - "NationalProfileVersion": "v1.0" - } - }, - "Payload": { - "RequestPayload": { - "ActionRequests": { - "ActionRequest": [ - { - "ActionIdentifier": 0, - "CREATE": { - "HI1Object": { - "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", - "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", - "CountryCode": "XX", - "OwnerIdentifier": "ACTOR01", - "AuthorisationReference": "W000001", - "AuthorisationTimespan": { - "StartTime": "2015-09-01T12:00:00Z", - "EndTime": "2015-12-01T12:00:00Z" - } - } - } - } - ] - } - } - } -} \ No newline at end of file diff --git a/103120/examples/json/request1c.json b/103120/examples/json/request1c.json deleted file mode 100644 index 645f706..0000000 --- a/103120/examples/json/request1c.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "Header": { - "SenderIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR01" - }, - "ReceiverIdentifier": { - "CountryCode": "XX", - "UniqueIdentifier": "ACTOR02" - }, - "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", - "Timestamp": "2015-09-01T12:00:00.000000Z", - "Version": { - "ETSIVersion": "V1.13.1", - "NationalProfileOwner": "XX", - "NationalProfileVersion": "v1.0" - } - }, - "Payload": { - "RequestPayload": { - "ActionRequests": { - "ActionRequest": [ - { - "ActionIdentifier": 1, - "GET": { - "Identifier" : "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e" - } - } - ] - } - } - } -} \ No newline at end of file diff --git a/103120/examples/json/request1d.json b/103120/examples/json/request1d.json deleted file mode 100644 index bf34f7f..0000000 --- a/103120/examples/json/request1d.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "Header" : { - "SenderIdentifier" : { - "CountryCode" : "XX", - "UniqueIdentifier" : "ACTOR01" - }, - "ReceiverIdentifier" : { - "CountryCode" : "YY", - "UniqueIdentifier" : "ACTOR02" - }, - "TransactionIdentifier" : "c4a09046-61da-485b-83f2-ca12caebf40b", - "Timestamp" : "2022-06-10T15:50:00.000000Z", - "Version" : { - "ETSIVersion" : "V1.11.2", - "NationalProfileOwner" : "NA", - "NationalProfileVersion" : "NA" - } - }, - "Payload" : { - "ResponsePayload" : { - "ActionResponses" : { - "ActionResponse" : [{ - "ActionIdentifier" : 0, - "CREATEResponse" : { - "Identifier" : "f25dec16-927c-433b-959c-1886182cac58", - "HI1Object" : { - "xsiType" : "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", - "ObjectIdentifier" : "d980e335-d17a-471f-bb40-cddf4457fd6b", - "Reference" : "LIID", - "TargetIdentifier" : { - "TargetIdentifierValues" : { - "TargetIdentifierValue" : [ { - "FormatType" : { - "FormatOwner" : "ETSI", - "FormatName" : "InternationalE164" - }, - "Value" : "447700900123" - } ] - } - } - } - } - }] - } - } - } -} diff --git a/103120/examples/json/request2.json b/103120/examples/json/request2.json new file mode 100644 index 0000000..476c15f --- /dev/null +++ b/103120/examples/json/request2.json @@ -0,0 +1,44 @@ +{ + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "45002c1e-dc4a-470a-9152-8e752638c86c", + "Timestamp": "2015-09-01T12:01:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "RequestPayload": { + "ActionRequests": { + "ActionRequest": [ + { + "ActionIdentifier": 0, + "GET": { + "Identifier": "2b36a78b-b628-416d-bd22-404e68a0cd36" + } + }, + { + "ActionIdentifier": 1, + "GET": { + "Identifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045" + } + } + ] + } + } + } +} diff --git a/103120/examples/json/response1.xml b/103120/examples/json/response1.xml new file mode 100644 index 0000000..3a97690 --- /dev/null +++ b/103120/examples/json/response1.xml @@ -0,0 +1,44 @@ +{ + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "c02358b2-76cf-4ba4-a8eb-f6436ccaea2e", + "Timestamp": "2015-09-01T12:00:01.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "ResponsePayload": { + "ActionResponses": { + "ActionResponse": [ + { + "ActionIdentifier": 0, + "CREATEResponse": { + "Identifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045" + } + }, + { + "ActionIdentifier": 1, + "CREATEResponse": { + "Identifier": "2b36a78b-b628-416d-bd22-404e68a0cd36" + } + } + ] + } + } + } +} diff --git a/103120/examples/json/response2.xml b/103120/examples/json/response2.xml new file mode 100644 index 0000000..829c8a7 --- /dev/null +++ b/103120/examples/json/response2.xml @@ -0,0 +1,118 @@ +{ + "@xmlns": "http://uri.etsi.org/03120/common/2019/10/Core", + "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "@xmlns:common": "http://uri.etsi.org/03120/common/2016/02/Common", + "@xmlns:task": "http://uri.etsi.org/03120/common/2020/09/Task", + "@xmlns:auth": "http://uri.etsi.org/03120/common/2020/09/Authorisation", + "Header": { + "SenderIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR01" + }, + "ReceiverIdentifier": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "TransactionIdentifier": "45002c1e-dc4a-470a-9152-8e752638c86c", + "Timestamp": "2015-09-01T12:01:00.000000Z", + "Version": { + "ETSIVersion": "V1.13.1", + "NationalProfileOwner": "XX", + "NationalProfileVersion": "v1.0" + } + }, + "Payload": { + "ResponsePayload": { + "ActionResponses": { + "ActionResponse": [ + { + "ActionIdentifier": 0, + "GETResponse": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Authorisation}AuthorisationObject", + "ObjectIdentifier": "7dbbc880-8750-4d3c-abe7-ea4a17646045", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "Generation": "1", + "LastChanged": "2015-09-01T12:00:00Z", + "auth:AuthorisationReference": "W000001", + "auth:AuthorisationStatus": { + "common:Owner": "ETSI", + "common:Name": "AuthorisationStatus", + "common:Value": "Invalid" + }, + "auth:AuthorisationTimespan": { + "auth:StartTime": "2015-09-01T12:00:00Z", + "auth:EndTime": "2015-12-01T12:00:00Z" + }, + "auth:AuthorisationInvalidReason": { + "ErrorCode": "3000", + "ErrorDescription": "The Authorisation is not associated with a valid Warrant Document Object" + } + } + } + }, + { + "ActionIdentifier": 0, + "GETResponse": { + "HI1Object": { + "@xsi:type": "{http://uri.etsi.org/03120/common/2020/09/Task}LITaskObject", + "ObjectIdentifier": "2b36a78b-b628-416d-bd22-404e68a0cd36", + "CountryCode": "XX", + "OwnerIdentifier": "ACTOR01", + "Generation": "1", + "AssociatedObjects": { + "AssociatedObject": [ + "7dbbc880-8750-4d3c-abe7-ea4a17646045" + ] + }, + "LastChanged": "2015-09-01T12:00:00Z", + "task:Reference": "LIID1", + "task:Status": { + "common:Owner": "ETSI", + "common:Name": "TaskStatus", + "common:Value": "Invalid" + }, + "task:TargetIdentifier": { + "task:TargetIdentifierValues": { + "task:TargetIdentifierValue": [ + { + "task:FormatType": { + "task:FormatOwner": "ETSI", + "task:FormatName": "InternationalE164" + }, + "task:Value": "442079460223" + } + ] + } + }, + "task:DeliveryType": { + "common:Owner": "ETSI", + "common:Name": "TaskDeliveryType", + "common:Value": "IRIandCC" + }, + "task:DeliveryDetails": { + "task:DeliveryDestination": [ + { + "task:DeliveryAddress": { + "task:IPv4Address": "192.0.2.0" + } + } + ] + }, + "task:CSPID": { + "CountryCode": "XX", + "UniqueIdentifier": "ACTOR02" + }, + "task:InvalidReason": { + "ErrorCode": "3000", + "ErrorDescription": "The associated Authorisation is in an Invalid state" + } + } + } + } + ] + } + } + } +} diff --git a/TS_103_120_CR045__JSON.docx b/TS_103_120_CR045__JSON.docx deleted file mode 100644 index c2ebfba7e9afb109da67671a09df40530f996558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75378 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

=BA+aH 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 diff --git a/utils/request.fragment.schema.json b/utils/request.fragment.schema.json deleted file mode 100644 index dc2bb14..0000000 --- a/utils/request.fragment.schema.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$id": "fragment_request", - "$ref" : "#/$defs/RequestPayload" -} \ No newline at end of file -- GitLab