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.