@open-resource-discovery/specification 1.10.1 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,7 +24,7 @@
24
24
  "type": "object",
25
25
  "title": "Package",
26
26
  "x-ums-type": "root",
27
- "description": "A [**Package**](../../details/articles/grouping-and-bundling#package) organizes a set of related resources together, by publishing and catalog presentation concerns.\n\nThe Package can also be used to indicate which products or vendors provided the packaged resources.\nFor partner or customer content, the package can indicate this via the `vendor` and `partOfProducts` assignments.\nIn any case, the Package `ordID` namespace MUST reflect the namespace of the providing application (which hosts the resource), not the resource definition owner, which could be a customer or partner.\n\nA package SHOULD contain at least one resource. Avoid empty packages.\n\nThe package assignment of a resource MAY change, so consumers MUST not rely on this to be stable.\n\nA package does not have a `visibility` property.\nWhether it is displayed is decided by the fact, whether it contains any visible resources according to the visibility role of the aggregator.\n\nTo learn more about the concept and further guidance, see [Package](../../details/articles/grouping-and-bundling#package).",
27
+ "description": "A [**Package**](../concepts/grouping-and-bundling#package) organizes a set of related resources together, by publishing and catalog presentation concerns.\n\nThe Package can also be used to indicate which products or vendors provided the packaged resources.\nFor partner or customer content, the package can indicate this via the `vendor` and `partOfProducts` assignments.\nIn any case, the Package `ordID` namespace MUST reflect the namespace of the providing application (which hosts the resource), not the resource definition owner, which could be a customer or partner.\n\nA package SHOULD contain at least one resource. Avoid empty packages.\n\nThe package assignment of a resource MAY change, so consumers MUST not rely on this to be stable.\n\nA package does not have a `visibility` property.\nWhether it is displayed is decided by the fact, whether it contains any visible resources according to the visibility role of the aggregator.\n\nTo learn more about the concept and further guidance, see [Package](../concepts/grouping-and-bundling#package).",
28
28
  "properties": {
29
29
  "ordId": {
30
30
  "type": "string",
@@ -73,7 +73,7 @@
73
73
  },
74
74
  "version": {
75
75
  "type": "string",
76
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
76
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
77
77
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
78
78
  "examples": [
79
79
  "1.2.3",
@@ -83,7 +83,12 @@
83
83
  "policyLevel": {
84
84
  "type": "string",
85
85
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
86
- "oneOf": [
86
+ "anyOf": [
87
+ {
88
+ "type": "string",
89
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
90
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
91
+ },
87
92
  {
88
93
  "const": "none",
89
94
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -249,6 +254,9 @@
249
254
  {
250
255
  "const": "Sourcing and Procurement"
251
256
  },
257
+ {
258
+ "const": "Strategy, Compliance, and Governance"
259
+ },
252
260
  {
253
261
  "const": "Supply Chain"
254
262
  },
@@ -289,6 +297,9 @@
289
297
  {
290
298
  "const": "Aerospace and Defense"
291
299
  },
300
+ {
301
+ "const": "Agribusiness"
302
+ },
292
303
  {
293
304
  "const": "Automotive"
294
305
  },
@@ -298,24 +309,39 @@
298
309
  {
299
310
  "const": "Chemicals"
300
311
  },
312
+ {
313
+ "const": "Consumer Industries"
314
+ },
301
315
  {
302
316
  "const": "Consumer Products"
303
317
  },
304
318
  {
305
319
  "const": "Defense and Security"
306
320
  },
321
+ {
322
+ "const": "Discrete Industries"
323
+ },
324
+ {
325
+ "const": "Energy and Natural Resources"
326
+ },
307
327
  {
308
328
  "const": "Engineering Construction and Operations"
309
329
  },
310
330
  {
311
- "const": "Healthcare"
331
+ "const": "Financial Services"
312
332
  },
313
333
  {
314
- "const": "Higher Education and Research"
334
+ "const": "Future Cities"
335
+ },
336
+ {
337
+ "const": "Healthcare"
315
338
  },
316
339
  {
317
340
  "const": "High Tech"
318
341
  },
342
+ {
343
+ "const": "Higher Education and Research"
344
+ },
319
345
  {
320
346
  "const": "Industrial Machinery and Components"
321
347
  },
@@ -343,9 +369,15 @@
343
369
  {
344
370
  "const": "Public Sector"
345
371
  },
372
+ {
373
+ "const": "Public Services"
374
+ },
346
375
  {
347
376
  "const": "Retail"
348
377
  },
378
+ {
379
+ "const": "Service Industries"
380
+ },
349
381
  {
350
382
  "const": "Sports and Entertainment"
351
383
  },
@@ -378,7 +410,7 @@
378
410
  "runtimeRestriction": {
379
411
  "x-introduced-in-version": "1.8.0",
380
412
  "x-feature-status": "alpha",
381
- "description": "If provided, all resources that are part of this package can only run on the listed runtime.\n\nMUST be a valid [System Namespace](../index.md#system-namespace).",
413
+ "description": "If provided, all resources that are part of this package can only run on the listed runtime.\n\nMUST be a valid [system namespace](../index.md#system-namespace).",
382
414
  "type": "string",
383
415
  "pattern": "^[a-z0-9]+(?:[.][a-z0-9]+){1}$",
384
416
  "examples": [
@@ -423,7 +455,7 @@
423
455
  "type": "object",
424
456
  "title": "Consumption Bundle",
425
457
  "x-ums-type": "root",
426
- "description": "A [**Consumption Bundle**](../../details/articles/grouping-and-bundling#consumption-bundle) groups APIs and Events together that can be consumed with the credentials and auth mechanism.\nIdeally it also includes instructions and details how to request access and credentials for resources.\n\nFor more documentation and guidance how to correctly this correctly, see [Consumption Bundle details](../../details/articles/grouping-and-bundling#consumption-bundle).\n\nA consumption bundle SHOULD have at least one association with a resource (0..n). Avoid empty consumption bundles.\nA consumption bundle MUST NOT contain APIs and Events that are NOT defined in the ORD document(s) returned\nby the system instance that defines the consumption bundle.\n\nPlease note that some ORD consumer use cases MAY depend on consumption bundle assignments to work with the resources.\n\nTo learn more about the concept, see [Consumption Bundle](../../details/articles/grouping-and-bundling#consumption-bundle).",
458
+ "description": "A [**Consumption Bundle**](../concepts/grouping-and-bundling#consumption-bundle) groups APIs and Events together that can be consumed with the credentials and auth mechanism.\nIdeally it also includes instructions and details how to request access and credentials for resources.\n\nFor more documentation and guidance how to correctly this correctly, see [Consumption Bundle details](../concepts/grouping-and-bundling#consumption-bundle).\n\nA consumption bundle SHOULD have at least one association with a resource (0..n). Avoid empty consumption bundles.\nA consumption bundle MUST NOT contain APIs and Events that are NOT defined in the ORD document(s) returned\nby the system instance that defines the consumption bundle.\n\nPlease note that some ORD consumer use cases MAY depend on consumption bundle assignments to work with the resources.\n\nTo learn more about the concept, see [Consumption Bundle](../concepts/grouping-and-bundling#consumption-bundle).",
427
459
  "properties": {
428
460
  "ordId": {
429
461
  "type": "string",
@@ -486,7 +518,7 @@
486
518
  },
487
519
  "version": {
488
520
  "type": "string",
489
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
521
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
490
522
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
491
523
  "examples": [
492
524
  "1.2.3",
@@ -745,7 +777,7 @@
745
777
  },
746
778
  "version": {
747
779
  "type": "string",
748
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
780
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
749
781
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
750
782
  "examples": [
751
783
  "1.2.3",
@@ -885,18 +917,23 @@
885
917
  "apiProtocol": {
886
918
  "type": "string",
887
919
  "description": "API Protocol including the protocol version if applicable",
888
- "oneOf": [
920
+ "anyOf": [
921
+ {
922
+ "type": "string",
923
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
924
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
925
+ },
889
926
  {
890
927
  "const": "odata-v2",
891
- "description": "[OData Version 2.0](https://www.odata.org/documentation/odata-version-2-0/) API.\nAn API Resource definition of type `edmx` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `edmx`, `csdl-json`, `openapi-v2`, `openapi-v3`, `sap-csn-interop-effective-v1` or `custom`."
928
+ "description": "[OData Version 2.0](https://www.odata.org/documentation/odata-version-2-0/) API.\nAn API Resource definition of type `edmx` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `edmx`, `csdl-json`, `openapi-v2`, `openapi-v3`, `openapi-v3.1+`, `sap-csn-interop-effective-v1` or `custom`."
892
929
  },
893
930
  {
894
931
  "const": "odata-v4",
895
- "description": "[OData Version 4](https://www.odata.org/documentation/) API.\nAn OData V4 API MUST be described via a Common Schema Definition Language (CSDL).\nAn API Resource definition of type `edmx` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `edmx`, `csdl-json`, `openapi-v2`, `openapi-v3`, `sap-csn-interop-effective-v1` or `custom`."
932
+ "description": "[OData Version 4](https://www.odata.org/documentation/) API.\nAn OData V4 API MUST be described via a Common Schema Definition Language (CSDL).\nAn API Resource definition of type `edmx` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `edmx`, `csdl-json`, `openapi-v2`, `openapi-v3`, `openapi-v3.1+`, `sap-csn-interop-effective-v1` or `custom`."
896
933
  },
897
934
  {
898
935
  "const": "rest",
899
- "description": "Generic [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) API.\nPlease not that while OData is also a REST API, the most precise/opinionated `apiProtocol` MUST be chosen.\nAn API Resource definition of type `openapi-v3` (RECOMMENDED) or another appropriate option SHOULD be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `openapi-v2`, `openapi-v3`, `raml-v1`, `sap-csn-interop-effective-v1` or `custom`."
936
+ "description": "Generic [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) API.\nPlease not that while OData is also a REST API, the most precise/opinionated `apiProtocol` MUST be chosen.\nAn API Resource definition of type `openapi-v3` (RECOMMENDED) or another appropriate option SHOULD be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `openapi-v2`, `openapi-v3`, `openapi-v3.1+`, `raml-v1`, `sap-csn-interop-effective-v1` or `custom`."
900
937
  },
901
938
  {
902
939
  "const": "graphql",
@@ -915,6 +952,10 @@
915
952
  "const": "soap-outbound",
916
953
  "description": "[SOAP](https://en.wikipedia.org/wiki/SOAP) API that provides/describes outbound interfaces for async communication.\nAn API Resource definition of type `wsdl-v2` (RECOMMENDED) or `wsdl-v1` MUST be provided.\nFor each API Resource definition: `type` MUST ONLY be set to `wsdl-v1`, `wsdl-v2` or `custom`."
917
954
  },
955
+ {
956
+ "const": "mcp",
957
+ "description": "[MCP](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs, based on JSON-RPC message format.\nThe protocol version is negotiated at runtime via the protocol itself.\n\nCurrently there is no standard API Resource definition type for MCP."
958
+ },
918
959
  {
919
960
  "const": "websocket",
920
961
  "description": "Generic [WebSocket](https://datatracker.ietf.org/doc/html/rfc6455) Protocol.\nSince WebSocket is very generic, it is important to also define or least describe which semantics are concretely used, e.g. via an `implementationStandard`.\nThe API Resource definitions `type` MUST ONLY be set to `custom`."
@@ -947,7 +988,12 @@
947
988
  "implementationStandard": {
948
989
  "type": "string",
949
990
  "description": "Declares this API to be a valid implementation of an externally standardized API contract, sub-protocol or protocol variant.\n\nAll APIs that share the same implementation standard MAY be treated the same or similar by a consumer client.",
950
- "oneOf": [
991
+ "anyOf": [
992
+ {
993
+ "type": "string",
994
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
995
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
996
+ },
951
997
  {
952
998
  "const": "sap:ord-document-api:v1",
953
999
  "description": "API follows the Open Resource Discovery v1 [Document API](../index.md#ord-provider-api) contract."
@@ -995,7 +1041,7 @@
995
1041
  "customImplementationStandard": {
996
1042
  "type": "string",
997
1043
  "description": "If the fixed `implementationStandard` values need to be extended, an arbitrary `customImplementationStandard` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `implementationStandard` is set to `custom`.",
998
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
1044
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
999
1045
  "maxLength": 255,
1000
1046
  "examples": [
1001
1047
  "sap.xref:some-api-contract:v1"
@@ -1010,7 +1056,7 @@
1010
1056
  },
1011
1057
  "compatibleWith": {
1012
1058
  "type": "array",
1013
- "description": "Declares this API is a compatible implementation of the referenced API contract(s).\nThis is also sometimes known as [Service Provider Interface](https://en.wikipedia.org/wiki/Service_provider_interface).\n\nMUST be a valid reference to an (usually external) [API Resource](#api-resource) ORD ID.\n\nAll APIs that share the same `compatibleWith` value MAY be treated the same or similar by a consumer client.",
1059
+ "description": "A reference to the interface (API contract) that this API implements.\nServes as a declaration of compatible implementation of API contract, effectively functioning as an \"implementationOf\" relationship.\n\nMUST be a valid reference to an (usually external) [API Resource](#api-resource) ORD ID.\n\nAll APIs that share the same `compatibleWith` value MAY be treated the same or similar by a consumer client.",
1014
1060
  "items": {
1015
1061
  "type": "string",
1016
1062
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(apiResource):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$"
@@ -1038,7 +1084,12 @@
1038
1084
  "x-feature-status": "beta",
1039
1085
  "items": {
1040
1086
  "type": "string",
1041
- "oneOf": [
1087
+ "anyOf": [
1088
+ {
1089
+ "type": "string",
1090
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1091
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
1092
+ },
1042
1093
  {
1043
1094
  "const": "data-federation",
1044
1095
  "description": "Resources are designed to support [data federation](https://en.wikipedia.org/wiki/Federated_database_system). This goes beyond plain queries, but typically allowing connections on the data base level, in the context of a business user.\nAs consumers will directly access data, performance of the system must support these use cases."
@@ -1084,11 +1135,36 @@
1084
1135
  "entityTypeMappings": {
1085
1136
  "type": "array",
1086
1137
  "x-introduced-in-version": "1.6.0",
1138
+ "x-deprecated-in-version": "1.11.0",
1139
+ "x-deprecated": "Use the simplified `exposedEntityTypes` instead.",
1087
1140
  "description": "Describes mappings between the API Models of the described resource to the underlying, conceptual entity types.",
1088
1141
  "items": {
1089
1142
  "$ref": "#/definitions/EntityTypeMapping"
1090
1143
  }
1091
1144
  },
1145
+ "exposedEntityTypes": {
1146
+ "type": "array",
1147
+ "x-introduced-in-version": "1.11.0",
1148
+ "description": "Optional list of [entity types](#entity-type) that are exposed by the resource.\n\nThis replaces `entityTypeMappings`. If both is given, the `exposedEntityTypes` wins.\n\nMUST be a valid reference to an [EntityType](#entity-type) ORD ID.",
1149
+ "items": {
1150
+ "$ref": "#/definitions/ExposedEntityType"
1151
+ },
1152
+ "examples": [
1153
+ [
1154
+ {
1155
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
1156
+ }
1157
+ ],
1158
+ [
1159
+ {
1160
+ "ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
1161
+ },
1162
+ {
1163
+ "ordId": "sap.sm:entityType:BusinessPartner:v1"
1164
+ }
1165
+ ]
1166
+ ]
1167
+ },
1092
1168
  "apiResourceLinks": {
1093
1169
  "type": "array",
1094
1170
  "description": "Links with semantic meaning that are specific to API Resources.",
@@ -1161,6 +1237,9 @@
1161
1237
  {
1162
1238
  "const": "Sourcing and Procurement"
1163
1239
  },
1240
+ {
1241
+ "const": "Strategy, Compliance, and Governance"
1242
+ },
1164
1243
  {
1165
1244
  "const": "Supply Chain"
1166
1245
  },
@@ -1201,6 +1280,9 @@
1201
1280
  {
1202
1281
  "const": "Aerospace and Defense"
1203
1282
  },
1283
+ {
1284
+ "const": "Agribusiness"
1285
+ },
1204
1286
  {
1205
1287
  "const": "Automotive"
1206
1288
  },
@@ -1210,24 +1292,39 @@
1210
1292
  {
1211
1293
  "const": "Chemicals"
1212
1294
  },
1295
+ {
1296
+ "const": "Consumer Industries"
1297
+ },
1213
1298
  {
1214
1299
  "const": "Consumer Products"
1215
1300
  },
1216
1301
  {
1217
1302
  "const": "Defense and Security"
1218
1303
  },
1304
+ {
1305
+ "const": "Discrete Industries"
1306
+ },
1307
+ {
1308
+ "const": "Energy and Natural Resources"
1309
+ },
1219
1310
  {
1220
1311
  "const": "Engineering Construction and Operations"
1221
1312
  },
1222
1313
  {
1223
- "const": "Healthcare"
1314
+ "const": "Financial Services"
1224
1315
  },
1225
1316
  {
1226
- "const": "Higher Education and Research"
1317
+ "const": "Future Cities"
1318
+ },
1319
+ {
1320
+ "const": "Healthcare"
1227
1321
  },
1228
1322
  {
1229
1323
  "const": "High Tech"
1230
1324
  },
1325
+ {
1326
+ "const": "Higher Education and Research"
1327
+ },
1231
1328
  {
1232
1329
  "const": "Industrial Machinery and Components"
1233
1330
  },
@@ -1255,9 +1352,15 @@
1255
1352
  {
1256
1353
  "const": "Public Sector"
1257
1354
  },
1355
+ {
1356
+ "const": "Public Services"
1357
+ },
1258
1358
  {
1259
1359
  "const": "Retail"
1260
1360
  },
1361
+ {
1362
+ "const": "Service Industries"
1363
+ },
1261
1364
  {
1262
1365
  "const": "Sports and Entertainment"
1263
1366
  },
@@ -1313,7 +1416,12 @@
1313
1416
  "policyLevel": {
1314
1417
  "type": "string",
1315
1418
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
1316
- "oneOf": [
1419
+ "anyOf": [
1420
+ {
1421
+ "type": "string",
1422
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1423
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
1424
+ },
1317
1425
  {
1318
1426
  "const": "none",
1319
1427
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -1536,7 +1644,7 @@
1536
1644
  },
1537
1645
  "version": {
1538
1646
  "type": "string",
1539
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
1647
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
1540
1648
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
1541
1649
  "examples": [
1542
1650
  "1.2.3",
@@ -1650,7 +1758,17 @@
1650
1758
  "implementationStandard": {
1651
1759
  "type": "string",
1652
1760
  "description": "Declares this EventResource to be a valid implementation of a standardized or shared contract.\n\nAll implementations of the same implementation standard MAY be treated the same by a consumer.\nHowever, there MAY be differences in the access strategy, and compatible customizations by the implementer.\nThe implementation standard MAY define the role of the implementor (producer, consumer, both) and how it is determined.\n\nAs of now, only custom implementation standards are supported.",
1653
- "oneOf": [
1761
+ "anyOf": [
1762
+ {
1763
+ "type": "string",
1764
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(apiResource):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1765
+ "description": "Any valid [API Resource ORD ID](../index.md#api-resource_ordid).\n\nRECOMMENDED to use if the contract is published via ORD and has an ORD ID."
1766
+ },
1767
+ {
1768
+ "type": "string",
1769
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1770
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customImplementationStandardDescription` SHOULD be provided."
1771
+ },
1654
1772
  {
1655
1773
  "const": "custom",
1656
1774
  "description": "If chosen, a custom implementation standard MUST be provided via `customImplementationStandard` and SHOULD be described via `customImplementationStandardDescription`"
@@ -1663,7 +1781,7 @@
1663
1781
  "customImplementationStandard": {
1664
1782
  "type": "string",
1665
1783
  "description": "If the fixed `implementationStandard` values need to be extended, an arbitrary `customImplementationStandard` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `implementationStandard` is set to `custom`.",
1666
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
1784
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
1667
1785
  "maxLength": 255,
1668
1786
  "examples": [
1669
1787
  "sap.xref:some-event-contract:v1"
@@ -1702,11 +1820,36 @@
1702
1820
  "entityTypeMappings": {
1703
1821
  "type": "array",
1704
1822
  "x-introduced-in-version": "1.6.0",
1823
+ "x-deprecated-in-version": "1.11.0",
1824
+ "x-deprecated": "Use the simplified `exposedEntityTypes` instead.",
1705
1825
  "description": "Describes mappings between the API Models of the described resource to the underlying, conceptual entity types.",
1706
1826
  "items": {
1707
1827
  "$ref": "#/definitions/EntityTypeMapping"
1708
1828
  }
1709
1829
  },
1830
+ "exposedEntityTypes": {
1831
+ "type": "array",
1832
+ "x-introduced-in-version": "1.11.0",
1833
+ "description": "Optional list of [entity types](#entity-type) that are exposed by the resource.\n\nThis replaces `entityTypeMappings`. If both is given, the `exposedEntityTypes` wins.\n\nMUST be a valid reference to an [EntityType](#entity-type) ORD ID.",
1834
+ "items": {
1835
+ "$ref": "#/definitions/ExposedEntityType"
1836
+ },
1837
+ "examples": [
1838
+ [
1839
+ {
1840
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
1841
+ }
1842
+ ],
1843
+ [
1844
+ {
1845
+ "ordId": "sap.sm:entityType:PurchaseOrderItem:v1"
1846
+ },
1847
+ {
1848
+ "ordId": "sap.sm:entityType:BusinessPartner:v1"
1849
+ }
1850
+ ]
1851
+ ]
1852
+ },
1710
1853
  "eventResourceLinks": {
1711
1854
  "type": "array",
1712
1855
  "x-introduced-in-version": "1.7.1",
@@ -1780,6 +1923,9 @@
1780
1923
  {
1781
1924
  "const": "Sourcing and Procurement"
1782
1925
  },
1926
+ {
1927
+ "const": "Strategy, Compliance, and Governance"
1928
+ },
1783
1929
  {
1784
1930
  "const": "Supply Chain"
1785
1931
  },
@@ -1820,6 +1966,9 @@
1820
1966
  {
1821
1967
  "const": "Aerospace and Defense"
1822
1968
  },
1969
+ {
1970
+ "const": "Agribusiness"
1971
+ },
1823
1972
  {
1824
1973
  "const": "Automotive"
1825
1974
  },
@@ -1829,24 +1978,39 @@
1829
1978
  {
1830
1979
  "const": "Chemicals"
1831
1980
  },
1981
+ {
1982
+ "const": "Consumer Industries"
1983
+ },
1832
1984
  {
1833
1985
  "const": "Consumer Products"
1834
1986
  },
1835
1987
  {
1836
1988
  "const": "Defense and Security"
1837
1989
  },
1990
+ {
1991
+ "const": "Discrete Industries"
1992
+ },
1993
+ {
1994
+ "const": "Energy and Natural Resources"
1995
+ },
1838
1996
  {
1839
1997
  "const": "Engineering Construction and Operations"
1840
1998
  },
1841
1999
  {
1842
- "const": "Healthcare"
2000
+ "const": "Financial Services"
1843
2001
  },
1844
2002
  {
1845
- "const": "Higher Education and Research"
2003
+ "const": "Future Cities"
2004
+ },
2005
+ {
2006
+ "const": "Healthcare"
1846
2007
  },
1847
2008
  {
1848
2009
  "const": "High Tech"
1849
2010
  },
2011
+ {
2012
+ "const": "Higher Education and Research"
2013
+ },
1850
2014
  {
1851
2015
  "const": "Industrial Machinery and Components"
1852
2016
  },
@@ -1874,9 +2038,15 @@
1874
2038
  {
1875
2039
  "const": "Public Sector"
1876
2040
  },
2041
+ {
2042
+ "const": "Public Services"
2043
+ },
1877
2044
  {
1878
2045
  "const": "Retail"
1879
2046
  },
2047
+ {
2048
+ "const": "Service Industries"
2049
+ },
1880
2050
  {
1881
2051
  "const": "Sports and Entertainment"
1882
2052
  },
@@ -1932,7 +2102,12 @@
1932
2102
  "policyLevel": {
1933
2103
  "type": "string",
1934
2104
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
1935
- "oneOf": [
2105
+ "anyOf": [
2106
+ {
2107
+ "type": "string",
2108
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2109
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2110
+ },
1936
2111
  {
1937
2112
  "const": "none",
1938
2113
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -2015,7 +2190,7 @@
2015
2190
  "type": "object",
2016
2191
  "title": "Entity Type",
2017
2192
  "x-ums-type": "root",
2018
- "description": "An [**Entity Type**](../../details/articles/grouping-and-bundling#entity-type) describes either a business concept / term or an underlying conceptual model.\nThe same entity type can be exposed through one or multiple API and events resources.\n\nTo learn more about the concept, see [Entity Type](../../details/articles/grouping-and-bundling#entity-type).",
2193
+ "description": "An [**Entity Type**](../concepts/grouping-and-bundling#entity-type) describes either a business concept / term or an underlying conceptual model.\nThe same entity type can be exposed through one or multiple API and events resources.\n\nTo learn more about the concept, see [Entity Type](../concepts/grouping-and-bundling#entity-type).",
2019
2194
  "x-introduced-in-version": "1.8.0",
2020
2195
  "properties": {
2021
2196
  "ordId": {
@@ -2145,7 +2320,7 @@
2145
2320
  },
2146
2321
  "version": {
2147
2322
  "type": "string",
2148
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
2323
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
2149
2324
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
2150
2325
  "examples": [
2151
2326
  "1.2.3",
@@ -2248,7 +2423,7 @@
2248
2423
  },
2249
2424
  "level": {
2250
2425
  "type": "string",
2251
- "description": "Defining the abstraction level of the entity type using the DDD terminology.\n\nIn Domain-Driven Design, there is a concept of entities and aggregates.\nThere are root entities which may contain further sub entities by composition.\nThe complete package is then called an aggregate, which gets its name and identity from the root entity.\nAn aggregate is a cluster of domain objects that can be treated as a single unit.\nThe root is the entity that is referenced from outside the aggregate. There must be only one root per aggregate.\nThe root ensures the integrity of the aggregate. A sub entity is any other non-root entity in the aggregate.\n\nSource, see [Martin Fowler on DDD Aggregate](https://martinfowler.com/bliki/DDD_Aggregate.html)",
2426
+ "description": "Defining the abstraction level of the entity type using the DDD terminology.\n\nIn Domain-Driven Design, there is a concept of entities and aggregates.\nThere are root entities which may contain further sub entities by composition.\nThe complete \"package\" is then called an aggregate, which gets its name and identity from the root entity.\nAn aggregate is a cluster of domain objects that can be treated as a single unit.\nThe root is the entity that is referenced from outside the aggregate. There must be only one root per aggregate.\nThe root ensures the integrity of the aggregate. A sub entity is any other non-root entity in the aggregate.\n\nSource, see [Martin Fowler on DDD Aggregate](https://martinfowler.com/bliki/DDD_Aggregate.html)",
2252
2427
  "oneOf": [
2253
2428
  {
2254
2429
  "const": "aggregate",
@@ -2273,7 +2448,14 @@
2273
2448
  "description": "States that this Entity Type is related to another Entity Type.\n\nUsually this happens if there are similar conceptual entity types across different namespaces.",
2274
2449
  "items": {
2275
2450
  "$ref": "#/definitions/RelatedEntityType"
2276
- }
2451
+ },
2452
+ "examples": [
2453
+ [
2454
+ {
2455
+ "ordId": "sap.odm:entityType:WorkforcePerson:v1"
2456
+ }
2457
+ ]
2458
+ ]
2277
2459
  },
2278
2460
  "links": {
2279
2461
  "type": "array",
@@ -2312,7 +2494,12 @@
2312
2494
  "policyLevel": {
2313
2495
  "type": "string",
2314
2496
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
2315
- "oneOf": [
2497
+ "anyOf": [
2498
+ {
2499
+ "type": "string",
2500
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2501
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2502
+ },
2316
2503
  {
2317
2504
  "const": "none",
2318
2505
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -2397,7 +2584,7 @@
2397
2584
  "x-ums-type": "root",
2398
2585
  "x-introduced-in-version": "1.8.0",
2399
2586
  "x-implements": "#/definitions/OrdResource",
2400
- "description": "A [Data Product](../../details/articles/data-product) is a data set exposed for consumption outside the boundaries of the producing application via APIs and described by high quality metadata that can be accessed through the [ORD Aggregator](../../spec-v1/#ord-aggregator).\n\nPlease note that this concept is in beta, see [Data Product - Beta Status](../../details/articles/data-product#beta-status).",
2587
+ "description": "A [Data Product](../concepts/data-product) is a data set exposed for consumption outside the boundaries of the producing application via APIs and described by high quality metadata that can be accessed through the [ORD Aggregator](../../spec-v1/#ord-aggregator).\n\nPlease note that this concept is in beta, see [Data Product - Beta Status](../concepts/data-product#beta-status).",
2401
2588
  "properties": {
2402
2589
  "ordId": {
2403
2590
  "type": "string",
@@ -2512,7 +2699,7 @@
2512
2699
  },
2513
2700
  "version": {
2514
2701
  "type": "string",
2515
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
2702
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
2516
2703
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
2517
2704
  "examples": [
2518
2705
  "1.2.3",
@@ -2677,9 +2864,14 @@
2677
2864
  ]
2678
2865
  },
2679
2866
  "category": {
2680
- "description": "Category of the data-set within data product. Based on its definition, a data product is a data set - which can include on the values below.\nBased on the type some properties of a data product may become optional/mandatory.\nConsumers might still do analytics on business object like data products.",
2867
+ "description": "Category of the data-set within data product. Based on its definition, a data product is a \"data set\" - which can include on the values below.\nBased on the type some properties of a data product may become optional/mandatory.\nConsumers might still do analytics on business object like data products.",
2681
2868
  "type": "string",
2682
- "oneOf": [
2869
+ "anyOf": [
2870
+ {
2871
+ "type": "string",
2872
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
2873
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
2874
+ },
2683
2875
  {
2684
2876
  "const": "business-object",
2685
2877
  "description": "Business Objects: master data, transaction data"
@@ -2796,6 +2988,9 @@
2796
2988
  {
2797
2989
  "const": "Aerospace and Defense"
2798
2990
  },
2991
+ {
2992
+ "const": "Agribusiness"
2993
+ },
2799
2994
  {
2800
2995
  "const": "Automotive"
2801
2996
  },
@@ -2805,24 +3000,39 @@
2805
3000
  {
2806
3001
  "const": "Chemicals"
2807
3002
  },
3003
+ {
3004
+ "const": "Consumer Industries"
3005
+ },
2808
3006
  {
2809
3007
  "const": "Consumer Products"
2810
3008
  },
2811
3009
  {
2812
3010
  "const": "Defense and Security"
2813
3011
  },
3012
+ {
3013
+ "const": "Discrete Industries"
3014
+ },
3015
+ {
3016
+ "const": "Energy and Natural Resources"
3017
+ },
2814
3018
  {
2815
3019
  "const": "Engineering Construction and Operations"
2816
3020
  },
2817
3021
  {
2818
- "const": "Healthcare"
3022
+ "const": "Financial Services"
2819
3023
  },
2820
3024
  {
2821
- "const": "Higher Education and Research"
3025
+ "const": "Future Cities"
3026
+ },
3027
+ {
3028
+ "const": "Healthcare"
2822
3029
  },
2823
3030
  {
2824
3031
  "const": "High Tech"
2825
3032
  },
3033
+ {
3034
+ "const": "Higher Education and Research"
3035
+ },
2826
3036
  {
2827
3037
  "const": "Industrial Machinery and Components"
2828
3038
  },
@@ -2850,9 +3060,15 @@
2850
3060
  {
2851
3061
  "const": "Public Sector"
2852
3062
  },
3063
+ {
3064
+ "const": "Public Services"
3065
+ },
2853
3066
  {
2854
3067
  "const": "Retail"
2855
3068
  },
3069
+ {
3070
+ "const": "Service Industries"
3071
+ },
2856
3072
  {
2857
3073
  "const": "Sports and Entertainment"
2858
3074
  },
@@ -2923,6 +3139,9 @@
2923
3139
  {
2924
3140
  "const": "Sourcing and Procurement"
2925
3141
  },
3142
+ {
3143
+ "const": "Strategy, Compliance, and Governance"
3144
+ },
2926
3145
  {
2927
3146
  "const": "Supply Chain"
2928
3147
  },
@@ -2995,7 +3214,12 @@
2995
3214
  "x-feature-status": "beta",
2996
3215
  "type": "string",
2997
3216
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
2998
- "oneOf": [
3217
+ "anyOf": [
3218
+ {
3219
+ "type": "string",
3220
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3221
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3222
+ },
2999
3223
  {
3000
3224
  "const": "none",
3001
3225
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."
@@ -3139,14 +3363,23 @@
3139
3363
  "type": {
3140
3364
  "description": "Type of the API Resource Definition\nIf \"custom\" is chosen, a customType MUST be provided",
3141
3365
  "type": "string",
3142
- "oneOf": [
3366
+ "anyOf": [
3367
+ {
3368
+ "type": "string",
3369
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3370
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3371
+ },
3143
3372
  {
3144
3373
  "const": "openapi-v2",
3145
- "description": "[OpenAPI 2 / Swagger 2](https://swagger.io/specification/v2/) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`."
3374
+ "description": "[OpenAPI 2 / Swagger 2](https://spec.openapis.org/oas/v2.0.html) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`."
3146
3375
  },
3147
3376
  {
3148
3377
  "const": "openapi-v3",
3149
- "description": "[OpenAPI 3](https://swagger.io/specification/) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`."
3378
+ "description": "[OpenAPI 3.0.x](https://spec.openapis.org/oas/v3.0.4.html) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`.\n\nFor OpenAPI 3.1+, `openapi-v3.1+` MUST be used instead, as it's not backward compatible with OpenAPI 3.0."
3379
+ },
3380
+ {
3381
+ "const": "openapi-v3.1+",
3382
+ "description": "[OpenAPI 3.1+](https://spec.openapis.org/oas/v3.1.1.html) (3.1 or greater, but below 4.x) API Definition for [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) APIs.\nThe `mediaType` MUST be be set to either `application/json` or `text/yaml`."
3150
3383
  },
3151
3384
  {
3152
3385
  "const": "raml-v1",
@@ -3198,7 +3431,7 @@
3198
3431
  "customType": {
3199
3432
  "type": "string",
3200
3433
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
3201
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
3434
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3202
3435
  "maxLength": 255,
3203
3436
  "examples": [
3204
3437
  "sap:custom-definition-format:v1"
@@ -3271,7 +3504,12 @@
3271
3504
  "type": {
3272
3505
  "description": "Type of the event resource definition",
3273
3506
  "type": "string",
3274
- "oneOf": [
3507
+ "anyOf": [
3508
+ {
3509
+ "type": "string",
3510
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3511
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3512
+ },
3275
3513
  {
3276
3514
  "const": "asyncapi-v2",
3277
3515
  "description": "[AsyncAPI 2](https://www.asyncapi.com/docs/specifications/2.0.0) API definition for events.\nThe SAP Event Catalog Specification also falls under this category, as it is a valid AsyncAPI definition."
@@ -3292,7 +3530,7 @@
3292
3530
  "customType": {
3293
3531
  "type": "string",
3294
3532
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
3295
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
3533
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3296
3534
  "maxLength": 255,
3297
3535
  "examples": [
3298
3536
  "sap:custom-definition-format:v1"
@@ -3509,14 +3747,19 @@
3509
3747
  "type": {
3510
3748
  "description": "Type of the Capability",
3511
3749
  "type": "string",
3512
- "oneOf": [
3750
+ "anyOf": [
3513
3751
  {
3514
- "const": "custom",
3515
- "description": "If chosen, `customType` MUST be provided."
3752
+ "type": "string",
3753
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3754
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3516
3755
  },
3517
3756
  {
3518
3757
  "const": "sap.mdo:mdi-capability:v1",
3519
3758
  "description": "Capability for SAP Master Data Integration (MDI).\n\nFor the capability definitions: `type` MUST ONLY be set to `sap.mdo:mdi-capability-definition:v1`."
3759
+ },
3760
+ {
3761
+ "const": "custom",
3762
+ "description": "If chosen, `customType` MUST be provided."
3520
3763
  }
3521
3764
  ],
3522
3765
  "examples": [
@@ -3526,7 +3769,7 @@
3526
3769
  "customType": {
3527
3770
  "type": "string",
3528
3771
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
3529
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
3772
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3530
3773
  "maxLength": 255,
3531
3774
  "examples": [
3532
3775
  "sap:custom-definition-format:v1"
@@ -3593,7 +3836,7 @@
3593
3836
  },
3594
3837
  "version": {
3595
3838
  "type": "string",
3596
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
3839
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
3597
3840
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
3598
3841
  "examples": [
3599
3842
  "1.2.3",
@@ -3659,7 +3902,7 @@
3659
3902
  },
3660
3903
  "relatedEntityTypes": {
3661
3904
  "type": "array",
3662
- "description": "Optional list of related EntityType Resources.\n\nMUST be a valid reference to an [EntityType Resource](#entity-type) ORD ID.",
3905
+ "description": "Optional list of related EntityType Resources.\nMUST be a valid reference to an [EntityType Resource](#entity-type) ORD ID.",
3663
3906
  "items": {
3664
3907
  "type": "string",
3665
3908
  "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
@@ -3749,14 +3992,19 @@
3749
3992
  "type": {
3750
3993
  "description": "Type of the capability resource definition",
3751
3994
  "type": "string",
3752
- "oneOf": [
3995
+ "anyOf": [
3753
3996
  {
3754
- "const": "custom",
3755
- "description": "If chosen, a custom type MUST be provided via `customType`"
3997
+ "type": "string",
3998
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3999
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
3756
4000
  },
3757
4001
  {
3758
4002
  "const": "sap.mdo:mdi-capability-definition:v1",
3759
4003
  "description": "Specification for describing master data integration capabilities for Master Data Orchestration (MDO).\n\nThe `mediaType` MUST be set to `application/json`.\nThe capability `type` MUST be set to `sap.mdo:mdi-capability:v1`."
4004
+ },
4005
+ {
4006
+ "const": "custom",
4007
+ "description": "If chosen, a custom type MUST be provided via `customType`"
3760
4008
  }
3761
4009
  ],
3762
4010
  "examples": [
@@ -3766,7 +4014,7 @@
3766
4014
  "customType": {
3767
4015
  "type": "string",
3768
4016
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
3769
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
4017
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
3770
4018
  "maxLength": 255,
3771
4019
  "examples": [
3772
4020
  "sap:custom-definition-format:v1"
@@ -3834,7 +4082,7 @@
3834
4082
  "title": "Integration Dependency",
3835
4083
  "x-ums-type": "root",
3836
4084
  "x-introduced-in-version": "1.7.0",
3837
- "description": "An [Integration Dependency](../../details/articles/integration-dependency) states that the described system (self) can integrate with external systems (integration target) to achieve an integration purpose.\nThe purpose could be to enable a certain feature or integration scenario, but it could also be a mandatory prerequisite for the described system to work.\n\nThe integration dependency includes a list of individual **aspects** that the integration consists of.\nAspects are an \"ingredient\" for the integration scenario (and are logically combined with AND condition).\nEach aspect can express alternatives (OR condition) on what API and event resources can be used to achieve the same outcome.\n\nThe direction of connection establishment, data flow is not directly implied and needs to be inferred from the referenced resources.\n\nIt is not in scope for the Integration Dependency to describe scenarios that external consumers have with the own exposed resources.\nThis would overstep the boundary of self-description.\n\nIf an integration scenario consists of two sides integration with each other, each need to describe its own part in it as an Integration Dependency.\nTherefore, if an integration with multiple types of systems need to be setup, this SHOULD be separated into distinct Integration Dependencies.\n\nAn integration dependency is also not meant to describe a bigger process.\nInstead it focuses on the technical necessaries to create an integration for one particular purpose.\n\nTo learn more about the concept, see [Integration Dependency](../../details/articles/integration-dependency).",
4085
+ "description": "An [Integration Dependency](../concepts/integration-dependency) states that the described system (self) can integrate with external systems (integration target) to achieve an integration purpose.\nThe purpose could be to enable a certain feature or integration scenario, but it could also be a mandatory prerequisite for the described system to work.\n\nThe integration dependency includes a list of individual **aspects** that the integration consists of.\nAspects are an \"ingredient\" for the integration scenario (and are logically combined with AND condition).\nEach aspect can express alternatives (OR condition) on what API and event resources can be used to achieve the same outcome.\n\nThe direction of connection establishment, data flow is not directly implied and needs to be inferred from the referenced resources.\n\nIt is not in scope for the Integration Dependency to describe scenarios that external consumers have with the own exposed resources.\nThis would overstep the boundary of self-description.\n\nIf an integration scenario consists of two sides integration with each other, each need to describe its own part in it as an Integration Dependency.\nTherefore, if an integration with multiple types of systems need to be setup, this SHOULD be separated into distinct Integration Dependencies.\n\nAn integration dependency is also not meant to describe a bigger process.\nInstead it focuses on the technical necessaries to create an integration for one particular purpose.\n\nTo learn more about the concept, see [Integration Dependency](../concepts/integration-dependency).",
3838
4086
  "properties": {
3839
4087
  "ordId": {
3840
4088
  "type": "string",
@@ -3930,7 +4178,7 @@
3930
4178
  },
3931
4179
  "version": {
3932
4180
  "type": "string",
3933
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
4181
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
3934
4182
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
3935
4183
  "examples": [
3936
4184
  "1.2.3",
@@ -4423,7 +4671,12 @@
4423
4671
  "properties": {
4424
4672
  "type": {
4425
4673
  "type": "string",
4426
- "oneOf": [
4674
+ "anyOf": [
4675
+ {
4676
+ "type": "string",
4677
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4678
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4679
+ },
4427
4680
  {
4428
4681
  "const": "terms-of-service",
4429
4682
  "description": "Link to human-readable terms of service / use documentation."
@@ -4464,7 +4717,7 @@
4464
4717
  "customType": {
4465
4718
  "type": "string",
4466
4719
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
4467
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
4720
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4468
4721
  "maxLength": 255,
4469
4722
  "examples": [
4470
4723
  "sap:custom-definition-format:v1"
@@ -4499,7 +4752,12 @@
4499
4752
  "type": {
4500
4753
  "type": "string",
4501
4754
  "description": "See also: [WADG0001 WebAPI type extension](https://webapi-discovery.github.io/rfcs/rfc0001.html#webapiactions)",
4502
- "oneOf": [
4755
+ "anyOf": [
4756
+ {
4757
+ "type": "string",
4758
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4759
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4760
+ },
4503
4761
  {
4504
4762
  "const": "api-documentation",
4505
4763
  "description": "Link to human-readable documentation describing the API or event resource in more detail."
@@ -4540,7 +4798,7 @@
4540
4798
  "customType": {
4541
4799
  "type": "string",
4542
4800
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
4543
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
4801
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4544
4802
  "maxLength": 255,
4545
4803
  "examples": [
4546
4804
  "sap:custom-definition-format:v1"
@@ -4576,7 +4834,12 @@
4576
4834
  "properties": {
4577
4835
  "type": {
4578
4836
  "type": "string",
4579
- "oneOf": [
4837
+ "anyOf": [
4838
+ {
4839
+ "type": "string",
4840
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4841
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
4842
+ },
4580
4843
  {
4581
4844
  "const": "payment",
4582
4845
  "description": "Links to a resource detailing pricing details of the data product."
@@ -4605,7 +4868,7 @@
4605
4868
  "customType": {
4606
4869
  "type": "string",
4607
4870
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
4608
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
4871
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4609
4872
  "maxLength": 255,
4610
4873
  "examples": [
4611
4874
  "sap:custom-definition-format:v1"
@@ -4823,7 +5086,12 @@
4823
5086
  "type": {
4824
5087
  "type": "string",
4825
5088
  "description": "Defines the authentication/authorization strategy through which the referenced `resourceDefinitions` are accessible.",
4826
- "oneOf": [
5089
+ "anyOf": [
5090
+ {
5091
+ "type": "string",
5092
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5093
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
5094
+ },
4827
5095
  {
4828
5096
  "const": "open",
4829
5097
  "description": "The resource definitions are openly accessible and not protected via authentication or authorization.\nPlease find a more detailed documentation [here](../../spec-extensions/access-strategies/open)."
@@ -4852,7 +5120,7 @@
4852
5120
  "customType": {
4853
5121
  "type": "string",
4854
5122
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
4855
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
5123
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4856
5124
  "maxLength": 255,
4857
5125
  "examples": [
4858
5126
  "sap.xref:open-local-tenant-id:v1"
@@ -4892,7 +5160,12 @@
4892
5160
  "type": {
4893
5161
  "type": "string",
4894
5162
  "description": "The type of credential exchange strategy.",
4895
- "oneOf": [
5163
+ "anyOf": [
5164
+ {
5165
+ "type": "string",
5166
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5167
+ "description": "Any valid [Specification ID](../index.md#specification-id).\nIf chosen, `customDescription` SHOULD be provided."
5168
+ },
4896
5169
  {
4897
5170
  "const": "custom",
4898
5171
  "description": "If chosen, `customType` MUST be provided.\nIf chosen, `customDescription` SHOULD be provided."
@@ -4902,7 +5175,7 @@
4902
5175
  "customType": {
4903
5176
  "type": "string",
4904
5177
  "description": "If the fixed `type` enum values need to be extended, an arbitrary `customType` can be provided.\n\nMUST be a valid [Specification ID](../index.md#specification-id).\n\nMUST only be provided if `type` is set to `custom`.",
4905
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):v([0-9]+)$",
5178
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
4906
5179
  "maxLength": 255,
4907
5180
  "examples": [
4908
5181
  "sap.xref:credential-exchange:v1"
@@ -4955,7 +5228,7 @@
4955
5228
  "title": "Group Type",
4956
5229
  "type": "object",
4957
5230
  "x-ums-type": "root",
4958
- "description": "A Group Type defines the semantics of [group assignments](#group).\nWhat the Group Type means and how it is to be used correctly SHOULD be described in the `description` (which may include markdown links).\n\nGroup Types can be defined centrally (ownership by authority namespace) or decentrally (defined by application / service itself).\n\nTo learn more about the concept, see [Group Concept Documentation](../../details/articles/grouping-and-bundling#Groups).",
5231
+ "description": "A Group Type defines the semantics of [group assignments](#group).\nWhat the Group Type means and how it is to be used correctly SHOULD be described in the `description` (which may include markdown links).\n\nGroup Types can be defined centrally (ownership by authority namespace) or decentrally (defined by application / service itself).\n\nTo learn more about the concept, see [Group Concept Documentation](../concepts/grouping-and-bundling#Groups).",
4959
5232
  "x-introduced-in-version": "1.9.0",
4960
5233
  "properties": {
4961
5234
  "groupTypeId": {
@@ -5001,7 +5274,7 @@
5001
5274
  "title": "Group",
5002
5275
  "type": "object",
5003
5276
  "x-ums-type": "root",
5004
- "description": "Group (instance) that resources can be assigned to.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nTo learn more about the concept, see [Group Concept Documentation](../../details/articles/grouping-and-bundling#Groups).",
5277
+ "description": "Group (instance) that resources can be assigned to.\n\nGroups are a lightweight custom taxonomy concept.\nThey express a \"part of\" relationship to the chosen group concept.\nIf an \"identity / equals\" relationship needs to be expressed, use the `correlationIds` instead.\n\nTo learn more about the concept, see [Group Concept Documentation](../concepts/grouping-and-bundling#Groups).",
5005
5278
  "x-introduced-in-version": "1.9.0",
5006
5279
  "properties": {
5007
5280
  "groupId": {
@@ -5121,9 +5394,11 @@
5121
5394
  },
5122
5395
  "EntityTypeMapping": {
5123
5396
  "title": "Entity Type Mapping",
5397
+ "type": "object",
5124
5398
  "x-introduced-in-version": "1.6.0",
5399
+ "x-deprecated-in-version": "1.11.0",
5400
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5125
5401
  "x-ums-type": "custom",
5126
- "type": "object",
5127
5402
  "description": "An API or Event resource may optionally define its `entityTypeMappings`.\nThis is used to map and correlate the API models to the underlying, conceptual **entity types**.\n\nIf the mapping from API resource to entity types is not defined,\ncertain use-cases that rely on this explicit connection will not be possible.\n\nThis mapping is meant to be rather fine granular.\nTherefore, the mapping needs to be done on basis of one of the referenced resource definitions,\nas only there we know the details and the actual contents of the API Model of the API resource.\n\nFor the various resource definition formats the selection of API models may need to be expressed differently.\nAs a consequence, there are different types of selectors that are specialized toward certain resource definition formats.\n\nThe target of the mapping is a correlation to an entity type via a [Correlation ID](../../#/v1/README?id=correlation-id)\nor to an [ORD ID](../../spec-v1/#ord-id) of an entity type.\nIt is assumed that the entity types are described in more detail or on a different abstraction level via metadata.\nWhen the correlation ID is used, an ORD consumer may need to know how to access the entity type metadata through conventions.\nThis can be determined either by the namespace of the correlation ID,\nor through a defined and known `implementationStandard` that can resolve the `localId` fragment of the correlation ID .\n\nAt SAP, the metadata about entity types could be retrieved via the CSN_EXPOSURE service.\nTo indicate this, the service needs to be implemented and described in ORD with `implementationStandard` set to `sap:csn-exposure:v1`).\n\nODM 2.0 relies on the entity type mappings and uses the the mapping to express the relationship of an API to the\ncorresponding ODM entity. ORD consumers like SAP Business Accelerator Hub consume the mapping to make the relationships navigate-able for customers.",
5128
5403
  "properties": {
5129
5404
  "apiModelSelectors": {
@@ -5164,6 +5439,8 @@
5164
5439
  "ApiModelSelectorOData": {
5165
5440
  "title": "API Model Selector (OData)",
5166
5441
  "x-introduced-in-version": "1.6.0",
5442
+ "x-deprecated-in-version": "1.11.0",
5443
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.\n\nFor creating a mapping from API model to Entity Types, consider using the [Entity Relationship](https://sap.github.io/csn-interop-specification/annotations/entity-relationship) annotations.",
5167
5444
  "x-ums-type": "custom",
5168
5445
  "type": "object",
5169
5446
  "description": "API Model Selector for OData, using entity set names for the selection.\n\nMUST only be used if the API Resource provides an API Resource Definition of type `edmx`.",
@@ -5199,6 +5476,8 @@
5199
5476
  "ApiModelSelectorJsonPointer": {
5200
5477
  "title": "API Model Selector (JSON Pointer)",
5201
5478
  "x-introduced-in-version": "1.6.0",
5479
+ "x-deprecated-in-version": "1.11.0",
5480
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.\n\nFor creating a mapping from API model to Entity Types, consider using the [Entity Relationship](https://sap.github.io/csn-interop-specification/annotations/entity-relationship) annotations.",
5202
5481
  "x-ums-type": "custom",
5203
5482
  "type": "object",
5204
5483
  "description": "Generic API Model Selector for JSON / YAML based resource definitions.\nIt uses a [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) that points to the\nentity type description within the resource definition.\n\nThe JSON Pointer always to refer to the structure of the document as originally provided, before further post-processing like resolving $ref properties.\n\nMUST only be used if the API Resource provides an API Resource Definition of media type `application/json` or `text/yaml`.",
@@ -5233,12 +5512,14 @@
5233
5512
  }
5234
5513
  ]
5235
5514
  },
5236
- "RelatedEntityType": {
5237
- "title": "Related Entity Type",
5238
- "x-introduced-in-version": "1.9.0",
5239
- "x-ums-type": "embedded",
5515
+ "EntityTypeOrdIdTarget": {
5516
+ "title": "Entity Type Target (ORD ID)",
5517
+ "x-introduced-in-version": "1.6.0",
5518
+ "x-deprecated-in-version": "1.11.0",
5519
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5520
+ "x-ums-type": "custom",
5240
5521
  "type": "object",
5241
- "description": "Defines which Entity Type is related (via its ORD ID).\nIn the future, this could include stating the relationship type, too.",
5522
+ "description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [ORD ID](../../spec-v1/#ord-id) of an entity type.",
5242
5523
  "properties": {
5243
5524
  "ordId": {
5244
5525
  "type": "string",
@@ -5258,12 +5539,35 @@
5258
5539
  ],
5259
5540
  "additionalProperties": false
5260
5541
  },
5261
- "EntityTypeOrdIdTarget": {
5262
- "title": "Entity Type Target (ORD ID)",
5542
+ "EntityTypeCorrelationIdTarget": {
5543
+ "title": "Entity Type Target (Correlation ID)",
5544
+ "type": "object",
5545
+ "description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [Correlation ID](../../spec-v1/#correlation-id).",
5263
5546
  "x-introduced-in-version": "1.6.0",
5547
+ "x-deprecated-in-version": "1.11.0",
5548
+ "x-deprecated": "Use the simplified `relatedEntityTypes` instead.",
5264
5549
  "x-ums-type": "custom",
5550
+ "properties": {
5551
+ "correlationId": {
5552
+ "type": "string",
5553
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
5554
+ "maxLength": 255,
5555
+ "examples": [
5556
+ "sap.csnexposure:entity:Attachment"
5557
+ ]
5558
+ }
5559
+ },
5560
+ "required": [
5561
+ "correlationId"
5562
+ ],
5563
+ "additionalProperties": false
5564
+ },
5565
+ "RelatedEntityType": {
5566
+ "title": "Related Entity Type",
5567
+ "x-introduced-in-version": "1.9.0",
5568
+ "x-ums-type": "embedded",
5265
5569
  "type": "object",
5266
- "description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [ORD ID](../../spec-v1/#ord-id) of an entity type.",
5570
+ "description": "Defines which Entity Type is related (via its ORD ID).\nIn the future, this could include stating the relationship type, too.",
5267
5571
  "properties": {
5268
5572
  "ordId": {
5269
5573
  "type": "string",
@@ -5283,24 +5587,28 @@
5283
5587
  ],
5284
5588
  "additionalProperties": false
5285
5589
  },
5286
- "EntityTypeCorrelationIdTarget": {
5287
- "title": "Entity Type Target (Correlation ID)",
5288
- "x-introduced-in-version": "1.6.0",
5289
- "x-ums-type": "custom",
5590
+ "ExposedEntityType": {
5591
+ "title": "Exposed Entity Type",
5290
5592
  "type": "object",
5291
- "description": "Define which entity type is the target of an entity type mapping\n\nEntity types can be referenced using a [Correlation ID](../../spec-v1/#correlation-id).",
5593
+ "description": "Defines which Entity Type is exposed through (via its ORD ID).",
5594
+ "x-introduced-in-version": "1.11.0",
5595
+ "x-ums-type": "embedded",
5292
5596
  "properties": {
5293
- "correlationId": {
5597
+ "ordId": {
5294
5598
  "type": "string",
5295
- "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):([a-zA-Z0-9._\\-\\/]+):([a-zA-Z0-9._\\-\\/]+)$",
5599
+ "description": "The ORD ID is a stable, globally unique ID for ORD resources or taxonomy.\n\nIt MUST be a valid [ORD ID](../index.md#ord-id) of the appropriate ORD type.",
5600
+ "pattern": "^([a-z0-9]+(?:[.][a-z0-9]+)*):(entityType):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5296
5601
  "maxLength": 255,
5297
5602
  "examples": [
5298
- "sap.csnexposure:entity:Attachment"
5603
+ "sap.s4.sot:entityType:BusinessPartner:v1"
5604
+ ],
5605
+ "x-association-target": [
5606
+ "#/definitions/EntityType/ordId"
5299
5607
  ]
5300
5608
  }
5301
5609
  },
5302
5610
  "required": [
5303
- "correlationId"
5611
+ "ordId"
5304
5612
  ],
5305
5613
  "additionalProperties": false
5306
5614
  },
@@ -5467,7 +5775,7 @@
5467
5775
  },
5468
5776
  "version": {
5469
5777
  "type": "string",
5470
- "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://swagger.io/specification/#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
5778
+ "description": "The complete [SemVer](https://semver.org/) version string.\n\nIt MUST follow the [Semantic Versioning 2.0.0](https://semver.org/) standard.\nIt SHOULD be changed if the ORD information or referenced resource definitions changed.\nIt SHOULD express minor and patch changes that don't lead to incompatible changes.\n\nWhen the `version` major version changes, the [ORD ID](../index.md#ord-id) `<majorVersion>` fragment MUST be updated to be identical.\nIn case that a resource definition file also contains a version number (e.g. [OpenAPI `info`.`version`](https://spec.openapis.org/oas/v3.1.1.html#info-object)), it MUST be equal with the resource `version` to avoid inconsistencies.\n\nIf the resource has been extended by the user, the change MUST be indicated via `lastUpdate`.\nThe `version` MUST not be bumped for changes in extensions.\n\nThe general [Version and Lifecycle](../index.md#version-and-lifecycle) flow MUST be followed.\n\nNote: A change is only relevant for a version increment, if it affects the ORD resource or ORD taxonomy directly.\nFor example: If a resource within a `Package` changes, but the package itself did not, the package version does not need to be incremented.",
5471
5779
  "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
5472
5780
  "examples": [
5473
5781
  "1.2.3",
@@ -5596,10 +5904,11 @@
5596
5904
  "1.7",
5597
5905
  "1.8",
5598
5906
  "1.9",
5599
- "1.10"
5907
+ "1.10",
5908
+ "1.11"
5600
5909
  ],
5601
5910
  "examples": [
5602
- "1.10"
5911
+ "1.11"
5603
5912
  ]
5604
5913
  },
5605
5914
  "description": {
@@ -5625,7 +5934,12 @@
5625
5934
  "policyLevel": {
5626
5935
  "type": "string",
5627
5936
  "description": "The [policy level](../../spec-extensions/policy-levels/) (aka. compliance level) that the described resources need to be compliant with.\nDepending on the chosen policy level, additional expectations and validations rules will be applied.\n\nThe policy level can be defined on ORD Document level, but also be overwritten on an individual package or resource level.\n",
5628
- "oneOf": [
5937
+ "anyOf": [
5938
+ {
5939
+ "type": "string",
5940
+ "pattern": "^([a-z0-9-]+(?:[.][a-z0-9-]+)*):([a-zA-Z0-9._\\-]+):(v0|v[1-9][0-9]*)$",
5941
+ "description": "Any valid [Specification ID](../index.md#specification-id)."
5942
+ },
5629
5943
  {
5630
5944
  "const": "none",
5631
5945
  "description": "No policy level chosen. Only the base rules on how to create correct ORD documents apply."