.
+- An [ODRL Agreement](https://www.w3.org/TR/odrl-vocab/#term-Agreement) must have a target property containing the [Dataset](../model/terminology.md#dataset) id.
+
+### 2.1 Contract Request Message
+
+| | |
+|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer) |
+| **Resulting state** | `REQUESTED`, `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-request-message-shape.ttl), [JSON Schema](./message/schema/contract-request-message-schema.json) |
+| **Example** | Initiating [Message](./message/example/contract-request-message_initial.json), [Message](./message/example/contract-offer-message.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-request-message.png) |
+
+The Contract Request Message is sent by a [Consumer](../model/terminology.md#consumer) to initiate a CN or to respond to a [Contract Offer Message](#22-contract-offer-message) sent by a [Provider](../model/terminology.md#provider).
+- The [Consumer](../model/terminology.md#consumer) must include an `offer` property, which itself must have a `@id` property. If the message includes a `providerPid` property, the request will be associated with an existing CN and a [Consumer](../model/terminology.md#consumer) [Offer](../model/terminology.md#offer) will be created using either the `offer` or `offer.@id` properties. If the message does not include a `providerPid`, a new CN will be created on [Provider](../model/terminology.md#provider) side using either the `offer` or `offer.@id` properties and the [Provider](../model/terminology.md#provider) selects an appropriate `providerPid`.
+- An `offer.@id` will generally refer to an [Offer](../model/terminology.md#offer) contained in a [Catalog](../model/terminology.md#catalog). If the [Provider](../model/terminology.md#provider) is not aware of the `offer.@id` value, it must respond with an error message.
+- The `callbackAddress` is a URL indicating where messages to the [Consumer](../model/terminology.md#consumer) should be sent in asynchronous settings. If the address is not understood, the [Provider](../model/terminology.md#provider) MUST return an UNRECOVERABLE error.
+- Different to a [Catalog](../model/terminology.md#catalog) or [Dataset](../model/terminology.md#dataset), the [Offer](../model/terminology.md#offer) inside a [Contract Request Message](#21-contract-request-message) must have an `odrl:target` attribute. However, it's contained Rules must not have any `odrl:target` attributes to prevent inconsistencies with the [ODRL inferencing rules for compact policies](https://www.w3.org/TR/odrl-model/#composition-compact).
+
+
+### 2.2 Contract Offer Message
+
+| | |
+|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Provider](../model/terminology.md#provider) |
+| **Resulting state** | `OFFERED`, `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-offer-message-shape.ttl), [JSON Schema](./message/schema/contract-offer-message-schema.json) |
+| **Example** | [Example Initial Message](./message/example/contract-offer-message_initial.json), [Example Message](./message/example/contract-offer-message.json) |
+| **Diagram(s)** | Initial message (note the missing `consumerPid`)
![](./message/diagram/contract-offer-message_initial.png)
Message following a [Contract Request Message](#21-contract-request-message):
![](./message/diagram/contract-offer-message.png)
|
+
+The Contract Offer Message is sent by a [Provider](../model/terminology.md#provider) to initiate a CN or to respond to a [Contract Request Message](#21-contract-request-message) sent by a [Consumer](../model/terminology.md#consumer).
+- If the message includes a `consumerPid` property, the request will be associated with an existing CN. If the message does not include a `consumerPid`, a new CN will be created on [Consumer](../model/terminology.md#consumer) side and the [Consumer](../model/terminology.md#consumer) selects an appropriate `consumerPid`.
+- The [Dataset](../model/terminology.md#dataset) id is not required but can be included when the [Provider](../model/terminology.md#provider) initiates a CN.
+- Different to a [Dataset](../model/terminology.md#dataset) (see [DCAT Vocabulry Mapping](../catalog/catalog.protocol.md#11-dcat-vocabulary-mapping)), the Offer inside a ContractOfferMessage must have an `odrl:target` attribute. However, it's contained Rules must not have any `odrl:target` attributes to prevent inconsistencies with the [ODRL inferencing rules for compact policies](https://www.w3.org/TR/odrl-model/#composition-compact).
+
+
+### 2.3 Contract Agreement Message
+
+| | |
+|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Provider](../model/terminology.md#provider) |
+| **Resulting state** | `AGREED`, `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-agreement-message-shape.ttl), [JSON Schema](./message/schema/contract-agreement-message-schema.json) |
+| **Example** | [Message](./message/example/contract-agreement-message.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-agreement-message.png) |
+
+The Contract Agreement Message is sent by a [Provider](../model/terminology.md#provider) when it agrees to a contract. It contains the complete [Agreement](../model/terminology.md#agreement).
+- The message must contain a `consumerPid` and a `providerPid`.
+- The message must contain an [ODRL Agreement](https://www.w3.org/TR/odrl-vocab/#term-Agreement).
+- An [Agreement](../model/terminology.md#agreement) must contain a `timestamp` property defined as an [XSD DateTime](https://www.w3schools.com/XML/schema_dtypes_date.asp) type.
+- An [Agreement](../model/terminology.md#agreement) must contain an `assigner` and `assignee`. The contents of these properties are a dataspace-specific unique identifier of the [Agreement](../model/terminology.md#agreement) parties. Note that these identifiers are not necessarily the same as the identifiers of the [Participant Agents](../model/terminology.md#participant-agent) negotiating the contract (e.g., [Connectors](../model/terminology.md#connector--data-service-)).
+- An [Agreement](../model/terminology.md#agreement) must contain a `odrl:target` property. None of its Rules, however, must have any `odrl:target` attributes to prevent inconsistencies with the [ODRL inferencing rules for compact policies](https://www.w3.org/TR/odrl-model/#composition-compact).
+
+
+### 2.4 Contract Agreement Verification Message
+
+| | |
+|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer) |
+| **Resulting state** | `VERIFIED`, `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-agreement-verification-message-shape.ttl), [JSON Schema](./message/schema/contract-agreement-verification-message-schema.json) |
+| **Example** | [Message](./message/example/contract-agreement-verification-message.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-agreement-verification-message.png) |
+
+The Contract Agreement Verification Message is sent by a [Consumer](../model/terminology.md#consumer) to verify the acceptance of an [Agreement](../model/terminology.md#agreement).
+- A [Provider](../model/terminology.md#provider) responds with an error if the contract cannot be validated or is incorrect.
+- The message must contain a `consumerPid` and a `providerPid`.
+
+### 2.5 Contract Negotiation Event Message
+
+| | |
+|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer), [Provider](../model/terminology.md#provider) |
+| **Resulting state** | `FINALIZED`, `ACCEPTED`, `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-negotiation-event-message-shape.ttl), [JSON Schema](./message/schema/contract-negotiation-event-message-schema.json) |
+| **Example** | [Message](./message/example/contract-negotiation-event-message.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-negotiation-event-message.png) |
+
+When the Contract Negotiation Event Message is sent by a [Provider](../model/terminology.md#provider) with an `eventType` property set to `FINALIZED`, an [Agreement](../model/terminology.md#agreement) has been finalized and the associated [Dataset](../model/terminology.md#dataset) is accessible. The state machine is transitioned to the `FINALIZED` state.
+- Other event types may be defined in the future.
+- A [Consumer](../model/terminology.md#consumer) responds with an error if the contract cannot be validated or is incorrect.
+- The message must contain a `consumerPid` and a `providerPid`.
+- When the message is sent by a [Consumer](../model/terminology.md#consumer) with an `eventType` set to `ACCEPTED`, the state machine is placed in the `ACCEPTED` state.
+- It is an error for a [Consumer](../model/terminology.md#consumer) to send the message with an event type `FINALIZED` to the [Provider](../model/terminology.md#provider).
+- It is an error for a [Provider](../model/terminology.md#provider) to send the message with an event type `ACCEPTED` to the [Consumer](../model/terminology.md#consumer).
+
+Note that CN events are not intended for propagation of an [Agreement](../model/terminology.md#agreement) state after a CN has entered a terminal state. It is considered an error for a [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) to send an event after the CN state machine has entered a terminal state.
+
+### 2.6 Contract Negotiation Termination Message
+
+| | |
+|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer), [Provider](../model/terminology.md#provider) |
+| **Resulting state** | `TERMINATED` |
+| **Response** | [ACK](#31-ack---contract-negotiation) or [ERROR](#32-error---contract-negotiation-error) |
+| **Schema** | [TTL Shape](./message/shape/contract-negotiation-termination-message-shape.ttl), [JSON Schema](./message/schema/contract-negotiation-termination-message-schema.json) |
+| **Example** | [Message](./message/example/contract-negotiation-termination-message.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-negotiation-termination-message.png) |
+
+The Contract Negotiation Termination Message is sent by a [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) indicating it has cancelled the CN sequence. The message can be sent at any state of a CN without providing an explanation. Nevertheless, the sender may provide a description to help the receiver.
+- The message must contain a `consumerPid` and a `providerPid`.
+- If an error is received in response to the message, the sending party may choose to ignore the error.
+
+Note that a CN may be terminated for a variety of reasons, for example, an unrecoverable error was encountered or one of the parties no longer wishes to continue. A [Connector's](../model/terminology.md#connector--data-service-) operator may remove terminated CN resources after it has reached the terminated state.
+
+## 3 Response Types
+
+The `ACK` and `ERROR` response types are mapped onto a protocol such as HTTPS. A description of an error might be provided in protocol-dependent forms, e.g., for an HTTPS binding in the request or response body.
+
+### 3.1 ACK - Contract Negotiation
+
+| | |
+|-----------------|-------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer), [Provider](../model/terminology.md#provider) |
+| **Schema** | [TTL Shape](./message/shape/contract-negotiation-shape.ttl), [JSON Schema](./message/schema/contract-negotiation-schema.json) |
+| **Example** | [Process](./message/example/contract-negotiation.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-negotiation.png) |
+
+The Contract Negotiation is an object returned by a [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) indicating a successful state change happened.
+
+### 3.2 ERROR - Contract Negotiation Error
+
+| | |
+|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------|
+| **Sent by** | [Consumer](../model/terminology.md#consumer), [Provider](../model/terminology.md#provider) |
+| **Schema** | [TTL Shape](./message/shape/contract-negotiation-error-shape.ttl), [JSON Schema](./message/schema/contract-negotiation-error-schema.json) |
+| **Example** | [Error](./message/example/contract-negotiation-error.json) |
+| **Diagram(s)** | ![](./message/diagram/contract-negotiation-error.png) |
+
+The Contract Negotiation Error is an object returned by a [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) indicating an error has occurred. It does not cause a state transition.
+
+| Field | Type | Description |
+|---------------|---------------|------------------------------------------------------------------------|
+| `consumerPid` | UUID | The CN unique id on [Consumer](../model/terminology.md#consumer) side. |
+| `providerPid` | UUID | The CN unique id on [Provider](../model/terminology.md#provider) side. |
+| `code` | String | An optional implementation-specific error code. |
+| `reason` | Array[object] | An optional array of implementation-specific error objects. |
diff --git a/negotiation/figures/contract.negotiation.state.machine.png b/negotiation/figures/contract.negotiation.state.machine.png
new file mode 100644
index 0000000..9f1d095
Binary files /dev/null and b/negotiation/figures/contract.negotiation.state.machine.png differ
diff --git a/negotiation/figures/contract.negotiation.state.machine.puml b/negotiation/figures/contract.negotiation.state.machine.puml
new file mode 100644
index 0000000..6fd7136
--- /dev/null
+++ b/negotiation/figures/contract.negotiation.state.machine.puml
@@ -0,0 +1,39 @@
+@startuml "contract-negotiation-state-machine"
+!pragma layout smetana
+
+!include ../common/style/diagram.styles.puml
+
+hide empty description
+
+state REQUESTED: ContractRequestMessage
+state OFFERED: ContractOfferMessage
+state ACCEPTED: ContractNegotiationEventMessage:accepted
+state AGREED: ContractAgreementMessage
+state VERIFIED: ContractAgreementVerificationMessage
+state FINALIZED: ContractNegotiationEventMessage:finalized
+
+state TERMINATED $lightRed #$borderRed: ContractNegotiationTerminationMessage
+
+[*] --> REQUESTED: C
+REQUESTED --> OFFERED: P
+REQUESTED --> AGREED: P
+REQUESTED --> TERMINATED: C/P
+
+[*] --> OFFERED: P
+OFFERED --> REQUESTED: C
+OFFERED --> ACCEPTED: C
+OFFERED --> TERMINATED: C/P
+
+ACCEPTED --> AGREED: P
+ACCEPTED -> TERMINATED: P
+
+AGREED --> VERIFIED: C
+AGREED --> TERMINATED: C
+
+VERIFIED --> FINALIZED: P
+VERIFIED -> TERMINATED: P
+
+FINALIZED -->[*]
+TERMINATED --> [*]
+
+@enduml
diff --git a/negotiation/message/diagram/contract-agreement-message.png b/negotiation/message/diagram/contract-agreement-message.png
new file mode 100644
index 0000000..07121f5
Binary files /dev/null and b/negotiation/message/diagram/contract-agreement-message.png differ
diff --git a/negotiation/message/diagram/contract-agreement-message.puml b/negotiation/message/diagram/contract-agreement-message.puml
new file mode 100644
index 0000000..51e36be
--- /dev/null
+++ b/negotiation/message/diagram/contract-agreement-message.puml
@@ -0,0 +1,28 @@
+@startuml "contract-agreement-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractAgreementMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractAgreementMessage"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+ dspace:callbackAddress : xsd:anyURI
+}
+
+class odrl:Agreement {
+ @type : "odrl:Agreement"
+ @id: String
+ odrl:target : xsd:anyURI
+ dspace:timestamp : xsd:dateTime
+ odrl:assignee : String
+ odrl:assigner : String
+}
+
+"dspace:ContractAgreementMessage" "1" *-- "1" "odrl:Agreement" : "dspace:agreement"
+
+@enduml
diff --git a/negotiation/message/diagram/contract-agreement-verification-message.png b/negotiation/message/diagram/contract-agreement-verification-message.png
new file mode 100644
index 0000000..1ff82d1
Binary files /dev/null and b/negotiation/message/diagram/contract-agreement-verification-message.png differ
diff --git a/negotiation/message/diagram/contract-agreement-verification-message.puml b/negotiation/message/diagram/contract-agreement-verification-message.puml
new file mode 100644
index 0000000..a0e919e
--- /dev/null
+++ b/negotiation/message/diagram/contract-agreement-verification-message.puml
@@ -0,0 +1,17 @@
+@startuml "contract-agreement-verification-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractAgreementVerificationMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractAgreementVerificationMessage"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+}
+
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-negotiation-error.png b/negotiation/message/diagram/contract-negotiation-error.png
new file mode 100644
index 0000000..392aef0
Binary files /dev/null and b/negotiation/message/diagram/contract-negotiation-error.png differ
diff --git a/negotiation/message/diagram/contract-negotiation-error.puml b/negotiation/message/diagram/contract-negotiation-error.puml
new file mode 100644
index 0000000..ac9cb74
--- /dev/null
+++ b/negotiation/message/diagram/contract-negotiation-error.puml
@@ -0,0 +1,25 @@
+@startuml "contract-negotiation-error"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractNegotiationError" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractNegotiationError"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+ dspace:code : String
+ dspace:reason : Array
+}
+
+class "MultilanguageProperty" {
+ @language : BCP47 Language-Tag
+ @value: String
+}
+
+"dspace:ContractNegotiationError" "1" *-- "*" "MultilanguageProperty" : "dct:description"
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-negotiation-event-message.png b/negotiation/message/diagram/contract-negotiation-event-message.png
new file mode 100644
index 0000000..321d32f
Binary files /dev/null and b/negotiation/message/diagram/contract-negotiation-event-message.png differ
diff --git a/negotiation/message/diagram/contract-negotiation-event-message.puml b/negotiation/message/diagram/contract-negotiation-event-message.puml
new file mode 100644
index 0000000..05e1ecf
--- /dev/null
+++ b/negotiation/message/diagram/contract-negotiation-event-message.puml
@@ -0,0 +1,23 @@
+@startuml "contract-negotiation-event-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractNegotiationEventMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractNegotiationEventMessage"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+}
+
+enum dspace:NegotiationEvent {
+ dspace:ACCEPTED
+ dspace:FINALIZED
+}
+
+"dspace:ContractNegotiationEventMessage" "1" *-- "1" "dspace:NegotiationEvent" : "dspace:eventType"
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-negotiation-termination-message.png b/negotiation/message/diagram/contract-negotiation-termination-message.png
new file mode 100644
index 0000000..24a256a
Binary files /dev/null and b/negotiation/message/diagram/contract-negotiation-termination-message.png differ
diff --git a/negotiation/message/diagram/contract-negotiation-termination-message.puml b/negotiation/message/diagram/contract-negotiation-termination-message.puml
new file mode 100644
index 0000000..cd54f0d
--- /dev/null
+++ b/negotiation/message/diagram/contract-negotiation-termination-message.puml
@@ -0,0 +1,18 @@
+@startuml "contract-negotiation-termination-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractNegotiationTerminationMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractNegotiationTerminationMessage"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+ dspace:code : String
+ dspace:reason : Array
+}
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-negotiation.png b/negotiation/message/diagram/contract-negotiation.png
new file mode 100644
index 0000000..305028d
Binary files /dev/null and b/negotiation/message/diagram/contract-negotiation.png differ
diff --git a/negotiation/message/diagram/contract-negotiation.puml b/negotiation/message/diagram/contract-negotiation.puml
new file mode 100644
index 0000000..f32abe4
--- /dev/null
+++ b/negotiation/message/diagram/contract-negotiation.puml
@@ -0,0 +1,29 @@
+@startuml "contract-negotiation"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractNegotiation" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : "dspace:ContractNegotiation"
+ dspace:providerPid : String
+ dspace:consumerPid : String
+}
+
+enum dspace:NegotiationState {
+ "dspace:REQUESTED"
+ "dspace:OFFERED"
+ "dspace:ACCEPTED"
+ "dspace:AGREED"
+ "dspace:VERIFIED"
+ "dspace:FINALIZED"
+ "dspace:TERMINATED"
+ "..."
+}
+
+"dspace:ContractNegotiation" "1" *-- "1" "dspace:NegotiationState" : "dspace:state"
+
+@enduml
diff --git a/negotiation/message/diagram/contract-offer-message.png b/negotiation/message/diagram/contract-offer-message.png
new file mode 100644
index 0000000..eea70c4
Binary files /dev/null and b/negotiation/message/diagram/contract-offer-message.png differ
diff --git a/negotiation/message/diagram/contract-offer-message.puml b/negotiation/message/diagram/contract-offer-message.puml
new file mode 100644
index 0000000..dafd886
--- /dev/null
+++ b/negotiation/message/diagram/contract-offer-message.puml
@@ -0,0 +1,25 @@
+@startuml "contract-offer-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractOfferMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : dspace:ContractOfferMessage
+ dspace:providerPid : String
+ dspace:consumerPid : String
+ dspace:callbackAddress : String
+}
+
+class odrl:Offer {
+ @type : odrl:Offer,
+ @id: String
+ odrl:target : xsd:anyURI
+}
+
+"dspace:ContractOfferMessage" "1" *-- "1" "odrl:Offer" : "dspace:offer"
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-offer-message_initial.png b/negotiation/message/diagram/contract-offer-message_initial.png
new file mode 100644
index 0000000..29bac76
Binary files /dev/null and b/negotiation/message/diagram/contract-offer-message_initial.png differ
diff --git a/negotiation/message/diagram/contract-offer-message_initial.puml b/negotiation/message/diagram/contract-offer-message_initial.puml
new file mode 100644
index 0000000..1bec883
--- /dev/null
+++ b/negotiation/message/diagram/contract-offer-message_initial.puml
@@ -0,0 +1,24 @@
+@startuml "contract-offer-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractOfferMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : dspace:ContractOfferMessage
+ dspace:providerPid : String
+ dspace:callbackAddress : String
+}
+
+class odrl:Offer {
+ @type : odrl:Offer,
+ @id: String
+ odrl:target : xsd:anyURI
+}
+
+"dspace:ContractOfferMessage" "1" *-- "1" "odrl:Offer" : "dspace:offer"
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-request-message.png b/negotiation/message/diagram/contract-request-message.png
new file mode 100644
index 0000000..19c3aaf
Binary files /dev/null and b/negotiation/message/diagram/contract-request-message.png differ
diff --git a/negotiation/message/diagram/contract-request-message.puml b/negotiation/message/diagram/contract-request-message.puml
new file mode 100644
index 0000000..fe1be30
--- /dev/null
+++ b/negotiation/message/diagram/contract-request-message.puml
@@ -0,0 +1,26 @@
+@startuml "contract-request-message"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractRequestMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : dspace:ContractRequestMessage
+ dspace:providerPid : String
+ dspace:consumerPid : String
+ dspace:callbackAddress : String
+}
+
+class odrl:Offer {
+ @type : odrl:Offer,
+ @id: String
+ odrl:target : xsd:anyURI
+ ...
+}
+
+"dspace:ContractRequestMessage" "1" *-- "1" "odrl:Offer" : "dspace:offer"
+
+@enduml
\ No newline at end of file
diff --git a/negotiation/message/diagram/contract-request-message_initial.png b/negotiation/message/diagram/contract-request-message_initial.png
new file mode 100644
index 0000000..b50eefb
Binary files /dev/null and b/negotiation/message/diagram/contract-request-message_initial.png differ
diff --git a/negotiation/message/diagram/contract-request-message_initial.puml b/negotiation/message/diagram/contract-request-message_initial.puml
new file mode 100644
index 0000000..3641174
--- /dev/null
+++ b/negotiation/message/diagram/contract-request-message_initial.puml
@@ -0,0 +1,25 @@
+@startuml "contract-request-message_initial"
+!pragma layout smetana
+
+!include ../../../common/style/diagram.styles.puml
+
+hide empty description
+
+
+class "dspace:ContractRequestMessage" {
+ @context : "https://w3id.org/dspace/2024/1/context.json"
+ @type : dspace:ContractRequestMessage
+ dspace:consumerPid : String
+ dspace:callbackAddress : String
+}
+
+class odrl:Offer {
+ @type : odrl:Offer,
+ @id: String
+ odrl:target : xsd:anyURI
+ ...
+}
+
+"dspace:ContractRequestMessage" "1" *-- "*" "odrl:Offer" : "dspace:offer"
+
+@enduml
diff --git a/negotiation/message/example/contract-agreement-message.json b/negotiation/message/example/contract-agreement-message.json
new file mode 100644
index 0000000..a0016bc
--- /dev/null
+++ b/negotiation/message/example/contract-agreement-message.json
@@ -0,0 +1,23 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractAgreementMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:agreement": {
+ "@id": "urn:uuid:e8dc8655-44c2-46ef-b701-4cffdc2faa44",
+ "@type": "odrl:Agreement",
+ "odrl:target": "urn:uuid:3dd1add4-4d2d-569e-d634-8394a8836d23",
+ "dspace:timestamp": "2023-01-01T01:00:00Z",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "odrl:assignee": "urn:jashd766",
+ "odrl:permission": [{
+ "odrl:action": "odrl:use" ,
+ "odrl:constraint": [{
+ "odrl:leftOperand": "odrl:dateTime",
+ "odrl:operand": "odrl:lteq",
+ "odrl:rightOperand": { "@value": "2023-12-31T06:00Z", "@type": "xsd:dateTime" }
+ }]
+ }]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/example/contract-agreement-verification-message.json b/negotiation/message/example/contract-agreement-verification-message.json
new file mode 100644
index 0000000..419388f
--- /dev/null
+++ b/negotiation/message/example/contract-agreement-verification-message.json
@@ -0,0 +1,6 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractAgreementVerificationMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833"
+}
diff --git a/negotiation/message/example/contract-negotiation-error.json b/negotiation/message/example/contract-negotiation-error.json
new file mode 100644
index 0000000..6ea7f33
--- /dev/null
+++ b/negotiation/message/example/contract-negotiation-error.json
@@ -0,0 +1,23 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractNegotiationError",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:code": "...",
+ "dspace:reason": [
+ {
+ "@value": "Catalog not provisioned for this requester.",
+ "@language": "en"
+ }
+ ],
+ "dct:description": [
+ {
+ "@language": "en",
+ "@value": "The parsing of the input parameters failed."
+ },
+ {
+ "@language": "de",
+ "@value": "Das Lesen der Eingabeparameter schlug fehl."
+ }
+ ]
+}
diff --git a/negotiation/message/example/contract-negotiation-event-message.json b/negotiation/message/example/contract-negotiation-event-message.json
new file mode 100644
index 0000000..7f1fde8
--- /dev/null
+++ b/negotiation/message/example/contract-negotiation-event-message.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractNegotiationEventMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:eventType": "dspace:ACCEPTED"
+}
diff --git a/negotiation/message/example/contract-negotiation-termination-message.json b/negotiation/message/example/contract-negotiation-termination-message.json
new file mode 100644
index 0000000..95cbcd9
--- /dev/null
+++ b/negotiation/message/example/contract-negotiation-termination-message.json
@@ -0,0 +1,13 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractNegotiationTerminationMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:code": "...",
+ "dspace:reason": [
+ {
+ "@value": "License model does not fit.",
+ "@language": "en"
+ }
+ ]
+}
diff --git a/negotiation/message/example/contract-negotiation.json b/negotiation/message/example/contract-negotiation.json
new file mode 100644
index 0000000..becf0c5
--- /dev/null
+++ b/negotiation/message/example/contract-negotiation.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractNegotiation",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:state": "dspace:REQUESTED"
+ }
diff --git a/negotiation/message/example/contract-offer-message.json b/negotiation/message/example/contract-offer-message.json
new file mode 100644
index 0000000..06fc69b
--- /dev/null
+++ b/negotiation/message/example/contract-offer-message.json
@@ -0,0 +1,22 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractOfferMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:offer": {
+ "@type": "odrl:Offer",
+ "@id": "urn:uuid:6bcea82e-c509-443d-ba8c-8eef25984c07",
+ "odrl:target": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "odrl:assignee": "urn:jashd766",
+ "odrl:permission": [{
+ "odrl:action": "odrl:use" ,
+ "odrl:constraint": [{
+ "odrl:leftOperand": "odrl:dateTime",
+ "odrl:operand": "odrl:lteq",
+ "odrl:rightOperand": { "@value": "2023-12-31T06:00Z", "@type": "xsd:dateTime" }
+ }]
+ }]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/example/contract-offer-message_initial.json b/negotiation/message/example/contract-offer-message_initial.json
new file mode 100644
index 0000000..6e6b5a4
--- /dev/null
+++ b/negotiation/message/example/contract-offer-message_initial.json
@@ -0,0 +1,15 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractOfferMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:offer": {
+ "@type": "odrl:Offer",
+ "@id": "urn:uuid:d526561f-528e-4d5a-ae12-9a9dd9b7a518",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "target": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:permission": [{
+ "odrl:action": "odrl:use"
+ }]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/example/contract-request-message.json b/negotiation/message/example/contract-request-message.json
new file mode 100644
index 0000000..32f7211
--- /dev/null
+++ b/negotiation/message/example/contract-request-message.json
@@ -0,0 +1,22 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractRequestMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:offer": {
+ "@type": "odrl:Offer",
+ "@id": "urn:uuid:d526561f-528e-4d5a-ae12-9a9dd9b7a815",
+ "odrl:target": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "odrl:assignee": "urn:jashd766",
+ "odrl:permission": [{
+ "odrl:action": "odrl:use" ,
+ "odrl:constraint": [{
+ "odrl:leftOperand": "odrl:dateTime",
+ "odrl:operand": "odrl:lteq",
+ "odrl:rightOperand": { "@value": "2023-12-31T06:00Z", "@type": "xsd:dateTime" }
+ }]
+ }]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/example/contract-request-message_initial.json b/negotiation/message/example/contract-request-message_initial.json
new file mode 100644
index 0000000..aafe340
--- /dev/null
+++ b/negotiation/message/example/contract-request-message_initial.json
@@ -0,0 +1,15 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractRequestMessage",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:offer": {
+ "@type": "odrl:Offer",
+ "@id": "urn:uuid:2828282:3dd1add8-4d2d-569e-d634-8394a8836a89",
+ "odrl:target": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "odrl:permission": [{
+ "odrl:action": "odrl:use"
+ }]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/example/contract.agreement.message.http.transfer.json b/negotiation/message/example/contract.agreement.message.http.transfer.json
new file mode 100644
index 0000000..90006b4
--- /dev/null
+++ b/negotiation/message/example/contract.agreement.message.http.transfer.json
@@ -0,0 +1,44 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:ContractAgreementMessage",
+ "dspace:providerPid": "urn:uuid:a343fcbf-99fc-4ce8-8e9b-148c97605aab",
+ "dspace:consumerPid": "urn:uuid:32541fe6-c580-409e-85a8-8a9a32fbe833",
+ "dspace:agreement": {
+ "@id": "urn:uuid:e8dc8655-44c2-46ef-b701-4cffdc2faa44",
+ "@type": "odrl:Agreement",
+ "odrl:target": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:assignee": "...",
+ "odrl:assigner": "...",
+ "odrl:permission": [
+ {
+ "@id": "some-permission-id",
+ "odrl:action": "odrl:use",
+ "odrl:constraint": [
+ {
+ "odrl:leftOperand": "dspace:TRANSPORT",
+ "odrl:operator": "odrl:equals",
+ "oderl:rightOperand": {
+ "@id": "dspace:HTTP_REST"
+ }
+ }
+ ]
+ }
+ ],
+ "odrl:duty": [
+ {
+ "@id": "some-permission-id",
+ "odrl:action": "odrl:use",
+ "odrl:constraint": [
+ {
+ "odrl:leftOperand": "dspace:TRANSPORT",
+ "odrl:operator": "odrl:equals",
+ "oderl:rightOperand": {
+ "@id": "dspace:HTTP_REST"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "dspace:callbackAddress": "https://example.com/callback"
+}
diff --git a/negotiation/message/schema/contract-agreement-message-schema.json b/negotiation/message/schema/contract-agreement-message-schema.json
new file mode 100644
index 0000000..a5a2369
--- /dev/null
+++ b/negotiation/message/schema/contract-agreement-message-schema.json
@@ -0,0 +1,39 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractAgreementMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractAgreementMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-agreement-message-schema.json",
+ "definitions": {
+ "ContractAgreementMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractAgreementMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:agreement": {
+ "$ref": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json#/definitions/Agreement"
+ },
+ "dspace:callbackAddress": {
+ "type" : "string"
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid", "dspace:agreement", "dspace:callbackAddress"]
+ }
+ }
+}
diff --git a/negotiation/message/schema/contract-agreement-verification-message-schema.json b/negotiation/message/schema/contract-agreement-verification-message-schema.json
new file mode 100644
index 0000000..dbf27cd
--- /dev/null
+++ b/negotiation/message/schema/contract-agreement-verification-message-schema.json
@@ -0,0 +1,33 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractAgreementVerificationMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractAgreementVerificationMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-agreement-verification-message-schema.json",
+ "definitions": {
+ "ContractAgreementVerificationMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractAgreementVerificationMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/negotiation/message/schema/contract-negotiation-error-schema.json b/negotiation/message/schema/contract-negotiation-error-schema.json
new file mode 100644
index 0000000..34d115a
--- /dev/null
+++ b/negotiation/message/schema/contract-negotiation-error-schema.json
@@ -0,0 +1,53 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractNegotiationErrorSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractNegotiationError"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-negotiation-error-schema.json",
+ "definitions": {
+ "ContractNegotiationError": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractNegotiationError"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:code": {
+ "type": "string"
+ },
+ "dspace:reason": {
+ "type": "array",
+ "minItems": 1,
+ "items": {}
+ },
+ "dct:description": {
+ "type": "array",
+ "items": {
+ "@language": {
+ "type": "string"
+ },
+ "@value": {
+ "type": "string"
+ }
+ },
+ "required": [ "@language", "@value"]
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid"]
+ }
+ }
+}
\ No newline at end of file
diff --git a/negotiation/message/schema/contract-negotiation-event-message-schema.json b/negotiation/message/schema/contract-negotiation-event-message-schema.json
new file mode 100644
index 0000000..56ec3ab
--- /dev/null
+++ b/negotiation/message/schema/contract-negotiation-event-message-schema.json
@@ -0,0 +1,40 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractNegotiationEventMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractNegotiationEventMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-negotiation-event-message-schema.json",
+ "definitions": {
+ "ContractNegotiationEventMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractNegotiationEventMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:eventType": {
+ "type": "string",
+ "enum": [
+ "dspace:ACCEPTED",
+ "dspace:FINALIZED"
+ ]
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid", "dspace:eventType" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/negotiation/message/schema/contract-negotiation-schema.json b/negotiation/message/schema/contract-negotiation-schema.json
new file mode 100644
index 0000000..47f4c63
--- /dev/null
+++ b/negotiation/message/schema/contract-negotiation-schema.json
@@ -0,0 +1,45 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractNegotiationSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractNegotiation"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-negotiation-schema.json",
+ "definitions": {
+ "ContractNegotiation": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractNegotiation"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:state": {
+ "type": "string",
+ "enum": [
+ "dspace:REQUESTED",
+ "dspace:OFFERED",
+ "dspace:ACCEPTED",
+ "dspace:AGREED",
+ "dspace:VERIFIED",
+ "dspace:FINALIZED",
+ "dspace:TERMINATED"
+ ]
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid", "dspace:state" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/negotiation/message/schema/contract-negotiation-termination-message-schema.json b/negotiation/message/schema/contract-negotiation-termination-message-schema.json
new file mode 100644
index 0000000..816ea27
--- /dev/null
+++ b/negotiation/message/schema/contract-negotiation-termination-message-schema.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractNegotiationTerminationMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractNegotiationTerminationMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-negotiation-termination-message-schema.json",
+ "definitions": {
+ "ContractNegotiationTerminationMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractNegotiationTerminationMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:code": {
+ "type": "string"
+ },
+ "dspace:reason": {
+ "type": "array",
+ "minItems": 1,
+ "items": {}
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:consumerPid" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/negotiation/message/schema/contract-offer-message-schema.json b/negotiation/message/schema/contract-offer-message-schema.json
new file mode 100644
index 0000000..3ea7d45
--- /dev/null
+++ b/negotiation/message/schema/contract-offer-message-schema.json
@@ -0,0 +1,39 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractOfferMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractOfferMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-offer-message-schema.json",
+ "definitions": {
+ "ContractOfferMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractOfferMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:offer": {
+ "$ref": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json#/definitions/MessageOffer"
+ },
+ "dspace:callbackAddress": {
+ "type" : "string"
+ }
+ },
+ "required": [ "@context", "@type", "dspace:providerPid", "dspace:offer", "dspace:callbackAddress" ]
+ }
+ }
+}
diff --git a/negotiation/message/schema/contract-request-message-schema.json b/negotiation/message/schema/contract-request-message-schema.json
new file mode 100644
index 0000000..3b1b8bb
--- /dev/null
+++ b/negotiation/message/schema/contract-request-message-schema.json
@@ -0,0 +1,39 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "ContractRequestMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ContractRequestMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-request-message-schema.json",
+ "definitions": {
+ "ContractRequestMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:ContractRequestMessage"
+ },
+ "dspace:providerPid": {
+ "type": "string"
+ },
+ "dspace:consumerPid": {
+ "type": "string"
+ },
+ "dspace:offer": {
+ "$ref": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json#/definitions/MessageOffer"
+ },
+ "dspace:callbackAddress": {
+ "type" : "string"
+ }
+ },
+ "required": [ "@context", "@type", "dspace:consumerPid", "dspace:offer", "dspace:callbackAddress" ]
+ }
+ }
+}
diff --git a/negotiation/message/schema/contract-schema.json b/negotiation/message/schema/contract-schema.json
new file mode 100644
index 0000000..7689334
--- /dev/null
+++ b/negotiation/message/schema/contract-schema.json
@@ -0,0 +1,381 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "PolicySchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Policy"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json",
+ "definitions": {
+ "Policy": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/MessageOffer"
+ },
+ {
+ "$ref": "#/definitions/Offer"
+ },
+ {
+ "$ref": "#/definitions/Agreement"
+ }
+ ]
+ },
+ "PolicyClass": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/AbstractPolicyRule"
+ },
+ {
+ "properties": {
+ "@id": {
+ "type": "string"
+ },
+ "odrl:profile": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Reference"
+ }
+ },
+ "odrl:permission": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Permission"
+ },
+ "minItems": 1
+ },
+ "odrl:obligation": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Duty"
+ },
+ "minItems": 1
+ }
+ },
+ "required": [
+ "@id"
+ ]
+ }
+ ]
+ },
+ "AbstractPolicyRule": {
+ "properties": {
+ "odrl:assigner": {
+ "type": "string"
+ },
+ "odrl:assignee": {
+ "type": "string"
+ }
+ }
+ },
+ "MessageOffer": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/PolicyClass"
+ },
+ {
+ "properties": {
+ "@type": {
+ "type": "string",
+ "const": "odrl:Offer"
+ }
+ }
+ },
+ {
+ "anyOf": [
+ {
+ "required": [
+ "odrl:permission"
+ ]
+ },
+ {
+ "required": [
+ "odrl:prohibition"
+ ]
+ }
+ ]
+ }
+ ],
+ "required": [ "@type", "odrl:assigner" ]
+ },
+ "Offer": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/MessageOffer"
+ }
+ ],
+ "not": { "required": [ "odrl:target" ] }
+ },
+ "Agreement": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/PolicyClass"
+ },
+ {
+ "properties": {
+ "@type": {
+ "type": "string",
+ "const": "odrl:Agreement"
+ },
+ "@id": {
+ "type": "string"
+ },
+ "odrl:target": {
+ "type": "string"
+ },
+ "dspace:timestamp": {
+ "type": "string",
+ "pattern": "-?([1-9][0-9]{3,}|0[0-9]{3})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T(([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]+)?|(24:00:00(\\.0+)?))(Z|(\\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?"
+ }
+ }
+ },
+ {
+ "anyOf": [
+ {
+ "required": [
+ "odrl:permission"
+ ]
+ },
+ {
+ "required": [
+ "odrl:prohibition"
+ ]
+ }
+ ]
+ }
+ ],
+ "required": [
+ "@type",
+ "@id",
+ "odrl:target",
+ "odrl:assignee",
+ "odrl:assigner"
+ ]
+ },
+ "RuleClass": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/AbstractPolicyRule"
+ },
+ {
+ "properties": {
+ "odrl:action": {
+ "$ref": "#/definitions/Action"
+ },
+ "odrl:constraint": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Constraint"
+ },
+ "minItems": 1
+ }
+ }
+ }
+ ],
+ "required": [
+ "odrl:action"
+ ]
+ },
+ "Permission": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/AbstractPolicyRule"
+ },
+ {
+ "properties": {
+ "odrl:action": {
+ "$ref": "#/definitions/Action"
+ },
+ "odrl:constraint": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Constraint"
+ },
+ "minItems": 1
+ },
+ "odrl:duty": {
+ "$ref": "#/definitions/Duty"
+ }
+ },
+ "required": [
+ "odrl:action"
+ ]
+ }
+ ]
+ },
+ "Duty": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/AbstractPolicyRule"
+ },
+ {
+ "properties": {
+ "@id": {
+ "type": "string"
+ },
+ "odrl:action": {
+ "$ref": "#/definitions/Action"
+ },
+ "odrl:constraint": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Constraint"
+ }
+ }
+ },
+ "required": [
+ "odrl:action"
+ ]
+ }
+ ]
+ },
+ "Action": {
+ "type": "string",
+ "enum": [
+ "odrl:delete",
+ "odrl:execute",
+ "cc:SourceCode",
+ "odrl:anonymize",
+ "odrl:extract",
+ "odrl:read",
+ "odrl:index",
+ "odrl:compensate",
+ "odrl:sell",
+ "odrl:derive",
+ "odrl:ensureExclusivity",
+ "odrl:annotate",
+ "cc:Reproduction",
+ "odrl:translate",
+ "odrl:include",
+ "cc:DerivativeWorks",
+ "cc:Distribution",
+ "odrl:textToSpeech",
+ "odrl:inform",
+ "odrl:grantUse",
+ "odrl:archive",
+ "odrl:modify",
+ "odrl:aggregate",
+ "odrl:attribute",
+ "odrl:nextPolicy",
+ "odrl:digitize",
+ "cc:Attribution",
+ "odrl:install",
+ "odrl:concurrentUse",
+ "odrl:distribute",
+ "odrl:synchronize",
+ "odrl:move",
+ "odrl:obtainConsent",
+ "odrl:print",
+ "cc:Notice",
+ "odrl:give",
+ "odrl:uninstall",
+ "cc:Sharing",
+ "odrl:reviewPolicy",
+ "odrl:watermark",
+ "odrl:play",
+ "odrl:reproduce",
+ "odrl:transform",
+ "odrl:display",
+ "odrl:stream",
+ "cc:ShareAlike",
+ "odrl:acceptTracking",
+ "cc:CommericalUse",
+ "odrl:present",
+ "odrl:use"
+ ]
+ },
+ "Constraint": {
+ "type": "object",
+ "properties": {
+ "odrl:rightOperand": {
+ "$ref": "#/definitions/RightOperand"
+ },
+ "odrl:rightOperandReference": {
+ "$ref": "#/definitions/Reference"
+ },
+ "odrl:leftOperand": {
+ "$ref": "#/definitions/LeftOperand"
+ },
+ "odrl:operator": {
+ "$ref": "#/definitions/Operator"
+ }
+ }
+ },
+ "Operator": {
+ "type": "string",
+ "enum": [
+ "odrl:eq",
+ "odrl:gt",
+ "odrl:gteq",
+ "odrl:hasPart",
+ "odrl:isA",
+ "odrl:isAllOf",
+ "odrl:isAnyOf",
+ "odrl:isNoneOf",
+ "odrl:isPartOf",
+ "odrl:lt",
+ "odrl:term-lteq",
+ "odrl:neq"
+ ]
+ },
+ "RightOperand": {},
+ "LeftOperand": {
+ "type": "string",
+ "enum": [
+ "odrl:absolutePosition",
+ "odrl:absoluteSize",
+ "odrl:absoluteSpatialPosition",
+ "odrl:absoluteTemporalPosition",
+ "odrl:count",
+ "odrl:dateTime",
+ "odrl:delayPeriod",
+ "odrl:deliveryChannel",
+ "odrl:device",
+ "odrl:elapsedTime",
+ "odrl:event",
+ "odrl:fileFormat",
+ "odrl:industry",
+ "odrl:language",
+ "odrl:media",
+ "odrl:meteredTime",
+ "odrl:payAmount",
+ "odrl:percentage",
+ "odrl:product",
+ "odrl:purpose",
+ "odrl:recipient",
+ "odrl:relativePosition",
+ "odrl:relativeSize",
+ "odrl:relativeSpatialPosition",
+ "odrl:relativeTemporalPosition",
+ "odrl:resolution",
+ "odrl:spatial",
+ "odrl:spatialCoordinates",
+ "odrl:system",
+ "odrl:systemDevice",
+ "odrl:timeInterval",
+ "odrl:unitOfCount",
+ "odrl:version",
+ "odrl:virtualLocation"
+ ]
+ },
+ "Reference": {
+ "type": "object",
+ "properties": {
+ "@id": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "@id"
+ ]
+ }
+ }
+}
diff --git a/negotiation/message/shape/contract-agreement-message-shape.ttl b/negotiation/message/shape/contract-agreement-message-shape.ttl
new file mode 100644
index 0000000..d5624b8
--- /dev/null
+++ b/negotiation/message/shape/contract-agreement-message-shape.ttl
@@ -0,0 +1,69 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractAgreementMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractAgreementMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementMessageShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementMessageShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:agreement ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:class odrl:Agreement ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementMessageShape): An dspace:agreement property must point to exactly one odrl:Agreement class."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:callbackAddress ;
+ sh:datatype xsd:anyURI ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementMessageShape): An dspace:callbackAddress property must point to exactly one xsd:anyURI value."@en ;
+ ]
+.
diff --git a/negotiation/message/shape/contract-agreement-verification-message-shape.ttl b/negotiation/message/shape/contract-agreement-verification-message-shape.ttl
new file mode 100644
index 0000000..a3c3fea
--- /dev/null
+++ b/negotiation/message/shape/contract-agreement-verification-message-shape.ttl
@@ -0,0 +1,51 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractAgreementVerificationMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractAgreementVerificationMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementVerificationMessageShape): A dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractAgreementVerificationMessageShape): A dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-negotiation-error-shape.ttl b/negotiation/message/shape/contract-negotiation-error-shape.ttl
new file mode 100644
index 0000000..60e119c
--- /dev/null
+++ b/negotiation/message/shape/contract-negotiation-error-shape.ttl
@@ -0,0 +1,73 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractNegotiationErrorShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractNegotiationError ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationErrorShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationErrorShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:code ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationErrorShape): An dspace:code property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:reason ;
+ sh:datatype rdf:langString ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationErrorShape): An dspace:reason property must point to rdf:langString values."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dct:description ;
+ sh:datatype rdf:langString ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationErrorShape): A dct:description property must point zero or more rdf:langString values."@en ;
+ ]
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-negotiation-event-message-shape.ttl b/negotiation/message/shape/contract-negotiation-event-message-shape.ttl
new file mode 100644
index 0000000..43beb19
--- /dev/null
+++ b/negotiation/message/shape/contract-negotiation-event-message-shape.ttl
@@ -0,0 +1,60 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractNegotiationEventMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractNegotiationEventMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationEventMessageShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationEventMessageShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:eventType ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationEventMessageShape): An dspace:eventType property must point to exactly one xsd:string value."@en ;
+ ] ;
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-negotiation-message-shape.ttl b/negotiation/message/shape/contract-negotiation-message-shape.ttl
new file mode 100644
index 0000000..d4d38e1
--- /dev/null
+++ b/negotiation/message/shape/contract-negotiation-message-shape.ttl
@@ -0,0 +1,51 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractNegotiationMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractNegotiationMessage ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 0 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationMessageShape): An dspace:providerPid property must point to exactly one xsd:string."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 0 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationMessageShape): An dspace:consumerPid property must point to exactly one xsd:string."@en ;
+ ] ;
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-negotiation-shape.ttl b/negotiation/message/shape/contract-negotiation-shape.ttl
new file mode 100644
index 0000000..b18ef20
--- /dev/null
+++ b/negotiation/message/shape/contract-negotiation-shape.ttl
@@ -0,0 +1,69 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractNegotiationShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractNegotiation ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationShape): An dspace:providerPid property must point to exactly one xsd:string."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationShape): An dspace:consumerPid property must point to exactly one xsd:string."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:state ;
+ sh:in (
+ dspace:REQUESTED
+ dspace:OFFERED
+ dspace:ACCEPTED
+ dspace:AGREED
+ dspace:VERIFIED
+ dspace:FINALIZED
+ dspace:TERMINATED
+ ) ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationShape): An dspace:state property must point to exactly one dspace:NegotiationState entity."@en ;
+ ]
+
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-negotiation-termination-message-shape.ttl b/negotiation/message/shape/contract-negotiation-termination-message-shape.ttl
new file mode 100644
index 0000000..2d5cebb
--- /dev/null
+++ b/negotiation/message/shape/contract-negotiation-termination-message-shape.ttl
@@ -0,0 +1,63 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractNegotiationTerminationMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractNegotiationTerminationMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationTerminationMessageShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationTerminationMessageShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:code ;
+ sh:datatype xsd:string ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractNegotiationTerminationMessageShape): An dspace:code property must point to an xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:reason ;
+ ]
+
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-offer-message-shape.ttl b/negotiation/message/shape/contract-offer-message-shape.ttl
new file mode 100644
index 0000000..36de8ba
--- /dev/null
+++ b/negotiation/message/shape/contract-offer-message-shape.ttl
@@ -0,0 +1,69 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractOfferMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractOfferMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractOfferMessageShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractOfferMessageShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:offer ;
+ sh:class odrl:Offer ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractOfferMessageShape): A dspace:offer property must point to exactly one odrl:Offer class."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:callbackAddress ;
+ sh:datatype xsd:anyURI ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractOfferMessageShape): A dspace:callbackAddress property must point to exactly one xsd:anyURI value."@en ;
+ ] ;
+.
\ No newline at end of file
diff --git a/negotiation/message/shape/contract-request-message-shape.ttl b/negotiation/message/shape/contract-request-message-shape.ttl
new file mode 100644
index 0000000..c8f0e43
--- /dev/null
+++ b/negotiation/message/shape/contract-request-message-shape.ttl
@@ -0,0 +1,69 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:ContractRequestMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:ContractRequestMessage ;
+ rdfs:subClassOf dspace_shapes:ContractNegotiationMessageShape ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:providerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractRequestMessageShape): An dspace:providerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:consumerPid ;
+ sh:datatype xsd:string ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractRequestMessageShape): An dspace:consumerPid property must point to exactly one xsd:string value."@en ;
+ ] ;
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:offer ;
+ sh:class odrl:Offer ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractRequestMessageShape): An dspace:offer property must point to exactly one odrl:Offer class."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:callbackAddress ;
+ sh:datatype xsd:anyURI ;
+ sh:maxCount 1 ;
+ sh:minCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (ContractRequestMessageShape): An dspace:callbackAddress property must point to exactly one xsd:anyURI value."@en ;
+ ] ;
+.
\ No newline at end of file
diff --git a/releases/2024-1/catalog/message/example/catalog-error.json b/releases/2024-1/catalog/message/example/catalog-error.json
new file mode 100644
index 0000000..60ee338
--- /dev/null
+++ b/releases/2024-1/catalog/message/example/catalog-error.json
@@ -0,0 +1,11 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:CatalogError",
+ "dspace:code": "123:A",
+ "dspace:reason": [
+ {
+ "@value": "Catalog not provisioned for this requester.",
+ "@language": "en"
+ }
+ ]
+}
diff --git a/releases/2024-1/catalog/message/example/catalog-request-message.json b/releases/2024-1/catalog/message/example/catalog-request-message.json
new file mode 100644
index 0000000..69ce5e1
--- /dev/null
+++ b/releases/2024-1/catalog/message/example/catalog-request-message.json
@@ -0,0 +1,7 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:CatalogRequestMessage",
+ "dspace:filter": [
+ "some-filter"
+ ]
+}
diff --git a/releases/2024-1/catalog/message/example/catalog.json b/releases/2024-1/catalog/message/example/catalog.json
new file mode 100644
index 0000000..869ad7e
--- /dev/null
+++ b/releases/2024-1/catalog/message/example/catalog.json
@@ -0,0 +1,76 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@id": "urn:uuid:3afeadd8-ed2d-569e-d634-8394a8836d57",
+ "@type": "dcat:Catalog",
+ "dct:title": "Data Provider A Catalog",
+ "dct:description": [
+ {
+ "@value": "A catalog of data items",
+ "@language": "en"
+ }
+ ],
+ "dspace:participantId": "urn:example:DataProviderA",
+ "dcat:keyword": [
+ "traffic",
+ "government"
+ ],
+ "dcat:service": [
+ {
+ "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77",
+ "@type": "dcat:DataService",
+ "dcat:endpointDescription": "dspace:connector",
+ "dcat:endpointURL": "https://provider-a.com/connector"
+ }
+ ],
+ "dcat:dataset": [
+ {
+ "@id": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "@type": "dcat:Dataset",
+ "dct:title": "Traffic Data",
+ "dct:description": [
+ {
+ "@value": "Traffic data sample extract",
+ "@language": "en"
+ }
+ ],
+ "dcat:keyword": [
+ "traffic"
+ ],
+ "odrl:hasPolicy": [
+ {
+ "@id": "urn:uuid:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "@type": "odrl:Offer",
+ "odrl:assigner": "http://example.com/Provider",
+ "odrl:permission": [
+ {
+ "odrl:action": "odrl:use",
+ "odrl:constraint": [
+ {
+ "odrl:leftOperand": "odrl:spatial",
+ "odrl:operator": "odrl:eq",
+ "odrl:rightOperand": "http://example.org/EU"
+ }
+ ],
+ "odrl:duty": {
+ "odrl:action": "cc:Attribution"
+ }
+ }
+ ]
+ }
+ ],
+ "dcat:distribution": [
+ {
+ "@type": "dcat:Distribution",
+ "dct:format": "dspace:s3+push",
+ "dcat:accessService": [
+ {
+ "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77",
+ "@type": "dcat:DataService",
+ "dcat:endpointURL": "https://provider-a.com/connector"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/releases/2024-1/catalog/message/example/dataset-request-message.json b/releases/2024-1/catalog/message/example/dataset-request-message.json
new file mode 100644
index 0000000..a1fe953
--- /dev/null
+++ b/releases/2024-1/catalog/message/example/dataset-request-message.json
@@ -0,0 +1,5 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@type": "dspace:DatasetRequestMessage",
+ "dspace:dataset": "urn:uuid:3afeadd8-ed2d-569e-d634-8394a8836d57"
+}
diff --git a/releases/2024-1/catalog/message/example/dataset.json b/releases/2024-1/catalog/message/example/dataset.json
new file mode 100644
index 0000000..2ccf961
--- /dev/null
+++ b/releases/2024-1/catalog/message/example/dataset.json
@@ -0,0 +1,46 @@
+{
+ "@context": "https://w3id.org/dspace/2024/1/context.json",
+ "@id": "urn:uuid:3afeadd8-ed2d-569e-d634-8394a8836d57",
+ "@type": "dcat:Dataset",
+ "dct:title": "Traffic Data",
+ "dct:description": [
+ {
+ "@value": "Traffic data sample extract",
+ "@language": "en"
+ }
+ ],
+ "dcat:keyword": [
+ "traffic"
+ ],
+ "odrl:hasPolicy": [ {
+ "@type": "odrl:Offer",
+ "@id": "urn:uuid:2828282:3dd1add8-4d2d-569e-d634-8394a8836a88",
+ "odrl:assigner": "urn:tsdshhs636378",
+ "odrl:permission": [
+ {
+ "odrl:action": "odrl:use",
+ "odrl:constraint": [
+ {
+ "odrl:leftOperand": "odrl:spatial",
+ "odrl:rightOperand": "_:EU",
+ "odrl:operator": "odrl:eq"
+ }
+ ]
+ }
+ ]
+ } ],
+ "dcat:distribution": [
+ {
+ "@type": "dcat:Distribution",
+ "dct:format": {
+ "@id": "dspace:s3+push"
+ },
+ "dcat:accessService": [
+ {
+ "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77",
+ "dcat:endpointURL": "https://provider-a.com/connector"
+ }
+ ]
+ }
+ ]
+}
diff --git a/releases/2024-1/catalog/message/schema/catalog-error-schema.json b/releases/2024-1/catalog/message/schema/catalog-error-schema.json
new file mode 100644
index 0000000..b47409b
--- /dev/null
+++ b/releases/2024-1/catalog/message/schema/catalog-error-schema.json
@@ -0,0 +1,33 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "CatalogErrorSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/CatalogError"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/catalog/catalog-error-schema.json",
+ "definitions": {
+ "CatalogError": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:CatalogError"
+ },
+ "dspace:code": {
+ "type": "string"
+ },
+ "dspace:reason": {
+ "type": "array"
+ }
+ },
+ "required": [ "@context", "@type" ]
+ }
+ }
+}
diff --git a/releases/2024-1/catalog/message/schema/catalog-request-message-schema.json b/releases/2024-1/catalog/message/schema/catalog-request-message-schema.json
new file mode 100644
index 0000000..cb17b9a
--- /dev/null
+++ b/releases/2024-1/catalog/message/schema/catalog-request-message-schema.json
@@ -0,0 +1,32 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "CatalogRequestMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/CatalogRequestMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/catalog/catalog-request-message-schema.json",
+ "definitions": {
+ "CatalogRequestMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:CatalogRequestMessage"
+ },
+ "dspace:filter": {
+ "type": "array",
+ "items": {
+ }
+ }
+ },
+ "required": [ "@context", "@type"]
+ }
+ }
+}
diff --git a/releases/2024-1/catalog/message/schema/catalog-schema.json b/releases/2024-1/catalog/message/schema/catalog-schema.json
new file mode 100644
index 0000000..c262573
--- /dev/null
+++ b/releases/2024-1/catalog/message/schema/catalog-schema.json
@@ -0,0 +1,59 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "CatalogSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Catalog"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/catalog/catalog-schema.json",
+ "definitions": {
+ "Catalog": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "https://w3id.org/dspace/2024/1/catalog/dataset-schema.json#/definitions/AbstractDataset"
+ },
+ {
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dcat:Catalog"
+ },
+ "dcat:dataset": {
+ "type": "array",
+ "items": {
+ "$ref": "https://w3id.org/dspace/2024/1/catalog/dataset-schema.json#/definitions/Dataset"
+ },
+ "minItems": 1
+ },
+ "dcat:service": {
+ "type": "array",
+ "items": {
+ "$ref": "https://w3id.org/dspace/2024/1/catalog/dataset-schema.json#/definitions/DataService"
+ },
+ "minItems": 1
+ },
+ "dspace:participantId": {
+ "type": "string"
+ },
+ "foaf:homepage": {
+ "type": "string"
+ }
+ }
+ }
+ ],
+ "required": [ "@context", "@type" ],
+ "anyOf" : [
+ {
+ "not" : { "required" : [ "odrl:hasPolicy" ] }
+ }
+ ]
+ }
+ }
+}
diff --git a/releases/2024-1/catalog/message/schema/dataset-request-message-schema.json b/releases/2024-1/catalog/message/schema/dataset-request-message-schema.json
new file mode 100644
index 0000000..c05c4e9
--- /dev/null
+++ b/releases/2024-1/catalog/message/schema/dataset-request-message-schema.json
@@ -0,0 +1,30 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "DatasetRequestMessageSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/DatasetRequestMessage"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/catalog/dataset-request-message-schema.json",
+ "definitions": {
+ "DatasetRequestMessage": {
+ "type": "object",
+ "properties": {
+ "@context": {
+ "type": "string",
+ "const": "https://w3id.org/dspace/2024/1/context.json"
+ },
+ "@type": {
+ "type": "string",
+ "const": "dspace:DatasetRequestMessage"
+ },
+ "dspace:dataset": {
+ "type": "string"
+ }
+ },
+ "required": [ "@context", "@type", "dspace:dataset" ]
+ }
+ }
+}
diff --git a/releases/2024-1/catalog/message/schema/dataset-schema.json b/releases/2024-1/catalog/message/schema/dataset-schema.json
new file mode 100644
index 0000000..e62634c
--- /dev/null
+++ b/releases/2024-1/catalog/message/schema/dataset-schema.json
@@ -0,0 +1,175 @@
+{
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
+ "title": "DatasetSchema",
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Dataset"
+ }
+ ],
+ "$id": "https://w3id.org/dspace/2024/1/catalog/dataset-schema.json",
+ "definitions": {
+ "AbstractDataset": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Resource"
+ },
+ {
+ "properties": {
+ "odrl:hasPolicy": {
+ "type": "array",
+ "items": {
+ "$ref": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json#/definitions/Offer"
+ },
+ "minItems": 1
+ },
+ "dcat:distribution": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Distribution"
+ },
+ "minItems": 1
+ }
+ }
+ }
+ ]
+ },
+ "Dataset": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/AbstractDataset"
+ }
+ ],
+ "required": [
+ "odrl:hasPolicy"
+ ]
+ },
+ "Resource": {
+ "type": "object",
+ "properties": {
+ "dcat:keyword": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "dcat:theme": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Reference"
+ },
+ "minItems": 1
+ },
+ "dct:conformsTo": {
+ "type": "string"
+ },
+ "dct:creator": {
+ "type": "string"
+ },
+ "dct:description": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Multilanguage"
+ }
+ },
+ "dct:identifier": {
+ "type": "string"
+ },
+ "dct:issued": {
+ "type": "string"
+ },
+ "dct:modified": {
+ "type": "string"
+ },
+ "dct:title": {
+ "type": "string"
+ }
+ }
+ },
+ "Distribution": {
+ "type": "object",
+ "properties": {
+ "dct:title": {
+ "type": "string"
+ },
+ "dct:description": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Multilanguage"
+ }
+ },
+ "dct:issued": {
+ "type": "string"
+ },
+ "dct:modified": {
+ "type": "string"
+ },
+ "odrl:hasPolicy": {
+ "type": "array",
+ "items": {
+ "$ref": "https://w3id.org/dspace/2024/1/negotiation/contract-schema.json#/definitions/Offer"
+ },
+ "minItems": 1
+ },
+ "dcat:accessService": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/DataService"
+ },
+ "minItems": 1
+ }
+ },
+ "required": [
+ "dcat:accessService"
+ ]
+ },
+ "DataService": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Resource"
+ },
+ {
+ "properties": {
+ "dcat:endpointDescription": {
+ "type": "string"
+ },
+ "dcat:endpointURL": {
+ "type": "string"
+ },
+ "dcat:servesDataset": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Dataset"
+ },
+ "minItems": 1
+ }
+ }
+ }
+ ]
+ },
+ "Reference": {
+ "type": "object",
+ "properties": {
+ "@id": {
+ "type": "string"
+ }
+ },
+ "required": [ "@id" ]
+ },
+ "Multilanguage": {
+ "type": "object",
+ "properties": {
+ "@value": {
+ "type": "string"
+ },
+ "@language": {
+ "type": "string"
+ }
+ },
+ "required": [ "@value", "@language" ]
+ }
+ }
+}
diff --git a/releases/2024-1/catalog/message/shape/catalog-error-shape.ttl b/releases/2024-1/catalog/message/shape/catalog-error-shape.ttl
new file mode 100644
index 0000000..9a28e39
--- /dev/null
+++ b/releases/2024-1/catalog/message/shape/catalog-error-shape.ttl
@@ -0,0 +1,40 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:CatalogErrorShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:CatalogError ;
+ sh:property [
+ sh:path dspace:code ;
+ sh:datatype xsd:string ;
+ ] ;
+ sh:property [
+ sh:path dspace:reason ;
+ sh:datatype rdf:langString ;
+ ] ;
+
+.
diff --git a/releases/2024-1/catalog/message/shape/catalog-request-message-shape.ttl b/releases/2024-1/catalog/message/shape/catalog-request-message-shape.ttl
new file mode 100644
index 0000000..30030f2
--- /dev/null
+++ b/releases/2024-1/catalog/message/shape/catalog-request-message-shape.ttl
@@ -0,0 +1,37 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:CatalogRequestMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:CatalogRequestMessage ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:filter ;
+ ] ;
+
+.
\ No newline at end of file
diff --git a/releases/2024-1/catalog/message/shape/dataset-request-message-shape.ttl b/releases/2024-1/catalog/message/shape/dataset-request-message-shape.ttl
new file mode 100644
index 0000000..c1542a6
--- /dev/null
+++ b/releases/2024-1/catalog/message/shape/dataset-request-message-shape.ttl
@@ -0,0 +1,40 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:DatasetRequestMessageShape
+ a sh:NodeShape ;
+ sh:targetClass dspace:DatasetRequestMessage ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dspace:dataset ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:severity sh:Violation ;
+ sh:message " (DatasetRequestMessage): There must be exactly one dspace:dataset property."@en ;
+ ] ;
+.
diff --git a/releases/2024-1/catalog/message/shape/dataset-shape.ttl b/releases/2024-1/catalog/message/shape/dataset-shape.ttl
new file mode 100644
index 0000000..2bb0c50
--- /dev/null
+++ b/releases/2024-1/catalog/message/shape/dataset-shape.ttl
@@ -0,0 +1,78 @@
+@prefix owl: .
+@prefix rdf: .
+@prefix rdfs: .
+@prefix xsd: .
+@prefix dct: .
+@prefix dcat: .
+@prefix odrl: .
+@prefix cred: .
+@prefix sec: .
+@prefix prov: .
+
+@prefix dspace: .
+@prefix dspace_shapes: .
+
+@prefix sh: .
+
+dspace_shapes:
+ a owl:Ontology ;
+ sh:declare [
+ sh:prefix "rdf" ;
+ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
+ ] ;
+ sh:declare [
+ sh:prefix "dspace" ;
+ sh:namespace "https://w3id.org/dspace/2024/1/"^^xsd:anyURI ;
+ ] ;
+.
+
+dspace_shapes:DatasetShape
+ a sh:NodeShape ;
+ sh:targetClass dcat:Dataset ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dcat:distribution ;
+ sh:class dcat:Distribution ;
+ sh:minCount 0;
+ sh:severity sh:Violation ;
+ sh:message " (DatasetShape): A dcat:distribution property must point to a dcat:Distribution."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dcat:keyword ;
+ sh:datatype xsd:string ;
+ sh:minCount 0;
+ sh:severity sh:Violation ;
+ sh:message " (DatasetShape): A dcat:keyword property must point to a xsd:string field."@en ;
+ ] ;
+
+ sh:property [
+ a sh:PropertyShape ;
+ sh:path dct:description ;
+ sh:datatype rdf:langString ;
+ sh:minCount 0;
+ sh:severity sh:Violation ;
+ sh:message "