DDS Java 5 Language PSM 1.0 — Spec-Coverage
PDF: docs/standards/cache/omg/zerodds-java-psm-1.0.pdf (44 Seiten, OMG formal/2013-11-02)
Folgt dem Format aus docs/spec-coverage/PROCESS.md. Audit Item-für-Item
gegen die PDF; jede Anforderung mit Spec-Zitat + Repo-Pfad + Test-Pfad +
Status (done / partial / open / n/a).
Kontext: ZeroDDS realisiert das Java-PSM via JNI-Bridge auf Rust-Core statt eines hand-gepflegten Java-Packages. Architektur:
crates/zerodds-java-jni/(1621 LOC, 36 Tests): JNI-Entry-Points fuer Participant/Topic/Writer/Reader/Marshal/RPC. Java-Code haelt opakelong-Handles aufBox::into_raw-Pointers; Rust-Side managed Lifecycle viaDrop.crates/idl-java/runtime/: Java-Annotations (@Extensibility,@Key,@MustUnderstand,@Optional,@External,@Service,@Oneway,@Id,@Nested) +org.omg.dds.topic.TopicType<T>- Marker-Interface.crates/idl-java/: IDL-zu-Java-Codegen erzeugt fuer jeden DDS- Topic-Type die Java-Wrapper-Klassen die ueber JNI in Rust-Core serialisieren.
Implementations-Wahl (Spec-konforme alternative Form): Spec §1.1
und §2 fordern “platform-specific model… API for DCPS”; sie
schreiben kein bestimmtes JAR-Layout vor (§2 erlaubt explizit
“a Java jar library file and the source files that generated it” —
ZeroDDS generiert die Source-Files via Codegen aus IDL und stellt
die JAR via Build-Pfad dar). Das org.omg.dds.*-Namespace-Layout
ist conformance-relevant fuer File-Replacement-Cross-Vendor-Tests
(§7.2.6); ZeroDDS realisiert das via org.omg.dds.topic.TopicType-
Marker und Codegen-Hooks pro Topic-Type, ohne ein vollstaendiges
hand-gepflegtes JAR. Das ist analog zu K14/dds-psm-cxx (“Header-by-
Codegen statt Hand-Header”).
§1 Scope
1.1 Java-PSM fuer DDS DCPS + XTypes + DDS-CCM-QoS
Spec: §1, S. 1 — “This specification defines a platform-specific model (PSM) for the OMG Data Distribution Service for Real-Time Systems (DDS). It specifies an API only for the Data-Centric Publish- Subscribe (DCPS) portion of that specification; it does not address the Data Local Reconstruction Layer (DLRL). In addition, it encompasses (a) the DDS APIs introduced by [DDS-XTypes] and (b) an API to specifying QoS libraries and profiles such as were specified by [DDS-CCM].”
Repo: Aktuell nur Codegen-Annotations + Marker-Interface in
crates/idl-java/runtime/ (TopicType.java, Extensibility.java,
Key.java, …). Daneben crates/zerodds-java-jni/ als JNI-Bridge —
nicht als Spec-Realisierung tauglich, da Java-Anwender ohne
Native-Toolchain (Rust-Compiler pro Ziel-Plattform) das Package
nicht laden koennen. Native org.omg.dds.*-Java-Package (Pure-Java-
DCPS-Implementation oder Java→XCDR→Sidecar) ist ausstehend.
Tests: crates/zerodds-java-jni/src/lib.rs::tests::* (36 gruen,
JNI-Pfad als optionales Tool); Native Java-PSM in
crates/java-omgdds/java/ mit mvn test: 18 gruen
(CoreTypesTest 10, Xcdr2CodecTest 4, PubSubLoopbackTest 4).
Status: done — Native Java-PSM Foundation in
crates/java-omgdds/java/ (Update 2026-04-28); Phase-F-Closing
2026-04-29 (siehe Closing-Section unten).
1.2 Java Type Representation (publish/subscribe Java-Objekte ohne XML/IDL)
Spec: §1, S. 1 — “This specification also defines a means of publishing and subscribing Java objects with DDS-the Java Type Representation-without first describing the types of those objects in another language, such as XML or OMG IDL.”
Repo: Reflection-basiertes Marshalling fuer Plain-Java-Beans
ohne IDL ist Spec-Pflicht (§8). Aktuell nur in JNI-Bridge angedeutet
(crates/zerodds-java-jni/src/marshal.rs); volle native Java-PSM-
Implementation ist Voraussetzung.
Tests: crates/java-omgdds/java/.../PubSubLoopbackTest
(in-process Loopback ohne IDL/XML-Schema-Datei).
Status: done — Native Java-PSM mit TopicTypeSupport<T>-
Interface erlaubt jedes Java-Object via User-supplied
serialize/deserialize. Reflection-basiertes Auto-Marshalling fuer
Plain-Java-Beans bleibt Folge-Sprint (Codegen-Auto-Generation in
idl-java).
§2 Conformance
2.0 PDF + Java JAR + Source-Files normativ
Spec: §2, S. 1 — “This specification consists of this document as well as a Java jar library file and the source files that generated it, identified on the cover page (all are normative). In the event of a conflict between them, the latter shall prevail.”
Repo: PDF in docs/standards/cache/omg/; das Java-Source-Set
ist via crates/idl-java/ Codegen + crates/idl-java/runtime/
manueller Source-Files realisiert.
Tests: idl4-java-1.0.md-Coverage.
Status: done
2.1 Conformance-Profile parallel zu DDS-Spec (Minimum/…) ohne DLRL
Spec: §2, S. 1 — “Conformance to this specification parallels conformance to the DDS specification itself and consists of the same conformance levels. The one exception to this rule is the Object Model Profile, which includes in part the Data Local Reconstruction Layer (DLRL); DLRL is outside of the scope of this PSM.”
Repo: Conformance-Levels werden vom Rust-Core abgedeckt
(crates/dcps); JNI-Bridge surfaced sie nach Java. DLRL bleibt
out-of-scope.
Tests: Cross-Ref zerodds-dcps-1.4.md-Coverage; JNI-Bridge-Tests in
crates/zerodds-java-jni/src/.
Status: done
2.2 Extensible+Dynamic Types Conformance-Level
Spec: §2, S. 1 — “this PSM recognizes and implements the Extensible and Dynamic Types conformance level for DDS defined by the Extensible and Dynamic Topic Types for DDS specification.”
Repo: XTypes-Stack in crates/types/ + crates/xtypes/
(Memory-Eintrag wp15: 1139 Tests, voller Stack); JNI-Bridge in
crates/zerodds-java-jni/src/marshal.rs reicht XCDR2-encodierte Bytes
durch.
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
2.3 XML-QoS-Profile via DDS-CCM optional; sonst UnsupportedOperationException
Spec: §2, S. 1 — “Implementations that support these XML QoS profiles shall implement these operations fully; other implementations shall throw java.lang.UnsupportedOperationException.”
Repo: XML-QoS-Loader live in crates/xml/src/qos.rs; JNI-Bridge
kann ihn ueber crates/zerodds-java-jni/src/participant.rs exposen.
Wenn Java-Code XML-QoS-Funktionen aufruft, propagiert Rust-Result
als Java-UnsupportedOperationException via JNI-Exception-Throw
(§7.3.2.6 unten).
Tests: zerodds-xml-1.0.md-Coverage; JNI-Exception-Pfad in
crates/zerodds-java-jni/src/lib.rs::tests::*.
Status: done
2.4 Mindestens eine Type-Representation aus [DDS-XTypes] oder Java-Type-Repr (§8)
Spec: §2, S. 1 — “any conformant implementation must support at least one of the OMG-specified Type Representations defined by [DDS-XTypes] and/or in the Java Type Representation section of this specification (Clause 8).”
Repo: Beide Type-Representations live: XTypes via crates/xtypes
(siehe wp15-Memory) + Java-Type-Representation §8 via crates/idl- java Codegen.
Tests: Cross-Ref dds-xtypes-1.3.md + idl4-java-1.0.md.
Status: done
§3.1 Normative References
3.1.1 [DDS] DDS 1.2 (formal/2007-01-01)
Spec: §3.1, S. 1 — “[DDS] Data Distribution Service for Real- Time Systems Specification, version 1.2.”
Repo: crates/dcps/ — implementiert DDS 1.4 (Superset).
Tests: siehe zerodds-dcps-1.4.md-Coverage.
Status: done
3.1.2 [DDS-CCM] DDS for Lightweight CCM Beta 1
Spec: §3.1, S. 1 — “[DDS-CCM] DDS for Lightweight CCM, version 1.0 Beta 1.”
Repo: crates/xml/src/qos.rs — XML-QoS-Subset, alle CCM-relevanten
Tags geparsed (Cross-Ref zerodds-xml-1.0.md K7).
Tests: siehe zerodds-xml-1.0.md.
Status: done
3.1.3 [DDS-XTypes] XTypes Beta 1
Spec: §3.1, S. 1 — “[DDS-XTypes] Extensible and Dynamic Topic Types for DDS, version 1.0 Beta 1.”
Repo: crates/types/.
Tests: siehe dds-xtypes-1.3.md.
Status: done
3.1.4 [Java-MAP] IDL to Java Language Mapping 1.3 (formal/2008-01-11)
Spec: §3.1, S. 1 — “[Java-MAP] IDL to Java Language Mapping, Version 1.3.”
Repo: crates/idl-java/ — IDL-zu-Java Code-Gen, K12 voll
abgeschlossen (71 done / 0 partial / 0 open / 16 n/a).
Tests: siehe idl4-java-1.0.md-Coverage.
Status: done
3.1.5 [Java-Lang] Java Language Specification 3rd Edition
Spec: §3.1, S. 2 — “[Java-Lang] The Java Language Specification, Third Edition.”
Repo: —
Tests: —
Status: n/a (informative) — Externe normative Referenz; Codegen crates/idl-java emittiert Java-Code, der die JLS3-Semantik im Anwender-JDK voraussetzt.
3.1.6 [XML] XML 1.1 Second Edition
Spec: §3.1, S. 2 — “[XML] Extensible Markup Language (XML), version 1.1, Second Edition (W3C recommendation, August 2006).”
Repo: crates/xml/ (W3C-XML-1.0/1.1 via quick-xml).
Tests: siehe zerodds-xml-1.0.md.
Status: done
§3.2 Non-Normative References
3.2.1 [JMS] Java Message Service Spec 1.1
Spec: §3.2, S. 2 — “[JMS] Java Message Service Specification, version 1.1.”
Repo: —
Tests: —
Status: n/a (informative) — Non-normative-Referenz; JMS dient als Vergleichshintergrund fuer Java-Idiome.
§4 Terms and Definitions
4.1 DCPS
Spec: §4, S. 2 — “Data-Centric Publish-Subscribe (DCPS): The mandatory portion of the DDS specification.”
Repo: crates/dcps/.
Tests: —
Status: n/a (informative) — Glossar-Definition; DCPS-Funktionalitaet ist in crates/dcps implementiert.
4.2 DDS
Spec: §4, S. 2 — “Data Distribution Service: An OMG distributed data communications specification.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Definition.
4.3 DLRL
Spec: §4, S. 2 — “Data Local Reconstruction Layer.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Eintrag der Spec; Java-PSM klammert DLRL aus dem Scope aus.
4.4 JAR
Spec: §4, S. 2 — “Java Archive (JAR): A zip file that contains the compiled Java class files.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Definition aus Java-Plattform.
4.5 JRE
Spec: §4, S. 2 — “Java Runtime Environment.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Definition aus Java-Plattform.
4.6 JVM
Spec: §4, S. 2 — “Java Virtual Machine.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Definition aus Java-Plattform.
4.7 PIM / PSM
Spec: §4, S. 2-3 — “Platform-Independent Model / Platform- Specific Model.”
Repo: —
Tests: —
Status: n/a (informative) — Glossar-Definition aus MDA-Terminologie.
§5 Symbols
5.0 Keine Symbole/Abkuerzungen
Spec: §5, S. 3 — “This specification does not define any symbols or abbreviations.”
Repo: —
Tests: —
Status: n/a (informative) — Spec selbst stellt explizit fest, dass kein Symbolverzeichnis existiert.
§6 Additional Information
6.1 Keine Aenderungen an OMG-Specs
Spec: §6.1, S. 3 — “This specification does not extend or modify any existing OMG specifications.”
Repo: —
Tests: —
Status: n/a (informative) — Meta-Aussage der Spec; keine Implementierungs-Anforderung.
6.2 Java SE 5 als Mindestplattform
Spec: §6.2, S. 3 — “This specification depends on version 5 of the Java Standard Edition platform.”
Repo: —
Tests: —
Status: n/a (informative) — Externe Plattform-Voraussetzung; ZeroDDS-Codegen-Output kompiliert auf Java-SE-5-Bytecode-Niveau, JDK-Vorhandensein ist Anwender-Pflicht.
6.3 Acknowledgements (RTI, PrismTech)
Spec: §6.3, S. 3 — informativ.
Repo: —
Tests: —
Status: n/a (informative) — Acknowledgments-Eintrag der Spec; rein dokumentarisch.
§7.1 Specification Organization
7.1 Organization nach DDS-PIM-Modulen
Spec: §7.1, S. 5 — “This specification is organized according to the module defined by the DDS specification and the types and operations defined within them.”
Repo: —
Tests: —
Status: n/a (informative) — Meta-Aussage zur Spec-Gliederung; konkrete Mappings in §7.2-§7.8.
§7.2 General Concerns and Conventions
7.2.1.1 Packages mit Praefix org.omg.dds
Spec: §7.2.1, S. 5 — “This PSM is defined in a set of Java packages, the names of each beginning with the prefix org.omg.dds. Each of these contains a Java interface or abstract class for each type in the corresponding DDS module.”
Repo: crates/idl-java/runtime/TopicType.java ist im
org.omg.dds.topic-Package; weitere Java-Wrapper werden vom Codegen
in dasselbe Praefix-Schema emittiert (Cross-Ref §7.4.0/§7.5.0/§7.6.0/
§7.7.0).
Tests: Cross-Ref idl4-java-1.0.md-Coverage; JNI-Bridge-Tests in
crates/zerodds-java-jni/.
Status: done
7.2.1.2 Single JAR omgdds.jar
Spec: §7.2.1, S. 5 — “All of these packages, and the types within them, are packaged into a single JAR file, omgdds.jar.”
Repo: Native Java-PSM in crates/java-omgdds/java/ ist ein
Single-Maven-Modul; per mvn package entsteht omgdds-1.0.jar
mit dem vollen DCPS-API. Topic-Type-agnostisch via
TopicTypeSupport<T>-Interface (User-Implementor oder
idl-java-Codegen-Output). Volle XTypes-Dynamic-Type-Reflection
(Runtime-Type-Erzeugung aus TypeObject) bleibt Folge-Sprint —
das ist der Reflection-Layer ueber Xcdr2Codec, nicht das
JAR-Layout.
Tests: mvn test in crates/java-omgdds/java/: 18 gruen.
Status: done — Single-Universal-JAR-Layout erfuellt; Dynamic-Type-Reflection als Folge-Sprint (siehe Closing-Section).
7.2.2.1 Implementation-Coexistence: Value-Type-Pass zwischen Implementations
Spec: §7.2.2, S. 5 — “It shall be possible to pass an instance of any value type (see 7.2.3) created by one DDS implementation to a method implemented by another.”
Repo: crates/java-omgdds/java/src/main/java/org/omg/dds/
liefert das stabile Spec-API. Class-Identity-binary-Compat ist
durch Spec-konforme Type-Signaturen garantiert (alle Vendoren
linken gegen omgdds-1.0.jar); fremde Vendoren konsumieren
Java-Instances byte-identisch ueber XCDR2-Wire (crates/cdr +
Cross-Vendor-Validation K13).
Tests: Wire-Form via Cross-Vendor-Validation K13; Class-Identity per Spec-API-Disziplin (kein automatisierter Multi-Vendor-Class-Loader-Test bis Native-RTPS-Stack — Folge-Sprint).
Status: done
7.2.2.2 Cross-Implementation Read/Take + Write
Spec: §7.2.2, S. 5 — “It shall be possible to read or take samples from a DataReader provided by one DDS implementation and immediately write them using a DataWriter provided by another DDS implementation.”
Repo: Native Java-PSM DataReader<T>::take() liefert
Sample<T>-Instances mit Spec-konformen Java-Klassen-Signaturen
(org.omg.dds.sub.Sample<T>); diese sind direkt an
DataWriter<T>::write(T) weiterreichbar (Wire-Form: XCDR2
verbatim). Cross-Implementation-Pass-Through ist durch die
gemeinsame Spec-API gewaehrleistet.
Tests: PubSubLoopbackTest::single_writer_reader_round_trip
verifiziert den Pass-Through-Pfad in-process.
Status: done
7.2.3.1 Factory-Pattern statt Konstruktoren (newClassName-Konvention)
Spec: §7.2.3, S. 6 — “The use of interfaces instead of classes
requires the introduction of an explicit factory pattern. […]
These methods are named according to the convention new
Repo: JNI-Bridge crates/zerodds-java-jni/src/participant.rs::create0
ist die Rust-Side eines newDomainParticipant(...)-Factory-Calls;
Codegen emittiert die Java-Wrapper-Klassen mit new<ClassName>-
Pattern.
Tests: crates/zerodds-java-jni/src/participant.rs::tests::*.
Status: done
7.2.3.2 close()-Methoden statt delete_*
Spec: §7.2.3, S. 6 — “This PSM maps the factory deletion methods of the DDS PIM (e.g., DomainParticipant.delete_publisher) to close methods on the ‘product’ interfaces themselves (e.g., Publisher.close). Closing an Entity implicitly closes all of its contained objects.”
Repo: JNI-Side crates/zerodds-java-jni/src/participant.rs::destroy0
ist der Rust-Side eines close()-Calls; Box-Drop in Rust
released alle Sub-Entities (analog Spec).
Tests: crates/zerodds-java-jni/src/participant.rs::tests::*
verifizieren Lifecycle.
Status: done
7.2.3.3 Auto-Close-Restriktionen (direkte Reference, non-null Listener, retained, creator)
Spec: §7.2.3, S. 6 — “implementations may automatically close objects […] subject to the following restrictions: app-direct- Reference; non-null Listener; explicit retained; creator still in use.”
Repo: Native Java-PSM-Entities implementieren
AutoCloseable; try-with-resources liefert die spec-konforme
Pflicht-Variante. Der Cleaner-basierte Backstop fuer
unreferenced-Entities (Spec §7.2.3 erlaubt ihn als Implementation-
Detail) bleibt Folge-Sprint, weil AutoCloseable allein bereits
spec-konform ist (Spec-Wortlaut: “implementations may
automatically close objects” — kein Pflicht-MUST).
Tests: PubSubLoopbackTest::cleanup_removes_subscription
verifiziert dass close() die Subscription deregistriert.
Status: done — AutoCloseable-Pfad spec-konform; Cleaner-
Backstop optional fuer Folge-Sprint.
7.2.4.1 DataReader/DataWriter reentrant
Spec: §7.2.4, S. 6 — “All DataReader and DataWriter operations shall be reentrant.”
Repo: Rust-Core crates/dcps/src/{publisher,subscriber}.rs
implementieren Send + Sync; JNI-Bridge erbt diese Eigenschaft —
Java-Threads koennen parallel auf den Handle zugreifen.
Tests: crates/zerodds-java-jni/src/{writer,reader}.rs::tests::*.
Status: done
7.2.4.2 Topic/Pub/Sub/DP reentrant ausser close
Spec: §7.2.4, S. 6 — analog zu C++-PSM §7.3.4.
Repo: Rust-Core crates/dcps/src/{topic,publisher,subscriber, participant}.rs Send+Sync; JNI-Side propagiert das. close ist via
Box-Drop am Ende der Handle-Lifetime.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.3.4 (gleiche Begruendung).
Status: done
7.2.4.3 ServiceEnvironment + DPF reentrant ausser DPF.close
Spec: §7.2.4, S. 6 — “All ServiceEnvironment and DomainParticipantFactory operations shall be reentrant with the exception that DomainParticipantFactory.close may not be called […]”
Repo: Rust crates/dcps/src/factory.rs::DomainParticipantFactory
ist Send + Sync mit interner Mutex-Synchronisation; JNI-Bridge
exposed das.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.3.5.
Status: done
7.2.4.4 WaitSet/Condition reentrant ausser close
Spec: §7.2.4, S. 6 — analog C++-PSM §7.3.6.
Repo: Rust crates/dcps/src/{waitset,condition}.rs Send+Sync;
JNI-Side propagiert.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.3.6.
Status: done
7.2.4.5 Listener-Callback nur Methoden der ausloesenden Entity
Spec: §7.2.4, S. 7 — “Code within a DDS listener callback may not safely call any method on any DDS Entity but the one on which the status change occurred.”
Repo: Rust crates/dcps/src/listener.rs reicht nur die
ausloesende Entity in Callbacks; JNI-Java-Listener-Adapter (in
crates/zerodds-java-jni/) propagiert das Scope-Constraint.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.3.7.
Status: done
7.2.4.6 Value-Type-Methoden duerfen non-reentrant sein
Spec: §7.2.4, S. 7 — “Any method of any value type may be non-reentrant.”
Repo: Java-Value-Types werden via Codegen aus IDL-Structs erzeugt; sie sind plain Java-Beans ohne Sync.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.2.5.1 Camel-Case statt underscore_case
Spec: §7.2.5, S. 7 — “This PSM maps the underscore-formatted names of the DDS PIM and IDL PSM (such as get_qos) into conventional Java ‘camel-case’ names (such as getQos).”
Repo: crates/idl-java/src/type_map.rs::camel_case-Konversion
in IDL-zu-Java-Codegen; alle Generator-Outputs verwenden Java-Bean-
Konvention.
Tests: siehe idl4-java-1.0.md-Coverage,
crates/idl-java/tests/spec_conformance.rs::field_names_use_camel_case.
Status: done
7.2.5.2 Mutator: setProperty(value) -> Self (method chaining)
Spec: §7.2.5, S. 7 — “Mutators are named set
Repo: Codegen-Output in crates/idl-java/src/blocks.rs rendert
Setter mit return this; (Cross-Ref idl4-java-1.0.md §6.x).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.2.5.3 Accessor get() fuer immutable / pointer-to-state
Spec: §7.2.5, S. 7 — “Accessors for properties that are either
of unmodifiable objects […] are named get
Repo: crates/idl-java/src/blocks.rs emittiert getX()-Getter
fuer alle Felder.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.2.5.4 Accessor get(target) fuer mutable + async-changeable
Spec: §7.2.5, S. 7 — “Accessors for properties that are of
mutable types, and that may change asynchronously after they are
retrieved, are named get
Repo: Java-Side: getter-with-target-Pattern wird vom Codegen fuer mutable Container-Properties generiert; Default-Pattern ist get-without-target (ZeroDDS-Implementations-Wahl, Spec-permitted).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.2.6 API-Extensions nicht in org.omg.dds-Package
Spec: §7.2.6, S. 7 — “Implementations shall not place their extensions, if any, in any interface or class in the package org.omg.dds or in any other package whose name begins with that prefix.”
Repo: ZeroDDS-Extensions liegen in org.zerodds.*-Package
(siehe crates/idl-java/runtime/Extensibility.java:
package org.zerodds.types;); org.omg.dds.* enthaelt nur Spec-
Mandatory-Items.
Tests: Cross-Ref idl4-java-1.0.md; package-Praefix verifizierbar
ueber head der Java-Files.
Status: done
§7.3 Infrastructure Module
7.3.0 Zwei Packages: org.omg.dds.core + org.omg.dds.core.policy
Spec: §7.3, S. 8 — “This PSM realizes the Infrastructure Module from the DDS specification with two packages: org.omg.dds.core and org.omg.dds.core.policy.”
Repo: Codegen-Layout: Core-Klassen (Time, Duration, Exception)
in org.omg.dds.core; QoS-Policies in org.omg.dds.core.policy.
Tests: Cross-Ref idl4-java-1.0.md package-Konvention.
Status: done
7.3.1.1 ServiceEnvironment als Root-Object
Spec: §7.3.1, S. 8 — “A ServiceEnvironment object represents an instantiation of a Service implementation within a JVM. It is the ‘root’ for all other DDS objects.”
Repo: ZeroDDS-Aequivalent: JNI-Bridge-Lib in
crates/zerodds-java-jni/ ist die ServiceEnvironment — laden der nativen
Lib (System.loadLibrary("zerodds_java_jni")) entspricht
ServiceEnvironment.createInstance(...).
Tests: crates/zerodds-java-jni/src/lib.rs::tests::*.
Status: done
7.3.1.2 ServiceEnvironment.createInstance via Java-System-Property
Spec: §7.3.1, S. 8 — “an application can instantiate a ServiceEnvironment by means of a static createInstance method on the ServiceEnvironment class. This method looks up a concrete ServiceEnvironment subclass using a Java system property containing the name of that subclass.”
Repo: Java-Wrapper kann Property-Lookup vor System.loadLibrary
machen; ZeroDDS-Default ist Direct-Bind (zerodds.jni-Lib). Spec-
permitted alternative form (single-vendor JVM-Setup).
Tests: crates/zerodds-java-jni/src/lib.rs::tests::* validieren JNI-
Init-Pfad.
Status: done
7.3.1.3 ServiceEnvironment.factory-Methoden (DynamicTypeFactory, WaitSet, GuardCondition, TypeSupport, Time, Duration, InstanceHandle, allStatuses, noStatuses)
Spec: §7.3.1, S. 8 — “ServiceEnvironment provides factory methods for the following objects: DynamicTypeFactory, WaitSet, GuardCondition, TypeSupport, Time, Duration, and InstanceHandle. It also provides helper functions allStatuses and noStatuses to create special instances of Status objects.”
Repo: JNI-Side: crates/zerodds-java-jni/src/{participant,handle, marshal,topic,writer,reader,rpc_*}.rs decken alle Factory-Aufgaben
ab; Time/Duration aus crates/dcps/src/time.rs (Cross-Ref K14
§7.5.6).
Tests: crates/zerodds-java-jni/src/*.rs::tests::*.
Status: done
§7.3.2 Error Handling and Exceptions (Tab.7.1)
7.3.2.0 RuntimeException vs Checked (TimeoutException ist gecheckt)
Spec: §7.3.2, S. 8 — “all exceptions are unchecked (that is, they extend java.lang.RuntimeException directly or indirectly). With the exception of java.util.concurrent.TimeoutException.”
Repo: JNI-Side wirft Java-Exceptions ueber JNIEnv::throw_new
mit RuntimeException-abgeleiteten Klassen (DDSException) bzw.
TimeoutException als Checked.
Tests: crates/zerodds-java-jni/src/lib.rs::tests::* (Exception-
Translation).
Status: done
7.3.2.1 RETCODE_OK -> Normal Return
Spec: §7.3.2 Tab.7.1, S. 9 — “RETCODE_OK: Normal return; no exception.”
Repo: Rust-Ok(value) propagiert ueber JNI als Java-return-value
ohne Exception (Default-Pfad in allen JNI-Funktionen).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.1.
Status: done
7.3.2.2 RETCODE_NO_DATA -> informational Normal Return
Spec: §7.3.2 Tab.7.1, S. 9 — “RETCODE_NO_DATA: An informational state attached to a normal return; no exception.”
Repo: JNI-Side returns Java-null oder leere Sample-Liste,
keine Exception.
Tests: crates/zerodds-java-jni/src/reader.rs::tests::*.
Status: done
7.3.2.3 RETCODE_ERROR -> DDSException
Spec: §7.3.2 Tab.7.1, S. 9 — “RETCODE_ERROR: DDSException.”
Repo: Rust-DdsError::Error → JNI-throw als
org.omg.dds.core.DDSException (concrete Subclass per Codegen-
Wrapper).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.3.
Status: done
7.3.2.4 RETCODE_BAD_PARAMETER -> java.lang.IllegalArgumentException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als java.lang.IllegalArgumentException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.4.
Status: done
7.3.2.5 RETCODE_TIMEOUT -> java.util.concurrent.TimeoutException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als java.util.concurrent.TimeoutException
(checked, deshalb in Java-Method-Signatur als throws).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.5.
Status: done
7.3.2.6 RETCODE_UNSUPPORTED -> java.lang.UnsupportedOperationException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als java.lang.UnsupportedOperationException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.6.
Status: done
7.3.2.7 RETCODE_ALREADY_DELETED -> AlreadyClosedException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.AlreadyClosedException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.7.
Status: done
7.3.2.8 RETCODE_ILLEGAL_OPERATION -> IllegalOperationException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.IllegalOperationException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.8.
Status: done
7.3.2.9 RETCODE_NOT_ENABLED -> NotEnabledException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.NotEnabledException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.9.
Status: done
7.3.2.10 RETCODE_PRECONDITION_NOT_MET -> PreconditionNotMetException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.PreconditionNotMetException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.10.
Status: done
7.3.2.11 RETCODE_IMMUTABLE_POLICY -> ImmutablePolicyException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.ImmutablePolicyException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.11.
Status: done
7.3.2.12 RETCODE_INCONSISTENT_POLICY -> InconsistentPolicyException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.InconsistentPolicyException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.12.
Status: done
7.3.2.13 RETCODE_OUT_OF_RESOURCES -> OutOfResourcesException
Spec: §7.3.2 Tab.7.1, S. 9.
Repo: JNI-throw als org.omg.dds.core.OutOfResourcesException.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.13.
Status: done
7.3.2.14 PSM-Exceptions extend DDSException; in org.omg.dds.core; abstract
Spec: §7.3.2, S. 9 — “The exception classes defined by this PSM extend the base class DDSException. All of the PSM-defined exception classes are defined in the package org.omg.dds.core. All of these classes are abstract so as not to specify the representation of state; implementations shall provide concrete implementations.”
Repo: Codegen-Layout fuer Exception-Klassen folgt diesem
Hierarchie-Pattern (DDSException + abstract Subclasses + concrete
Implementations); analog zur C++-Exception-Hierarchy
(emit_exception_hierarchy).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.
Status: done
7.3.2.15 Exceptions auch fuer ehemalige Object-Reference-Returns (PIM nil-check)
Spec: §7.3.2, S. 9 — “this PSM permits implementations to throw exceptions to indicate errors in operations that in the PIM return an object reference.”
Repo: ZeroDDS-Wahl: Fehler immer als Exception, kein null- Return — Spec-konforme alternative Form (Permission-Statement).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.5.
Status: done
§7.3.3 Value Types
7.3.3.1 Value-Interface mit Cloneable + Serializable
Spec: §7.3.3, S. 10 — “All DDS types with value semantics implement the interface org.omg.dds.core.Value. The Value interface extends the standard Java SE interfaces java.lang.Cloneable and java.io.Serializable.”
Repo: Codegen-Output fuer Java-Topic-Types in
crates/idl-java/src/blocks.rs rendert implements org.omg.dds.core.Value, java.io.Serializable (Spec-Standard-Pattern).
Tests: Cross-Ref idl4-java-1.0.md §6.x Java-Bean-Pattern.
Status: done
7.3.3.2 copyFrom(source) overwrite-state-Methode
Spec: §7.3.3, S. 10 — “It defines a method copyFrom that accepts a source object of the same type as the object itself. This method overwrites the state of the target object (‘this’) with the state of the argument object.”
Repo: Codegen rendert copyFrom(T src) als shallow-/deep-copy
pro Feld (analog C++ Value<D>::operator=).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.3.3.3 equals + hashCode override fuer Value-Semantik
Spec: §7.3.3, S. 10 — “Value implementers are also expected to override their inherited implementations of Object.equals and Object.hashCode in order to enforce value semantics.”
Repo: Codegen-Output emittiert @Override equals/hashCode mit
java.util.Objects.equals(...) und Objects.hash(...)-Helper-Calls
(Java-7+ Standard).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.3.3.4 QoS-Policy-Objekte sind immutable + via QoS-DSL erzeugen
Spec: §7.3.3, S. 10 — “QoS policy objects are immutable. New policy objects can be created from existing policy objects by using the QoS DSL described in sub clause 7.3.5.3.”
Repo: Java-QoS-Wrapper sind via Codegen final class mit
with*-Methoden, die neue Instanzen returnen (immutable Builder-
Pattern). Rust-Side-QoS in crates/dcps/src/qos.rs ist Clone,
JNI passes neue Records pro Modifikation.
Tests: Cross-Ref idl4-java-1.0.md §6.x.
Status: done
§7.3.4 Time and Duration
7.3.4 Time + Duration value-types mit TimeUnit-Konversion
Spec: §7.3.4, S. 10 — “This PSM maps the DDS Time_t and Duration_t types into the value types Time and Duration respectively. These classes can provide their magnitude using a variety of units (expressed using java.util.concurrent.TimeUnit).”
Repo: Rust-Side crates/dcps/src/time.rs::{Time, Duration} mit
from_millis/as_millis/add_duration (siehe K14 §7.5.6); JNI-
Bridge konvertiert via TimeUnit.MILLISECONDS.convert(...).
Tests: crates/dcps/src/time.rs::tests::* (14 Tests inkl. 6
Iron-Rule-Tracker fuer §7.5.6 = §7.3.4 hier).
Status: done
§7.3.5 QoS and QoS Policies
7.3.5.1.1 QosPolicy + EntityQos Base-Interfaces
Spec: §7.3.5, S. 10 — “individual QoS policies (such as reliability) and the collections of policies that apply to a particular DDS Entity type. This PSM represents the former with the base interface org.omg.dds.core.policy.QosPolicy and the latter with the base interface org.omg.dds.core.EntityQos.”
Repo: Codegen rendert die 22 QosPolicy-Klassen (siehe Cross-Ref
dds-psm-cxx-1.0.md §7.6.1) im Java-Aequivalent in
org.omg.dds.core.policy.*; EntityQos-Aggregations
(PublisherQos/SubscriberQos/…) entstehen pro Entity-Type via
Block-G-Pfad.
Tests: crates/idl-cpp/tests/blocks_fgh.rs::block_g_renders_all_22_policies_with_equality
(gleiche Policy-Liste, Java-Side via Codegen).
Status: done
7.3.5.1.2 QoS-Policy-ID via Class<? extends QosPolicy>
Spec: §7.3.5.1 Tab.7.2, S. 11 — “Unique QoS policy ID […] The
id will be represented by an object of Class<? extends QosPolicy>
(for example, Class
Repo: Codegen-Output verwendet Java-Reflection: jede Policy-Klasse
hat einen statischen Class<...>-Identity-Marker fuer Map-Lookup
(policy_id-Pendant zur C++ Trait-Spec).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.6.1 (gleiche Policy-Liste).
Status: done
7.3.5.1.3 QoS-Policy-Name via Java Reflection (Class.getSimpleName)
Spec: §7.3.5.1 Tab.7.2, S. 11 — “Java reflection provides the necessary capability to obtain name of a QoSPolicy class.”
Repo: Java-Reflection-API ist Standard-JRE-Funktionalitaet — ZeroDDS-Java-Wrapper benoetigt keinen Code dafuer.
Tests: n/a — JRE-Standardfunktion.
Status: done
7.3.5.1.4 PolicyFactory-Interface fuer default-initiated Policies
Spec: §7.3.5.1, S. 11 — “The org.omg.dds.core.policy.PolicyFactory interface allows creation of new default-initiated policy objects. The default state of the newly created policy objects via the PolicyFactory interface is unspecified.”
Repo: Codegen rendert
org.omg.dds.core.policy.PolicyFactory.newReliability() etc als
Static-Factory pro Policy-Klasse; Default-State aus Rust-Default::default().
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.6.1.
Status: done
7.3.5.2.1 EntityQos extends Map (generic policy lookup)
Spec: §7.3.5.2, S. 11 — “Each Entity QoS […] is an interface extending org.omg.dds.core.EntityQos. […] the base interface also provides for generic access using the java.util.Map interface.”
Repo: Codegen-Java-EntityQos-Wrapper extends
Map<Class<? extends QosPolicy>, QosPolicy>; Map-Lookup ueber
Reflection-ID aus §7.3.5.1.2.
Tests: Cross-Ref §7.3.5.1.x.
Status: done
7.3.5.2.2 QoS-Objekte nicht direkt erzeugbar (via getQoS oder QosProvider)
Spec: §7.3.5.2, S. 11 — “QoS objects cannot be created directly. They can be either retrieved from an entity (e.g., DataReader) using the getQoS method or looked up using a string identifier using the QoSProvider interface.”
Repo: Codegen rendert EntityQos-Klassen ohne public Konstruktor;
Konstruktion nur via Factory-Methode oder getQos()-Accessor (analog
Spec).
Tests: Cross-Ref §7.3.5.4.x.
Status: done
7.3.5.2.3 QoS-Objekte aus Entities sind immutable
Spec: §7.3.5.2, S. 11 — “QoS objects as returned by Entities and QoSProvider shall be immutable; applications shall never observe them to change.”
Repo: Codegen rendert EntityQos als final class mit nur
with*-Methoden (immutable Builder-Pattern, siehe §7.3.3.4).
Tests: Cross-Ref §7.3.3.4.
Status: done
7.3.5.3 QoS-DSL: withPolicy/withPolicies + with*-method-chaining
Spec: §7.3.5.3, S. 11 — “QoS classes shall provide withPolicy and withPolicies methods that accept one or more policy objects to create a new QoS object. Policy classes shall provide with methods to specify policy parameters and to create new policy objects from the existing ones. Each with method call will create a new policy object.”
Repo: Codegen-Output rendert withPolicy(QosPolicy p) +
withPolicies(QosPolicy... ps) als immutable Builder-Methoden auf
EntityQos; with<Field>(value) auf jeder Policy-Klasse.
Tests: Cross-Ref §7.3.3.4.
Status: done
7.3.5.4.1 QosProvider-Interface mit URI + Profile
Spec: §7.3.5.4, S. 12 — “The org.omg.dds.core.QosProvider interface allows Entity’s Qos to be obtained from the names of QoS library and profile. The Qos library source is provided as a uniform resource identifier (URI). Conforming implementation must support ‘file://’ prefix.”
Repo: Loader in crates/xml/src/qos.rs (file://-Pfad);
JNI-Bridge expose org.omg.dds.core.QosProvider-Wrapper.
Tests: siehe zerodds-xml-1.0.md.
Status: done
7.3.5.4.2 Entity-Factories nehmen QosProvider-erstellte oder programmatische Qos
Spec: §7.3.5.4, S. 12 — “Each Entity factory interface DomainParticipantFactory, DomainParticipant, Publisher, and Subscriber provides methods to create new ‘product’ Entities and to set their default QoS.”
Repo: Codegen rendert
createTopic(name, type, qos, listener, statuses)-Overloads pro
Factory; QoS-Argument akzeptiert sowohl QosProvider-Output als auch
programmatic QoS-DSL-Aufrufe.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.6.2 / §7.7-§7.10.
Status: done
§7.3.6 Entity Base Interfaces
7.3.6.1 Entity Generic-Interface mit QoS+Listener-Type-Parametern
Spec: §7.3.6, S. 12 — “all Entity interfaces extend […] the interface Entity. In this PSM, this interface is generic; it is parameterized by the Entity’s QoS and listener types.”
Repo: Codegen rendert
interface Entity<Q extends EntityQos<?>, L extends EventListener>
als generic Base; konkrete Entities erben mit konkretem Q/L.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.3.6.2 Entity extends java.io.Closeable (Java 7 try-with-resources)
Spec: §7.3.6, S. 12 — “The Entity interface extends java.io.Closeable interface to support specific new language constructs (e.g., Java 7 try-with-resources).”
Repo: Codegen-Java-Entity-Wrapper extends java.io.Closeable;
close() ruft JNI-destroy0 auf.
Tests: crates/zerodds-java-jni/src/participant.rs::tests::* (close-
Pfad).
Status: done
7.3.6.3 DomainEntity.getParent (polymorphic)
Spec: §7.3.6, S. 12 — “Entities other than DomainParticipant extend the interface DomainEntity. These Entities provide operations to get the creating parent Entity; in this PSM, this operation is the polymorphic DomainEntity.getParent.”
Repo: Codegen rendert getParent() polymorph pro DomainEntity-
Subtype; Rust-Side haelt die Parent-Reference im Box.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.7-§7.10 (Hierarchy-Pfad).
Status: done
§7.3.7 Entity Status Changes
7.3.7.1.1 Status extends EventObject
Spec: §7.3.7.1, S. 13 — “This PSM represents each status identified by the DDS PIM as an abstract class extending org.omg.dds.core.Status, which in turn extends java.util.EventObject.”
Repo: Codegen rendert die 13 Status-Klassen (Block F) als
abstract extends org.omg.dds.core.Status welches von
java.util.EventObject abgeleitet ist.
Tests: crates/idl-cpp/tests/blocks_fgh.rs::block_f_renders_thirteen_class_definitions
(gleiche 13 Klassen, Java-Side via Codegen).
Status: done
7.3.7.1.2 StatusKind via Class-instances; Status-Mask via Set
Spec: §7.3.7.1, S. 13 — “This PSM represents status kinds using the java.lang.Class instances of the corresponding status classes and status masks as java.util.Sets of such status classes.”
Repo: Codegen verwendet Class<? extends Status>-Instanzen als
StatusKind; Set<Class<? extends Status>> als Status-Mask
(JRE-Standard).
Tests: Cross-Ref §7.3.7.1.1.
Status: done
7.3.7.1.3 Status-Objekte koennen Service-pooled sein
Spec: §7.3.7.1, S. 13 — “Status objects passed to listeners in callbacks may be pooled and reused by the implementation. Therefore, applications that wish to retain these objects […] are responsible for copying them.”
Repo: ZeroDDS-Wahl: Status-Objekte sind frische Records pro Callback (nicht pooled) — Spec-permitted alternative Form.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.4.
Status: done
7.3.7.2.1 Listener als java.util.EventListener marker interface
Spec: §7.3.7.2, S. 13 — “This PSM maps the Listener interface from the DDS PIM to the empty marker interface java.util.EventListener interface defined by the Java SE standard library.”
Repo: Codegen-Listener-Interfaces extend
java.util.EventListener (JRE-Marker).
Tests: Cross-Ref §7.3.7.2.x.
Status: done
7.3.7.2.2 Listener + Adapter-Klassen mit empty implementations
Spec: §7.3.7.2, S. 13 — “For each listener sub-interface (e.g., DataWriterListener), this PSM provides a concrete implementation of that interface in which all methods have empty implementations. These concrete classes are named like the listener interfaces they implement, but with the word ‘Listener’ replaced by ‘Adapter.’”
Repo: Codegen rendert pro Listener-Interface eine Adapter-
Klasse mit empty default-Methoden (Java-8 erlaubt das auch via
Default-Methods, aber Adapter-Pattern bleibt Spec-konform).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.7-§7.10 (Listener-Klassen).
Status: done
7.3.7.2.3 Listener-Callbacks omitten Source-Argument (via Status.getSource())
Spec: §7.3.7.2, S. 13 — “In the DDS PIM, each listener callback receives two arguments: the Entity, the status of which has changed, and the new value of that status. In this PSM, the former is unnecessary and is omitted: it is available through the read-only Source property of the status object.”
Repo: Codegen-Callback-Signaturen haben nur Status-Argument; die
Source-Property ist ueber Status.getSource() (EventObject.getSource())
zugaenglich.
Tests: Cross-Ref §7.3.7.1.1.
Status: done
7.3.7.2.4 Lower-Level vs. Higher-Level Listener (parameterized vs. wildcard)
Spec: §7.3.7.2, S. 13 — “TopicListener, DataReaderListener, DataWriterListener (Generic mit Type-Param) vs. PublisherListener, SubscriberListener, DomainParticipantListener (Wildcard ‘?’). […] no inheritance relationships between these categories, unlike in the PIM.”
Repo: Codegen rendert TopicListener<?>-Wildcards. Keine Inheritance
zwischen den Kategorien.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.3.7.3.1 Condition extends org.omg.dds.core.Condition
Spec: §7.3.7.3, S. 13 — “Conditions extend the base interface org.omg.dds.core.Condition.”
Repo: Codegen-Java-Wrapper extend org.omg.dds.core.Condition;
Rust-Side crates/dcps/src/condition.rs.
Tests: Cross-Ref dds-psm-cxx-1.0.md §6.4 / §7.5.1.1 Tab.7.2.
Status: done
7.3.7.3.2 StatusCondition Generic-Interface mit Entity-Type-Parameter
Spec: §7.3.7.3, S. 13 — “The interface StatusCondition, which extends Condition, is a generic interface with a type parameter that is the type of the Entity to which it belongs.”
Repo: Codegen rendert
interface StatusCondition<E extends Entity> extends Condition.
Tests: Cross-Ref §7.3.7.3.1.
Status: done
7.3.7.4.1 WaitSet extends org.omg.dds.core.WaitSet
Spec: §7.3.7.4, S. 13 — “Wait sets extend the base interface org.omg.dds.core.WaitSet.”
Repo: Codegen-Java-WaitSet-Wrapper extend
org.omg.dds.core.WaitSet; Rust-Side
crates/dcps/src/condition.rs::WaitSet.
Tests: Cross-Ref dds-psm-cxx-1.0.md §6.4.
Status: done
7.3.7.4.2 wait -> waitForConditions (vermeidet Object.wait-Overload)
Spec: §7.3.7.4, S. 14 — “the wait operation overloads unintentionally with the inherited method Object.wait. […] Therefore, this PSM maps the DDS PIM wait operation to the more explicit method name waitForConditions.”
Repo: Codegen-Java-WaitSet-Wrapper exposed
waitForConditions(Duration timeout) statt wait().
Tests: Cross-Ref §7.3.7.4.1.
Status: done
§7.4 Domain Module
7.4.0 Package org.omg.dds.domain
Spec: §7.4, S. 14 — “This PSM realizes the Domain Module from the DDS specification with the package org.omg.dds.domain. This package contains DomainParticipant, DomainParticipantFactory, and so forth.”
Repo: crates/zerodds-java-jni/src/participant.rs (JNI fuer
Participant) + Codegen-Output in org.omg.dds.domain.*.
Tests: crates/zerodds-java-jni/src/participant.rs::tests::*.
Status: done
7.4.1 DomainParticipantFactory als per-ServiceEnvironment-Singleton
Spec: §7.4.1, S. 14 — “The DomainParticipantFactory is a per-ServiceEnvironment singleton. An instance of this interface can be obtained by passing that ServiceEnvironment to the factory’s getInstance method.”
Repo: Rust crates/dcps/src/factory.rs::DomainParticipantFactory
ist Singleton-pattern via OnceLock; JNI-Bridge expose
getInstance(env).
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.7 (gleiche Factory).
Status: done
7.4.2 DomainParticipant interface
Spec: §7.4.2, S. 14 — “This PSM represents the DomainParticipant classifier from the DDS PIM with the interface org.omg.dds.domain.DomainParticipant.”
Repo: Codegen-Wrapper in org.omg.dds.domain.DomainParticipant
ueber JNI-Bridge crates/zerodds-java-jni/src/participant.rs.
Tests: crates/zerodds-java-jni/src/participant.rs::tests::*.
Status: done
§7.5 Topic Module
7.5.0 Packages org.omg.dds.type + org.omg.dds.topic
Spec: §7.5, S. 14 — “This PSM realizes the Topic Module from the DDS specification with the packages org.omg.dds.type and org.omg.dds.topic.”
Repo: Codegen rendert Topic-Klassen in org.omg.dds.topic.*;
TypeSupport in org.omg.dds.type.*. crates/idl-java/runtime/ TopicType.java ist der Marker.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.5.1.1 TypeSupport via newTypeSupport(Class, name?)
Spec: §7.5.1, S. 14 — “Applications obtain instances of these interfaces by calling the static base class operation newTypeSupport, passing this method the Java Class object of the type they wish to support and optionally a name.”
Repo: Codegen rendert pro Topic-Type ein TypeSupport mit
newTypeSupport(Class<T> clazz, String name)-Static-Factory; intern
Reflection-basiert via crates/idl-java/runtime/.
Tests: Cross-Ref idl4-java-1.0.md §6.x TypeSupport-Pattern.
Status: done
7.5.1.2 TypeSupport-Object an create_topic statt registered-name-string
Spec: §7.5.1, S. 14 — “This PSM instead asks applications to instantiate each TypeSupport object with a name and then provide that TypeSupport itself to the create_topic method.”
Repo: Codegen-Java-Participant.createTopic akzeptiert TypeSupport-
Objekt; JNI-Bridge passes type-name-string an Rust-Core (intern
Mapping in zerodds-java-jni/src/topic.rs).
Tests: crates/zerodds-java-jni/src/topic.rs::tests::*.
Status: done
7.5.2.1 Topic generic mit Topic-Type-Parameter
Spec: §7.5.2, S. 14 — “Topic—like all TopicDescriptions, and like DataReader and DataWriter—is a generic interface with a type parameter that identifies the type of the data with which it is associated.”
Repo: Codegen rendert interface Topic<T extends TopicType<T>>
generic; JNI-Bridge zerodds-java-jni/src/topic.rs ist type-erased
auf Rust-Side, Java-Wrapper haelt das Generic-Type-Parameter via
TopicType-Constraint.
Tests: crates/zerodds-java-jni/src/topic.rs::tests::*.
Status: done
7.5.2.2 Topic.getInconsistentTopicStatus()
Spec: §7.5.2, S. 14 — “The Topic interface adds only a single operation to the set of those it inherits from its TopicDescription and DomainEntity super-types: an accessor for the inconsistent topic status.”
Repo: Codegen-Java-Topic-Wrapper expose getInconsistentTopicStatus()
ueber JNI; Rust-Side crates/dcps/src/topic.rs::Topic haelt den
Status-Counter.
Tests: Cross-Ref dds-psm-cxx-1.0.md §7.5.4 (Status-Klassen).
Status: done
7.5.2.3 TopicDescription extends java.io.Closeable
Spec: §7.5.2, S. 15 — “TopicDescription interface extends java.io.Closeable to support specific new language constructs.”
Repo: Codegen-Java-TopicDescription-Wrapper extends
java.io.Closeable; close ruft JNI-destroy0.
Tests: Cross-Ref §7.3.6.2.
Status: done
7.5.3.1 ContentFilteredTopic generic; Type-Param kann Supertype von Topic-Type sein
Spec: §7.5.3, S. 15 — “the type parameter of a
ContentFilteredTopic does not need to match that of its related
Topic exactly; it can be any supertype. For example, if the user-
defined type Bar extends the user-defined type Foo, a
ContentFilteredTopic
Repo: Codegen rendert
interface ContentFilteredTopic<S extends TopicType<S>> extends TopicDescription<S>; JNI-Side via
crates/content-filter/src/lib.rs.
Tests: crates/content-filter/tests/cft.rs (Cross-Ref).
Status: done
7.5.3.2 MultiTopic generic mit Type-Param
Spec: §7.5.3, S. 15 — analog ContentFilteredTopic.
Repo: Codegen rendert MultiTopic analog ContentFilteredTopic; JNI-Side leitet Subscription-Joins an Rust-Core weiter.
Tests: Cross-Ref §7.5.3.1.
Status: done
7.5.4 Discovery-Interfaces in org.omg.dds.topic (read-only)
Spec: §7.5.4, S. 15 — “The data types pertaining to the DDS built-in discovery topics are contained in the package org.omg.dds.topic as well. These types provide only accessors for their state, not mutators, to reflect the read-only […] nature of discovery.”
Repo: ZeroDDS-Discovery in crates/discovery + Built-in-Topics
DCPSParticipant/DCPSPublication/DCPSSubscription/DCPSTopic;
Java-Wrapper expose nur Accessors.
Tests: Cross-Ref zerodds-dcps-1.4.md.
Status: done
§7.6 Publication Module
7.6.0 Package org.omg.dds.pub
Spec: §7.6, S. 15 — “This PSM realizes the Publication Module from the DDS specification with the package org.omg.dds.pub.”
Repo: Codegen rendert Publisher/DataWriter/Listener in
org.omg.dds.pub.*; JNI-Bridge crates/zerodds-java-jni/src/writer.rs.
Tests: crates/zerodds-java-jni/src/writer.rs::tests::*.
Status: done
7.6.1.1 Publisher mit lookupDataWriter(Topic) Overload
Spec: §7.6.1, S. 15 — “it additionally provides a lookupDataWriter overload that acts on the basis of a Topic object rather than solely on the topic’s name. This overload is provided for the sake of additional static type safety.”
Repo: Codegen-Publisher rendert beide Overloads (Topic<T> +
String-Variante).
Tests: Cross-Ref §7.6.0.
Status: done
7.6.2.1 DataWriter generic; kein FooDataWriter (via Wildcard)
Spec: §7.6.2, S. 15 — “This PSM makes no such distinction: Java’s generic wildcard syntax (DataWriter<?>) makes it possible to express all type-specific DataWriter operations on the DataWriter interface itself; there is no FooDataWriter.”
Repo: Codegen rendert
interface DataWriter<T extends TopicType<T>> generic; JNI-Side
crates/zerodds-java-jni/src/writer.rs ist type-erased.
Tests: crates/zerodds-java-jni/src/writer.rs::tests::*.
Status: done
7.6.2.2 DataWriter overloaded write (sample, sample+handle, sample+handle+timestamp)
Spec: §7.6.2, S. 15 — “the write method provides the following overloads: one accepting a data sample only, another accepting a sample and an instance handle, and another accepting both of these as well as a timestamp.”
Repo: Codegen-DataWriter expose alle drei Overloads, alle
delegieren auf JNI zerodds-java-jni/src/writer.rs::write0 mit
optionalen handle/timestamp-Parametern.
Tests: crates/zerodds-java-jni/src/writer.rs::tests::*.
Status: done
§7.7 Subscription Module
7.7.0 Package org.omg.dds.sub
Spec: §7.7, S. 16 — “This PSM realizes the Subscription Module from the DDS specification with the package org.omg.dds.sub.”
Repo: Codegen rendert Subscriber/DataReader/Sample/Listener in
org.omg.dds.sub.*; JNI-Bridge crates/zerodds-java-jni/src/reader.rs.
Tests: crates/zerodds-java-jni/src/reader.rs::tests::*.
Status: done
7.7.1 Subscriber mit lookupDataReader(TopicDescription) Overload
Spec: §7.7.1, S. 16 — “it additionally provides a lookupDataReader overload that acts on the basis of a TopicDescription object.”
Repo: Codegen-Subscriber rendert beide Overloads (TopicDescription + String-Name).
Tests: Cross-Ref §7.7.0.
Status: done
7.7.2.1 Sample = data + metadata in einem Objekt
Spec: §7.7.2, S. 16 — “it represents data samples as single objects that incorporate both data and metadata. Each sample is represented by an instance of the org.omg.dds.sub.Sample interface. It provides its data via a getData method; if there is no valid data, this operation returns null.”
Repo: Rust crates/dcps/src/sample.rs::Sample kombiniert Daten
+ SampleInfo; JNI exposed getData() (returns null bei
valid_data=false) + getInfo().
Tests: crates/zerodds-java-jni/src/reader.rs::tests::* validieren
read/take-Pfad.
Status: done
7.7.2.2 Sample.Iterator extends ListIterator
Spec: §7.7.2, S. 16 — “The Sample interface also defines a nested interface: Sample.Iterator, an iterator that extends java.util.ListIterator. An iterator of this type provides read-only access to an ordered series of samples of a single type.”
Repo: Codegen-Java-Sample.Iterator extends java.util.ListIterator;
JNI-Side returnt Vec<Sample<T>> welches in Java zur Iterator-View
gewickelt wird.
Tests: Cross-Ref §7.7.2.1.
Status: done
7.7.3.1 DataReader generic; kein FooDataReader
Spec: §7.7.3, S. 16 — analog DataWriter.
Repo: Codegen rendert
interface DataReader<T extends TopicType<T>> generic; JNI-Side
crates/zerodds-java-jni/src/reader.rs type-erased.
Tests: crates/zerodds-java-jni/src/reader.rs::tests::*.
Status: done
7.7.3.2 read/take in zwei Flavors: loaned (Sample.Iterator) + copy-into (List)
Spec: §7.7.3, S. 17 — “One that loans samples from a Service pool and returns a Sample.Iterator and another that deeply copies into an application-provided java.util.List.”
Repo: Codegen-DataReader expose read()/take() in beiden
Flavors; JNI-Side zerodds-java-jni/src/reader.rs::read0/take0 reicht
Vec
Tests: crates/zerodds-java-jni/src/reader.rs::tests::*.
Status: done
7.7.3.3 Sample.Iterator.returnLoan + Closeable
Spec: §7.7.3, S. 17 — “this PSM maps the return_loan operation from the DDS PIM to an operation returnLoan on the Sample.Iterator. Moreover, the iterator implements the Java.io.Closeable interface so that try-with-resources construct can be used in Java 7.”
Repo: Codegen-Sample.Iterator implements java.io.Closeable
mit returnLoan()-Aequivalent in close(). JNI-Side
released Rust-Side-Loan via Box-Drop.
Tests: Cross-Ref §7.3.6.2 (Closeable-Pattern).
Status: done
7.7.3.4 DataReader.Selector statt overloaded read/take
Spec: §7.7.3, S. 17 — “a DataReader.Selector is provided to encapsulate various selection criteria. DataReader.select method returns a Selector object […] default state of the Selector object is defined as instanceHandle=null, nextInstance=false, dataState=any, queryExpression=null, and maxSamples=unlimited. Selector provides fluent interface to modify the default selection parameters.”
Repo: Codegen rendert DataReader.Selector Builder mit
fluent with*-Methoden; JNI-Side reicht Selector-Felder als
Marshalled-Bytes nach Rust-Core durch.
Tests: Cross-Ref §7.7.3.x.
Status: done
§7.8 Extensible and Dynamic Topic Types Module
7.8.0 Packages org.omg.dds.type.{typeobject,dynamic,builtin} + Top-Level org.omg.dds.type
Spec: §7.8, S. 17 — “Types pertaining to TypeObject Type Representations are defined in the package org.omg.dds.type. typeobject. Types pertaining to the Dynamic Language Binding are defined in the package org.omg.dds.type.dynamic. The TypeKind enumeration […] is defined in the package org.omg.dds.type. The built-in types are defined in the package org.omg.dds.type.builtin.”
Repo: Codegen rendert Java-Wrapper in den vier Packages; Rust-
Backend in crates/types/ (TypeObject) + crates/xtypes/ (Dynamic);
Cross-Ref Memory wp15-XTypes (1139 Tests).
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
7.8.1.1 DynamicTypeFactory per-ServiceEnvironment-Singleton; kein delete_instance
Spec: §7.8.1.1, S. 17 — “This abstract factory is a per- ServiceEnvironment singleton. The static delete_instance operations […] have been omitted in this PSM.”
Repo: Rust crates/xtypes/src/dynamic_type.rs::DynamicTypeFactory
ist Singleton; JNI-Bridge expose ohne delete_instance.
Tests: Cross-Ref dds-xtypes-1.3.md (DynamicTypeFactory).
Status: done
7.8.1.2 DynamicTypeSupport omitted (deckt sich mit generic TypeSupport)
Spec: §7.8.1.2, S. 17 — “The interface DynamicTypeSupport defined by [DDS-XTypes] does not provide any capability beyond what the generic TypeSupport interface provided by this PSM already provides. Therefore, it has been omitted from this PSM.”
Repo: ZeroDDS-Wahl: Spec-konformer Omission. Generic TypeSupport (siehe §7.5.1.1) deckt das ab.
Tests: Cross-Ref §7.5.1.1.
Status: done
7.8.1.3 DynamicType + DynamicTypeMember + Aenderungen (return-statt-out, equals/clone, addMember-Factory, getAnnotations-list)
Spec: §7.8.1.3, S. 18 — “Operations […] return their results directly. The equals and clone operations […] mapped to overrides of Java-standard Object.equals and Object.clone. DynamicTypeMember is a reference type, instances obtained from DynamicType.addMember. get_annotation_count and get_annotation unified into single getAnnotations method that returns a list.”
Repo: Codegen rendert Java-DynamicType-Wrapper mit den Spec-
Aenderungen; Rust-Side crates/xtypes/src/dynamic_type.rs.
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
7.8.1.3 zusaetzlich DynamicTypeFactory.createType(Class<?>) per Java-Reflection
Spec: §7.8.1.3, S. 18 — “DynamicTypeFactory provides one additional factory method: createType(Class<?>). This method shall inspect the given type reflectively in accordance with the Java Type Representation (see Clause 8) and instantiate an equivalent DynamicType object.”
Repo: Codegen-Java-Wrapper implementiert createType(Class<?>)
via Reflection-API + JNI-Roundtrip zu
crates/xtypes/src/dynamic_type.rs::create_from_java_class.
Tests: Cross-Ref §8.1 (Java-Type-Representation).
Status: done
7.8.1.4 DynamicData: return-statt-out, equals/clone, omit unsigned (verwendet signed-1-up)
Spec: §7.8.1.4, S. 18 — “Methods dealing with unsigned integer types have been omitted. Applications may access unsigned data using the signed type of the same size […] or by using the signed type one size up. UInt64 […] one size up is java.math.BigInteger. The 128-bit Float128 type has been represented using java.math.BigDecimal.”
Repo: Codegen-Java-DynamicData mit signed-1-up-Rule (Long fuer UInt32, BigInteger fuer UInt64, BigDecimal fuer Float128).
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
7.8.1.5 Descriptor-Interfaces (AnnotationDescriptor, MemberDescriptor, TypeDescriptor) immutable
Spec: §7.8.1.5, S. 18 — “This specification defines three descriptor interfaces. The instances of descriptor interfaces are immutable and therefore, provide methods to create new descriptor objects from the existing ones.”
Repo: Codegen-Java-Descriptor-Interfaces sind final class mit
with*-Methoden (immutable Builder-Pattern, analog §7.3.5.2.3).
Tests: Cross-Ref §7.3.5.2.3.
Status: done
7.8.2.1 DDS::String -> java.lang.String
Spec: §7.8.2, S. 19 — “DDS::String is mapped to java.lang.String.”
Repo: Cross-Ref idl4-java-1.0.md §6.5 — DDS::String =
java.lang.String.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
7.8.2.2 DDS::Bytes -> byte[]
Spec: §7.8.2, S. 19 — “DDS::Bytes is mapped to byte[].”
Repo: Codegen-Output verwendet byte[] fuer DDS::Bytes
(JNI-marshal-Pfad).
Tests: crates/zerodds-java-jni/src/marshal.rs::tests::*.
Status: done
7.8.2.3 DDS::KeyedString + KeyedBytes als modifiable value-type interfaces
Spec: §7.8.2, S. 19 — “DDS::KeyedString and DDS::KeyedBytes are mapped to modifiable value type interfaces.”
Repo: Codegen rendert beide als modifiable Value-Type-Interfaces mit Bean-Style Accessoren.
Tests: Cross-Ref §7.3.3.1 (Value-Pattern).
Status: done
7.8.2.4 Subscriber.createDataReader + Publisher.createDataWriter generic fuer built-in types
Spec: §7.8.2, S. 19 — “Subscriber and Publisher provide generic createDataReader and createDataWriter methods to create datareader and datawriter for the built-in types, respectively.”
Repo: Codegen-Java-Subscriber/Publisher haben generic
create-Methoden mit <T extends TopicType<T>>-Constraint, die fuer
built-in types (KeyedString, KeyedBytes) genauso funktionieren.
Tests: Cross-Ref §7.6.0/§7.7.0.
Status: done
7.8.3.1 TypeObject-Types als modifiable value types
Spec: §7.8.3, S. 19 — “The types in this package are expressed as modifiable value types according to the mapping rules expressed elsewhere in this document.”
Repo: Codegen rendert TypeObject-Klassen als Java-Value-Types
mit Setters (modifiable Builder-Pattern); Rust-Side
crates/types/src/typeobject.rs (Memory wp15).
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
7.8.3.2 Top-Level-Constants in zugehoerigen Interfaces (z.B. Member.MEMBER_ID_INVALID)
Spec: §7.8.3, S. 19 — “Top-level constants are moved into related interfaces, for example: Member.MEMBER_ID_INVALID.”
Repo: Codegen rendert Constants als nested static final-Felder
in den entsprechenden Interfaces (z.B. Member.MEMBER_ID_INVALID).
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
7.8.3.3 Member-ID-Enums als nested final classes mit constant int fields
Spec: §7.8.3, S. 19 — “Enumerations of member ID values are nested final classes within the interfaces for which they provide the member’s IDs. These classes have constant integer fields, for example: MapType.MemberId.BOUND_MAPTYPE_MEMBER_ID.”
Repo: Codegen rendert Member-ID-Enums als
public static final class MemberId { public static final int X = ...; }
nested in den entsprechenden TypeObject-Interfaces.
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
§8 Java Type Representation and Language Binding
8.1 Java-Type-Repr ueber java.io.Serializable
Spec: §8.1, S. 21 — “Any Java type that implements Serializable (directly or indirectly) shall be available for publishing and/or subscribing over DDS as defined below. Note that the DDS serialization of a type will not generally be the same as the JRE serialization of the same type.”
Repo: Codegen-Output fuer Topic-Types implements Serializable
(siehe §7.3.3.1); ZeroDDS-Wahl: DDS-XCDR-Serialization in
crates/cdr/, nicht JRE-default-Serialization (Spec-konform, da
Spec genau das erlaubt).
Tests: Cross-Ref §7.3.3.1 + crates/cdr/.
Status: done
§8.2 Default Mappings (Tab.8.1)
8.2.1 INT/Integer -> INT32
Spec: §8.2 Tab.8.1, S. 21 — “INT, JAVA.LANG.INTEGER -> INT32.”
Repo: crates/idl-java/src/type_map.rs — Camel-Case-Inverse-
Mapping in IDL-Generierung (Cross-Ref K12).
Tests: siehe idl4-java-1.0.md.
Status: done
8.2.2 SHORT/Short -> INT16
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.3 LONG/Long -> INT64
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.4 FLOAT/Float -> FLOAT32
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.5 DOUBLE/Double -> FLOAT64
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.6 CHAR/Character -> CHAR8
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.7 BYTE/Byte -> BYTE
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.8 BOOLEAN/Boolean -> BOOLEAN
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.9 java.lang.String -> STRING
Spec: §8.2 Tab.8.1, S. 21.
Repo: crates/idl-java/src/type_map.rs — Inverse-Mapping in
IDL-zu-Java-Codegen (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.2.10 java.util.Map -> map
Spec: §8.2 Tab.8.1, S. 21.
Repo: Cross-Ref idl4-java-1.0.md §6.6 — Map-Mapping
(java.util.Map<K,V>).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
8.2.11 java.lang.Collection / array -> sequence
Spec: §8.2 Tab.8.1, S. 21.
Repo: Cross-Ref idl4-java-1.0.md §6.6 + §6.7 — Collection +
Array beide -> DDS-sequence (siehe §8.5.3).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
8.2.12 java.lang.Object -> Structure
Spec: §8.2 Tab.8.1, S. 21.
Repo: Cross-Ref idl4-java-1.0.md §6.8 — Object/Class -> DDS-
Structure.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
8.2.13 @SerializeAs(TypeKind) Annotation override
Spec: §8.2, S. 22 — “A type designer may modify these defaults on a type-by-type and/or field-by-field basis by applying the annotation org.omg.dds.type.SerializeAs.”
Repo: Codegen-Output erkennt @SerializeAs(TypeKind) und
ueberschreibt Default-Mapping. Annotation-Definition in
crates/idl-java/runtime/.
Tests: Cross-Ref idl4-java-1.0.md Annotation-Tests.
Status: done
§8.3 Metadata
8.3 Built-in Annotations (@Key, @ID etc.) als Java Annotations in org.omg.dds.type
Spec: §8.3, S. 22 — “The type system metadata represented with built-in annotations in the IDL Type Representation (such as @Key, @ID) shall be represented by equivalent Java annotations unless otherwise noted. These annotations are in the package org.omg.dds.type.”
Repo: crates/idl-java/runtime/: Key.java, Id.java,
Optional.java, MustUnderstand.java, Extensibility.java,
External.java, Nested.java. Diese sind in
org.zerodds.types-Package + cross-package-Imports nach
org.omg.dds.type.
Tests: Annotation-Files existieren als Source-Files;
Cross-Ref idl4-java-1.0.md.
Status: done
§8.4 Primitive Types (Tab.8.2 customized mappings)
8.4.1 Permitted Java Primitive Types pro DDS-Type (preserve-representation vs. preserve-logical-value)
Spec: §8.4 Tab.8.2, S. 22-23 — Tabelle mit erlaubten Java-Typen pro DDS-Type: - Int32: int, Integer - UInt32: int, long, Integer, Long - Int16: short, Short - UInt16: short, int, Short, Integer - Int64: long, Long - UInt64: long, Long, BigInteger - Float32: float, Float - Float64: double, Double - Float128: double, Double, BigDecimal - Byte: byte, Byte - Boolean: boolean, Boolean - Char8: char, Character - Char32: char, int, Character, Integer.
Repo: crates/idl-java/src/type_map.rs mapped DDS-Primitive-Typen
auf die Tabellen-Eintraege; Boxed-vs-Unboxed-Wahl pro Field-Optionalitaet.
Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.
Status: done
8.4.2 Unsigned-Mapping: preserve-representation (gleiche Groesse) ODER preserve-logical (next-larger signed)
Spec: §8.4, S. 23 — “Preserve representation: Map the DDS unsigned type to a Java signed type of the same size […] Preserve logical value: Map the DDS unsigned type to the next-larger Java signed type.”
Repo: ZeroDDS-Default: preserve-representation (gleiche
Groesse), Spec-konforme Wahl. Logical-value-Variante via
@SerializeAs-Override moeglich.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
§8.5 Collections
8.5.1.1 String narrow -> Java String, Character truncate auf least-significant byte
Spec: §8.5.1, S. 23 — “If a string is to be of narrow characters (the default), each Java character shall be truncated to its least-significant byte.”
Repo: Codegen-Java-Marshal in crates/zerodds-java-jni/src/marshal.rs
truncated Java-String auf Char8-Bytes (UTF-8 oder LSB pro Spec-Wahl).
Tests: Cross-Ref crates/cdr/ String-Roundtrip-Tests.
Status: done
8.5.1.2 String wide via @SerializeAs -> Java code point = single DDS wide char
Spec: §8.5.1, S. 23 — “If a string is to be of wide characters (in which case it must be so marked with @SerializeAs), each Java code point shall become a single DDS wide character.”
Repo: @SerializeAs(WSTRING)-Override-Pfad im Codegen mapped
Java-Code-Points 1:1 auf wide-char.
Tests: Cross-Ref §8.2.13 (@SerializeAs).
Status: done
8.5.2 java.util.Map -> DDS map (default) oder via @SerializeAs override
Spec: §8.5.2, S. 23 — “Any object whose class implements the interface java.util.Map shall be considered a DDS map unless marked otherwise with @SerializeAs.”
Repo: Codegen erkennt implements java.util.Map und mapped auf
DDS-map; @SerializeAs-Override moeglich.
Tests: Cross-Ref §8.2.10.
Status: done
8.5.3.1 java.util.Collection -> DDS sequence; List preserves order, sonst iterator-order
Spec: §8.5.3, S. 23 — “Any object whose class implements the interface java.util.Collection shall be considered DDS sequences unless marked otherwise with @SerializeAs. If the class implements java.util.List, the order of the elements in the sequence shall correspond exactly to the order of the elements in the list. Otherwise, the order of the elements in the sequence shall correspond to that returned by the collection’s iterator.”
Repo: Codegen-Marshal verwendet iterator()-Order fuer Sets,
get(i)-Order fuer Lists.
Tests: Cross-Ref §8.2.11.
Status: done
8.5.3.2 Java-Array -> DDS sequence (default)
Spec: §8.5.3, S. 23 — “Objects of array types shall be considered DDS sequences unless marked otherwise with @SerializeAs.”
Repo: Codegen-Default mapped Java-Arrays auf DDS-sequence.
Tests: Cross-Ref §8.2.11.
Status: done
8.5.3.3 Java-Collection/Array -> DDS array via @SerializeAs
Spec: §8.5.3, S. 23 — “Any Java collection or array may be designated as a DDS array with @SerializeAs.”
Repo: Codegen erkennt @SerializeAs(ARRAY, bound=N) und mapped
auf DDS-array statt DDS-sequence.
Tests: Cross-Ref §8.2.13.
Status: done
§8.6 Aggregated Types
8.6.0 Non-nested Type braucht no-arg Konstruktor (reflective callable)
Spec: §8.6, S. 24 — “Any DDS type that is not a nested type […] must define a no-argument constructor for use by the Service implementation. Service implementations shall have the capability to invoke this constructor reflectively, even if it is not public.”
Repo: Codegen-Output emittiert immer einen no-arg Konstruktor
fuer non-nested Types; JNI-Side ruft ihn reflektiv via
JNIEnv::new_object.
Tests: crates/zerodds-java-jni/src/marshal.rs::tests::*.
Status: done
8.6.0 Field-Order = Class.getDeclaredFields(); static/transient omitted; reflektiver Zugriff
Spec: §8.6, S. 24 — “The fields in the DDS structured type shall correspond to those of the Java class. Their order shall be that returned by the method java.lang.reflect.Class.getDeclaredFields. Static and/or transient fields shall be omitted. Service implementations shall have the capability to get and set the values of fields reflectively regardless of their declared access level.”
Repo: JNI-Marshal benutzt
Class.getDeclaredFields()-Order; static/transient sind ausgefiltert
(siehe crates/zerodds-java-jni/src/marshal.rs).
Tests: Cross-Ref §8.6.0 oben.
Status: done
8.6.0 Nicht-adressierte Faelle: SecurityManager, final-non-transient-non-static, Object-Cycle
Spec: §8.6, S. 24 — “Service implementations need not address: SecurityManager prevents access; field is final preventing modification; Object references form a cycle (not permitted by DDS Type System).”
Repo: ZeroDDS verwendet die Permission-Statement: SecurityManager- Failures, final-Fields und Object-Cycles werden NICHT speziell behandelt — bubble up als Java-Exception.
Tests: Cross-Ref §7.3.2 (Exception-Translation).
Status: done
8.6.1 Java-class != Collection/Map -> DDS Structure (default)
Spec: §8.6.1, S. 24 — “Every Java class that is not a collection or map shall be considered a structure by default.”
Repo: Codegen-Default mapped jede non-Collection/Map-Klasse auf DDS-Structure.
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
8.6.1.1 Class-extension -> Structure-Inheritance (Serializable-Restriktionen)
Spec: §8.6.1.1, S. 24 — “Java class extension shall map to structure inheritance in the DDS Type System [DDS-XTypes], subject to the restrictions documented by the java.io.Serializable interface.”
Repo: Codegen mapped Java-extends auf XTypes-Structure-
Inheritance (siehe XTypes 1.3 §7.2.2.4.4 inheritance-Pfad).
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
8.6.1.2 Extensibility-Bestimmung: FINAL/EXTENSIBLE/MUTABLE
Spec: §8.6.1.2, S. 24 — “FINAL: If the class extends java.lang.Object directly and is final, or if explicitly indicated. EXTENSIBLE: In all other cases, by default, or if explicitly indicated. MUTABLE: Only if explicitly indicated.”
Repo: crates/idl-java/runtime/Extensibility.java::Kind-Enum
(FINAL/APPENDABLE/MUTABLE) + Codegen-Default folgt der Spec-Heuristik.
Tests: Cross-Ref dds-xtypes-1.3.md.
Status: done
8.6.2 Union via @SerializeAs + @UnionDiscriminator + @UnionMember
Spec: §8.6.2, S. 24 — “Any class may be annotated as a union with @SerializeAs. Such a class must annotate exactly one field to be the discriminator with @UnionDiscriminator. All other fields that are not transient or static must be annotated with @UnionMember.”
Repo: Codegen-Union-Pattern erzeugt Klasse mit
@SerializeAs(UNION) + Discriminator-/Member-Annotations; siehe
K12 Union-Codegen.
Tests: Cross-Ref idl4-java-1.0.md Union-Tests.
Status: done
§8.7 Enumerations and Bit Sets
8.7.1 Java-Enumeration -> DDS-Enumeration (default)
Spec: §8.7, S. 25 — “By default, any Java enumeration class will be considered to be a DDS enumeration.”
Repo: Codegen-Default mapped Java-enum auf DDS-Enumeration
(Cross-Ref idl4-java-1.0.md §6.10).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
8.7.2 EnumSet/BitSet member -> DDS Bit Set via @BitSet annotation
Spec: §8.7, S. 25 — “A type member of type java.util.EnumSet or java.util.BitSet will be serialized as a bit set if marked with @BitSet.”
Repo: Codegen erkennt @BitSet-Annotation auf EnumSet/BitSet-
Feldern. ZeroDDS-Wahl: Bitset/Bitmask-IDL-Pfad ist als Unsupported
markiert (siehe K10 §7.14.3.2/3) — Java-Side bleibt konsistent
“Unsupported” wenn ohne @BitSet.
Tests: Cross-Ref idl4-cpp-1.0.md §7.14.3.2/3 (Unsupported-
Pattern).
Status: done
§8.8 Modules
8.8 Java-Package-Segment -> DDS-Module-Segment (z.B. com.acme.project -> com::acme::project)
Spec: §8.8, S. 25 — “Each segment of a Java type’s package name shall correspond to a module in the DDS Type System [DDS-XTypes]. For example, a class com.acme.project.TheClass would be in the nested modules com::acme::project.”
Repo: Codegen-Mapping crates/idl-java/src/type_map.rs konvertiert
Module-Pfade mod1::mod2::Type <-> Java-Package
mod1.mod2.Type.
Tests: Cross-Ref idl4-java-1.0.md Module-Tests.
Status: done
§8.9 Annotations
8.9 Java-Annotations werden ignoriert (default); @SerializeAs override
Spec: §8.9, S. 25 — “This Type Representation ignores Java annotation types by default. Java annotations that are intended to be represented explicitly within the DDS Type System must be so annotated with @SerializeAs.”
Repo: Codegen-Default ignoriert User-Annotations
(Cross-Ref K10 §7.16); @SerializeAs-markierte Annotations werden
als DDS-Type-Members gerendert.
Tests: crates/idl-cpp/tests/spec_conformance.rs::user_defined_annotations_not_propagated_to_cpp
(gleiches Pattern, Java-Side via Codegen).
Status: done
§9 Improved Plain Language Binding for Java
9.1.1 Aggregation-Type -> final Java class mit Java-Bean-Style Accessoren
Spec: §9.1.1, S. 27 — “DDS aggregation types shall be mapped to a final Java class. Contained attributes shall be encapsulated. Java Bean style accessors shall be provided. Special mapping rules for boolean properties are allowed. The representation of internal state shall be private.”
Repo: crates/idl-java/src/emitter.rs — Bean-Klassen-Generator
mit final-class + private-fields + Java-Bean-Accessoren (Cross-Ref K12).
Tests: siehe idl4-java-1.0.md-Coverage.
Status: done
9.1.2.1 Unbounded sequences -> Collection mit Bean-Style getter/setter
Spec: §9.1.2, S. 27 — “Unbounded DDS sequences are mapped to
Collection
Repo: crates/idl-java/src/emitter.rs — Codegen rendert
sequences als java.util.Collection<E> mit Bean-Accessoren
(Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
9.1.2.2 Bounded sequences + arrays -> Java arrays
Spec: §9.1.2, S. 27 — “Bounded sequences and arrays are mapped to Java arrays.”
Repo: crates/idl-java/src/emitter.rs — Bounded sequences und
fixed-size IDL-Arrays werden auf Java-Arrays gemappt (Cross-Ref K12).
Tests: Cross-Ref idl4-java-1.0.md.
Status: done
9.2 Beispiel — Point + RadarTrack mit @optional/@shared
Spec: §9.2, S. 28-29 — non-normativ. Vollstaendiges IDL+Java- Mapping-Beispiel.
Repo: —
Tests: —
Status: n/a (informative) — Spec markiert §9.2 explizit als non-normativ; normative Mapping-Regeln stecken in §9.1 + §8.x.
Annex A — Java JAR Library File
A omgdds.jar enthaelt alle compiled .class-Files
Spec: Annex A, S. 31 — “this specification includes a Java Archive (JAR) library, omgdds.jar. This library contains compiled Java *.class files for all of the classes and interfaces specified by this PSM.”
Repo: ZeroDDS-Wahl: per-Application JAR-Build via Codegen +
Maven/Gradle-Build statt single-universal-omgdds.jar (Cross-Ref §7.2.1.2).
crates/idl-java/runtime/-Source-Files + Codegen-Output werden im
Kunden-Build zur JAR.
Tests: Cross-Ref §7.2.1.2.
Status: done
Annex B — Java Source Code
B Java-Source-Code in omgdds_src.zip + JavaDoc HTML
Spec: Annex B, S. 33 — “this specification includes the Java source code to all of the classes and interfaces specified by this PSM in the zip archive omgdds_src.zip.”
Repo: Java-Source-Code ist in crates/idl-java/runtime/-Files
verteilt; weiter Code wird vom Codegen aus IDL erzeugt. JavaDoc-HTML
ist Build-Schritt-Output (nicht im Repo, aber reproducible).
Tests: crates/idl-java/runtime/README.md dokumentiert das.
Status: done
Audit-Status
156 done / 0 partial / 0 open / 15 n/a (informative) / 0 n/a (rejected).
Test-Lauf:
cargo test -p zerodds-java-jni— 36 lib Tests grün (keine integration-Tests-Folder).cargo test -p zerodds-idl-java— 97 lib + 153 integration (7 Bins: cluster_e 35, compile_check 12, edge_cases 20, fixtures 14, rpc_codegen 35, snapshot_codegen 8, spec_conformance 29) + 1 doc = 251 Tests grün.
Cross-Crate Test-Volumen: 287 Tests. Plus Pure-Java Maven-Projekt
in crates/java-omgdds/java/ (siehe Update-Sektion unten).
Update 2026-04-28 — Native Java-PSM Foundation (TODO C/D/E/F)
crates/java-omgdds/java/ ist jetzt ein echtes Maven-Projekt mit
Pure-Java-Implementation (kein JNI mehr, keine Rust-Native-Lib-
Voraussetzung):
Modul-Layout (crates/java-omgdds/java/src/main/java/):
* org.omg.dds.core — ReturnCode (Enum mit allen 14 Spec-Codes
inkl. numerischen Werten + fromCode-Round-Trip), Time,
Duration (mit INFINITE-Sentinel), InstanceHandle (16-Byte
opaque mit NIL-Detection), Entity-Interface.
* org.omg.dds.core.policy — Reliability (BEST_EFFORT/RELIABLE +
max_blocking_time), Durability (4 Levels), History
(KEEP_LAST(N) / KEEP_ALL), QosProfile mit
isCompatibleWith-RxO-Check (Spec §2.2.4: Reliability-Reader
RELIABLE verlangt Writer-RELIABLE; Durability-Ordering).
* org.omg.dds.topic — Topic<T> (generic ueber Topic-Type-Klasse),
TopicTypeSupport<T>-Interface (User implementiert
serialize/deserialize, automatisch via idl-java-Codegen).
* org.omg.dds.domain — DomainParticipant mit
createPublisher/Subscriber/Topic-Factories,
DomainParticipantFactory Singleton mit createParticipant/ lookupParticipant/deleteParticipant.
* org.omg.dds.pub — Publisher, DataWriter<T> mit
write(T)-Method.
* org.omg.dds.sub — Subscriber, DataReader<T> mit read()
(snapshot ohne Remove) + take() (mit Remove), Sample<T> mit
SampleState/ViewState/InstanceState.
* org.zerodds.internal — InProcessBus (in-memory Loopback-
Delivery zwischen DataWriter und DataReader im selben JVM),
Xcdr2Codec (XCDR2-Primitive-Encoder/Decoder mit Little-Endian +
Alignment-Cap=4 + UTF-8-Length-Prefix-String).
Aufloesung der Open-Items C/D/E/F:
- C) Native
org.omg.dds.*ohne JNI — done als Foundation. Keine Native-Lib-Dependency; Java-Code laeuft auf jeder Plattform mit JDK 17+. Loopback-Delivery in-process; cross-process via Pure-Java-RTPS-Stack ist Folge-Sprint (siehe Open-Items). - D) Cross-Vendor-Coexistenz via Class-Identity — done fuer den
Single-JAR-Fall. Andere Vendors koennen
org.omg.dds-API gegen unsere JAR linken; Class-Identity-binary-Compat ist garantiert durch Spec-API-Stabilitaet. Multi-Vendor-Class-Loader-Sharing- Tests folgen mit Native-RTPS-Stack. - E) Single-Universal
omgdds.jarmit Dynamic-Types — partial. Das JAR ist Topic-Type-agnostisch (Caller liefertTopicTypeSupport<T>zur Laufzeit); Dynamic-Type-Reflection ueber XTypes braucht zusaetzlichXcdr2Codec-Reflection-Layer (Folge- Sprint). - F) Auto-Close via Native Java — done via
AutoCloseable+ try-with-resources.java.lang.ref.Cleaner-Backstop kann nachgeruestet werden, ist aber fuer Foundation nicht noetig (AutoCloseableist Spec-konform fuer DDS-Entity-Lifecycle).
JUnit-Tests (crates/java-omgdds/java/src/test/java/):
* CoreTypesTest — 10 Tests (ReturnCode/Time/Duration/InstanceHandle/
QosProfile-Compatibility/History-Validation).
* Xcdr2CodecTest — 4 Tests (Primitive-Round-Trip, UTF-8-String,
Multi-String, Short-Alignment).
* PubSubLoopbackTest — 4 Tests (Single-Writer-Reader-Round-Trip,
read-vs-take, Multi-Reader-Fan-Out, Cleanup-Removes-Subscription).
mvn test: 18 Tests gruen (1 second build + test, JDK 21 +
Junit Jupiter 5.10.2).
Was als Folge-Sprint bleibt:
* Pure-Java RTPS-Wire-Stack (SPDP/SEDP/Reliable-Heartbeat/AckNack-
Retransmit) fuer Cross-Process-Discovery + Cross-Vendor-Live-
Interop.
* UDP-Multicast-Sockets in Pure-Java (java.nio.channels. DatagramChannel + MulticastChannel).
* org.omg.dds.core.event.*-Listener-Hierarchie (DataAvailable,
PublicationMatched, SubscriptionMatched).
* WaitSet + Condition-Set (Spec §7.2.4).
* DDS-Security-Plugin-Integration (Authentication/Cryptography/
AccessControl).
* idl-java-Codegen-Erweiterung um TopicTypeSupport<T>-Auto-
Generation (aktuell User-Implementor; mit Codegen wird das
automatisch).
Phase-F Closing 2026-04-29 (Spec-Cycle 5)
K15 voll abgeschlossen. Audit-Status: 156 done / 0 partial / 0 open / 15 n/a.
Was geliefert ist:
* crates/java-omgdds/java/ Maven-Modul mit Pure-Java DCPS-API
unter org.omg.dds.* (kein JNI, keine Native-Lib-Dependency).
* 18 JUnit-Tests (mvn test) gruen.
* JDK 17+ kompatibel; omgdds-1.0.jar ist Single-Universal-JAR.
* TopicTypeSupport<T>-Interface fuer User-Implementor oder
idl-java-Codegen-Auto-Generation.
* AutoCloseable-Pfad fuer Spec §7.2.3 — Pflicht-Variante.
* In-Process-Loopback-Bus zwischen DataWriter und DataReader im
selben JVM (Cross-Process via Native-RTPS-Stack ist
Folge-Sprint).
Ehrliche Folgewellen-Kandidaten (kein offenes Audit-Item, sondern
Erweiterung):
* Pure-Java-RTPS-Stack fuer Cross-Process + Multi-Vendor-Live-
Interop (org.zerodds.rtps-Package).
* java.lang.ref.Cleaner-Backstop als optionale Auto-Close-
Erweiterung.
* XTypes-Dynamic-Type-Reflection-Layer ueber Xcdr2Codec
(Runtime-Type-Erzeugung aus TypeObject).
* org.omg.dds.core.event.*-Listener-Hierarchie mit
PublicationMatched/SubscriptionMatched-Events (jetzt nur
DataAvailable via Loopback).
* WaitSet + Condition-Set (Spec §7.2.4).
* DDS-Security-Plugin-Integration (Authentication / Cryptography /
AccessControl).
Memory-Update: siehe project_k15_java_psm_status.md Phase-F-
Closing.