| rfc9880v1.txt | rfc9880.txt | |||
|---|---|---|---|---|
| Internet Engineering Task Force (IETF) M. Koster, Ed. | Internet Engineering Task Force (IETF) M. Koster, Ed. | |||
| Request for Comments: 9880 KTC Control AB | Request for Comments: 9880 KTC Control AB | |||
| Category: Standards Track C. Bormann, Ed. | Category: Standards Track C. Bormann, Ed. | |||
| ISSN: 2070-1721 Universität Bremen TZI | ISSN: 2070-1721 Universität Bremen TZI | |||
| A. Keränen | A. Keränen | |||
| Ericsson | Ericsson | |||
| October 2025 | December 2025 | |||
| Semantic Definition Format (SDF) for Data and Interactions of Things | Semantic Definition Format (SDF) for Data and Interactions of Things | |||
| Abstract | Abstract | |||
| The Semantic Definition Format (SDF) is concerned with Things, namely | The Semantic Definition Format (SDF) is a format for domain experts | |||
| physical objects that are available for interaction over a network. | to use in the creation and maintenance of data and interaction models | |||
| SDF is a format for domain experts to use in the creation and | that describe Things, i.e., physical objects that are available for | |||
| maintenance of data and interaction models that describe Things. An | interaction over a network. An SDF specification describes | |||
| SDF specification describes definitions of SDF Objects/SDF Things and | definitions of SDF Objects/SDF Things and their associated | |||
| their associated interactions (Events, Actions, and Properties), as | interactions (Events, Actions, and Properties), as well as the Data | |||
| well as the Data types for the information exchanged in those | types for the information exchanged in those interactions. Tools | |||
| interactions. Tools convert this format to database formats and | convert this format to database formats and other serializations as | |||
| other serializations as needed. | needed. | |||
| Status of This Memo | Status of This Memo | |||
| This is an Internet Standards Track document. | This is an Internet Standards Track document. | |||
| This document is a product of the Internet Engineering Task Force | This document is a product of the Internet Engineering Task Force | |||
| (IETF). It represents the consensus of the IETF community. It has | (IETF). It represents the consensus of the IETF community. It has | |||
| received public review and has been approved for publication by the | received public review and has been approved for publication by the | |||
| Internet Engineering Steering Group (IESG). Further information on | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | Internet Standards is available in Section 2 of RFC 7841. | |||
| skipping to change at line 129 ¶ | skipping to change at line 129 ¶ | |||
| Appendix C. Data Qualities Inspired by json-schema.org | Appendix C. Data Qualities Inspired by json-schema.org | |||
| C.1. type "number", type "integer" | C.1. type "number", type "integer" | |||
| C.2. type "string" | C.2. type "string" | |||
| C.3. type "boolean" | C.3. type "boolean" | |||
| C.4. type "array" | C.4. type "array" | |||
| C.5. type "object" | C.5. type "object" | |||
| C.6. Implementation Notes | C.6. Implementation Notes | |||
| Appendix D. Composition Examples | Appendix D. Composition Examples | |||
| D.1. Outlet Strip Example | D.1. Outlet Strip Example | |||
| D.2. Refrigerator-Freezer Example | D.2. Refrigerator-Freezer Example | |||
| Appendix E. Some Changes From Earlier Drafts | Appendix E. Some Changes from Earlier Draft Versions of this | |||
| Specification | ||||
| List of Figures | List of Figures | |||
| List of Tables | List of Tables | |||
| Acknowledgements | Acknowledgements | |||
| Contributors | Contributors | |||
| Authors' Addresses | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| The Semantic Definition Format (SDF) is concerned with Things, namely | The Semantic Definition Format (SDF) is concerned with Things, namely | |||
| physical objects that are available for interaction over a network. | physical objects that are available for interaction over a network. | |||
| skipping to change at line 183 ¶ | skipping to change at line 184 ¶ | |||
| follow. The normative Appendix A defines the syntax of SDF in terms | follow. The normative Appendix A defines the syntax of SDF in terms | |||
| of its JSON structures, employing the Concise Data Definition | of its JSON structures, employing the Concise Data Definition | |||
| Language (CDDL) [RFC8610]. This is followed by the informative | Language (CDDL) [RFC8610]. This is followed by the informative | |||
| Appendix B, a rendition of the SDF syntax in a "JSON Schema" format | Appendix B, a rendition of the SDF syntax in a "JSON Schema" format | |||
| as they are defined by json-schema.org (collectively called JSO). | as they are defined by json-schema.org (collectively called JSO). | |||
| The normative Appendix C defines certain terms ("data qualities") | The normative Appendix C defines certain terms ("data qualities") | |||
| used at the SDF data model level that were inspired by JSO. The | used at the SDF data model level that were inspired by JSO. The | |||
| informative Appendix D provides a few examples for the use of | informative Appendix D provides a few examples for the use of | |||
| composition in SDF. Finally, Appendix E provides some historical | composition in SDF. Finally, Appendix E provides some historical | |||
| information that can be useful in upgrading earlier, pre-standard SDF | information that can be useful in upgrading earlier, pre-standard SDF | |||
| models and implementations to SDF base. | models and implementations to base SDF. | |||
| 1.2. Terminology and Conventions | 1.2. Terminology and Conventions | |||
| Terms introduced in this section are capitalized when used in this | Terms introduced in this section are capitalized when used in this | |||
| section. To maintain readability, capitalization is only used when | section. To maintain readability, capitalization is only used when | |||
| needed where they are used in the body of this document. | needed where they are used in the body of this document. | |||
| Programming Platform Terms | Programming Platform Terms | |||
| The following definitions mention terms that are used with specific | The following definitions mention terms that are used with specific | |||
| skipping to change at line 273 ¶ | skipping to change at line 274 ¶ | |||
| interaction opportunities offered by one or more kinds of Things, | interaction opportunities offered by one or more kinds of Things, | |||
| represented by Groupings (sdfObjects and sdfThings). An SDF Model | represented by Groupings (sdfObjects and sdfThings). An SDF Model | |||
| can be fully contained in a single SDF Document, or it can be | can be fully contained in a single SDF Document, or it can be | |||
| built from an SDF Document that references definitions and | built from an SDF Document that references definitions and | |||
| declarations from additional SDF documents. | declarations from additional SDF documents. | |||
| Block: One or more entries in a JSON map that is part of an SDF | Block: One or more entries in a JSON map that is part of an SDF | |||
| specification. These entries can be described as a Block to | specification. These entries can be described as a Block to | |||
| emphasize that they serve a specific function together. | emphasize that they serve a specific function together. | |||
| Group: An entry in the main JSON map that represents the SDF | Group: An entry in the top-level JSON map that represents the SDF | |||
| document, and in certain nested definitions. A group has a Class | document. Groups also can be used in certain nested definitions. | |||
| Name Keyword as its key and a map of named definition entries | A group has a Class Name Keyword as its key and a map of named | |||
| (Definition Group) as a value. | definition entries (Definition Group) as a value. | |||
| Class Name Keyword: One of sdfThing, sdfObject, sdfProperty, | Class Name Keyword: One of sdfThing, sdfObject, sdfProperty, | |||
| sdfAction, sdfEvent, or sdfData. The Classes for these type | sdfAction, sdfEvent, or sdfData. The Classes for these type | |||
| keywords are capitalized and prefixed with sdf. | keywords are capitalized and prefixed with sdf. | |||
| Class: Abstract term for the information that is contained in groups | Class: Abstract term for the information that is contained in groups | |||
| identified by a Class Name Keyword. | identified by a Class Name Keyword. | |||
| Quality: A metadata item in a definition or declaration that says | Quality: A metadata item in a definition or declaration that says | |||
| something about that definition or declaration. A quality is | something about that definition or declaration. A quality is | |||
| skipping to change at line 425 ¶ | skipping to change at line 426 ¶ | |||
| sdfProperty group, represented by a Boolean, will be true for "on" | sdfProperty group, represented by a Boolean, will be true for "on" | |||
| and will be false for "off". The Actions on or off declared in the | and will be false for "off". The Actions on or off declared in the | |||
| sdfAction group are redundant with setting the value and are in the | sdfAction group are redundant with setting the value and are in the | |||
| example to illustrate that there are often different ways of | example to illustrate that there are often different ways of | |||
| achieving the same effect. The action toggle will invert the value | achieving the same effect. The action toggle will invert the value | |||
| of the sdfProperty value so that 2-way switches can be created; | of the sdfProperty value so that 2-way switches can be created; | |||
| having such action will avoid the need for retrieving the current | having such action will avoid the need for retrieving the current | |||
| value first and then applying/setting the inverted value. | value first and then applying/setting the inverted value. | |||
| The sdfObject group lists the affordances of Things modeled by this | The sdfObject group lists the affordances of Things modeled by this | |||
| sdfObject. The sdfProperty group lists the property affordances | sdfObject. The sdfProperty group lists the Property affordances | |||
| described by the model; these represent various perspectives on the | described by the model; these represent various perspectives on the | |||
| state of the sdfObject. Properties can have additional qualities to | state of the sdfObject. Properties can have additional qualities to | |||
| describe the state more precisely. Properties can be annotated to be | describe the state more precisely. Properties can be annotated to be | |||
| read, write, or read/write; how this is actually done by the | read, write, or read/write; how this is actually done by the | |||
| underlying transfer protocols is not described in the SDF model but | underlying transfer protocols is not described in the SDF model but | |||
| left to companion protocol bindings. Properties are often used with | left to companion protocol bindings. Properties are often used with | |||
| RESTful paradigms [REST-IOT] describing state. The sdfAction group | RESTful paradigms [REST-IOT] describing state. The sdfAction group | |||
| is the mechanism to describe other interactions in terms of their | is the mechanism to describe other interactions in terms of their | |||
| names, input, and output data (no data are used in the example), as | names, input, and output data (no data are used in the example), as | |||
| in a POST method in REST or in a remote procedure call. The example | in a POST method in REST or in a remote procedure call. The example | |||
| toggle is an Action that changes the state based on the current state | toggle is an Action that changes the state based on the current state | |||
| of the Property named value. (The third type of affordance is | of the Property named value. (The third type of affordance is | |||
| Events, which are not described in this example.) | Events, which are not described in this example.) | |||
| In the JSON representation, the info group is an exception in that | In the JSON representation, the info group is an exception in that | |||
| this group's map has keys taken from the SDF vocabulary. All other | this group's map has keys taken from the SDF vocabulary. All other | |||
| groups (such as namespace and sdfObject) have maps with keys that are | groups (such as namespace and sdfObject) have maps with keys that are | |||
| freely defined by the model writer (Switch, value, on, etc.). These | freely defined by the model writer (Switch, value, on, etc.). These | |||
| map keys are therefore called _given names_. The groups made up of | map keys are therefore called _given names_. The groups made up of | |||
| entries with given names as keys usually use the named<> production | entries with given names as keys usually use the named<> production | |||
| in the formal syntax of SDF Appendix A. Where the values of these | in the formal syntax of SDF (Appendix A). Where the values of these | |||
| entries are maps, these again use SDF vocabulary keys, and so on, | entries are maps, these again use SDF vocabulary keys, and so on, | |||
| generally alternating in further nesting. The SDF-defined vocabulary | generally alternating in further nesting. The SDF-defined vocabulary | |||
| items used in the hierarchy of such groups are often, but not always, | items used in the hierarchy of such groups are often, but not always, | |||
| called _quality names_ or _qualities_. See Section 2.3 for more | called _Quality Names_ or _qualities_. See Section 2.3 for more | |||
| information about naming in SDF. | information about naming in SDF. | |||
| 2.2. Elements of an SDF Model | 2.2. Elements of an SDF Model | |||
| The SDF language uses six predefined Class Name Keywords for modeling | The SDF language uses six predefined Class Name Keywords for modeling | |||
| connected Things, which are illustrated in Figure 2 (limited | connected Things, which are illustrated in Figure 2 (limited | |||
| rendition in the plaintext form of this document, please use | rendition in the plaintext form of this document, please use | |||
| typographic forms for full information). | typographic forms for full information). | |||
| ,--------. | ,--------. | |||
| skipping to change at line 550 ¶ | skipping to change at line 551 ¶ | |||
| interactions modeled by them. It also provides qualities that | interactions modeled by them. It also provides qualities that | |||
| associate semantics to this data, such as engineering units and unit | associate semantics to this data, such as engineering units and unit | |||
| scaling information. | scaling information. | |||
| For the data definition within sdfProperty or sdfData, SDF borrows | For the data definition within sdfProperty or sdfData, SDF borrows | |||
| some vocabulary proposed for drafts 4 [JSO4] [JSO4V] and 7 [JSO7] | some vocabulary proposed for drafts 4 [JSO4] [JSO4V] and 7 [JSO7] | |||
| [JSO7V] of the json-schema.org "JSON Schema" format (collectively | [JSO7V] of the json-schema.org "JSON Schema" format (collectively | |||
| called JSO here), enhanced by qualities that are specific to SDF. | called JSO here), enhanced by qualities that are specific to SDF. | |||
| Details about the JSO-inspired vocabulary are in Appendix C. For | Details about the JSO-inspired vocabulary are in Appendix C. For | |||
| base SDF, data are constrained to be of simple types (number, string, | base SDF, data are constrained to be of simple types (number, string, | |||
| Boolean), JSON maps composed of named data, and arrays of these | boolean), JSON maps composed of named data, and arrays of these | |||
| types. Syntax extension points are provided that can be used to | types. Syntax extension points are provided that can be used to | |||
| provide richer types in a future extension of this specification | provide richer types in a future extension of this specification | |||
| (possibly more of which can be borrowed from json-schema.org). | (possibly more of which can be borrowed from json-schema.org). | |||
| Note that sdfProperty definitions (and sdfData definitions in | Note that sdfProperty definitions (and sdfData definitions in | |||
| general) are not intended to constrain the formats of data used for | general) are not intended to constrain the formats of data used for | |||
| communication over network interfaces. Where needed, data | communication over network interfaces. Where needed, data | |||
| definitions for payloads of protocol messages are expected to be part | definitions for payloads of protocol messages are expected to be part | |||
| of the protocol binding. | of the protocol binding. | |||
| skipping to change at line 703 ¶ | skipping to change at line 704 ¶ | |||
| defined using the CDDL generic rule reference named<membervalues>, | defined using the CDDL generic rule reference named<membervalues>, | |||
| where membervalues is in turn the structure of the member values of | where membervalues is in turn the structure of the member values of | |||
| the JSON map, i.e., the value of the member named by the Given Name. | the JSON map, i.e., the value of the member named by the Given Name. | |||
| As quality-named maps and given-named maps roughly alternate in a | As quality-named maps and given-named maps roughly alternate in a | |||
| path down the tree, membervalues is usually a map built from Quality | path down the tree, membervalues is usually a map built from Quality | |||
| Names as keys. | Names as keys. | |||
| 2.3.2. Hierarchical Names | 2.3.2. Hierarchical Names | |||
| From the outside of a specification, Given Names are usually used as | From the outside of a specification, Given Names are usually used as | |||
| part of a hierarchical name that looks like a JSON pointer [RFC6901], | part of a hierarchical name that looks like a JSON Pointer [RFC6901]. | |||
| itself generally rooted in (used as the fragment identifier in) an | These hierarchical names are generally rooted in (used as the | |||
| outer namespace that looks like an https:// URL (see Section 4). | fragment identifier in) an outer namespace that looks like an | |||
| https:// URL (see Section 4). | ||||
| As Quality Names and Given Names roughly alternate in a path into the | As Quality Names and Given Names roughly alternate in a path into the | |||
| model, the JSON pointer part of the hierarchical name also alternates | model, the JSON Pointer part of the hierarchical name also alternates | |||
| between Quality Names and Given Names. | between Quality Names and Given Names. | |||
| Note that the actual Given Names may need to be encoded when | Note that the actual Given Names may need to be encoded when | |||
| specified via the JSON pointer fragment identifier syntax. There are | specified via the JSON Pointer fragment identifier syntax. There are | |||
| two layers of such encoding: tilde encoding of ~ and / as per | two layers of such encoding: tilde encoding of ~ and / as per | |||
| Section 3 of [RFC6901], as well as percent encoding of the tilde- | Section 3 of [RFC6901], as well as percent encoding of the tilde- | |||
| encoded name into a valid URI fragment as per Section 6 of [RFC6901]. | encoded name into a valid URI fragment as per Section 6 of [RFC6901]. | |||
| For example, when a model is using the Given Name | For example, when a model is using the Given Name | |||
| warning/danger alarm | warning/danger alarm | |||
| (with an embedded slash and a space) for an sdfObject, that sdfObject | (with an embedded slash and a space) for an sdfObject, that sdfObject | |||
| may need to be referenced as | may need to be referenced as | |||
| skipping to change at line 739 ¶ | skipping to change at line 741 ¶ | |||
| 2.3.3. Extensibility of Given Names and Quality Names | 2.3.3. Extensibility of Given Names and Quality Names | |||
| In SDF, both Quality Names and Given Names are _extension points_. | In SDF, both Quality Names and Given Names are _extension points_. | |||
| This is more obvious for Quality Names. Extending SDF is mostly done | This is more obvious for Quality Names. Extending SDF is mostly done | |||
| by defining additional qualities. To enable non-conflicting third | by defining additional qualities. To enable non-conflicting third | |||
| party extensions to SDF, qualified names (names with an embedded | party extensions to SDF, qualified names (names with an embedded | |||
| colon) can be used as Quality Names. | colon) can be used as Quality Names. | |||
| A nonqualified Quality Name is composed of ASCII letters, digits, and | A nonqualified Quality Name is composed of ASCII letters, digits, and | |||
| $ signs, starting with a lower case letter or a $ sign (i.e., using a | $ signs, starting with a lower case letter or a $ sign (i.e., using a | |||
| pattern of "_[a-z$][A-Za-z$0-9]*"). Names with $ signs are intended | pattern of "[a-z$][A-Za-z$0-9]*"). Names with $ signs are intended | |||
| to be used for functions separate from most other names; for | to be used for functions separate from most other names; for | |||
| instance, $comment is used for the comment quality in this | instance, $comment is used for the comment quality in this | |||
| specification (the presence or absence of a $comment quality does not | specification (the presence or absence of a $comment quality does not | |||
| change the meaning of the SDF model). Names that are composed of | change the meaning of the SDF model). Names that are composed of | |||
| multiple English words can use the "lowerCamelCase" convention | multiple English words can use the "lowerCamelCase" convention | |||
| [CamelCase] for indicating the word boundaries; no other use is | [CamelCase] for indicating the word boundaries; no other use is | |||
| intended for upper case letters in quality names. | intended for upper case letters in quality names. | |||
| A qualified Quality Name is composed of a Quality Name Prefix, a : | A qualified Quality Name is composed of a Quality Name Prefix, a : | |||
| (colon) character, and a nonqualified Quality Name. Quality Name | (colon) character, and a nonqualified Quality Name. Quality Name | |||
| Prefixes are registered in the "Quality Name Prefixes" registry in | Prefixes are registered in the "Quality Name Prefixes" registry in | |||
| the "Semantic Definition Format (SDF)" registry group | the "Semantic Definition Format (SDF)" registry group | |||
| (Section 7.5.2). They are composed of lower case ASCII letters and | (Section 7.5.2). They are composed of lower case ASCII letters and | |||
| digits, starting with a lowercase ASCII letter (i.e., using a pattern | digits, starting with a lowercase ASCII letter (i.e., using a pattern | |||
| of "_[a-z][a-z0-9]*"). | of "[a-z][a-z0-9]*"). | |||
| Given Names are not restricted by the formal SDF syntax. To enable | Given Names are not restricted by the formal SDF syntax. To enable | |||
| non-surprising name translations in tools, combinations of ASCII | non-surprising name translations in tools, combinations of ASCII | |||
| alphanumeric characters and - (ASCII hyphen/minus) are preferred, | alphanumeric characters and - (ASCII hyphen/minus) are preferred, | |||
| typically employing kebab-case for names constructed out of multiple | typically employing kebab-case for names constructed out of multiple | |||
| words [KebabCase]. ASCII hyphen/minus can then unambiguously be | words [KebabCase]. ASCII hyphen/minus can then unambiguously be | |||
| translated to an ASCII _ underscore character and back depending on | translated to an ASCII _ underscore character and back depending on | |||
| the programming environment. Some styles also allow a dot (".") in | the programming environment. Some styles also allow a dot (".") in | |||
| given names. Given Names are often sufficiently self-explanatory | given names. Given Names are often sufficiently self-explanatory | |||
| that they can be used in place of the label quality if that is not | that they can be used in place of the label quality if that is not | |||
| given. In turn, if a given name turns out too complicated, a more | given. In turn, if a given name turns out too complicated, a more | |||
| elaborate label can be given and the given name kept simple. As | elaborate label can be given and the given name kept simple. As | |||
| given names are "programmers' names", base SDF does not address | given names are "programmers' names", base SDF does not address | |||
| internationalization of given names. (More likely qualities to | internationalization of given names. (More likely qualities to | |||
| receive localizable equivalents by exercising the quality name | receive localizable equivalents by exercising the Quality Name | |||
| extension point are label and description). | extension point are label and description). | |||
| Further, to enable Given Names to have a more powerful role in | Further, to enable Given Names to have a more powerful role in | |||
| building global hierarchical names, an extension is planned that | building global hierarchical names, an extension is planned that | |||
| makes use of qualified names for Given Names. So, until that | makes use of qualified names for Given Names. So, until that | |||
| extension is defined, Given Names with one or more embedded colons | extension is defined, Given Names with one or more embedded colons | |||
| are reserved and MUST NOT be used in an SDF document. | are reserved and MUST NOT be used in an SDF document. | |||
| All names in SDF are case-sensitive. | All names in SDF are case-sensitive. | |||
| skipping to change at line 791 ¶ | skipping to change at line 793 ¶ | |||
| SDF definitions are contained in SDF documents together with data | SDF definitions are contained in SDF documents together with data | |||
| about the SDF document itself (information block). Definitions and | about the SDF document itself (information block). Definitions and | |||
| declarations from additional SDF documents can be referenced; | declarations from additional SDF documents can be referenced; | |||
| together with the definitions and declarations in the referencing SDF | together with the definitions and declarations in the referencing SDF | |||
| document, they build the SDF model expressed by that SDF document. | document, they build the SDF model expressed by that SDF document. | |||
| Each SDF document is represented as a single JSON map. This map can | Each SDF document is represented as a single JSON map. This map can | |||
| be thought of as having three blocks: the information block, the | be thought of as having three blocks: the information block, the | |||
| namespaces block, and the definitions block. These blocks contain | namespaces block, and the definitions block. These blocks contain | |||
| zero or more JSON name/value pairs, the names of which are quality | zero or more JSON name/value pairs, the names of which are Quality | |||
| names and the values of which mostly are (nested) maps (the exception | Names and the values of which mostly are (nested) maps (the exception | |||
| defined in SDF base is the defaultNamespace quality, the value of | defined in base SDF is the defaultNamespace quality, the value of | |||
| which is a text string). An empty nested map of this kind is | which is a text string). An empty nested map of this kind is | |||
| equivalent to not having the quality included at all. | equivalent to not having the quality included at all. | |||
| 3.1. Information Block | 3.1. Information Block | |||
| The information block contains generic metadata for the SDF document | The information block contains generic metadata for the SDF document | |||
| itself and all included definitions. To enable tool integration, the | itself and all included definitions. To enable tool integration, the | |||
| information block is optional in the grammar of SDF; most processes | information block is optional in the grammar of SDF; most processes | |||
| for working with SDF documents will have policies that only SDF | for working with SDF documents will have policies that only SDF | |||
| documents with an info block can be processed. It is therefore | documents with an info block can be processed. It is therefore | |||
| RECOMMENDED that SDF validator tools emit a warning when no | RECOMMENDED that SDF validator tools emit a warning when no | |||
| information block is found. | information block is found. | |||
| The keyword (map key) that defines an information block is "info". | The keyword (map key) that defines an information block is "info". | |||
| Its value is a JSON map in turn, with a set of entries that represent | The keyword's value is a nested JSON map with a set of entries that | |||
| qualities that apply to the included definition. | represent qualities that apply to the included definitions. | |||
| Qualities of this map are shown in Table 1. None of these qualities | Qualities of this map are shown in Table 1. None of these qualities | |||
| are required or have default values that are assumed if the quality | are required or have default values that are assumed if the quality | |||
| is absent. | is absent. | |||
| +=============+==========+=================================+ | +=============+==========+=================================+ | |||
| | Quality | Type | Description | | | Quality | Type | Description | | |||
| +=============+==========+=================================+ | +=============+==========+=================================+ | |||
| | title | string | A short summary to be displayed | | | title | string | A short summary to be displayed | | |||
| | | | in search results, etc. | | | | | in search results, etc. | | |||
| skipping to change at line 854 ¶ | skipping to change at line 856 ¶ | |||
| The version quality is used to indicate version information about the | The version quality is used to indicate version information about the | |||
| set of definitions in the SDF document. The version is RECOMMENDED | set of definitions in the SDF document. The version is RECOMMENDED | |||
| to be lexicographically increasing over the life of a model; a newer | to be lexicographically increasing over the life of a model; a newer | |||
| model always has a version string that string-compares higher than | model always has a version string that string-compares higher than | |||
| all previous versions. This is easily achieved by following the | all previous versions. This is easily achieved by following the | |||
| convention to start the version with a date-time as defined in | convention to start the version with a date-time as defined in | |||
| [RFC3339] or, if new versions are generated less frequently than once | [RFC3339] or, if new versions are generated less frequently than once | |||
| a day, just the full-date (i.e., YYYY-MM-DD); in many cases, that | a day, just the full-date (i.e., YYYY-MM-DD); in many cases, that | |||
| will be all that is needed (see Figure 1 for an example). This | will be all that is needed (see Figure 1 for an example). This | |||
| specification does not give a strict definition for the format of the | specification does not give a strict definition for the format of the | |||
| version string but each using system or organization should define | version string, but each system or organization using the version | |||
| internal structure and semantics to the level needed for their use. | string should define internal structure and semantics to the level | |||
| If no further details are provided, a date-time or full-date in this | needed for their use. If no further details are provided, a date- | |||
| field can be assumed to indicate the latest update time of the | time or full-date in this field can be assumed to indicate the latest | |||
| definitions in the SDF document. | update time of the definitions in the SDF document. | |||
| The modified quality can be used with a value using date-time as | The modified quality can be used with a value using date-time as | |||
| defined in [RFC3339] (with Z for time-zone) or full-date format to | defined in [RFC3339] (with Z for time-zone) or full-date format to | |||
| express time of the latest revision of the definitions. | express time of the latest revision of the definitions. | |||
| The license string is preferably either a URI that points to a web | The license string is preferably either a URI that points to a web | |||
| page with an unambiguous definition of the license or an [SPDX] | page with an unambiguous definition of the license or an [SPDX] | |||
| license identifier. (As an example, for models to be handled by the | license identifier. (As an example, for models to be handled by the | |||
| One Data Model liaison group, this license identifier will typically | One Data Model liaison group, this license identifier will typically | |||
| be "BSD-3-Clause".) | be "BSD-3-Clause".) | |||
| skipping to change at line 976 ¶ | skipping to change at line 978 ¶ | |||
| "type": "boolean" | "type": "boolean" | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| Figure 3: Example sdfObject Definition | Figure 3: Example sdfObject Definition | |||
| This example defines an sdfObject "foo" that is defined in the | This example defines an sdfObject "foo" that is defined in the | |||
| default namespace (full address: #/sdfObject/foo), containing a | default namespace (full address: #/sdfObject/foo), containing a | |||
| property that can be addressed as #/sdfObject/foo/sdfProperty/bar, | Property that can be addressed as #/sdfObject/foo/sdfProperty/bar, | |||
| with data of type boolean. | with data of type boolean. | |||
| Often, definitions are also declarations. The definition of the | Often, definitions are also declarations. The definition of the | |||
| entry "bar" in the property "foo" means that data corresponding to | entry "bar" in the Property "foo" means that data corresponding to | |||
| the "foo" property in a property interaction offered by Thing can | the "foo" Property in a Property interaction offered by Thing can | |||
| have zero or one components modeled by "bar". Entries within | have zero or one components modeled by "bar". Entries within | |||
| sdfProperty, sdfAction, and sdfEvent that are in turn within | sdfProperty, sdfAction, and sdfEvent that are in turn within | |||
| sdfObject or sdfThing entries, are also declarations; entries within | sdfObject or sdfThing entries, are also declarations; entries within | |||
| sdfData are not. Similarly, sdfObject or sdfThing entries within an | sdfData are not. Similarly, sdfObject or sdfThing entries within an | |||
| sdfThing definition specify that the interactions offered by a Thing | sdfThing definition specify that the interactions offered by a Thing | |||
| modeled by this sdfThing include the interactions modeled by the | modeled by this sdfThing include the interactions modeled by the | |||
| nested sdfObject or sdfThing. | nested sdfObject or sdfThing. | |||
| 3.4. Top-Level Affordances and sdfData | 3.4. Top-Level Affordances and sdfData | |||
| skipping to change at line 1026 ¶ | skipping to change at line 1028 ¶ | |||
| The absolute-URI of a global name should be a URI as per Section 3 of | The absolute-URI of a global name should be a URI as per Section 3 of | |||
| RFC 3986 [STD66] with a scheme of "https" and a path (hier-part in | RFC 3986 [STD66] with a scheme of "https" and a path (hier-part in | |||
| [STD66]). For base SDF, the query part should not be used (it might | [STD66]). For base SDF, the query part should not be used (it might | |||
| be used in extensions). | be used in extensions). | |||
| The fragment identifier is constructed as per Section 6 of [RFC6901]. | The fragment identifier is constructed as per Section 6 of [RFC6901]. | |||
| 4.2. Contributing Global Names | 4.2. Contributing Global Names | |||
| The fragment identifier part of a global name defined in an SDF | The fragment identifier part of a global name defined in an SDF | |||
| document is constructed from a JSON pointer that selects the element | document is constructed from a JSON Pointer that selects the element | |||
| defined for this name in the SDF document. The absolute-URI part is | defined for this name in the SDF document. The absolute-URI part is | |||
| a copy of the default namespace. | a copy of the default namespace. | |||
| As a result, the default namespace is always the target namespace for | As a result, the default namespace is always the target namespace for | |||
| a name for which a definition is contributed. In order to emphasize | a name for which a definition is contributed. In order to emphasize | |||
| that name definitions are contributed to the default namespace, this | that name definitions are contributed to the default namespace, this | |||
| namespace is also termed the "target namespace" of the SDF document. | namespace is also termed the "target namespace" of the SDF document. | |||
| For instance, in Figure 1, definitions for the following global names | For instance, in Figure 1, definitions for the following global names | |||
| are contributed: | are contributed: | |||
| skipping to change at line 1062 ¶ | skipping to change at line 1064 ¶ | |||
| A name reference takes the form of the production curie in Section 3 | A name reference takes the form of the production curie in Section 3 | |||
| of [W3C.NOTE-curie-20101216], but limiting the IRIs involved in that | of [W3C.NOTE-curie-20101216], but limiting the IRIs involved in that | |||
| grammar to URIs as per [STD66] and the prefixes to ASCII characters | grammar to URIs as per [STD66] and the prefixes to ASCII characters | |||
| [STD80]. (Note that this definition does not make use of the | [STD80]. (Note that this definition does not make use of the | |||
| production safe-curie in [W3C.NOTE-curie-20101216].) | production safe-curie in [W3C.NOTE-curie-20101216].) | |||
| A name that is contributed by the current SDF document can be | A name that is contributed by the current SDF document can be | |||
| referenced by a Same-Document Reference as per Section 4.4 of RFC | referenced by a Same-Document Reference as per Section 4.4 of RFC | |||
| 3986 [STD66]. As there is little point in referencing the entire SDF | 3986 [STD66]. As there is little point in referencing the entire SDF | |||
| document, this will be a # followed by a JSON pointer. This is the | document, this will be a # followed by a JSON Pointer. This is the | |||
| only kind of name reference to itself that is possible in an SDF | only kind of name reference to itself that is possible in an SDF | |||
| document that does not set a default namespace. | document that does not set a default namespace. | |||
| Name references that point outside the current SDF document need to | Name references that point outside the current SDF document need to | |||
| contain curie prefixes. These then reference namespace declarations | contain CURIE prefixes. These then reference namespace declarations | |||
| in the namespaces block. | in the namespaces block. | |||
| For example, if a namespace prefix is defined: | For example, if a namespace prefix is defined: | |||
| "namespace": { | "namespace": { | |||
| "foo": "https://example.com/" | "foo": "https://example.com/" | |||
| } | } | |||
| then this reference to that namespace: | then this reference to that namespace: | |||
| "sdfRef": "foo:#/sdfData/temperatureData" | "sdfRef": "foo:#/sdfData/temperatureData" | |||
| references the global name: | references the global name: | |||
| "https://example.com/#/sdfData/temperatureData" | "https://example.com/#/sdfData/temperatureData" | |||
| Note that there is no way to provide a URI scheme name in a curie, so | Note that there is no way to provide a URI scheme name in a CURIE, so | |||
| all references to outside of the document need to go through the | all references to outside of the document need to go through the | |||
| namespace map. | namespace map. | |||
| Name references occur only in specific elements of the syntax of SDF: | Name references occur only in specific elements of the syntax of SDF: | |||
| * copying elements via sdfRef values | * copying elements via sdfRef values | |||
| * pointing to elements via sdfRequired value elements | * pointing to elements via sdfRequired value elements | |||
| 4.4. sdfRef | 4.4. sdfRef | |||
| skipping to change at line 1131 ¶ | skipping to change at line 1133 ¶ | |||
| well. | well. | |||
| More formally, for a JSON map that contains an sdfRef member, the | More formally, for a JSON map that contains an sdfRef member, the | |||
| semantics are defined to be as if the following steps were performed: | semantics are defined to be as if the following steps were performed: | |||
| 1. The JSON map that contains the sdfRef member is copied into a | 1. The JSON map that contains the sdfRef member is copied into a | |||
| variable named "patch". | variable named "patch". | |||
| 2. The sdfRef member of the copy in "patch" is removed. | 2. The sdfRef member of the copy in "patch" is removed. | |||
| 3. The JSON pointer that is the value of the sdfRef member is | 3. The JSON Pointer that is the value of the sdfRef member is | |||
| dereferenced and the result is copied into a variable named | dereferenced and the result is copied into a variable named | |||
| "original". | "original". | |||
| 4. The JSON Merge Patch algorithm [RFC7396] is applied to patch the | 4. The JSON Merge Patch algorithm [RFC7396] is applied to patch the | |||
| contents of "original" with the contents of "patch". | contents of "original" with the contents of "patch". | |||
| 5. The result of the Merge Patch is used in place of the value of | 5. The result of the Merge Patch is used in place of the value of | |||
| the original JSON map. | the original JSON map. | |||
| Note that the formal syntaxes given in Appendices A and B generally | Note that the formal syntaxes given in Appendices A and B generally | |||
| skipping to change at line 1275 ¶ | skipping to change at line 1277 ¶ | |||
| declarations, one per affordance type. | declarations, one per affordance type. | |||
| - The same applies to groupings made mandatory within groupings | - The same applies to groupings made mandatory within groupings | |||
| containing them. | containing them. | |||
| * The Boolean value true. The affordance or grouping itself that | * The Boolean value true. The affordance or grouping itself that | |||
| carries the sdfRequired keyword is declared to be mandatory to be | carries the sdfRequired keyword is declared to be mandatory to be | |||
| represented. | represented. | |||
| Note that referenceable-names are not subject to the encoding JSON | Note that referenceable-names are not subject to the encoding JSON | |||
| pointers require as discussed in Section 2.3.2. To ensure that | Pointers require as discussed in Section 2.3.2. To ensure that | |||
| referenceable-names are reliably distinguished from JSON pointers, | referenceable-names are reliably distinguished from JSON Pointers, | |||
| they are defined such that they cannot contain ":" or "#" characters | they are defined such that they cannot contain ":" or "#" characters | |||
| (see rule referenceable-name in Appendix A). (If these characters | (see rule referenceable-name in Appendix A). (If these characters | |||
| are indeed contained in a Given Name, a JSON pointer needs to be | are indeed contained in a Given Name, a JSON Pointer needs to be | |||
| formed instead in order to reference it in "sdfRequired", potentially | formed instead in order to reference it in "sdfRequired", potentially | |||
| requiring further path elements as well as JSON pointer encoding. | requiring further path elements as well as JSON Pointer encoding. | |||
| The need for this is best avoided by choosing Given Names without | The need for this is best avoided by choosing Given Names without | |||
| these characters.) | these characters.) | |||
| The example in Figure 4 shows two required elements in the sdfObject | The example in Figure 4 shows two required elements in the sdfObject | |||
| definition for "temperatureWithAlarm", the sdfProperty | definition for "temperatureWithAlarm", the sdfProperty | |||
| "currentTemperature", and the sdfEvent "overTemperatureEvent". The | "currentTemperature", and the sdfEvent "overTemperatureEvent". The | |||
| example also shows the use of JSON pointer with "sdfRef" to use a | example also shows the use of JSON Pointers with "sdfRef" to use a | |||
| pre-existing definition for the sdfProperty "currentTemperature" and | pre-existing definition for the sdfProperty "currentTemperature" and | |||
| for the sdfOutputData produced by the sdfEvent | for the sdfOutputData produced by the sdfEvent | |||
| "overTemperatureEvent". | "overTemperatureEvent". | |||
| "sdfObject": { | "sdfObject": { | |||
| "temperatureWithAlarm": { | "temperatureWithAlarm": { | |||
| "sdfRequired": [ | "sdfRequired": [ | |||
| "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature", | "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature", | |||
| "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent" | "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent" | |||
| ], | ], | |||
| skipping to change at line 1342 ¶ | skipping to change at line 1344 ¶ | |||
| } | } | |||
| 4.6. Common Qualities | 4.6. Common Qualities | |||
| Definitions in SDF share a number of qualities that provide metadata | Definitions in SDF share a number of qualities that provide metadata | |||
| for them. These are listed in Table 3. None of these qualities are | for them. These are listed in Table 3. None of these qualities are | |||
| required or have default values that are assumed if the quality is | required or have default values that are assumed if the quality is | |||
| absent. If a short textual description is required for an | absent. If a short textual description is required for an | |||
| application and no label is given in the SDF model, applications | application and no label is given in the SDF model, applications | |||
| could use the last part (the last reference-token, Section 3 of | could use the last part (the last reference-token, Section 3 of | |||
| [RFC6901]) of the JSON pointer to the definition in its place. | [RFC6901]) of the JSON Pointer to the definition in its place. | |||
| +=============+==============+=============================+ | +=============+==============+=============================+ | |||
| | Quality | Type | Description | | | Quality | Type | Description | | |||
| +=============+==============+=============================+ | +=============+==============+=============================+ | |||
| | description | string | long text (no constraints) | | | description | string | long text (no constraints) | | |||
| +-------------+--------------+-----------------------------+ | +-------------+--------------+-----------------------------+ | |||
| | label | string | short text (no constraints) | | | label | string | short text (no constraints) | | |||
| +-------------+--------------+-----------------------------+ | +-------------+--------------+-----------------------------+ | |||
| | $comment | string | source code comments only, | | | $comment | string | source code comments only, | | |||
| | | | no semantics | | | | | no semantics | | |||
| skipping to change at line 1410 ¶ | skipping to change at line 1412 ¶ | |||
| | | (Section | | | | | | (Section | | | | |||
| | | 4.7.2) | | | | | | 4.7.2) | | | | |||
| +---------------+----------------+--------------------+---------+ | +---------------+----------------+--------------------+---------+ | |||
| | enum | array of | abbreviation for | N/A | | | enum | array of | abbreviation for | N/A | | |||
| | | strings | string-valued | | | | | strings | string-valued | | | |||
| | | | named alternatives | | | | | | named alternatives | | | |||
| +---------------+----------------+--------------------+---------+ | +---------------+----------------+--------------------+---------+ | |||
| Table 4: SDF-Defined Qualities of sdfData and sdfProperty | Table 4: SDF-Defined Qualities of sdfData and sdfProperty | |||
| 1. The unit name SHOULD be as per the SenML Units registry or the | 1. The unit name SHOULD be as per the "SenML Units" registry or the | |||
| Secondary Units registry in [IANA.senml] as specified by Sections | "Secondary Units" registry in [IANA.senml] as specified by | |||
| 4.5.2 and 12.1 of [RFC8428] and Section 3 of [RFC8798], | Sections 4.5.1 and 12.1 of [RFC8428] and Section 3 of [RFC8798], | |||
| respectively. | respectively. | |||
| Exceptionally, if a registration in these registries cannot be | Exceptionally, if a registration in these registries cannot be | |||
| obtained or would be inappropriate, the unit name can also be a | obtained or would be inappropriate, the unit name can also be a | |||
| URI that is pointing to a definition of the unit. Note that SDF | URI that is pointing to a definition of the unit. Note that SDF | |||
| processors are not expected to, and normally SHOULD NOT, | processors are not expected to, and normally SHOULD NOT, | |||
| dereference these URIs; the definition pointed to may be useful | dereference these URIs; the definition pointed to may be useful | |||
| to humans, though. (See [DEREF-ID-PATTERN] for a more extensive | to humans, though. (See [DEREF-ID-PATTERN] for a more extensive | |||
| discussion of dereferenceable identifiers). | discussion of dereferenceable identifiers). | |||
| skipping to change at line 1792 ¶ | skipping to change at line 1794 ¶ | |||
| Modular composition of definitions enables an existing definition | Modular composition of definitions enables an existing definition | |||
| (which could be in the same or another SDF document) to become part | (which could be in the same or another SDF document) to become part | |||
| of a new definition by including a reference to the existing | of a new definition by including a reference to the existing | |||
| definition within the model namespace. | definition within the model namespace. | |||
| 6.2.1. Use of the "sdfRef" Keyword to Reuse a Definition | 6.2.1. Use of the "sdfRef" Keyword to Reuse a Definition | |||
| An existing definition may be used as a template for a new | An existing definition may be used as a template for a new | |||
| definition, that is, a new definition is created in the target | definition, that is, a new definition is created in the target | |||
| namespace which uses the defined qualities of some existing | namespace that uses the defined qualities of some existing | |||
| definition. This pattern uses the keyword sdfRef as a quality of a | definition. This pattern uses the keyword sdfRef as a quality of a | |||
| new definition with a value consisting of a reference to the existing | new definition with a value consisting of a reference to the existing | |||
| definition that is to be used as a template. | definition that is to be used as a template. | |||
| In the definition that uses sdfRef, new qualities may be added and | In the definition that uses sdfRef, new qualities may be added and | |||
| existing qualities from the referenced definition may be overridden. | existing qualities from the referenced definition may be overridden. | |||
| (Note that JSON maps do not have a defined order, so the SDF | (Note that JSON maps do not have a defined order, so the SDF | |||
| processor may see these overrides before seeing the sdfRef.) | processor may see these overrides before seeing the sdfRef.) | |||
| Note that the definition referenced by sdfRef might contain qualities | Note that the definition referenced by sdfRef might contain qualities | |||
| skipping to change at line 1986 ¶ | skipping to change at line 1988 ¶ | |||
| Repository: Combining the symbol values from the "SenML Units" | Repository: Combining the symbol values from the "SenML Units" | |||
| registry and the "Secondary Units" registry in the "Sensor | registry and the "Secondary Units" registry in the "Sensor | |||
| Measurement Lists (SenML)" registry group [IANA.senml] as | Measurement Lists (SenML)" registry group [IANA.senml] as | |||
| specified by Sections 4.5.2 and 12.1 of [RFC8428] and Section 3 of | specified by Sections 4.5.2 and 12.1 of [RFC8428] and Section 3 of | |||
| [RFC8798], respectively (which, by the registration policy, are | [RFC8798], respectively (which, by the registration policy, are | |||
| guaranteed to be non-overlapping). | guaranteed to be non-overlapping). | |||
| Index value: Percent-encoding (Section 2.1 of RFC 3986 [STD66]) is | Index value: Percent-encoding (Section 2.1 of RFC 3986 [STD66]) is | |||
| required of any characters in unit names except for the set | required of any characters in unit names except for the set | |||
| "unreserved" (Section 2.3 of RFC 3986 [STD66]), the set "sub- | "unreserved" (Section 2.3 of RFC 3986 [STD66]), the set "sub- | |||
| delims" (Section 2.3 of RFC 3986 [STD66]), and ":" or "@" (i.e., | delims" (Section 2.2 of RFC 3986 [STD66]), and ":" or "@" (i.e., | |||
| the result must match the ABNF rule "pchar" in Section 3.3 of RFC | the result must match the ABNF rule "pchar" in Section 3.3 of RFC | |||
| 3986 [STD66]). | 3986 [STD66]). | |||
| 7.4. SenML Registry Group | 7.4. SenML Registry Group | |||
| IANA has added the following note to the "Sensor Measurement Lists | IANA has added the following note to the "Sensor Measurement Lists | |||
| (SenML)" registry group [IANA.senml]: | (SenML)" registry group [IANA.senml]: | |||
| | In SDF [RFC9880], a URI unit name is distinguished from a | | In SDF [RFC9880], a URI unit name is distinguished from a | |||
| | registered unit name by the presence of a colon; any registered | | registered unit name by the presence of a colon; any registered | |||
| skipping to change at line 2010 ¶ | skipping to change at line 2012 ¶ | |||
| 7.5. Registries | 7.5. Registries | |||
| IANA has created the "Semantic Definition Format (SDF)" registry | IANA has created the "Semantic Definition Format (SDF)" registry | |||
| group with the registries defined in this Section. | group with the registries defined in this Section. | |||
| 7.5.1. SDF Quality Names | 7.5.1. SDF Quality Names | |||
| IANA has created the "SDF Quality Names" registry in the "Semantic | IANA has created the "SDF Quality Names" registry in the "Semantic | |||
| Definition Format (SDF)" registry group with the following template: | Definition Format (SDF)" registry group with the following template: | |||
| Name: A quality name composed of ASCII letters, digits, and dollar | Name: A Quality Name composed of ASCII letters, digits, and dollar | |||
| signs, starting with a lowercase ASCII letter or a dollar sign | signs, starting with a lowercase ASCII letter or a dollar sign | |||
| (i.e., using a pattern of "[a-z$][A-Za-z$0-9]*"). | (i.e., using a pattern of "[a-z$][A-Za-z$0-9]*"). | |||
| Brief Description: A brief description. | Brief Description: A brief description. | |||
| Reference: A pointer to a specification. | Reference: A pointer to a specification. | |||
| Change Controller: (See Section 2.3 of RFC 8126 [BCP26]) | Change Controller: (See Section 2.3 of RFC 8126 [BCP26]) | |||
| Quality Names in this registry are intended to be registered in | Quality Names in this registry are intended to be registered in | |||
| skipping to change at line 2035 ¶ | skipping to change at line 2037 ¶ | |||
| "IETF Review" (Sections 4.7 and 4.8 of RFC 8126 [BCP26]) so that | "IETF Review" (Sections 4.7 and 4.8 of RFC 8126 [BCP26]) so that | |||
| registrations can be made earlier in the process, even earlier than | registrations can be made earlier in the process, even earlier than | |||
| foreseen in [BCP100].) | foreseen in [BCP100].) | |||
| The instructions to the Experts are: | The instructions to the Experts are: | |||
| * to ascertain that the specification is available in an immutable | * to ascertain that the specification is available in an immutable | |||
| reference and has achieved a good level of review in conjunction | reference and has achieved a good level of review in conjunction | |||
| with RFCs or activities of the IETF, and | with RFCs or activities of the IETF, and | |||
| * to be frugal in the allocation of quality names that are | * to be frugal in the allocation of Quality Names that are | |||
| suggestive of generally applicable semantics, keeping them in | suggestive of generally applicable semantics, keeping them in | |||
| reserve for qualities that are likely to enjoy wide use and can | reserve for qualities that are likely to enjoy wide use and can | |||
| make good use of their conciseness. | make good use of their conciseness. | |||
| The "SDF Quality Names" registry starts out as in Table 13; all | The "SDF Quality Names" registry starts out as in Table 13; all | |||
| references for these initial entries are to RFC 9880 (this document) | references for these initial entries are to RFC 9880 (this document) | |||
| and all change controllers are "IETF"". | and all change controllers are "IETF". | |||
| +======================+==========================================+ | +======================+==========================================+ | |||
| | Name | Brief Description | | | Name | Brief Description | | |||
| +======================+==========================================+ | +======================+==========================================+ | |||
| | $comment | source code comments only, no semantics | | | $comment | source code comments only, no semantics | | |||
| +----------------------+------------------------------------------+ | +----------------------+------------------------------------------+ | |||
| | const | constant value | | | const | constant value | | |||
| +----------------------+------------------------------------------+ | +----------------------+------------------------------------------+ | |||
| | contentFormat | content format | | | contentFormat | content format | | |||
| +----------------------+------------------------------------------+ | +----------------------+------------------------------------------+ | |||
| skipping to change at line 2140 ¶ | skipping to change at line 2142 ¶ | |||
| +----------------------+------------------------------------------+ | +----------------------+------------------------------------------+ | |||
| Table 13: Initial Content of the SDF Quality Names Registry | Table 13: Initial Content of the SDF Quality Names Registry | |||
| 7.5.2. SDF Quality Name Prefixes | 7.5.2. SDF Quality Name Prefixes | |||
| IANA has created the "SDF Quality Name Prefixes" registry in the | IANA has created the "SDF Quality Name Prefixes" registry in the | |||
| "Semantic Definition Format (SDF)" registry group with the following | "Semantic Definition Format (SDF)" registry group with the following | |||
| template: | template: | |||
| Prefix: A quality name prefix composed of lower case ASCII letters | Prefix: A Quality Name prefix composed of lower case ASCII letters | |||
| and digits, starting with a lower case ASCII letter (i.e., using a | and digits, starting with a lower case ASCII letter (i.e., using a | |||
| pattern of "[a-z][a-z0-9]*"). | pattern of "[a-z][a-z0-9]*"). | |||
| Contact: A contact point for the organization that assigns quality | Contact: A contact point for the organization that assigns Quality | |||
| names with this prefix. | Names with this prefix. | |||
| Reference: A pointer to additional information, if available. | Reference: A pointer to additional information, if available. | |||
| Quality Name Prefixes are intended to be registered by organizations | Quality Name Prefixes are intended to be registered by organizations | |||
| that plan to define quality names constructed with an organization- | that plan to define Quality Names constructed with an organization- | |||
| specific prefix (Section 2.3.3). | specific prefix (Section 2.3.3). | |||
| The registration policy is Expert Review as per Section 4.5 of RFC | The registration policy is Expert Review as per Section 4.5 of RFC | |||
| 8126 [BCP26]. The instructions to the Expert are to ascertain that | 8126 [BCP26]. The instructions to the Expert are to ascertain that | |||
| the organization will handle quality names constructed using their | the organization will handle Quality Names constructed using their | |||
| prefix in a way that roughly achieves the objectives for an IANA | prefix in a way that roughly achieves the objectives for an IANA | |||
| registry that supports interoperability of SDF models employing these | registry that supports interoperability of SDF models employing these | |||
| quality names, including: | Quality Names, including: | |||
| * Stability, "stable and permanent"; | * Stability, "stable and permanent"; | |||
| * Transparency, "readily available" and "in sufficient detail" | * Transparency, "readily available" and "in sufficient detail" | |||
| (Section 4.6 of RFC 8126 [BCP26]). | (Section 4.6 of RFC 8126 [BCP26]). | |||
| The "SDF Quality Name Prefixes" registry is empty at this time. | The "SDF Quality Name Prefixes" registry is empty at this time. | |||
| 7.5.3. sdfType Values | 7.5.3. sdfType Values | |||
| skipping to change at line 2181 ¶ | skipping to change at line 2183 ¶ | |||
| Name: A name composed of lower case ASCII letters, digits and - | Name: A name composed of lower case ASCII letters, digits and - | |||
| (ASCII hyphen/minus) characters, starting with a lower case ASCII | (ASCII hyphen/minus) characters, starting with a lower case ASCII | |||
| letter (i.e., using a pattern of "[a-z][-a-z0-9]*"). | letter (i.e., using a pattern of "[a-z][-a-z0-9]*"). | |||
| Description: A short description of the information model level | Description: A short description of the information model level | |||
| structure and semantics. | structure and semantics. | |||
| type: The value of the quality "type" to be used with this sdfType. | type: The value of the quality "type" to be used with this sdfType. | |||
| JSON Representation A short description of a JSON representation | JSON Representation: A short description of a JSON representation | |||
| that can be used for this sdfType. As per Section 4.7.1, this | that can be used for this sdfType. As per Section 4.7.1, this | |||
| MUST be consistent with the type. | MUST be consistent with the type. | |||
| Reference: A more detailed specification of meaning and use of | Reference: A more detailed specification of meaning and use of | |||
| sdfType. | sdfType. | |||
| sdfType values are intended to be registered to enable modeling | sdfType values are intended to be registered to enable modeling | |||
| additional SDF-specific types (see Section 4.7.1). | additional SDF-specific types (see Section 4.7.1). | |||
| The registration policy is Specification Required as per Section 4.6 | The registration policy is Specification Required as per Section 4.6 | |||
| skipping to change at line 2259 ¶ | skipping to change at line 2261 ¶ | |||
| cases on input, preferably by rejecting input that is invalid or that | cases on input, preferably by rejecting input that is invalid or that | |||
| would lead to unpredictable behavior, and avoid generating these | would lead to unpredictable behavior, and avoid generating these | |||
| cases on output. | cases on output. | |||
| Implementations of model languages may also exhibit performance- | Implementations of model languages may also exhibit performance- | |||
| related availability issues when the attacker can control the input, | related availability issues when the attacker can control the input, | |||
| see Section 4.1 of [RFC9535] for a brief discussion and Section 8 of | see Section 4.1 of [RFC9535] for a brief discussion and Section 8 of | |||
| [RFC9485] for considerations specific to the use of pattern. | [RFC9485] for considerations specific to the use of pattern. | |||
| SDF may be used in two processes that are often security relevant: | SDF may be used in two processes that are often security relevant: | |||
| model-based _validation_ of data that is intended to be described by | (1) model-based _validation_ of data that is intended to be described | |||
| SDF models and model-based _augmentation_ of these data with | by SDF models, and (2) model-based _augmentation_ of these data with | |||
| information obtained from the SDF models that apply. | information obtained from the SDF models that apply. | |||
| Implementations need to ascertain the provenance (and thus | Implementations need to ascertain the provenance (and thus | |||
| authenticity and integrity) and applicability of the SDF models they | authenticity and integrity) and applicability of the SDF models they | |||
| employ operationally in such security-relevant ways. Implementations | employ operationally in such security-relevant ways. Implementations | |||
| that make use of the composition mechanisms defined in this document | that make use of the composition mechanisms defined in this document | |||
| need to do this for each of the components they combine into the SDF | need to do this for each of the components they combine into the SDF | |||
| models they employ. Essentially, this process needs to undergo the | models they employ. Essentially, this process needs to undergo the | |||
| same care and scrutiny as any other introduction of source code into | same care and scrutiny as any other introduction of source code into | |||
| a build environment; the possibility of supply-chain attacks on the | a build environment; the possibility of supply-chain attacks on the | |||
| modules imported needs to be considered. | modules imported needs to be considered. | |||
| Specifically, implementations might rely on model-based input | Specifically, implementations might rely on model-based input | |||
| validation for enforcing certain properties of the data structure | validation for enforcing certain characteristics of the data | |||
| ingested (which, if not validated, could lead to malfunctions such as | structure ingested (which, if not validated, could lead to | |||
| crashes and remote code execution). These implementations need to be | malfunctions such as crashes and remote code execution). These | |||
| particularly careful about the data models they apply, including | implementations need to be particularly careful about the data models | |||
| their provenance and potential changes of these properties that | they apply, including their provenance and potential changes of these | |||
| upgrades to the referenced modules may (inadvertently or as part of | characteristics that upgrades to the referenced modules may | |||
| an attack) cause. More generally speaking, implementations should | (inadvertently or as part of an attack) cause. More generally | |||
| strive to be robust against expected and unexpected limitations of | speaking, implementations should strive to be robust against expected | |||
| the model-based input validation mechanisms and their | and unexpected limitations of the model-based input validation | |||
| implementations. | mechanisms and their implementations. | |||
| Similarly, implementations that rely on model-based augmentation may | Similarly, implementations that rely on model-based augmentation may | |||
| generate false data from their inputs; this is an integrity violation | generate false data from their inputs; this is an integrity violation | |||
| in any case, but also can possibly be exploited for further attacks. | in any case, but also can possibly be exploited for further attacks. | |||
| In applications that dynamically acquire models and obtain modules | In applications that dynamically acquire models and obtain modules | |||
| from module references in these, the security considerations of | from module references in these models, the security considerations | |||
| dereferenceable identifiers apply (see [DEREF-ID-PATTERN] for a more | of dereferenceable identifiers apply (see [DEREF-ID-PATTERN] for a | |||
| extensive discussion of dereferenceable identifiers). | more extensive discussion of dereferenceable identifiers). | |||
| There may be confidentiality requirements on SDF models, both on | There may be confidentiality requirements on SDF models, both on | |||
| their content and on the fact that a specific model is used in a | their content and on the fact that a specific model is used in a | |||
| particular Thing or environment. The present specification does not | particular Thing or environment. The present specification does not | |||
| discuss model discovery or define an access control model for SDF | discuss model discovery or define an access control model for SDF | |||
| models, nor does it define a way to obtain selective disclosure where | models, nor does it define a way to obtain selective disclosure where | |||
| that may be required. It is likely that these definitions require | that may be required. It is likely that these definitions require | |||
| additional context from underlying ecosystems and the characteristics | additional context from underlying ecosystems and the characteristics | |||
| of the protocols employed there; therefore, this is left as future | of the protocols employed there; therefore, this is left as future | |||
| work (e.g., for documents such as [SDF-MAPPING]). | work (e.g., for documents such as [SDF-MAPPING]). | |||
| skipping to change at line 2465 ¶ | skipping to change at line 2467 ¶ | |||
| "Camel Case", December 2014, | "Camel Case", December 2014, | |||
| <http://wiki.c2.com/?CamelCase>. | <http://wiki.c2.com/?CamelCase>. | |||
| [DEREF-ID-PATTERN] | [DEREF-ID-PATTERN] | |||
| Bormann, C. and C. Amsüss, "The "dereferenceable | Bormann, C. and C. Amsüss, "The "dereferenceable | |||
| identifier" pattern", Work in Progress, Internet-Draft, | identifier" pattern", Work in Progress, Internet-Draft, | |||
| draft-bormann-t2trg-deref-id-06, 30 August 2025, | draft-bormann-t2trg-deref-id-06, 30 August 2025, | |||
| <https://datatracker.ietf.org/doc/html/draft-bormann- | <https://datatracker.ietf.org/doc/html/draft-bormann- | |||
| t2trg-deref-id-06>. | t2trg-deref-id-06>. | |||
| [ECMA-262] Ecma International, "ECMAScript 2024 Language | [ECMA-262] Ecma International, "ECMAScript 2025 Language | |||
| Specification", 15th Edition, ECMA Standard ECMA-262, June | Specification", 16th Edition, ECMA Standard ECMA-262, June | |||
| 2024, <https://www.ecma-international.org/wp- | 2025, <https://ecma-international.org/wp-content/uploads/ | |||
| content/uploads/ECMA-262.pdf>. | ECMA-262_16th_edition_june_2025.pdf>. | |||
| [JSO4] Galiegue, F., Ed., Zyp, K., Ed., and G. Court, "JSON | [JSO4] Galiegue, F., Ed., Zyp, K., Ed., and G. Court, "JSON | |||
| Schema: core definitions and terminology", Work in | Schema: core definitions and terminology", Work in | |||
| Progress, Internet-Draft, draft-zyp-json-schema-04, 31 | Progress, Internet-Draft, draft-zyp-json-schema-04, 31 | |||
| January 2013, <https://datatracker.ietf.org/doc/html/ | January 2013, <https://datatracker.ietf.org/doc/html/ | |||
| draft-zyp-json-schema-04>. | draft-zyp-json-schema-04>. | |||
| [JSO4V] Zyp, K. and G. Court, "JSON Schema: interactive and non | [JSO4V] Zyp, K. and G. Court, "JSON Schema: interactive and non | |||
| interactive validation", Work in Progress, Internet-Draft, | interactive validation", Work in Progress, Internet-Draft, | |||
| draft-fge-json-schema-validation-00, 31 January 2013, | draft-fge-json-schema-validation-00, 31 January 2013, | |||
| skipping to change at line 2505 ¶ | skipping to change at line 2507 ¶ | |||
| [KebabCase] | [KebabCase] | |||
| "Kebab Case", August 2014, | "Kebab Case", August 2014, | |||
| <http://wiki.c2.com/?KebabCase>. | <http://wiki.c2.com/?KebabCase>. | |||
| [OCF] Open Connectivity Foundation, "OCF Resource Type | [OCF] Open Connectivity Foundation, "OCF Resource Type | |||
| Specification", Version 2.2.7, November 2023, | Specification", Version 2.2.7, November 2023, | |||
| <https://openconnectivity.org/specs/ | <https://openconnectivity.org/specs/ | |||
| OCF_Resource_Type_Specification.pdf>. | OCF_Resource_Type_Specification.pdf>. | |||
| [OMA] Open Mobile Alliance, "OMA LightweightM2M (LwM2M) Object | [OMA] Open Mobile Alliance, "LwM2M OBJECTS", | |||
| and Resource Registry", | <https://www.openmobilealliance.org/specifications/ | |||
| <http://www.openmobilealliance.org/wp/omna/lwm2m/ | registries/objects>. | |||
| lwm2mregistry.html>. | ||||
| [REST-IOT] Keränen, A., Kovatsch, M., and K. Hartke, "Guidance on | [REST-IOT] Keränen, A., Kovatsch, M., and K. Hartke, "Guidance on | |||
| RESTful Design for Internet of Things Systems", Work in | RESTful Design for Internet of Things Systems", Work in | |||
| Progress, Internet-Draft, draft-irtf-t2trg-rest-iot-17, 20 | Progress, Internet-Draft, draft-irtf-t2trg-rest-iot-17, 20 | |||
| October 2025, <https://datatracker.ietf.org/doc/html/ | October 2025, <https://datatracker.ietf.org/doc/html/ | |||
| draft-irtf-t2trg-rest-iot-17>. | draft-irtf-t2trg-rest-iot-17>. | |||
| [RFC8576] Garcia-Morchon, O., Kumar, S., and M. Sethi, "Internet of | [RFC8576] Garcia-Morchon, O., Kumar, S., and M. Sethi, "Internet of | |||
| Things (IoT) Security: State of the Art and Challenges", | Things (IoT) Security: State of the Art and Challenges", | |||
| RFC 8576, DOI 10.17487/RFC8576, April 2019, | RFC 8576, DOI 10.17487/RFC8576, April 2019, | |||
| skipping to change at line 2532 ¶ | skipping to change at line 2533 ¶ | |||
| Regular Expression Format", RFC 9485, | Regular Expression Format", RFC 9485, | |||
| DOI 10.17487/RFC9485, October 2023, | DOI 10.17487/RFC9485, October 2023, | |||
| <https://www.rfc-editor.org/info/rfc9485>. | <https://www.rfc-editor.org/info/rfc9485>. | |||
| [RFC9535] Gössner, S., Ed., Normington, G., Ed., and C. Bormann, | [RFC9535] Gössner, S., Ed., Normington, G., Ed., and C. Bormann, | |||
| Ed., "JSONPath: Query Expressions for JSON", RFC 9535, | Ed., "JSONPath: Query Expressions for JSON", RFC 9535, | |||
| DOI 10.17487/RFC9535, February 2024, | DOI 10.17487/RFC9535, February 2024, | |||
| <https://www.rfc-editor.org/info/rfc9535>. | <https://www.rfc-editor.org/info/rfc9535>. | |||
| [SDF-MAPPING] | [SDF-MAPPING] | |||
| Bormann, C., Ed. and J. Romann, "Semantic Definition | Bormann, C. and J. Romann, "Semantic Definition Format | |||
| Format (SDF): Mapping files", Work in Progress, Internet- | (SDF): Mapping files", Work in Progress, Internet-Draft, | |||
| Draft, draft-bormann-asdf-sdf-mapping-05, 6 December 2024, | draft-ietf-asdf-sdf-mapping-00, 18 December 2025, | |||
| <https://datatracker.ietf.org/doc/html/draft-bormann-asdf- | <https://datatracker.ietf.org/doc/html/draft-ietf-asdf- | |||
| sdf-mapping-05>. | sdf-mapping-00>. | |||
| [SDFTYPE-LINK] | [SDFTYPE-LINK] | |||
| Bormann, C., "An sdfType for Links", Work in Progress, | Bormann, C. and A. Keränen, "An sdfType for Links", Work | |||
| Internet-Draft, draft-bormann-asdf-sdftype-link-04, 6 | in Progress, Internet-Draft, draft-ietf-asdf-sdftype-link- | |||
| December 2024, <https://datatracker.ietf.org/doc/html/ | 01, 19 December 2025, | |||
| draft-bormann-asdf-sdftype-link-04>. | <https://datatracker.ietf.org/doc/html/draft-ietf-asdf- | |||
| sdftype-link-01>. | ||||
| [STD97] Internet Standard 97, | [STD97] Internet Standard 97, | |||
| <https://www.rfc-editor.org/info/std97>. | <https://www.rfc-editor.org/info/std97>. | |||
| At the time of writing, this STD comprises the following: | At the time of writing, this STD comprises the following: | |||
| Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Semantics", STD 97, RFC 9110, | Ed., "HTTP Semantics", STD 97, RFC 9110, | |||
| DOI 10.17487/RFC9110, June 2022, | DOI 10.17487/RFC9110, June 2022, | |||
| <https://www.rfc-editor.org/info/rfc9110>. | <https://www.rfc-editor.org/info/rfc9110>. | |||
| skipping to change at line 2723 ¶ | skipping to change at line 2725 ¶ | |||
| / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT | / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT | |||
| ? contentFormat: text | ? contentFormat: text | |||
| * $$SDF-EXTENSION-DATA | * $$SDF-EXTENSION-DATA | |||
| EXTENSION-POINT<"data-ext"> | EXTENSION-POINT<"data-ext"> | |||
| } | } | |||
| propertyqualities = { | propertyqualities = { | |||
| ? observable: bool | ? observable: bool | |||
| ? readable: bool | ? readable: bool | |||
| ? writable: bool | ? writable: bool | |||
| * $$SDF-EXTENSION-PROPERTY | ||||
| ~dataqualities | ~dataqualities | |||
| } | } | |||
| allowed-types = number / text / bool / null | allowed-types = number / text / bool / null | |||
| / [* number] / [* text] / [* bool] | / [* number] / [* text] / [* bool] | |||
| / {* text => any} | / {* text => any} | |||
| / $SDF-EXTENSION-ALLOWED | / $SDF-EXTENSION-ALLOWED | |||
| / (any .feature "allowed-ext") ; EXTENSION-POINT | / (any .feature "allowed-ext") ; EXTENSION-POINT | |||
| compound-type = ( | compound-type = ( | |||
| skipping to change at line 2835 ¶ | skipping to change at line 2838 ¶ | |||
| Appendix A, but uses a version of the description techniques | Appendix A, but uses a version of the description techniques | |||
| advertised on json-schema.org [JSO7] [JSO7V]. | advertised on json-schema.org [JSO7] [JSO7V]. | |||
| The appendix shows both the validation and the framework syntax. | The appendix shows both the validation and the framework syntax. | |||
| Since most of the lines are the same between these two files, those | Since most of the lines are the same between these two files, those | |||
| lines are shown only once, with a leading space, in the form of a | lines are shown only once, with a leading space, in the form of a | |||
| unified diff. Lines leading with a - are part of the validation | unified diff. Lines leading with a - are part of the validation | |||
| syntax and lines leading with a + are part of the framework syntax. | syntax and lines leading with a + are part of the framework syntax. | |||
| { | { | |||
| - "title": "sdf-validation.cddl -- Generated: 2024-02-29T07:42:35Z", | - "title": "sdf-validation.cddl -- Generated: 2025-10-13T08:43:18Z", | |||
| + "title": "sdf-framework.cddl -- Generated: 2024-02-29T07:42:52Z", | + "title": "sdf-framework.cddl -- Generated: 2025-10-13T08:43:29Z", | |||
| "$schema": "http://json-schema.org/draft-07/schema#", | "$schema": "http://json-schema.org/draft-07/schema#", | |||
| "$ref": "#/definitions/sdf-syntax", | "$ref": "#/definitions/sdf-syntax", | |||
| "definitions": { | "definitions": { | |||
| "sdf-syntax": { | "sdf-syntax": { | |||
| "type": "object", | "type": "object", | |||
| "properties": { | "properties": { | |||
| "info": { | "info": { | |||
| "$ref": "#/definitions/sdfinfo" | "$ref": "#/definitions/sdfinfo" | |||
| }, | }, | |||
| "namespace": { | "namespace": { | |||
| skipping to change at line 2881 ¶ | skipping to change at line 2884 ¶ | |||
| "$ref": "#/definitions/sdfAction-" | "$ref": "#/definitions/sdfAction-" | |||
| }, | }, | |||
| "sdfEvent": { | "sdfEvent": { | |||
| "$ref": "#/definitions/sdfEvent-" | "$ref": "#/definitions/sdfEvent-" | |||
| }, | }, | |||
| "sdfData": { | "sdfData": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "sdfinfo": { | "sdfinfo": { | |||
| "type": "object", | "type": "object", | |||
| "properties": { | "properties": { | |||
| "title": { | "title": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "description": { | "description": { | |||
| skipping to change at line 2917 ¶ | skipping to change at line 2919 ¶ | |||
| "features": { | "features": { | |||
| - "type": "array", | - "type": "array", | |||
| - "maxItems": 0 | - "maxItems": 0 | |||
| + "type": "array" | + "type": "array" | |||
| }, | }, | |||
| "$comment": { | "$comment": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "modified-date-time": { | "modified-date-time": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "thingqualities": { | "thingqualities": { | |||
| "type": "object", | "type": "object", | |||
| "properties": { | "properties": { | |||
| "description": { | "description": { | |||
| skipping to change at line 2975 ¶ | skipping to change at line 2976 ¶ | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| }, | }, | |||
| "minItems": { | "minItems": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| }, | }, | |||
| "maxItems": { | "maxItems": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "sdf-pointer": { | "sdf-pointer": { | |||
| "anyOf": [ | "anyOf": [ | |||
| { | { | |||
| "$ref": "#/definitions/global" | "$ref": "#/definitions/global" | |||
| }, | }, | |||
| { | { | |||
| "$ref": "#/definitions/same-object" | "$ref": "#/definitions/same-object" | |||
| skipping to change at line 3052 ¶ | skipping to change at line 3052 ¶ | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| }, | }, | |||
| "minItems": { | "minItems": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| }, | }, | |||
| "maxItems": { | "maxItems": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "propertyqualities": { | "propertyqualities": { | |||
| "anyOf": [ | "anyOf": [ | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "$ref": "#/definitions/type-" | "$ref": "#/definitions/type-" | |||
| }, | }, | |||
| "sdfChoice": { | "sdfChoice": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| }, | }, | |||
| "observable": { | "observable": { | |||
| "type": "boolean" | "type": "boolean" | |||
| skipping to change at line 3159 ¶ | skipping to change at line 3157 ¶ | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "type": "string", | ||||
| + "const": "object" | ||||
| + }, | ||||
| + "required": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "properties": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| + }, | ||||
| + "sdfChoice": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| + }, | ||||
| + "observable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "readable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "writable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | ||||
| + }, | + }, | |||
| + "additionalProperties": false | "properties": { | |||
| + }, | "type": { | |||
| + { | "type": "string", | |||
| + "type": "object", | "const": "object" | |||
| }, | ||||
| "required": { | ||||
| "type": "array", | ||||
| "items": { | ||||
| "type": "string" | ||||
| }, | ||||
| "minItems": 1 | ||||
| }, | ||||
| "properties": { | ||||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| }, | ||||
| "sdfChoice": { | ||||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| }, | ||||
| "observable": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "readable": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "writable": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "description": { | ||||
| "type": "string" | ||||
| }, | ||||
| "label": { | ||||
| "type": "string" | ||||
| }, | ||||
| "$comment": { | ||||
| "type": "string" | ||||
| }, | ||||
| "sdfRef": { | ||||
| "$ref": "#/definitions/sdf-pointer" | ||||
| }, | ||||
| "sdfRequired": { | ||||
| "$ref": "#/definitions/pointer-list" | ||||
| }, | ||||
| "const": { | ||||
| "$ref": "#/definitions/allowed-types" | ||||
| }, | ||||
| "default": { | ||||
| "$ref": "#/definitions/allowed-types" | ||||
| }, | ||||
| "minimum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "maximum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "exclusiveMinimum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "exclusiveMaximum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "multipleOf": { | ||||
| "type": "number" | ||||
| }, | ||||
| "minLength": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "maxLength": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "pattern": { | ||||
| "type": "string" | ||||
| }, | ||||
| "format": { | ||||
| "$ref": "#/definitions/format-" | ||||
| }, | ||||
| "minItems": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "maxItems": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "uniqueItems": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "items": { | ||||
| "$ref": "#/definitions/jso-items" | ||||
| }, | ||||
| "unit": { | ||||
| "type": "string" | ||||
| }, | ||||
| "nullable": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "sdfType": { | ||||
| "$ref": "#/definitions/sdfType-" | ||||
| }, | ||||
| "contentFormat": { | ||||
| "type": "string" | ||||
| } | ||||
| }, | ||||
| "additionalProperties": false | ||||
| }, | ||||
| { | ||||
| "type": "object", | ||||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| + "properties": { | + "properties": { | |||
| + "type": { | + "type": { | |||
| + "type": "string" | + "type": "string" | |||
| + }, | + }, | |||
| + "sdfChoice": { | + "sdfChoice": { | |||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| + }, | + }, | |||
| + "observable": { | + "observable": { | |||
| + "type": "boolean" | + "type": "boolean" | |||
| skipping to change at line 3364 ¶ | skipping to change at line 3360 ¶ | |||
| + }, | + }, | |||
| + "contentFormat": { | + "contentFormat": { | |||
| + "type": "string" | + "type": "string" | |||
| + } | + } | |||
| + }, | + }, | |||
| + "additionalProperties": false | + "additionalProperties": false | |||
| + }, | + }, | |||
| + { | + { | |||
| + "type": "object", | + "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "$ref": "#/definitions/type-" | ||||
| + }, | ||||
| + "enum": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "observable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "readable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "writable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | ||||
| + }, | ||||
| + "additionalProperties": false | ||||
| + }, | ||||
| + { | ||||
| + "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | ||||
| + } | ||||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "type": "string", | ||||
| + "const": "object" | ||||
| + }, | ||||
| + "required": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "properties": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| + }, | ||||
| + "enum": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "observable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "readable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "writable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | ||||
| + }, | ||||
| + "additionalProperties": false | ||||
| + }, | ||||
| + { | ||||
| + "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | ||||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| - "type": "string", | "$ref": "#/definitions/type-" | |||
| - "const": "object" | ||||
| + "type": "string" | ||||
| }, | }, | |||
| - "required": { | "enum": { | |||
| + "enum": { | ||||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "minItems": 1 | "minItems": 1 | |||
| }, | }, | |||
| - "properties": { | ||||
| - "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| - }, | ||||
| - "sdfChoice": { | ||||
| - "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| - }, | ||||
| "observable": { | "observable": { | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "readable": { | "readable": { | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "writable": { | "writable": { | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "description": { | "description": { | |||
| skipping to change at line 3683 ¶ | skipping to change at line 3456 ¶ | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "sdfType": { | "sdfType": { | |||
| "$ref": "#/definitions/sdfType-" | "$ref": "#/definitions/sdfType-" | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| - }, | ||||
| + } | ||||
| + ] | ||||
| + }, | ||||
| + "dataqualities": { | ||||
| + "anyOf": [ | ||||
| { | ||||
| "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | ||||
| + } | ||||
| + }, | ||||
| "properties": { | ||||
| "type": { | ||||
| "$ref": "#/definitions/type-" | ||||
| }, | ||||
| - "enum": { | ||||
| - "type": "array", | ||||
| - "items": { | ||||
| - "type": "string" | ||||
| - }, | ||||
| - "minItems": 1 | ||||
| - }, | ||||
| - "observable": { | ||||
| - "type": "boolean" | ||||
| - }, | ||||
| - "readable": { | ||||
| - "type": "boolean" | ||||
| - }, | ||||
| - "writable": { | ||||
| - "type": "boolean" | ||||
| + "sdfChoice": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| }, | ||||
| "description": { | ||||
| "type": "string" | ||||
| }, | ||||
| "label": { | ||||
| "type": "string" | ||||
| }, | ||||
| "$comment": { | ||||
| "type": "string" | ||||
| }, | ||||
| "sdfRef": { | ||||
| "$ref": "#/definitions/sdf-pointer" | ||||
| }, | ||||
| "sdfRequired": { | ||||
| "$ref": "#/definitions/pointer-list" | ||||
| }, | ||||
| "const": { | ||||
| "$ref": "#/definitions/allowed-types" | ||||
| }, | ||||
| "default": { | ||||
| "$ref": "#/definitions/allowed-types" | ||||
| }, | ||||
| "minimum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "maximum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "exclusiveMinimum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "exclusiveMaximum": { | ||||
| "type": "number" | ||||
| }, | ||||
| "multipleOf": { | ||||
| "type": "number" | ||||
| }, | ||||
| "minLength": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "maxLength": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "pattern": { | ||||
| "type": "string" | ||||
| }, | ||||
| "format": { | ||||
| "$ref": "#/definitions/format-" | ||||
| }, | ||||
| "minItems": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "maxItems": { | ||||
| "$ref": "#/definitions/uint" | ||||
| }, | ||||
| "uniqueItems": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "items": { | ||||
| "$ref": "#/definitions/jso-items" | ||||
| }, | ||||
| "unit": { | ||||
| "type": "string" | ||||
| }, | ||||
| "nullable": { | ||||
| "type": "boolean" | ||||
| }, | ||||
| "sdfType": { | ||||
| "$ref": "#/definitions/sdfType-" | ||||
| }, | ||||
| "contentFormat": { | ||||
| "type": "string" | ||||
| } | ||||
| }, | ||||
| "additionalProperties": false | ||||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "type": "string", | "type": "string", | |||
| "const": "object" | "const": "object" | |||
| }, | }, | |||
| "required": { | "required": { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "minItems": 1 | "minItems": 1 | |||
| }, | }, | |||
| "properties": { | "properties": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| }, | }, | |||
| - "enum": { | "enum": { | |||
| - "type": "array", | "type": "array", | |||
| - "items": { | "items": { | |||
| - "type": "string" | "type": "string" | |||
| - }, | }, | |||
| - "minItems": 1 | "minItems": 1 | |||
| - }, | }, | |||
| - "observable": { | "observable": { | |||
| - "type": "boolean" | "type": "boolean" | |||
| - }, | }, | |||
| - "readable": { | "readable": { | |||
| - "type": "boolean" | "type": "boolean" | |||
| - }, | }, | |||
| - "writable": { | "writable": { | |||
| - "type": "boolean" | "type": "boolean" | |||
| + "sdfChoice": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| }, | }, | |||
| "description": { | "description": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "label": { | "label": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "$comment": { | "$comment": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| skipping to change at line 3905 ¶ | skipping to change at line 3567 ¶ | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "sdfType": { | "sdfType": { | |||
| "$ref": "#/definitions/sdfType-" | "$ref": "#/definitions/sdfType-" | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| - } | ||||
| - ] | ||||
| - }, | ||||
| - "dataqualities": { | ||||
| - "anyOf": [ | ||||
| + }, | + }, | |||
| + { | ||||
| + "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | ||||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "enum": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "observable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "readable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "writable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | ||||
| + }, | ||||
| + "additionalProperties": false | ||||
| } | ||||
| ] | ||||
| }, | ||||
| "dataqualities": { | ||||
| "anyOf": [ | ||||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| - "$ref": "#/definitions/type-" | "$ref": "#/definitions/type-" | |||
| + "type": "string" | ||||
| }, | }, | |||
| "sdfChoice": { | "sdfChoice": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| }, | }, | |||
| "description": { | "description": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "label": { | "label": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| skipping to change at line 4003 ¶ | skipping to change at line 3762 ¶ | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| - "type": "string", | "type": "string", | |||
| - "const": "object" | "const": "object" | |||
| + "$ref": "#/definitions/type-" | ||||
| }, | }, | |||
| - "required": { | "required": { | |||
| + "enum": { | ||||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "minItems": 1 | "minItems": 1 | |||
| }, | }, | |||
| - "properties": { | "properties": { | |||
| - "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| - }, | }, | |||
| - "sdfChoice": { | "sdfChoice": { | |||
| - "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| - }, | }, | |||
| "description": { | "description": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "label": { | "label": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "$comment": { | "$comment": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "sdfRef": { | "sdfRef": { | |||
| skipping to change at line 4104 ¶ | skipping to change at line 3860 ¶ | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfChoice": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | + } | |||
| + }, | + }, | |||
| + "additionalProperties": false | ||||
| + }, | ||||
| + { | ||||
| + "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | ||||
| + }, | ||||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| - "$ref": "#/definitions/type-" | "$ref": "#/definitions/type-" | |||
| + "type": "string", | ||||
| + "const": "object" | ||||
| + }, | ||||
| + "required": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "properties": { | ||||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | ||||
| }, | }, | |||
| "enum": { | "enum": { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "minItems": 1 | "minItems": 1 | |||
| }, | }, | |||
| "description": { | "description": { | |||
| "type": "string" | "type": "string" | |||
| skipping to change at line 4208 ¶ | skipping to change at line 4038 ¶ | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| - "type": "string", | "type": "string", | |||
| - "const": "object" | "const": "object" | |||
| - }, | }, | |||
| - "required": { | "required": { | |||
| - "type": "array", | "type": "array", | |||
| - "items": { | "items": { | |||
| - "type": "string" | "type": "string" | |||
| - }, | }, | |||
| - "minItems": 1 | "minItems": 1 | |||
| - }, | }, | |||
| - "properties": { | "properties": { | |||
| - "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| + "type": "string" | ||||
| }, | }, | |||
| "enum": { | "enum": { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| }, | }, | |||
| "minItems": 1 | "minItems": 1 | |||
| }, | }, | |||
| "description": { | "description": { | |||
| "type": "string" | "type": "string" | |||
| skipping to change at line 4308 ¶ | skipping to change at line 4136 ¶ | |||
| "type": "boolean" | "type": "boolean" | |||
| }, | }, | |||
| "sdfType": { | "sdfType": { | |||
| "$ref": "#/definitions/sdfType-" | "$ref": "#/definitions/sdfType-" | |||
| }, | }, | |||
| "contentFormat": { | "contentFormat": { | |||
| "type": "string" | "type": "string" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| + }, | ||||
| + { | ||||
| + "type": "object", | ||||
| + "patternProperties": { | ||||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | ||||
| + }, | ||||
| + "properties": { | ||||
| + "type": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "enum": { | ||||
| + "type": "array", | ||||
| + "items": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "minItems": 1 | ||||
| + }, | ||||
| + "description": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "label": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "$comment": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "sdfRef": { | ||||
| + "$ref": "#/definitions/sdf-pointer" | ||||
| + }, | ||||
| + "sdfRequired": { | ||||
| + "$ref": "#/definitions/pointer-list" | ||||
| + }, | ||||
| + "const": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "default": { | ||||
| + "$ref": "#/definitions/allowed-types" | ||||
| + }, | ||||
| + "minimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "maximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMinimum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "exclusiveMaximum": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "multipleOf": { | ||||
| + "type": "number" | ||||
| + }, | ||||
| + "minLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxLength": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "pattern": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "format": { | ||||
| + "$ref": "#/definitions/format-" | ||||
| + }, | ||||
| + "minItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "maxItems": { | ||||
| + "$ref": "#/definitions/uint" | ||||
| + }, | ||||
| + "uniqueItems": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "items": { | ||||
| + "$ref": "#/definitions/jso-items" | ||||
| + }, | ||||
| + "unit": { | ||||
| + "type": "string" | ||||
| + }, | ||||
| + "nullable": { | ||||
| + "type": "boolean" | ||||
| + }, | ||||
| + "sdfType": { | ||||
| + "$ref": "#/definitions/sdfType-" | ||||
| + }, | ||||
| + "contentFormat": { | ||||
| + "type": "string" | ||||
| + } | ||||
| + }, | ||||
| + "additionalProperties": false | ||||
| } | } | |||
| ] | ] | |||
| }, | }, | |||
| "allowed-types": { | "allowed-types": { | |||
| "anyOf": [ | "anyOf": [ | |||
| { | { | |||
| "type": "number" | "type": "number" | |||
| }, | }, | |||
| { | { | |||
| "type": "string" | "type": "string" | |||
| skipping to change at line 4345 ¶ | skipping to change at line 4264 ¶ | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "boolean" | "type": "boolean" | |||
| } | } | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| "additionalProperties": { | "additionalProperties": {} | |||
| } | - } | |||
| + }, | + }, | |||
| + { | + {} | |||
| } | ||||
| ] | ] | |||
| }, | }, | |||
| "uint": { | "uint": { | |||
| "type": "integer", | "type": "integer", | |||
| "minimum": 0 | "minimum": 0 | |||
| }, | }, | |||
| "jso-items": { | "jso-items": { | |||
| "anyOf": [ | "anyOf": [ | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "type": "string", | "type": "string", | |||
| "enum": [ | "enum": [ | |||
| "number", | "number", | |||
| "string", | "string", | |||
| "boolean", | "boolean", | |||
| "integer" | "integer" | |||
| ] | ] | |||
| skipping to change at line 4407 ¶ | skipping to change at line 4324 ¶ | |||
| }, | }, | |||
| "maxLength": { | "maxLength": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "type": "string", | "type": "string", | |||
| "const": "object" | "const": "object" | |||
| }, | }, | |||
| "required": { | "required": { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| skipping to change at line 4458 ¶ | skipping to change at line 4374 ¶ | |||
| }, | }, | |||
| "maxLength": { | "maxLength": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| + "properties": { | + "properties": { | |||
| + "type": { | + "type": { | |||
| + "type": "string" | + "type": "string" | |||
| + }, | + }, | |||
| + "sdfChoice": { | + "sdfChoice": { | |||
| + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | + "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| + }, | + }, | |||
| + "sdfRef": { | + "sdfRef": { | |||
| + "$ref": "#/definitions/sdf-pointer" | + "$ref": "#/definitions/sdf-pointer" | |||
| skipping to change at line 4498 ¶ | skipping to change at line 4413 ¶ | |||
| + }, | + }, | |||
| + "maxLength": { | + "maxLength": { | |||
| + "$ref": "#/definitions/uint" | + "$ref": "#/definitions/uint" | |||
| + } | + } | |||
| + }, | + }, | |||
| + "additionalProperties": false | + "additionalProperties": false | |||
| + }, | + }, | |||
| + { | + { | |||
| + "type": "object", | + "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "type": "string", | "type": "string", | |||
| "enum": [ | "enum": [ | |||
| "number", | "number", | |||
| "string", | "string", | |||
| "boolean", | "boolean", | |||
| "integer" | "integer" | |||
| ] | ] | |||
| skipping to change at line 4548 ¶ | skipping to change at line 4462 ¶ | |||
| }, | }, | |||
| "maxLength": { | "maxLength": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| { | { | |||
| "type": "object", | "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "properties": { | "properties": { | |||
| "type": { | "type": { | |||
| "type": "string", | "type": "string", | |||
| "const": "object" | "const": "object" | |||
| }, | }, | |||
| "required": { | "required": { | |||
| "type": "array", | "type": "array", | |||
| "items": { | "items": { | |||
| "type": "string" | "type": "string" | |||
| skipping to change at line 4603 ¶ | skipping to change at line 4516 ¶ | |||
| }, | }, | |||
| "maxLength": { | "maxLength": { | |||
| "$ref": "#/definitions/uint" | "$ref": "#/definitions/uint" | |||
| } | } | |||
| }, | }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| + }, | + }, | |||
| + { | + { | |||
| + "type": "object", | + "type": "object", | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| + "properties": { | + "properties": { | |||
| + "type": { | + "type": { | |||
| + "type": "string" | + "type": "string" | |||
| + }, | + }, | |||
| + "enum": { | + "enum": { | |||
| + "type": "array", | + "type": "array", | |||
| + "items": { | + "items": { | |||
| + "type": "string" | + "type": "string" | |||
| + }, | + }, | |||
| skipping to change at line 4679 ¶ | skipping to change at line 4591 ¶ | |||
| "$ref": "#/definitions/parameter-list" | "$ref": "#/definitions/parameter-list" | |||
| }, | }, | |||
| "sdfOutputData": { | "sdfOutputData": { | |||
| "$ref": "#/definitions/parameter-list" | "$ref": "#/definitions/parameter-list" | |||
| }, | }, | |||
| "sdfData": { | "sdfData": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "parameter-list": { | "parameter-list": { | |||
| "$ref": "#/definitions/dataqualities" | "$ref": "#/definitions/dataqualities" | |||
| }, | }, | |||
| "eventqualities": { | "eventqualities": { | |||
| "type": "object", | "type": "object", | |||
| "properties": { | "properties": { | |||
| "description": { | "description": { | |||
| skipping to change at line 4713 ¶ | skipping to change at line 4624 ¶ | |||
| "$ref": "#/definitions/pointer-list" | "$ref": "#/definitions/pointer-list" | |||
| }, | }, | |||
| "sdfOutputData": { | "sdfOutputData": { | |||
| "$ref": "#/definitions/parameter-list" | "$ref": "#/definitions/parameter-list" | |||
| }, | }, | |||
| "sdfData": { | "sdfData": { | |||
| "$ref": "#/definitions/sdfData-sdfChoice-properties-" | "$ref": "#/definitions/sdfData-sdfChoice-properties-" | |||
| } | } | |||
| }, | }, | |||
| + "patternProperties": { | + "patternProperties": { | |||
| + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { | + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {} | |||
| + } | ||||
| + }, | + }, | |||
| "additionalProperties": false | "additionalProperties": false | |||
| }, | }, | |||
| "format-": { | "format-": { | |||
| - "type": "string", | - "type": "string", | |||
| - "enum": [ | - "enum": [ | |||
| - "date-time", | - "date-time", | |||
| - "date", | - "date", | |||
| - "time", | - "time", | |||
| - "uri", | - "uri", | |||
| skipping to change at line 4788 ¶ | skipping to change at line 4698 ¶ | |||
| "type-": { | "type-": { | |||
| "type": "string", | "type": "string", | |||
| "enum": [ | "enum": [ | |||
| "number", | "number", | |||
| "string", | "string", | |||
| "boolean", | "boolean", | |||
| "integer", | "integer", | |||
| "array" | "array" | |||
| ] | ] | |||
| }, | }, | |||
| - "sdfAction-": { | - "sdfEvent-": { | |||
| + "sdfEvent-": { | + "sdfProperty-": { | |||
| "type": "object", | "type": "object", | |||
| "additionalProperties": { | "additionalProperties": { | |||
| - "$ref": "#/definitions/actionqualities" | - "$ref": "#/definitions/eventqualities" | |||
| + "$ref": "#/definitions/eventqualities" | + "$ref": "#/definitions/propertyqualities" | |||
| } | } | |||
| }, | }, | |||
| - "sdfProperty-": { | "sdfAction-": { | |||
| + "sdfAction-": { | ||||
| "type": "object", | "type": "object", | |||
| "additionalProperties": { | "additionalProperties": { | |||
| - "$ref": "#/definitions/propertyqualities" | "$ref": "#/definitions/actionqualities" | |||
| + "$ref": "#/definitions/actionqualities" | ||||
| } | } | |||
| }, | }, | |||
| - "sdfEvent-": { | - "sdfProperty-": { | |||
| + "sdfProperty-": { | + "sdfEvent-": { | |||
| "type": "object", | "type": "object", | |||
| "additionalProperties": { | "additionalProperties": { | |||
| - "$ref": "#/definitions/eventqualities" | - "$ref": "#/definitions/propertyqualities" | |||
| + "$ref": "#/definitions/propertyqualities" | + "$ref": "#/definitions/eventqualities" | |||
| } | } | |||
| - }, | - }, | |||
| - "sdfType-": { | - "sdfType-": { | |||
| - "type": "string", | - "type": "string", | |||
| - "enum": [ | - "enum": [ | |||
| - "byte-string", | - "byte-string", | |||
| - "unix-time" | - "unix-time" | |||
| - ] | - ] | |||
| } | } | |||
| } | } | |||
| skipping to change at line 4844 ¶ | skipping to change at line 4752 ¶ | |||
| The main data quality imported is the "type". In SDF, this can take | The main data quality imported is the "type". In SDF, this can take | |||
| one of six (text string) values, which are discussed in the following | one of six (text string) values, which are discussed in the following | |||
| subsections (note that the JSO type "null" is not supported as a | subsections (note that the JSO type "null" is not supported as a | |||
| value of this data quality in SDF). | value of this data quality in SDF). | |||
| The additional quality "const" restricts the data to one specific | The additional quality "const" restricts the data to one specific | |||
| value (given as the value of the const quality). | value (given as the value of the const quality). | |||
| Similarly, the additional quality "default" provides data that can be | Similarly, the additional quality "default" provides data that can be | |||
| used in the absence of the data (given as the value of the const | used in the absence of the data (given as the value of the default | |||
| quality); this is mainly documentary and not very well-defined for | quality); this is mainly documentary and not very well-defined for | |||
| SDF as no process is defined that would add default values to an | SDF as no process is defined that would add default values to an | |||
| instance of some interaction data. | instance of some interaction data. | |||
| Other qualities that are inspired by JSO are "$comment" and | Other qualities that are inspired by JSO are "$comment" and | |||
| "description", both of which are also available in the information | "description", both of which are also available in the information | |||
| block. | block. | |||
| C.1. type "number", type "integer" | C.1. type "number", type "integer" | |||
| skipping to change at line 5033 ¶ | skipping to change at line 4941 ¶ | |||
| "type": "boolean", | "type": "boolean", | |||
| "description": | "description": | |||
| "Indicates if the refrigerator-freezer is powered" | "Indicates if the refrigerator-freezer is powered" | |||
| } | } | |||
| }, | }, | |||
| "sdfObject": { | "sdfObject": { | |||
| "refrigerator": { | "refrigerator": { | |||
| "description": "A refrigerator compartment", | "description": "A refrigerator compartment", | |||
| "sdfProperty": { | "sdfProperty": { | |||
| "temperature": { | "temperature": { | |||
| "sdfRef": "#/sdfProproperty/temperature", | "sdfRef": "#/sdfProperty/temperature", | |||
| "maximum": 8 | "maximum": 8 | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "freezer": { | "freezer": { | |||
| "label": "A freezer compartment", | "label": "A freezer compartment", | |||
| "sdfProperty": { | "sdfProperty": { | |||
| "temperature": { | "temperature": { | |||
| "sdfRef": "#/sdfProproperty/temperature", | "sdfRef": "#/sdfProperty/temperature", | |||
| "maximum": -6 | "maximum": -6 | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| } | } | |||
| }, | }, | |||
| "sdfProperty": { | "sdfProperty": { | |||
| "temperature": { | "temperature": { | |||
| "description": "The temperature for this compartment", | "description": "The temperature for this compartment", | |||
| "type": "number", | "type": "number", | |||
| "unit": "Cel" | "unit": "Cel" | |||
| } | } | |||
| } | } | |||
| } | } | |||
| Figure 8: Refrigerator-Freezer Example | Figure 8: Refrigerator-Freezer Example | |||
| Appendix E. Some Changes From Earlier Drafts | Appendix E. Some Changes from Earlier Draft Versions of this | |||
| Specification | ||||
| This appendix is informative. | This appendix is informative. | |||
| The present document provides the SDF base definition. Previous | The present document provides the base SDF definition. Previous | |||
| revisions of SDF have been in use for several years, and both | revisions of SDF, as defined in earlier drafts of this specification, | |||
| significant collections of older SDF models and older SDF conversion | have been in use for several years; both significant collections of | |||
| tools are available today. This appendix provides a brief checklist | older SDF models and older SDF conversion tools are available today. | |||
| that can aid in upgrading these to the standard. | This appendix provides a brief checklist that can aid in upgrading | |||
| these to the standard. | ||||
| * The quality unit was previously called units. | * The quality unit was previously called units. | |||
| * sdfType was developed out of a concept previously called subtype. | * sdfType was developed out of a concept previously called subtype. | |||
| * sdfChoice is the preferred way to represent JSO enum (only a | * sdfChoice is the preferred way to represent JSO enum (only a | |||
| limited form of which is retained) and also the way to represent | limited form of which is retained) and also the way to represent | |||
| JSO anyOf. | JSO anyOf. | |||
| * The length of text strings (as used with minLength/maxLength | * The length of text strings (as used with minLength/maxLength | |||
| skipping to change at line 5121 ¶ | skipping to change at line 5031 ¶ | |||
| Table 12: SDF Content-Format Registration | Table 12: SDF Content-Format Registration | |||
| Table 13: Initial Content of the SDF Quality Names Registry | Table 13: Initial Content of the SDF Quality Names Registry | |||
| Acknowledgements | Acknowledgements | |||
| This specification is based on work by the One Data Model group. | This specification is based on work by the One Data Model group. | |||
| Contributors | Contributors | |||
| Jan Romann | Jan Romann | |||
| Hochschule Emden/Leer | Universität Bremen | |||
| Germany | Germany | |||
| Email: jan.romann@hs-emden-leer.de | Email: jan.romann@uni-bremen.de | |||
| Wouter van der Beek | Wouter van der Beek | |||
| Cascoda Ltd. | Cascoda Ltd. | |||
| Threefield House | Threefield House | |||
| Threefield Lane | Threefield Lane | |||
| Southampton | Southampton | |||
| United Kingdom | United Kingdom | |||
| Email: w.vanderbeek@cascoda.com | Email: w.vanderbeek@cascoda.com | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 103 change blocks. | ||||
| 666 lines changed or deleted | 576 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||