diff --git a/Communication/CommunicationGuide.md b/Communication/CommunicationGuide.md index 4a6a178..b227c88 100644 --- a/Communication/CommunicationGuide.md +++ b/Communication/CommunicationGuide.md @@ -47,7 +47,9 @@ The foundation package contains elements that commonly used. This includes stand The common information model that is used in every other package. This shall include a base model containing the entities of a data space and their relation. -**Insert entity model after update.** +![Entities and relationships in data spaces](./images/Communicatoin-Guide_Dataspace_entities.png) + +(find the source file of the image above [here](./images/CommunicatoinGuide_Dataspace_entities.drawio)) The realization bases on DCAT for the Data Products and ODRL for Contract Policies. @@ -91,9 +93,68 @@ API binding: ## Catalog (Publish and query meta-data) ## -messages and data types: -protocols: state machines for message flows and interaction patterns: -API binding: +The catalog in the IDS is a collection of Self-Descriptions, either of IDS Connectors or IDS Resources published by such IDS Connectors. The Self-Descriptions are the first-class-citizen in the catalogs, therefore all messages have the Self-Descriptions as their target, instead of the catalogs containing them. + +### Messages and Datatypes + +The messages, expected content, and the error behaviour are described in the [Functions and Correlated Messages](../Components/MetaDataBroker/FunctionsAndCorrelatedMessages/) section of the Metadata Broker. + +### Interaction Sequences + +Creating and manipulating catalog entries follows different state transitions depending wether Connector or Resource self-descriptions are concerned. + +#### Register and Update a Connector Self-Description + +An IDS Connector self-description is either unknown to a catalog (`initial state`), registered (`ConnectorRegistered`), temporarily inactive (`ConnectorInactive`), or deleted from the catalog (`end state`) as shown in Fig. C1. An inactive self-description is intended for Connectors, which are currently not reachable but intend to become active again in the dataspace. A Connector which self-description has been deleted before (aka. has reached the `end state`) must never come back with the same URI identifier. This is to prevent *false-flag operations* where evil players claim the identity of removed Connectors. + +![catalog-connector-interaction](./images/catalog-connector-interaction.png) + +___Figure C1: State transitions of Connector self-descriptions in a catalog.___ + + +#### Retrieve a Connector Self-Description + +Fig. C2 shows the diagram how to request a Connector self-description entry from a catalog. The DescriptionRequestMessage contains a reference to the target Connector self-discription identifier, defining which catalog entry shall be returned. There is no intermediate state so the operation is either successful or fails, for instance, due to a non-existing entry or an incorrectly formatted message. + +![catalog-request-connector-interaction](./images/catalog-request-connector-interaction.png) + +___Figure C2: Requesting a Connector self-description has no further states apart of the standard success or error cases.___ + + +#### Register and Update a Resource Self-Description + +An IDS Resource is either unknown to a catalog (`initial state`), registered (`ResourceRegistered`), temporarily inactive (`ResourceInactive`), or deleted from the catalog (`end state`) as shown in Fig. C3. It may be automatically created if a Connector self-description is added or extended (ConnectorUpdateMessage) and its self-description also contains Resource entries. A Resource self-description becomes inactive - and active again - if its parent Connector catalog entry becomes inactive or active. Similarily, a Resource self-description gets deleted automatically if the containing Connector gets deleted through a ConnectorUnavailableMessage. + +![catalog-resource-interaction](./images/catalog-resource-interaction.png) + +___Figure C3: State transitions of Connector self-descriptions in a catalog.___ + +#### Rerieve a Resource Self-Description + +Fig. C4 shows the diagram how to request a Resource entry from a catalog, similar to the operation for a Connector self-description. The DescriptionRequestMessage contains a reference to the target Resource self-discription identifier, defining which catalog entry shall be returned. There is no intermediate state so the operation is either successful or fails, for instance, due to a non-existing entry or an incorrectly formatted message. + +![catalog-request-resource-interaction](./images/catalog-request-resource-interaction.png) + +___Figure C4: Requesting a Resource self-description has no further states apart of the standard success or error cases.___ + + +#### Query a Catalog + +Fig. C5 shows the diagram how to send a formulated query a catalog. Different to the retrieval of Connector or Resource self-description entries, the return format is not predefined but depends on the query. The QueryMessage contains formulated query string in a standardized query language, for instance, SPARQL or the upcoming GQL. There is no intermediate state so the operation is either successful or fails, for instance, if the query language is not supported by the catalog hoster or the query itself contains syntax errors. + +![catalog-query-interaction](./images/catalog-query-interaction.png) + +___Figure C5: Sending a catalog query has no further states apart of the standard success or error cases.___ + + + +### API Bindings + +The API Operations of catalogs in the different protocol bindings are explained in the respective protocol sections: +* [IDS REST](./protocols/ids-rest/README.md#complex-operations-and-workflows) +* [IDS Multipart](./protocols/multipart/README.md#41-metadata-broker-communication) +* [idscp2](./protocols/idscp2/ApplicationLayer/README.md) + ## Registration ## diff --git a/Communication/images/Communicatoin-Guide_Dataspace_entities.png b/Communication/images/Communicatoin-Guide_Dataspace_entities.png new file mode 100644 index 0000000..c339533 Binary files /dev/null and b/Communication/images/Communicatoin-Guide_Dataspace_entities.png differ diff --git a/Communication/images/CommunicatoinGuide_Dataspace_entities.drawio b/Communication/images/CommunicatoinGuide_Dataspace_entities.drawio new file mode 100644 index 0000000..9809619 --- /dev/null +++ b/Communication/images/CommunicatoinGuide_Dataspace_entities.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Communication/images/catalog-connector-interaction.png b/Communication/images/catalog-connector-interaction.png new file mode 100644 index 0000000..bcb31d8 Binary files /dev/null and b/Communication/images/catalog-connector-interaction.png differ diff --git a/Communication/images/catalog-query-interaction.png b/Communication/images/catalog-query-interaction.png new file mode 100644 index 0000000..1d3667f Binary files /dev/null and b/Communication/images/catalog-query-interaction.png differ diff --git a/Communication/images/catalog-request-connector-interaction.png b/Communication/images/catalog-request-connector-interaction.png new file mode 100644 index 0000000..43a3f8c Binary files /dev/null and b/Communication/images/catalog-request-connector-interaction.png differ diff --git a/Communication/images/catalog-request-resource-interaction.png b/Communication/images/catalog-request-resource-interaction.png new file mode 100644 index 0000000..d01edb0 Binary files /dev/null and b/Communication/images/catalog-request-resource-interaction.png differ diff --git a/Communication/images/catalog-resource-interaction.png b/Communication/images/catalog-resource-interaction.png new file mode 100644 index 0000000..11d52b4 Binary files /dev/null and b/Communication/images/catalog-resource-interaction.png differ diff --git a/Communication/images/connector-broker-interactions.drawio b/Communication/images/connector-broker-interactions.drawio new file mode 100644 index 0000000..28008a6 --- /dev/null +++ b/Communication/images/connector-broker-interactions.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file