OMG Web-Enabled DDS 1.0 — Spec Coverage

Spec: OMG Web-Enabled DDS 1.0 — formal/2014-12-01 →

Context: DDS-WEB defines a WebDDS object model + a REST PSM, with which web clients (browsers, mobile apps, cloud services) participate in DDS topics over HTTP. ZeroDDS implements the WebDDS object model (§7) + the REST-PSM URI routing + status mapping + header set + XML element-tag registry (§8.3) as a pure-Rust no_std+alloc library. The HTTP server implementation + XML body serialization are caller-layer.

Implementation:

  • crates/web/ · docs.rs — WebDDS object model + REST PSM (URI routing, status mapping, header set, XML element-tag registry), 6 modules, 44 tests green.

§1 Scope

§1.1-§1.6 Overview + conformance + examples

Spec: §1, p. 1-4 — a DDS gateway service over HTTP/REST.

Repo: crate doc.

Status: done


§2 Conformance

§2 Profile triple (REST + SIMPLE-REST + SIMPLE-WSDL-SOAP)

Spec: §2, p. 5 — REST Mandatory, SIMPLE-REST + SIMPLE-WSDL-SOAP Optional.

Repo: ZeroDDS implements REST (mandatory) plus SOAP.

Tests: cross-ref rest::tests::*, headers::tests::*, status::tests::*.

Status: done — the mandatory profile (REST) and the optional SIMPLE-WSDL-SOAP profile both implemented (see §8.4); the SIMPLE-REST profile analogous to the REST subset.


§3 Normative references

Spec: §3, p. 5 — DDS 1.2, DDS-CCM, DDS-XTYPES, HTTP RFC 2616, HTTP-Auth RFC 2617, WebSockets RFC 6455, SOAP 1.2, WSDL 1.1, XML 1.1.

Repo:

Tests:

Status: n/a (informative) — an external normative reference list; HTTP/RFC/XML are fulfilled operationally in the respective consumer items §7/§8.


§4-§6 Terms + symbols + acks

Repo:

Tests:

Status: n/a (informative) — glossary/symbols/acks; without a code mapping.


§7 WebDDS object model

§7.1 WebDDS object model overview

Spec: §7.1, p. 9 — the WebDDS object model concept: a container for application/type/QoS/AccessController instances.

Repo: crates/web/src/model.rs::WebDdsRoot (container structure).

Tests: cross-ref §7.3.1.

Status: done

§7.2 Singleton WebDDS::Root

Spec: §7.2, p. 10 — WebDDS::Root is a singleton; all other classes are reachable via Root.

Repo: crates/web/src/model.rs::WebDdsRoot as a singleton pattern (instantiated via the application lifecycle).

Tests: model::tests::root_lifecycle, model::tests::root_holds_singleton_application_set.

Status: done

§7.3 Access control + SessionId

Spec: §7.3, p. 11-13 — AccessController + session tracking.

Repo: crates/web/src/session.rs::SessionId + crates/web/src/model.rs::Client + crates/web/src/access_control.rs (permissions data model + an evaluate(op, topic) -> Decision engine, a glob matcher with */prefix*/*suffix patterns, the spec §7.3 decision tree: first deny-match wins, otherwise first permit-match, otherwise default).

Tests: session::tests::* (2), access_control::tests::* (7) incl. empty-permissions, allow-rule, deny-overrides-allow, glob-prefix/suffix, operation-mismatch, first-match-deny-wins.

Status: done

§7.3.1 Class WebDDS::Root

Spec: §7.3.1, p. 13-17 — Root operations: create_application, delete_application, get_applications (with fnmatch), create/delete/update/get_qos_library, create/delete/get_type.

Repo: WebDdsRoot::{create_application, delete_application, get_applications} with an fnmatch wildcard subset.

Tests: cross-ref model::tests::*.

Cross-ref schema storage (Phase-B cluster-8): QosLibrary CRUD via crates/xml/src/qos.rs::{QosLibrary, parse_xml_string}; type CRUD via the crates/types/ TypeLibrary. Bridge to the DCPS API in crates/web/src/bridge.rs::DdsBackend trait (see §7.4).

Status: done

§7.4 Class operations Application + Participant + …

Spec: §7.4, p. 17-58 — DomainParticipant, Topic, Publisher, Subscriber, DataWriter, DataReader, WaitSet — all CRUD.

Repo: data-model stubs in model.rs::{Application, DomainParticipant}. Full CRUD integrable via the crates/dcps/ public API (caller-layer bridge).

Repo: crates/web/src/bridge.rs::DdsBackend trait with all class operations (create/delete/list_application, create/delete_participant, create_topic, create_data_writer, create_data_reader, write_sample, read_samples). A concrete backend impl in a higher layer (daemon crate) calls the crates/dcps/ public API; the web crate itself stays bridge-agnostic. enforce(decision) -> Result<(), BackendError> composes orthogonally with the AccessController engine from §7.3.

Tests: bridge::tests::* (5) incl. enforce-permit/deny, permission-check-then-backend-call-chain, create+delete-roundtrip, conflict-on-duplicate-create.

Status: done

§7.4.8 DataReader::read with a SampleSelector

Spec: §7.4.8, p. 51-53 — read with a SampleSelector BNF grammar (FilterExpression + MetadataExpression with AND/OR logic).

Repo: crates/web/src/sample_selector.rs::parse_sample_selector returns an AST (SampleSelector with filter: Option<FilterExpression> + metadata: Vec<MetadataExpression>). A recursive-descent parser with all 6 comparison operators (=,!=,<,<=,>,>=), AND/OR logic, parentheses, integer/string/boolean literals, a dotted field path, sample_state/view_state/instance_state metadata with all values.

Tests: sample_selector::tests::* (14) incl. simple-equality, inequality-with-string, dotted-field-path, AND-conjunction, OR-with-parens, metadata-only, filter-plus-metadata, all-three-metadata-kinds, all 6 compare operators, boolean-literal, plus 4 error cases (unknown-key, unknown-value, unbalanced-parens, trailing-garbage).

Status: done


§8 REST PSM

§8.1 Formats

Spec: §8.1, p. 59 — Content-Type application/zerodds-web+xml (mandatory) as the XML format; further formats optional.

Repo: crates/web/src/representation.rs::{ContentType, CONTENT_TYPE_DDS_WEB_XML}.

Tests: representation::tests::content_type_constant_matches_spec.

Status: done

§8.2 Representations

Spec: §8.2, p. 60-61 — four representation kinds: QoS, Type, Data, Entity (with XML element tags per kind).

Repo: crates/web/src/representation.rs::{RepresentationKind, element_name}.

Tests: representation::tests::element_names_match_spec_tab_6.

Status: done — element-tag registry. XML body serialization is caller-layer.

§8.3.1 Mapping to resource URIs

Spec: §8.3.1, p. 62 Tab 4 — all URI patterns with prefix /dds/rest1.

Repo: crates/web/src/rest.rs::{REST_PREFIX, RestRoute, parse_route, RestMethod} with all 30+ routes.

Tests: rest::tests::* (14 tests incl. prefix validation, parameter extraction for all Tab-5 routes).

Status: done

§8.3.2 Mapping to HTTP methods + status codes

Spec: §8.3.2, p. 62-64 — method mapping (POST/PUT/GET/DELETE) + status codes (201, 204, 200, 409, 422, 404, 401, 403, 500).

Repo: crates/web/src/status.rs::{ReturnStatus, http_status_for}.

Tests: status::tests::* (11 tests incl. all 8 ReturnStatus + method-dependent OK mappings).

Status: done

§8.3.3 Complete mapping (Tab 5)

Spec: §8.3.3, p. 64-67 — the complete table of all PIM operations to REST routes.

Repo: cross-ref the rest::RestRoute variants.

Status: done

§8.3.4 Object representations (Tab 6)

Spec: §8.3.4, p. 68-69 Tab 6 — the XML element-tag registry.

Repo: representation::element_name.

Tests: representation::tests::element_names_match_spec_tab_6.

Status: done

§8.3.5 HTTP headers (Tab 7+8)

Spec: §8.3.5, p. 70 — required request/response headers (Accept, Content-Length, Content-Type, Cache-Control, OMG-DDS-API-Key, Authentication-Info, Date, Expires, Location, Last-Modified).

Repo: crates/web/src/headers.rs::{RequestHeaders, ResponseHeaders, REQUEST_API_KEY, validate_required}.

Tests: headers::tests::* (5).

Status: done


§8.4 Simplified SOAP platform

Spec: §8.4, p. 71+ — optional SIMPLE-WSDL-SOAP.

Repo: crates/zerodds-soap/src/{envelope,addressing,fault,mtom, security,wsdl}.rs (SOAP envelope codec, WS-Addressing, MTOM, WS-Security hooks, WSDL emitter; 1218 SLOC).

Tests: inline tests in the zerodds-soap crate.

Status: done — the SOAP PSM as a differentiation feature for the Java-enterprise estate, fully covered.


Audit status

16 done / 0 partial / 0 open / 2 n/a (informative) / 0 n/a (rejected).

Test run:

  • cargo test -p zerodds-web --lib — 70 tests green. Modules: access_control, bridge, headers, model, representation, rest, sample_selector, session, status.
  • cargo test -p zerodds-soap --lib — 37 tests green. Modules: addressing, envelope, fault, mtom, security, wsdl.

zerodds-web covers §7-§8.3, zerodds-soap covers §8.4. No open items.

OMG Web-Enabled DDS 1.0 — Spec-Coverage

Spec: OMG Web-Enabled DDS 1.0 — formal/2014-12-01 →

Kontext: DDS-WEB definiert ein WebDDS-Object-Model + REST-PSM, mit dem Web-Clients (Browser, Mobile-Apps, Cloud-Services) über HTTP an DDS-Topics teilnehmen. ZeroDDS implementiert das WebDDS-Object- Model (§7) + REST-PSM URI-Routing + Status-Mapping + Header-Set + XML-Element-Tag-Registry (§8.3) als pure-Rust no_std+alloc Library. HTTP-Server-Implementation + XML-Body-Serialization sind Caller-Layer.

Implementation:

  • crates/web/ · docs.rs — WebDDS-Object-Model + REST-PSM (URI-Routing, Status-Mapping, Header-Set, XML-Element-Tag-Registry), 6 Module, 44 Tests grün.

§1 Scope

§1.1-§1.6 Overview + Conformance + Examples

Spec: §1, S. 1-4 — DDS-Gateway-Service über HTTP/REST.

Repo: Crate-Doc.

Status: done


§2 Conformance

§2 Profile-Triple (REST + SIMPLE-REST + SIMPLE-WSDL-SOAP)

Spec: §2, S. 5 — REST Mandatory, SIMPLE-REST + SIMPLE-WSDL-SOAP Optional.

Repo: ZeroDDS implementiert REST (Mandatory) plus SOAP.

Tests: Cross-Ref rest::tests::*, headers::tests::*, status::tests::*.

Status: done — Mandatory-Profile (REST) und Optional SIMPLE-WSDL- SOAP-Profile beide implementiert (siehe §8.4); SIMPLE-REST-Profile analog REST-Subset.


§3 Normative References

Spec: §3, S. 5 — DDS 1.2, DDS-CCM, DDS-XTYPES, HTTP RFC 2616, HTTP-Auth RFC 2617, WebSockets RFC 6455, SOAP 1.2, WSDL 1.1, XML 1.1.

Repo:

Tests:

Status: n/a (informative) — Externe normative Referenz-Liste; HTTP/RFC/XML werden in den jeweiligen Konsumenten-Items §7/§8 operativ erfüllt.


§4-§6 Terms + Symbols + Acks

Repo:

Tests:

Status: n/a (informative) — Glossar/Symbole/Acks; ohne Code-Mapping.


§7 WebDDS Object Model

§7.1 WebDDS Object Model Overview

Spec: §7.1, S. 9 — Konzept WebDDS-Object-Model: Container für Application/Type/QoS/AccessController-Instanzen.

Repo: crates/web/src/model.rs::WebDdsRoot (Container-Struktur).

Tests: Cross-Ref §7.3.1.

Status: done

§7.2 Singleton WebDDS::Root

Spec: §7.2, S. 10 — WebDDS::Root ist Singleton; alle anderen Klassen sind über Root erreichbar.

Repo: crates/web/src/model.rs::WebDdsRoot als Singleton- Pattern (instanziiert über Application-Lifecycle).

Tests: model::tests::root_lifecycle, model::tests::root_holds_singleton_application_set.

Status: done

§7.3 Access Control + SessionId

Spec: §7.3, S. 11-13 — AccessController + Session-Tracking.

Repo: crates/web/src/session.rs::SessionId + crates/web/src/model.rs::Client + crates/web/src/access_control.rs (Permissions-Datenmodell + evaluate(op, topic) -> Decision- Engine, Glob-Matcher mit */prefix*/*suffix-Pattern, Spec §7.3-Decision-Tree: erste Deny-Match wins, sonst erste Permit-Match, sonst default).

Tests: session::tests::* (2), access_control::tests::* (7) inkl. empty-permissions, allow-rule, deny-overrides-allow, glob-prefix/suffix, operation-mismatch, first-match-deny-wins.

Status: done

§7.3.1 Class WebDDS::Root

Spec: §7.3.1, S. 13-17 — Root-Operations: create_application, delete_application, get_applications (mit fnmatch), create/delete/update/get_qos_library, create/delete/get_type.

Repo: WebDdsRoot::{create_application, delete_application, get_applications} mit fnmatch-Wildcard-Subset.

Tests: Cross-Ref model::tests::*.

Cross-Ref Schema-Storage (Phase-B-Cluster-8): QosLibrary CRUD über crates/xml/src/qos.rs::{QosLibrary, parse_xml_string}; Type-CRUD über crates/types/-TypeLibrary. Bridge zur DCPS-API in crates/web/src/bridge.rs::DdsBackend-Trait (siehe §7.4).

Status: done

§7.4 Class-Operationen Application + Participant + …

Spec: §7.4, S. 17-58 — DomainParticipant, Topic, Publisher, Subscriber, DataWriter, DataReader, WaitSet — alle CRUD.

Repo: Datenmodell-Stubs in model.rs::{Application, DomainParticipant}. Vollständiges CRUD via crates/dcps/-Public-API integrierbar (Caller-Layer-Bridge).

Repo: crates/web/src/bridge.rs::DdsBackend Trait mit allen Class-Operationen (create/delete/list_application, create/delete_participant, create_topic, create_data_writer, create_data_reader, write_sample, read_samples). Konkrete Backend- Impl in einer höheren Schicht (Daemon-Crate) ruft crates/dcps/-Public-API; das Web-Crate selbst bleibt Bridge- agnostisch. enforce(decision) -> Result<(), BackendError> komponiert orthogonal mit der AccessController-Engine aus §7.3.

Tests: bridge::tests::* (5) inkl. enforce-permit/deny, permission-check-then-backend-call-chain, create+delete-roundtrip, conflict-on-duplicate-create.

Status: done

§7.4.8 DataReader::read mit SampleSelector

Spec: §7.4.8, S. 51-53 — read mit SampleSelector-BNF-Grammar (FilterExpression + MetadataExpression mit AND/OR-Logik).

Repo: crates/web/src/sample_selector.rs::parse_sample_selector liefert AST (SampleSelector mit filter: Option<FilterExpression> + metadata: Vec<MetadataExpression>). Recursive-descent-Parser mit allen 6 Vergleichs-Operatoren (=,!=,<,<=,>,>=), AND/OR-Logik, Parentheses, Integer/String/Boolean-Literale, dotted Field-Path, sample_state/view_state/instance_state-Metadata mit allen Werten.

Tests: sample_selector::tests::* (14) inkl. simple-equality, inequality-with-string, dotted-field-path, AND-conjunction, OR-with-parens, metadata-only, filter-plus-metadata, all-three-metadata-kinds, alle 6 Compare-Operators, Boolean-Literal, plus 4 Error-Cases (unknown-key, unknown-value, unbalanced-parens, trailing-garbage).

Status: done


§8 REST PSM

§8.1 Formats

Spec: §8.1, S. 59 — Content-Type application/zerodds-web+xml (Mandatory) als XML-Format; weitere Formate optional.

Repo: crates/web/src/representation.rs::{ContentType, CONTENT_TYPE_DDS_WEB_XML}.

Tests: representation::tests::content_type_constant_matches_spec.

Status: done

§8.2 Representations

Spec: §8.2, S. 60-61 — Vier Representation-Kinds: QoS, Type, Data, Entity (mit XML-Element-Tags pro Kind).

Repo: crates/web/src/representation.rs::{RepresentationKind, element_name}.

Tests: representation::tests::element_names_match_spec_tab_6.

Status: done — Element-Tag-Registry. XML-Body-Serialization ist Caller-Layer.

§8.3.1 Mapping zu Resource URIs

Spec: §8.3.1, S. 62 Tab 4 — alle URI-Patterns mit Prefix /dds/rest1.

Repo: crates/web/src/rest.rs::{REST_PREFIX, RestRoute, parse_route, RestMethod} mit allen 30+ Routes.

Tests: rest::tests::* (14 Tests inkl. Prefix-Validation, Parameter-Extraktion für alle Tab-5-Routes).

Status: done

§8.3.2 Mapping zu HTTP-Methods + Status-Codes

Spec: §8.3.2, S. 62-64 — Method-Mapping (POST/PUT/GET/DELETE) + Status-Codes (201, 204, 200, 409, 422, 404, 401, 403, 500).

Repo: crates/web/src/status.rs::{ReturnStatus, http_status_for}.

Tests: status::tests::* (11 Tests inkl. alle 8 ReturnStatus + method-abhängige OK-Mappings).

Status: done

§8.3.3 Komplett-Mapping (Tab 5)

Spec: §8.3.3, S. 64-67 — komplette Tabelle aller PIM-Operations zu REST-Routes.

Repo: Cross-Ref rest::RestRoute-Variants.

Status: done

§8.3.4 Object-Representations (Tab 6)

Spec: §8.3.4, S. 68-69 Tab 6 — XML-Element-Tag-Registry.

Repo: representation::element_name.

Tests: representation::tests::element_names_match_spec_tab_6.

Status: done

§8.3.5 HTTP-Headers (Tab 7+8)

Spec: §8.3.5, S. 70 — Required Request-/Response-Headers (Accept, Content-Length, Content-Type, Cache-Control, OMG-DDS-API-Key, Authentication-Info, Date, Expires, Location, Last-Modified).

Repo: crates/web/src/headers.rs::{RequestHeaders, ResponseHeaders, REQUEST_API_KEY, validate_required}.

Tests: headers::tests::* (5).

Status: done


§8.4 Simplified SOAP Platform

Spec: §8.4, S. 71+ — Optional SIMPLE-WSDL-SOAP.

Repo: crates/zerodds-soap/src/{envelope,addressing,fault,mtom, security,wsdl}.rs (SOAP-Envelope-Codec, WS-Addressing, MTOM, WS-Security-Hooks, WSDL-Emitter; 1218 SLOC).

Tests: Inline-Tests im zerodds-soap-Crate.

Status: done — SOAP-PSM als Differenzierungs-Feature für Java-Enterprise-Bestand voll abgedeckt.


Audit-Status

16 done / 0 partial / 0 open / 2 n/a (informative) / 0 n/a (rejected).

Test-Lauf:

  • cargo test -p zerodds-web --lib — 70 Tests grün. Module: access_control, bridge, headers, model, representation, rest, sample_selector, session, status.
  • cargo test -p zerodds-soap --lib — 37 Tests grün. Module: addressing, envelope, fault, mtom, security, wsdl.

zerodds-web deckt §7-§8.3, zerodds-soap deckt §8.4. Keine offenen Punkte.