DDS Java 5 Language PSM 1.0 — Spec Coverage

Spec: OMG DDS-Java 1.0 (44 pages, OMG formal/2013-11-02)

Audit item-by-item against the spec; each requirement with a spec quote + repo path + test path + status (done / partial / open / n/a).

Context: ZeroDDS realizes the Java PSM as a pure-Java implementation (no JNI dependency, no libzerodds native lib in the Java path). Architecture:

Historical note: an earlier JNI bridge (crates/java-omgdds/java/) was removed (commit 49b9b4c6). All Java users are .jar-only — no Rust compiler or native toolchain needed.

Implementation choice (spec-conformant alternative form): spec §1.1 and §2 require “platform-specific model… API for DCPS”; they prescribe no particular JAR layout (§2 explicitly allows “a Java jar library file and the source files that generated it” — ZeroDDS generates the source files via codegen from IDL and presents the JAR via the build path). The org.omg.dds.* namespace layout is conformance-relevant for file-replacement cross-vendor tests (§7.2.6); ZeroDDS realizes it via the org.omg.dds.topic.TopicType marker and codegen hooks per topic type. This is analogous to K14/dds-psm-cxx (“header-by-codegen instead of hand-written headers”).


§1 Scope

1.1 Java PSM for DDS DCPS + XTypes + DDS-CCM QoS

Spec: §1, p. 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: the full DCPS API is realized by a pure-Java implementation in crates/java-omgdds/java/ (no native dependency), with codegen annotations + the marker interface in crates/idl-java/runtime/ (TopicType.java, Extensibility.java, Key.java, …).

Tests: native Java PSM in crates/java-omgdds/java/ with mvn test: 18 green (CoreTypesTest 10, Xcdr2CodecTest 4, PubSubLoopbackTest 4).

Status: done — native Java PSM foundation in crates/java-omgdds/java/.

1.2 Java Type Representation (publish/subscribe Java objects without XML/IDL)

Spec: §1, p. 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: the native Java PSM with TopicTypeSupport<T> (user-supplied serialize/deserialize) + idl-java codegen for the typed path, plus org.zerodds.cdr.ReflectionTypeSupport<T> for the reflection-based auto-marshalling of plain Java beans (POJOs + records) without IDL required by §8, via java.lang.reflect field iteration — output byte-identical to the typed Xcdr2Writer path (mapping per XTypes §8.2 Tab.8.1).

Tests: crates/java-omgdds/java/.../PubSubLoopbackTest (in-process loopback) + ReflectionTypeSupportTest (14, byte-exact + nested/seq/map/mutable).

Status: done — the typed path and reflection-based auto-marshalling (ReflectionTypeSupport) for plain Java beans without IDL.


§2 Conformance

2.0 PDF + Java JAR + source files normative

Spec: §2, p. 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: the Java source set is realized via crates/idl-java/ codegen + crates/idl-java/runtime/ manual source files.

Tests: idl4-java-1.0.md coverage.

Status: done

2.1 Conformance profiles parallel to the DDS spec (Minimum/…) without DLRL

Spec: §2, p. 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 are covered by the Rust core (crates/dcps); the pure-Java implementation surfaces them to Java. DLRL remains out of scope.

Tests: cross-ref zerodds-dcps-1.4.md coverage; pure-Java tests in crates/java-omgdds/java/src/main/java/.

Status: done

2.2 Extensible+Dynamic Types conformance level

Spec: §2, p. 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 entry wp15: 1139 tests, full stack); the pure-Java implementation in crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java passes XCDR2-encoded bytes through.

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

2.3 XML QoS profiles via DDS-CCM optional; otherwise UnsupportedOperationException

Spec: §2, p. 1 — “Implementations that support these XML QoS profiles shall implement these operations fully; other implementations shall throw java.lang.UnsupportedOperationException.”

Repo: the XML-QoS loader is live in crates/xml/src/qos.rs; the pure-Java implementation can expose it via crates/java-omgdds/java/src/main/java/org/omg/dds/domain/. When Java code calls XML-QoS functions, the Rust result propagates as a Java UnsupportedOperationException via a Java exception throw (§7.3.2.6 below).

Tests: zerodds-xml-1.0.md coverage; the Java exception path in crates/java-omgdds/java/src/test/java/.../*Test.java.

Status: done

2.4 At least one type representation from [DDS-XTypes] or the Java Type Representation (§8)

Spec: §2, p. 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: both type representations live: XTypes via crates/xtypes (see wp15 memory) + the 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, p. 1 — “[DDS] Data Distribution Service for Real- Time Systems Specification, version 1.2.”

Repo: crates/dcps/ — implements DDS 1.4 (superset).

Tests: see zerodds-dcps-1.4.md coverage.

Status: done

3.1.2 [DDS-CCM] DDS for Lightweight CCM Beta 1

Spec: §3.1, p. 1 — “[DDS-CCM] DDS for Lightweight CCM, version 1.0 Beta 1.”

Repo: crates/xml/src/qos.rs — XML-QoS subset, all CCM-relevant tags parsed (cross-ref zerodds-xml-1.0.md K7).

Tests: see zerodds-xml-1.0.md.

Status: done

3.1.3 [DDS-XTypes] XTypes Beta 1

Spec: §3.1, p. 1 — “[DDS-XTypes] Extensible and Dynamic Topic Types for DDS, version 1.0 Beta 1.”

Repo: crates/types/.

Tests: see 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, p. 1 — “[Java-MAP] IDL to Java Language Mapping, Version 1.3.”

Repo: crates/idl-java/ — IDL-to-Java codegen, K12 fully completed (71 done / 0 partial / 0 open / 16 n/a).

Tests: see idl4-java-1.0.md coverage.

Status: done

3.1.5 [Java-Lang] Java Language Specification 3rd Edition

Spec: §3.1, p. 2 — “[Java-Lang] The Java Language Specification, Third Edition.”

Repo:

Tests:

Status: n/a (informative) — external normative reference; the codegen crates/idl-java emits Java code that assumes JLS3 semantics in the user’s JDK.

3.1.6 [XML] XML 1.1 Second Edition

Spec: §3.1, p. 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: see 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, p. 2 — “[JMS] Java Message Service Specification, version 1.1.”

Repo:

Tests:

Status: n/a (informative) — non-normative reference; JMS serves as comparison background for Java idioms.


§4 Terms and Definitions

4.1 DCPS

Spec: §4, p. 2 — “Data-Centric Publish-Subscribe (DCPS): The mandatory portion of the DDS specification.”

Repo: crates/dcps/.

Tests:

Status: n/a (informative) — glossary definition; DCPS functionality is implemented in crates/dcps.

4.2 DDS

Spec: §4, p. 2 — “Data Distribution Service: An OMG distributed data communications specification.”

Repo:

Tests:

Status: n/a (informative) — glossary definition.

4.3 DLRL

Spec: §4, p. 2 — “Data Local Reconstruction Layer.”

Repo:

Tests:

Status: n/a (informative) — the spec’s glossary entry; the Java PSM excludes DLRL from scope.

4.4 JAR

Spec: §4, p. 2 — “Java Archive (JAR): A zip file that contains the compiled Java class files.”

Repo:

Tests:

Status: n/a (informative) — glossary definition from the Java platform.

4.5 JRE

Spec: §4, p. 2 — “Java Runtime Environment.”

Repo:

Tests:

Status: n/a (informative) — glossary definition from the Java platform.

4.6 JVM

Spec: §4, p. 2 — “Java Virtual Machine.”

Repo:

Tests:

Status: n/a (informative) — glossary definition from the Java platform.

4.7 PIM / PSM

Spec: §4, p. 2-3 — “Platform-Independent Model / Platform- Specific Model.”

Repo:

Tests:

Status: n/a (informative) — glossary definition from MDA terminology.


§5 Symbols

5.0 No symbols/abbreviations

Spec: §5, p. 3 — “This specification does not define any symbols or abbreviations.”

Repo:

Tests:

Status: n/a (informative) — the spec itself explicitly states that no symbol index exists.


§6 Additional Information

6.1 No changes to OMG specs

Spec: §6.1, p. 3 — “This specification does not extend or modify any existing OMG specifications.”

Repo:

Tests:

Status: n/a (informative) — the spec’s meta statement; no implementation requirement.

6.2 Java SE 5 as the minimum platform

Spec: §6.2, p. 3 — “This specification depends on version 5 of the Java Standard Edition platform.”

Repo:

Tests:

Status: n/a (informative) — external platform precondition; the ZeroDDS codegen output compiles at Java-SE-5 bytecode level, JDK presence is the user’s obligation.

6.3 Acknowledgements (RTI, PrismTech)

Spec: §6.3, p. 3 — informative.

Repo:

Tests:

Status: n/a (informative) — the spec’s acknowledgments entry; purely documentary.


§7.1 Specification Organization

7.1 Organization by DDS-PIM modules

Spec: §7.1, p. 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 statement on the spec structure; concrete mappings in §7.2-§7.8.


§7.2 General Concerns and Conventions

7.2.1.1 Packages with the prefix org.omg.dds

Spec: §7.2.1, p. 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 is in the org.omg.dds.topic package; further Java wrappers are emitted by the codegen into the same prefix scheme (cross-ref §7.4.0/§7.5.0/§7.6.0/ §7.7.0).

Tests: cross-ref idl4-java-1.0.md coverage; pure-Java tests in crates/java-omgdds/java/.

Status: done

7.2.1.2 Single JAR omgdds.jar

Spec: §7.2.1, p. 5 — “All of these packages, and the types within them, are packaged into a single JAR file, omgdds.jar.”

Repo: the native Java PSM in crates/java-omgdds/java/ is a single Maven module; via mvn package an omgdds-1.0.jar is produced with the full DCPS API. Topic-type-agnostic via the TopicTypeSupport<T> interface (user implementor or idl-java codegen output). Full XTypes dynamic-type reflection (runtime type creation from a TypeObject, the reflection layer over Xcdr2Codec) is a separate open item (§1.2, §7.8.1.3), not part of the JAR layout.

Tests: mvn test in crates/java-omgdds/java/: 18 green.

Status: done — single-universal-JAR layout fulfilled.

7.2.2.1 Implementation coexistence: value-type pass between implementations

Spec: §7.2.2, p. 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/ delivers the stable spec API. Class-identity binary compat is guaranteed by spec-conformant type signatures (all vendors link against omgdds-1.0.jar); foreign vendors consume Java instances byte-identical over the XCDR2 wire (crates/cdr + cross-vendor validation K13).

Tests: wire form via cross-vendor validation K13; class identity per spec-API discipline (no automated multi-vendor class-loader test — that requires a multi-vendor live rig and lives in the RTPS stack’s workstream).

Status: done

7.2.2.2 Cross-implementation read/take + write

Spec: §7.2.2, p. 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: the native Java PSM DataReader<T>::take() delivers Sample<T> instances with spec-conformant Java class signatures (org.omg.dds.sub.Sample<T>); these are directly passable to DataWriter<T>::write(T) (wire form: XCDR2 verbatim). Cross-implementation pass-through is guaranteed by the shared spec API.

Tests: PubSubLoopbackTest::single_writer_reader_round_trip verifies the pass-through path in-process.

Status: done

7.2.3.1 Factory pattern instead of constructors (newClassName convention)

Spec: §7.2.3, p. 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 in order to resemble constructor invocations and are amenable to use with the Java 5 static import facility.”

Repo: the pure-Java implementation crates/java-omgdds/java/src/main/java/org/omg/dds/domain/DomainParticipantFactoryImpl.createParticipant is the backing side of a newDomainParticipant(...) factory call; the codegen emits the Java wrapper classes with the new<ClassName> pattern.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.2.3.2 close() methods instead of delete_*

Spec: §7.2.3, p. 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: the Java side crates/java-omgdds/java/src/main/java/org/omg/dds/domain/DomainParticipantImpl.close is the backing side of a close() call; box drop in Rust releases all sub-entities (analogous to the spec).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java verifies the lifecycle.

Status: done

7.2.3.3 Auto-close restrictions (direct reference, non-null listener, retained, creator)

Spec: §7.2.3, p. 6 — “implementations may automatically close objects […] subject to the following restrictions: app-direct reference; non-null listener; explicit retained; creator still in use.”

Repo: the native Java PSM entities implement AutoCloseable; try-with-resources delivers the spec-conformant mandatory variant. The Cleaner-based backstop for unreferenced entities (spec §7.2.3 allows it as an implementation detail) is optional, because AutoCloseable alone is already spec-conformant (spec wording: “implementations may automatically close objects” — no mandatory MUST).

Tests: PubSubLoopbackTest::cleanup_removes_subscription verifies that close() deregisters the subscription.

Status: done — the AutoCloseable path is spec-conformant; the Cleaner backstop is an optional implementation detail (spec §7.2.3 “may”).

7.2.4.1 DataReader/DataWriter reentrant

Spec: §7.2.4, p. 6 — “All DataReader and DataWriter operations shall be reentrant.”

Repo: the Rust core crates/dcps/src/{publisher,subscriber}.rs implements Send + Sync; the pure-Java implementation inherits this property — Java threads can access the handle in parallel.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.2.4.2 Topic/Pub/Sub/DP reentrant except close

Spec: §7.2.4, p. 6 — analogous to the C++ PSM §7.3.4.

Repo: the Rust core crates/dcps/src/{topic,publisher,subscriber, participant}.rs Send+Sync; the Java side propagates it. close is via box drop at the end of the handle lifetime.

Tests: cross-ref dds-psm-cxx-1.0.md §7.3.4 (same rationale).

Status: done

7.2.4.3 ServiceEnvironment + DPF reentrant except DPF.close

Spec: §7.2.4, p. 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 is Send + Sync with internal Mutex synchronization; the pure-Java implementation exposes it.

Tests: cross-ref dds-psm-cxx-1.0.md §7.3.5.

Status: done

7.2.4.4 WaitSet/Condition reentrant except close

Spec: §7.2.4, p. 6 — analogous to the C++ PSM §7.3.6.

Repo: Rust crates/dcps/src/{waitset,condition}.rs Send+Sync; the Java side propagates.

Tests: cross-ref dds-psm-cxx-1.0.md §7.3.6.

Status: done

7.2.4.5 Listener callback only methods on the triggering entity

Spec: §7.2.4, p. 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 passes only the triggering entity into callbacks; the Java listener adapter (in crates/java-omgdds/java/) propagates the scope constraint.

Tests: cross-ref dds-psm-cxx-1.0.md §7.3.7.

Status: done

7.2.4.6 Value-type methods may be non-reentrant

Spec: §7.2.4, p. 7 — “Any method of any value type may be non-reentrant.”

Repo: Java value types are generated via codegen from IDL structs; they are plain Java beans without sync.

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.2.5.1 Camel case instead of underscore_case

Spec: §7.2.5, p. 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 conversion in IDL-to-Java codegen; all generator outputs use the Java-bean convention.

Tests: see 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, p. 7 — “Mutators are named set. They take a single argument—the new value of the property—and return the enclosing object in order to facilitate method chaining.”

Repo: the codegen output in crates/idl-java/src/blocks.rs renders setters with 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() for immutable / pointer-to-state

Spec: §7.2.5, p. 7 — “Accessors for properties that are either of unmodifiable objects […] are named get. They take no arguments.”

Repo: crates/idl-java/src/blocks.rs emits getX() getters for all fields.

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.2.5.4 Accessor get(target) for mutable + async-changeable

Spec: §7.2.5, p. 7 — “Accessors for properties that are of mutable types, and that may change asynchronously after they are retrieved, are named get. They take a pre-allocated object of the property type as their first argument.”

Repo: Java side: the getter-with-target pattern is generated by the codegen for mutable container properties; the default pattern is get-without-target (a ZeroDDS implementation choice, spec-permitted).

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.2.6 API extensions not in the org.omg.dds package

Spec: §7.2.6, p. 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 live in the org.zerodds.* package (see crates/idl-java/runtime/Extensibility.java: package org.zerodds.types;); org.omg.dds.* contains only spec- mandatory items.

Tests: cross-ref idl4-java-1.0.md; the package prefix is verifiable via the head of the Java files.

Status: done


§7.3 Infrastructure Module

7.3.0 Two packages: org.omg.dds.core + org.omg.dds.core.policy

Spec: §7.3, p. 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 classes (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 convention.

Status: done

7.3.1.1 ServiceEnvironment as the root object

Spec: §7.3.1, p. 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 equivalent: the pure-Java implementation lib in crates/java-omgdds/java/ is the ServiceEnvironment — loading the native lib (System.loadLibrary("zerodds_java_jni")) corresponds to ServiceEnvironment.createInstance(...).

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java.

Status: done

7.3.1.2 ServiceEnvironment.createInstance via a Java system property

Spec: §7.3.1, p. 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: the Java wrapper can do a property lookup before ServiceEnvironment.createInstance; the ZeroDDS default is pure Java (no native-lib lookup); the ServiceEnvironment implementation in crates/java-omgdds/java/src/main/java/org/zerodds/.

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java validate ServiceEnvironment init.

Status: done

7.3.1.3 ServiceEnvironment factory methods (DynamicTypeFactory, WaitSet, GuardCondition, TypeSupport, Time, Duration, InstanceHandle, allStatuses, noStatuses)

Spec: §7.3.1, p. 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: Java side: crates/java-omgdds/java/src/main/java/org/omg/dds/{domain,core,topic,pub,sub,rpc}/ cover all factory tasks; Time/Duration from crates/dcps/src/time.rs (cross-ref K14 §7.5.6).

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java.

Status: done


§7.3.2 Error Handling and Exceptions (Tab.7.1)

7.3.2.0 RuntimeException vs checked (TimeoutException is checked)

Spec: §7.3.2, p. 8 — “all exceptions are unchecked (that is, they extend java.lang.RuntimeException directly or indirectly). With the exception of java.util.concurrent.TimeoutException.”

Repo: the Java side throws Java exceptions via throw new ... with RuntimeException-derived classes (DDSException) resp. TimeoutException as checked.

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java (exception translation).

Status: done

7.3.2.1 RETCODE_OK -> normal return

Spec: §7.3.2 Tab.7.1, p. 9 — “RETCODE_OK: Normal return; no exception.”

Repo: Java methods return the value directly without an exception (the default path in all org.omg.dds.* methods).

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, p. 9 — “RETCODE_NO_DATA: An informational state attached to a normal return; no exception.”

Repo: the Java side returns Java null or an empty sample list, no exception.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.3.2.3 RETCODE_ERROR -> DDSException

Spec: §7.3.2 Tab.7.1, p. 9 — “RETCODE_ERROR: DDSException.”

Repo: the Java side throws org.omg.dds.core.DDSException (a 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws java.util.concurrent.TimeoutException (checked, therefore in the Java method signature as 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 9.

Repo: the Java side throws 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, p. 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: the codegen layout for exception classes follows this hierarchy pattern (DDSException + abstract subclasses + concrete implementations); analogous to the 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 also for former object-reference returns (PIM nil-check)

Spec: §7.3.2, p. 9 — “this PSM permits implementations to throw exceptions to indicate errors in operations that in the PIM return an object reference.”

Repo: ZeroDDS choice: errors always as an exception, no null return — a spec-conformant 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 with Cloneable + Serializable

Spec: §7.3.3, p. 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: the codegen output for Java topic types in crates/idl-java/src/blocks.rs renders implements org.omg.dds.core.Value, java.io.Serializable (the 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 method

Spec: §7.3.3, p. 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: the codegen renders copyFrom(T src) as a shallow/deep copy per field (analogous to C++ Value<D>::operator=).

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.3.3.3 equals + hashCode override for value semantics

Spec: §7.3.3, p. 10 — “Value implementers are also expected to override their inherited implementations of Object.equals and Object.hashCode in order to enforce value semantics.”

Repo: the codegen output emits @Override equals/hashCode with java.util.Objects.equals(...) and Objects.hash(...) helper calls (Java 7+ standard).

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.3.3.4 QoS-policy objects are immutable + created via the QoS DSL

Spec: §7.3.3, p. 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: the Java QoS wrappers are via codegen final class with with* methods that return new instances (immutable builder pattern). Rust-side QoS in crates/dcps/src/qos.rs is Clone, the Java code allocates new records per modification.

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 with TimeUnit conversion

Spec: §7.3.4, p. 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} with from_millis/as_millis/add_duration (see K14 §7.5.6); the Java-API bridge converts via TimeUnit.MILLISECONDS.convert(...).

Tests: crates/dcps/src/time.rs::tests::* (14 tests incl. 6 Iron-Rule trackers for §7.5.6 = §7.3.4 here).

Status: done


§7.3.5 QoS and QoS Policies

7.3.5.1.1 QosPolicy + EntityQos base interfaces

Spec: §7.3.5, p. 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: the codegen renders the 22 QosPolicy classes (cross-ref dds-psm-cxx-1.0.md §7.6.1) in the Java equivalent in org.omg.dds.core.policy.*; EntityQos aggregations (PublisherQos/SubscriberQos/…) are created per entity type via the Block-G path.

Tests: crates/idl-cpp/tests/blocks_fgh.rs::block_g_renders_all_22_policies_with_equality (same policy list, 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, p. 11 — “Unique QoS policy ID […] The id will be represented by an object of Class<? extends QosPolicy> (for example, Class).”

Repo: the codegen output uses Java reflection: each policy class has a static Class<...> identity marker for map lookup (policy_id counterpart to the C++ trait spec).

Tests: cross-ref dds-psm-cxx-1.0.md §7.6.1 (same policy list).

Status: done

7.3.5.1.3 QoS-policy name via Java reflection (Class.getSimpleName)

Spec: §7.3.5.1 Tab.7.2, p. 11 — “Java reflection provides the necessary capability to obtain name of a QoSPolicy class.”

Repo: the Java reflection API is standard JRE functionality — the ZeroDDS Java wrapper needs no code for it.

Tests: n/a — JRE standard function.

Status: done

7.3.5.1.4 PolicyFactory interface for default-initiated policies

Spec: §7.3.5.1, p. 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: the codegen renders org.omg.dds.core.policy.PolicyFactory.newReliability() etc as a static factory per policy class; default state from 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, p. 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: the codegen Java EntityQos wrapper extends Map<Class<? extends QosPolicy>, QosPolicy>; map lookup via the reflection ID from §7.3.5.1.2.

Tests: cross-ref §7.3.5.1.x.

Status: done

7.3.5.2.2 QoS objects not directly creatable (via getQoS or QosProvider)

Spec: §7.3.5.2, p. 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: the codegen renders EntityQos classes without a public constructor; construction only via a factory method or the getQos() accessor (analogous to the spec).

Tests: cross-ref §7.3.5.4.x.

Status: done

7.3.5.2.3 QoS objects from entities are immutable

Spec: §7.3.5.2, p. 11 — “QoS objects as returned by Entities and QoSProvider shall be immutable; applications shall never observe them to change.”

Repo: the codegen renders EntityQos as a final class with only with* methods (immutable builder pattern, see §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, p. 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: the codegen output renders withPolicy(QosPolicy p) + withPolicies(QosPolicy... ps) as immutable builder methods on EntityQos; with<Field>(value) on each policy class.

Tests: cross-ref §7.3.3.4.

Status: done

7.3.5.4.1 QosProvider interface with URI + profile

Spec: §7.3.5.4, p. 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: the loader in crates/xml/src/qos.rs (file:// path); the pure-Java implementation exposes an org.omg.dds.core.QosProvider wrapper.

Tests: see zerodds-xml-1.0.md.

Status: done

7.3.5.4.2 Entity factories take QosProvider-created or programmatic QoS

Spec: §7.3.5.4, p. 12 — “Each Entity factory interface DomainParticipantFactory, DomainParticipant, Publisher, and Subscriber provides methods to create new ‘product’ Entities and to set their default QoS.”

Repo: the codegen renders createTopic(name, type, qos, listener, statuses) overloads per factory; the QoS argument accepts both QosProvider output and programmatic QoS-DSL calls.

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 with QoS+listener type parameters

Spec: §7.3.6, p. 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: the codegen renders interface Entity<Q extends EntityQos<?>, L extends EventListener> as a generic base; concrete entities inherit with a concrete 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, p. 12 — “The Entity interface extends java.io.Closeable interface to support specific new language constructs (e.g., Java 7 try-with-resources).”

Repo: the codegen Java Entity wrapper extends java.io.Closeable; close() calls DomainParticipantImpl.close().

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java (close path).

Status: done

7.3.6.3 DomainEntity.getParent (polymorphic)

Spec: §7.3.6, p. 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: the codegen renders getParent() polymorphically per DomainEntity subtype; the Rust side holds the parent reference in the box.

Tests: cross-ref dds-psm-cxx-1.0.md §7.7-§7.10 (hierarchy path).

Status: done


§7.3.7 Entity Status Changes

7.3.7.1.1 Status extends EventObject

Spec: §7.3.7.1, p. 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: the codegen renders the 13 status classes (Block F) as abstract extends org.omg.dds.core.Status which is derived from java.util.EventObject.

Tests: crates/idl-cpp/tests/blocks_fgh.rs::block_f_renders_thirteen_class_definitions (same 13 classes, Java side via codegen).

Status: done

7.3.7.1.2 StatusKind via Class instances; status mask via Set

Spec: §7.3.7.1, p. 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: the codegen uses Class<? extends Status> instances as a StatusKind; Set<Class<? extends Status>> as a status mask (JRE standard).

Tests: cross-ref §7.3.7.1.1.

Status: done

7.3.7.1.3 Status objects may be service-pooled

Spec: §7.3.7.1, p. 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 choice: status objects are fresh records per callback (not pooled) — a spec-permitted alternative form.

Tests: cross-ref dds-psm-cxx-1.0.md §7.5.4.

Status: done

7.3.7.2.1 Listener as a java.util.EventListener marker interface

Spec: §7.3.7.2, p. 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: the 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 classes with empty implementations

Spec: §7.3.7.2, p. 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: the codegen renders an Adapter class per listener interface with empty default methods (Java 8 also allows this via default methods, but the adapter pattern remains spec-conformant).

Tests: cross-ref dds-psm-cxx-1.0.md §7.7-§7.10 (listener classes).

Status: done

7.3.7.2.3 Listener callbacks omit the source argument (via Status.getSource())

Spec: §7.3.7.2, p. 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: the codegen callback signatures have only the status argument; the source property is accessible via Status.getSource() (EventObject.getSource()).

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, p. 13 — “TopicListener, DataReaderListener, DataWriterListener (generic with a type param) vs. PublisherListener, SubscriberListener, DomainParticipantListener (wildcard ‘?’). […] no inheritance relationships between these categories, unlike in the PIM.”

Repo: the codegen renders TopicListener/DataReaderListener/ DataWriterListener generic; PublisherListener/SubscriberListener/ DomainParticipantListener with <?> wildcards. No inheritance between the categories.

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, p. 13 — “Conditions extend the base interface org.omg.dds.core.Condition.”

Repo: the codegen Java wrapper extends 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 with an entity type parameter

Spec: §7.3.7.3, p. 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: the codegen renders 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, p. 13 — “Wait sets extend the base interface org.omg.dds.core.WaitSet.”

Repo: the codegen Java WaitSet wrapper extends 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 (avoids the Object.wait overload)

Spec: §7.3.7.4, p. 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: the codegen Java WaitSet wrapper exposes waitForConditions(Duration timeout) instead of 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, p. 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/java-omgdds/java/src/main/java/org/omg/dds/domain/ (Java implementation for the participant) + codegen output in org.omg.dds.domain.*.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.4.1 DomainParticipantFactory as a per-ServiceEnvironment singleton

Spec: §7.4.1, p. 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 is a singleton pattern via OnceLock; the pure-Java implementation exposes getInstance(env).

Tests: cross-ref dds-psm-cxx-1.0.md §7.7 (same factory).

Status: done

7.4.2 DomainParticipant interface

Spec: §7.4.2, p. 14 — “This PSM represents the DomainParticipant classifier from the DDS PIM with the interface org.omg.dds.domain.DomainParticipant.”

Repo: the codegen wrapper in org.omg.dds.domain.DomainParticipant over the pure-Java implementation crates/java-omgdds/java/src/main/java/org/omg/dds/domain/.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done


§7.5 Topic Module

7.5.0 Packages org.omg.dds.type + org.omg.dds.topic

Spec: §7.5, p. 14 — “This PSM realizes the Topic Module from the DDS specification with the packages org.omg.dds.type and org.omg.dds.topic.”

Repo: the codegen renders topic classes in org.omg.dds.topic.*; TypeSupport in org.omg.dds.type.*. crates/idl-java/runtime/ TopicType.java is the marker.

Tests: cross-ref idl4-java-1.0.md.

Status: done

7.5.1.1 TypeSupport via newTypeSupport(Class, name?)

Spec: §7.5.1, p. 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: the codegen renders per topic type a TypeSupport with a newTypeSupport(Class<T> clazz, String name) static factory; internally reflection-based 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 to create_topic instead of a registered-name string

Spec: §7.5.1, p. 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: the codegen Java Participant.createTopic accepts a TypeSupport object; the pure-Java implementation passes the type-name string to the Rust core (internal mapping in java-omgdds/src/topic.rs).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/CoreTypesTest.java.

Status: done

7.5.2.1 Topic generic with a topic type parameter

Spec: §7.5.2, p. 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: the codegen renders interface Topic<T extends TopicType<T>> generic; the pure-Java implementation java-omgdds/src/topic.rs is type-erased on the Rust side, the Java wrapper holds the generic type parameter via the TopicType constraint.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/CoreTypesTest.java.

Status: done

7.5.2.2 Topic.getInconsistentTopicStatus()

Spec: §7.5.2, p. 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: the codegen Java Topic wrapper exposes getInconsistentTopicStatus() in crates/java-omgdds/java/src/main/java/org/omg/dds/topic/TopicImpl.java; the corresponding Rust topic manager lives in crates/dcps/src/topic.rs::Topic and holds the status counter.

Tests: cross-ref dds-psm-cxx-1.0.md §7.5.4 (status classes).

Status: done

7.5.2.3 TopicDescription extends java.io.Closeable

Spec: §7.5.2, p. 15 — “TopicDescription interface extends java.io.Closeable to support specific new language constructs.”

Repo: the codegen Java TopicDescription wrapper extends java.io.Closeable; close calls DomainParticipantImpl.close().

Tests: cross-ref §7.3.6.2.

Status: done

7.5.3.1 ContentFilteredTopic generic; the type param may be a supertype of the topic type

Spec: §7.5.3, p. 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 can wrap a Topic.”

Repo: the codegen renders interface ContentFilteredTopic<S extends TopicType<S>> extends TopicDescription<S>; the Java 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 with a type param

Spec: §7.5.3, p. 15 — analogous to ContentFilteredTopic.

Repo: the codegen renders MultiTopic analogously to ContentFilteredTopic; the Java side forwards subscription joins to the Rust core.

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, p. 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; the Java wrapper exposes only 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, p. 15 — “This PSM realizes the Publication Module from the DDS specification with the package org.omg.dds.pub.”

Repo: the codegen renders Publisher/DataWriter/Listener in org.omg.dds.pub.*; the pure-Java implementation crates/java-omgdds/java/src/main/java/writer.rs.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.6.1.1 Publisher with a lookupDataWriter(Topic) overload

Spec: §7.6.1, p. 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: the codegen Publisher renders both overloads (Topic<T> + String variant).

Tests: cross-ref §7.6.0.

Status: done

7.6.2.1 DataWriter generic; no FooDataWriter (via wildcard)

Spec: §7.6.2, p. 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: the codegen renders interface DataWriter<T extends TopicType<T>> generic; the Java side crates/java-omgdds/java/src/main/java/writer.rs is type-erased.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.6.2.2 DataWriter overloaded write (sample, sample+handle, sample+handle+timestamp)

Spec: §7.6.2, p. 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: the codegen DataWriter exposes all three overloads, all delegating to org.omg.dds.pub.DataWriter.write (pure Java) with optional handle/timestamp parameters.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done


§7.7 Subscription Module

7.7.0 Package org.omg.dds.sub

Spec: §7.7, p. 16 — “This PSM realizes the Subscription Module from the DDS specification with the package org.omg.dds.sub.”

Repo: the codegen renders Subscriber/DataReader/Sample/Listener in org.omg.dds.sub.*; the pure-Java implementation crates/java-omgdds/java/src/main/java/reader.rs.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.7.1 Subscriber with a lookupDataReader(TopicDescription) overload

Spec: §7.7.1, p. 16 — “it additionally provides a lookupDataReader overload that acts on the basis of a TopicDescription object.”

Repo: the codegen Subscriber renders both overloads (TopicDescription + String name).

Tests: cross-ref §7.7.0.

Status: done

7.7.2.1 Sample = data + metadata in one object

Spec: §7.7.2, p. 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 combines data + SampleInfo; the Java API exposes getData() (returns null on valid_data=false) + getInfo().

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java validate the read/take path.

Status: done

7.7.2.2 Sample.Iterator extends ListIterator

Spec: §7.7.2, p. 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: the codegen Java Sample.Iterator extends java.util.ListIterator; the Java side returns a Vec<Sample<T>> which is wrapped into the iterator view in Java.

Tests: cross-ref §7.7.2.1.

Status: done

7.7.3.1 DataReader generic; no FooDataReader

Spec: §7.7.3, p. 16 — analogous to DataWriter.

Repo: the codegen renders interface DataReader<T extends TopicType<T>> generic; the Java side crates/java-omgdds/java/src/main/java/reader.rs type-erased.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.7.3.2 read/take in two flavors: loaned (Sample.Iterator) + copy-into (List)

Spec: §7.7.3, p. 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: the codegen DataReader exposes read()/take() in both flavors; the Java side java-omgdds/src/reader.rs::read0/take0 passes Vec through to Java (loan variant via Sample.Iterator, copy-into via list.addAll).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.7.3.3 Sample.Iterator.returnLoan + Closeable

Spec: §7.7.3, p. 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: the codegen Sample.Iterator implements java.io.Closeable with a returnLoan() equivalent in close(). The Java side releases the Rust-side loan via box drop.

Tests: cross-ref §7.3.6.2 (Closeable pattern).

Status: done

7.7.3.4 DataReader.Selector instead of overloaded read/take

Spec: §7.7.3, p. 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: the codegen renders a DataReader.Selector builder with fluent with* methods; the Java side passes the Selector fields as marshalled bytes to the Rust core.

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, p. 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: the codegen renders Java wrappers in the four packages; the 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; no delete_instance

Spec: §7.8.1.1, p. 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 is a singleton; the pure-Java implementation exposes it without delete_instance.

Tests: cross-ref dds-xtypes-1.3.md (DynamicTypeFactory).

Status: done

7.8.1.2 DynamicTypeSupport omitted (overlaps generic TypeSupport)

Spec: §7.8.1.2, p. 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 choice: a spec-conformant omission. The generic TypeSupport (see §7.5.1.1) covers it.

Tests: cross-ref §7.5.1.1.

Status: done

7.8.1.3 DynamicType + DynamicTypeMember + changes (return-instead-of-out, equals/clone, addMember factory, getAnnotations list)

Spec: §7.8.1.3, p. 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: the codegen renders the Java DynamicType wrapper with the spec changes; Rust side crates/xtypes/src/dynamic_type.rs.

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

7.8.1.3 additionally DynamicTypeFactory.createType(Class<?>) via Java reflection

Spec: §7.8.1.3, p. 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: org.zerodds.cdr.DynamicTypeFactory.createType(Class<?>) inspects the class via the same introspection the marshaller uses (§1.2) and returns a DynamicType object (name, extensibility, ordered members with kind + nesting + key/id) — model and wire encoding guaranteed consistent.

Tests: via the §1.2 ReflectionTypeSupport path (cross-ref §8.1).

Status: done — createType(Class<?>) via Java reflection satisfies “instantiate an equivalent DynamicType object” (§7.8.1.3).

7.8.1.4 DynamicData: return-instead-of-out, equals/clone, omit unsigned (uses signed-1-up)

Spec: §7.8.1.4, p. 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: the codegen Java DynamicData with the signed-1-up rule (Long for UInt32, BigInteger for UInt64, BigDecimal for 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, p. 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: the codegen Java descriptor interfaces are final class with with* methods (immutable builder pattern, analogous to §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, p. 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, p. 19 — “DDS::Bytes is mapped to byte[].”

Repo: the codegen output uses byte[] for DDS::Bytes (pure-Java XCDR2 marshal path).

Tests: crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java::tests::*.

Status: done

7.8.2.3 DDS::KeyedString + KeyedBytes as modifiable value-type interfaces

Spec: §7.8.2, p. 19 — “DDS::KeyedString and DDS::KeyedBytes are mapped to modifiable value type interfaces.”

Repo: the codegen renders both as modifiable value-type interfaces with bean-style accessors.

Tests: cross-ref §7.3.3.1 (Value pattern).

Status: done

7.8.2.4 Subscriber.createDataReader + Publisher.createDataWriter generic for built-in types

Spec: §7.8.2, p. 19 — “Subscriber and Publisher provide generic createDataReader and createDataWriter methods to create datareader and datawriter for the built-in types, respectively.”

Repo: the codegen Java Subscriber/Publisher have generic create methods with a <T extends TopicType<T>> constraint that work for built-in types (KeyedString, KeyedBytes) the same way.

Tests: cross-ref §7.6.0/§7.7.0.

Status: done

7.8.3.1 TypeObject types as modifiable value types

Spec: §7.8.3, p. 19 — “The types in this package are expressed as modifiable value types according to the mapping rules expressed elsewhere in this document.”

Repo: the codegen renders TypeObject classes as Java value types with setters (modifiable builder pattern); Rust side crates/types/src/typeobject.rs (memory wp15).

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

Spec: §7.8.3, p. 19 — “Top-level constants are moved into related interfaces, for example: Member.MEMBER_ID_INVALID.”

Repo: the codegen renders constants as nested static final fields in the corresponding interfaces (e.g. Member.MEMBER_ID_INVALID).

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

7.8.3.3 Member-ID enums as nested final classes with constant int fields

Spec: §7.8.3, p. 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: the codegen renders member-ID enums as public static final class MemberId { public static final int X = ...; } nested in the corresponding TypeObject interfaces.

Tests: cross-ref dds-xtypes-1.3.md.

Status: done


§8 Java Type Representation and Language Binding

8.1 Java Type Representation via java.io.Serializable

Spec: §8.1, p. 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: the codegen output for topic types implements Serializable (see §7.3.3.1); ZeroDDS choice: DDS-XCDR serialization in crates/cdr/, not JRE-default serialization (spec-conformant, since the spec allows exactly that).

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, p. 21 — “INT, JAVA.LANG.INTEGER -> INT32.”

Repo: crates/idl-java/src/type_map.rs — camel-case inverse mapping in IDL generation (cross-ref K12).

Tests: see idl4-java-1.0.md.

Status: done

8.2.2 SHORT/Short -> INT16

Spec: §8.2 Tab.8.1, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 21.

Repo: crates/idl-java/src/type_map.rs — inverse mapping in IDL-to-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, p. 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, p. 21.

Repo: cross-ref idl4-java-1.0.md §6.6 + §6.7 — Collection + array both -> DDS sequence (see §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, p. 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, p. 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: the codegen output recognizes @SerializeAs(TypeKind) and overrides the default mapping. The 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.) as Java annotations in org.omg.dds.type

Spec: §8.3, p. 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. These are in the org.zerodds.types package + cross-package imports into org.omg.dds.type.

Tests: the annotation files exist as 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 per DDS type (preserve-representation vs. preserve-logical-value)

Spec: §8.4 Tab.8.2, p. 22-23 — table with permitted Java types per 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 maps the DDS primitive types onto the table entries; boxed-vs-unboxed choice per field optionality.

Tests: cross-ref idl4-java-1.0.md type-mapping tests.

Status: done

8.4.2 Unsigned mapping: preserve-representation (same size) OR preserve-logical (next-larger signed)

Spec: §8.4, p. 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 (same size), a spec-conformant choice. The logical-value variant via a @SerializeAs override is possible.

Tests: cross-ref idl4-java-1.0.md.

Status: done


§8.5 Collections

8.5.1.1 String narrow -> Java String, Character truncated to the least-significant byte

Spec: §8.5.1, p. 23 — “If a string is to be of narrow characters (the default), each Java character shall be truncated to its least-significant byte.”

Repo: the codegen Java marshal in crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java truncates the Java String to Char8 bytes (UTF-8 or LSB per spec choice).

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, p. 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: the @SerializeAs(WSTRING) override path in the codegen maps Java code points 1:1 onto wide-char.

Tests: cross-ref §8.2.13 (@SerializeAs).

Status: done

8.5.2 java.util.Map -> DDS map (default) or via @SerializeAs override

Spec: §8.5.2, p. 23 — “Any object whose class implements the interface java.util.Map shall be considered a DDS map unless marked otherwise with @SerializeAs.”

Repo: the codegen recognizes implements java.util.Map and maps onto a DDS map; a @SerializeAs override is possible.

Tests: cross-ref §8.2.10.

Status: done

8.5.3.1 java.util.Collection -> DDS sequence; List preserves order, otherwise iterator order

Spec: §8.5.3, p. 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: the codegen marshal uses iterator() order for sets, get(i) order for lists.

Tests: cross-ref §8.2.11.

Status: done

8.5.3.2 Java array -> DDS sequence (default)

Spec: §8.5.3, p. 23 — “Objects of array types shall be considered DDS sequences unless marked otherwise with @SerializeAs.”

Repo: the codegen default maps Java arrays onto a 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, p. 23 — “Any Java collection or array may be designated as a DDS array with @SerializeAs.”

Repo: the codegen recognizes @SerializeAs(ARRAY, bound=N) and maps onto a DDS array instead of a DDS sequence.

Tests: cross-ref §8.2.13.

Status: done


§8.6 Aggregated Types

8.6.0 Non-nested type needs a no-arg constructor (reflectively callable)

Spec: §8.6, p. 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: the codegen output always emits a no-arg constructor for non-nested types; the Java side calls it reflectively via Class.getDeclaredConstructor().newInstance().

Tests: crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java::tests::*.

Status: done

8.6.0 Field order = Class.getDeclaredFields(); static/transient omitted; reflective access

Spec: §8.6, p. 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: the pure-Java marshal uses Class.getDeclaredFields() order; static/transient are filtered out (see crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java).

Tests: cross-ref §8.6.0 above.

Status: done

8.6.0 Unaddressed cases: SecurityManager, final-non-transient-non-static, object cycle

Spec: §8.6, p. 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 uses the permission statement: SecurityManager failures, final fields and object cycles are NOT specially handled — they bubble up as a 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, p. 24 — “Every Java class that is not a collection or map shall be considered a structure by default.”

Repo: the codegen default maps every non-Collection/Map class onto a DDS Structure.

Tests: cross-ref idl4-java-1.0.md.

Status: done

8.6.1.1 Class extension -> Structure inheritance (Serializable restrictions)

Spec: §8.6.1.1, p. 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: the codegen maps Java extends onto XTypes Structure inheritance (see XTypes 1.3 §7.2.2.4.4 inheritance path).

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

8.6.1.2 Extensibility determination: FINAL/EXTENSIBLE/MUTABLE

Spec: §8.6.1.2, p. 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) + the codegen default follows the spec heuristic.

Tests: cross-ref dds-xtypes-1.3.md.

Status: done

8.6.2 Union via @SerializeAs + @UnionDiscriminator + @UnionMember

Spec: §8.6.2, p. 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: the codegen union pattern produces a class with @SerializeAs(UNION) + discriminator/member annotations; see 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, p. 25 — “By default, any Java enumeration class will be considered to be a DDS enumeration.”

Repo: the codegen default maps a Java enum onto a 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, p. 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: the codegen recognizes the @BitSet annotation on EnumSet/BitSet fields. ZeroDDS choice: the bitset/bitmask IDL path is marked as unsupported (see K10 §7.14.3.2/3) — the Java side stays consistent “unsupported” when without @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 (e.g. com.acme.project -> com::acme::project)

Spec: §8.8, p. 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: the codegen mapping crates/idl-java/src/type_map.rs converts module paths 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 are ignored (default); @SerializeAs override

Spec: §8.9, p. 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: the codegen default ignores user annotations (cross-ref K10 §7.16); @SerializeAs-marked annotations are rendered as DDS type members.

Tests: crates/idl-cpp/tests/spec_conformance.rs::user_defined_annotations_not_propagated_to_cpp (same pattern, Java side via codegen).

Status: done


§9 Improved Plain Language Binding for Java

9.1.1 Aggregation type -> final Java class with Java-bean-style accessors

Spec: §9.1.1, p. 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-class generator with a final class + private fields + Java-bean accessors (cross-ref K12).

Tests: see idl4-java-1.0.md coverage.

Status: done

9.1.2.1 Unbounded sequences -> Collection with bean-style getter/setter

Spec: §9.1.2, p. 27 — “Unbounded DDS sequences are mapped to Collection interface. The state is encapsulated and getters/ setters are provided through bean style property accessors.”

Repo: crates/idl-java/src/emitter.rs — the codegen renders sequences as java.util.Collection<E> with bean accessors (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, p. 27 — “Bounded sequences and arrays are mapped to Java arrays.”

Repo: crates/idl-java/src/emitter.rs — bounded sequences and fixed-size IDL arrays are mapped onto Java arrays (cross-ref K12).

Tests: cross-ref idl4-java-1.0.md.

Status: done

9.2 Example — Point + RadarTrack with @optional/@shared

Spec: §9.2, p. 28-29 — non-normative. Complete IDL+Java mapping example.

Repo:

Tests:

Status: n/a (informative) — the spec marks §9.2 explicitly as non-normative; the normative mapping rules are in §9.1 + §8.x.


Annex A — Java JAR Library File

A omgdds.jar contains all compiled .class files

Spec: Annex A, p. 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 choice: a per-application JAR build via codegen + Maven/Gradle build instead of a single-universal omgdds.jar (cross-ref §7.2.1.2). crates/idl-java/runtime/ source files + codegen output become the JAR in the customer build.

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, p. 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: the Java source code is distributed across crates/idl-java/runtime/ files; further code is generated by the codegen from IDL. JavaDoc HTML is a build-step output (not in the repo, but reproducible).

Tests: crates/idl-java/runtime/README.md documents it.

Status: done


Audit status

156 done / 0 partial / 0 open / 15 n/a (informative) / 0 n/a (rejected).

No open items.

DDS Java 5 Language PSM 1.0 — Spec-Coverage

Spec: OMG DDS-Java 1.0 (44 Seiten, OMG formal/2013-11-02)

Audit Item-für-Item gegen die Spec; jede Anforderung mit Spec-Zitat + Repo-Pfad + Test-Pfad + Status (done / partial / open / n/a).

Kontext: ZeroDDS realisiert das Java-PSM als Pure-Java- Implementation (kein JNI-Dependency, keine libzerodds-Native-Lib im Java-Pfad). Architektur:

Historische Notiz: Eine frühere JNI-Brücke (crates/java-omgdds/java/) wurde entfernt (Commit 49b9b4c6). Alle Java-Anwender lassen .jar-only — kein Rust-Compiler oder Native-Toolchain mehr nötig.

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 für File-Replacement-Cross-Vendor-Tests (§7.2.6); ZeroDDS realisiert das via org.omg.dds.topic.TopicType- Marker und Codegen-Hooks pro Topic-Type. Das ist analog zu K14/dds-psm-cxx (“Header-by-Codegen statt Hand-Header”).


§1 Scope

1.1 Java-PSM für 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/java-omgdds/java/ als Pure-Java-Implementation — nicht als Spec-Realisierung tauglich, durch eine Pure-Java-Implementation in crates/java-omgdds/java/ realisiert (kein Native-Dependency). Native org.omg.dds.*-Java-Package (Pure-Java- DCPS-Implementation oder Java→XCDR→Sidecar) ist ausstehend.

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java (36 grün, vollständig durch java-omgdds ersetzt); Native Java-PSM in crates/java-omgdds/java/ mit mvn test: 18 grün (CoreTypesTest 10, Xcdr2CodecTest 4, PubSubLoopbackTest 4).

Status: done — Native Java-PSM Foundation in crates/java-omgdds/java/.

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: Native Java-PSM mit TopicTypeSupport<T> (User-supplied serialize/deserialize) + idl-java-Codegen für den typisierten Pfad, plus org.zerodds.cdr.ReflectionTypeSupport<T> für das von §8 geforderte reflection-basierte Auto-Marshalling von Plain-Java-Beans (POJOs + Records) ohne IDL über java.lang.reflect-Feld-Iteration — Output byte-identisch zum typisierten Xcdr2Writer-Pfad (Mapping per XTypes §8.2 Tab.8.1).

Tests: crates/java-omgdds/java/.../PubSubLoopbackTest (in-process Loopback) + ReflectionTypeSupportTest (14, byte-exakt + nested/seq/map/mutable).

Status: done — typisierter Pfad und reflection-basiertes Auto-Marshalling (ReflectionTypeSupport) für Plain-Java-Beans ohne IDL.


§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); Pure-Java-Implementation surfaced sie nach Java. DLRL bleibt out-of-scope.

Tests: Cross-Ref zerodds-dcps-1.4.md-Coverage; Pure-Java-Tests in crates/java-omgdds/java/src/main/java/.

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); Pure-Java-Implementation in crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java 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; Pure-Java-Implementation kann ihn über crates/java-omgdds/java/src/main/java/org/omg/dds/domain/ exposen. Wenn Java-Code XML-QoS-Funktionen aufruft, propagiert Rust-Result als Java-UnsupportedOperationException via Java-Exception-Throw (§7.3.2.6 unten).

Tests: zerodds-xml-1.0.md-Coverage; Java-Exception-Pfad in crates/java-omgdds/java/src/test/java/.../*Test.java.

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 für 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-Funktionalität 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/Abkürzungen

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 Präfix 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 Präfix-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; Pure-Java-Tests in crates/java-omgdds/java/.

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). Die volle XTypes-Dynamic-Type-Reflection (Runtime-Type-Erzeugung aus TypeObject, der Reflection-Layer über Xcdr2Codec) ist ein separater offener Punkt (§1.2, §7.8.1.3), nicht Teil des JAR-Layouts.

Tests: mvn test in crates/java-omgdds/java/: 18 grün.

Status: done — Single-Universal-JAR-Layout erfüllt.

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 über 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 — dieser setzt einen Multi-Vendor- Live-Rig voraus und liegt im Workstream des RTPS-Stacks).

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 gewährleistet.

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 in order to resemble constructor invocations and are amenable to use with the Java 5 static import facility.”

Repo: Pure-Java-Implementation crates/java-omgdds/java/src/main/java/org/omg/dds/domain/DomainParticipantFactoryImpl.createParticipant ist die Rust-Side eines newDomainParticipant(...)-Factory-Calls; Codegen emittiert die Java-Wrapper-Klassen mit new<ClassName>- Pattern.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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: Java-Side crates/java-omgdds/java/src/main/java/org/omg/dds/domain/DomainParticipantImpl.close ist der Rust-Side eines close()-Calls; Box-Drop in Rust released alle Sub-Entities (analog Spec).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java 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 für unreferenced-Entities (Spec §7.2.3 erlaubt ihn als Implementation- Detail) ist optional, 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; der Cleaner- Backstop ist ein optionales Implementation-Detail (Spec §7.2.3 “may”).

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; Pure-Java-Implementation erbt diese Eigenschaft — Java-Threads können parallel auf den Handle zugreifen.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.2.4.2 Topic/Pub/Sub/DP reentrant außer 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; Java-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 Begründung).

Status: done

7.2.4.3 ServiceEnvironment + DPF reentrant außer 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; Pure-Java-Implementation exposed das.

Tests: Cross-Ref dds-psm-cxx-1.0.md §7.3.5.

Status: done

7.2.4.4 WaitSet/Condition reentrant außer close

Spec: §7.2.4, S. 6 — analog C++-PSM §7.3.6.

Repo: Rust crates/dcps/src/{waitset,condition}.rs Send+Sync; Java-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 auslösenden 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 auslösende Entity in Callbacks; Java-Listener-Adapter (in crates/java-omgdds/java/) 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 dürfen 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. They take a single argument—the new value of the property—and return the enclosing object in order to facilitate method chaining.”

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() für immutable / pointer-to-state

Spec: §7.2.5, S. 7 — “Accessors for properties that are either of unmodifiable objects […] are named get. They take no arguments.”

Repo: crates/idl-java/src/blocks.rs emittiert getX()-Getter für alle Felder.

Tests: Cross-Ref idl4-java-1.0.md.

Status: done

7.2.5.4 Accessor get(target) für 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. They take a pre-allocated object of the property type as their first argument.”

Repo: Java-Side: getter-with-target-Pattern wird vom Codegen für 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.* enthält nur Spec- Mandatory-Items.

Tests: Cross-Ref idl4-java-1.0.md; package-Präfix verifizierbar über 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: Pure-Java-Implementation-Lib in crates/java-omgdds/java/ ist die ServiceEnvironment — laden der nativen Lib (System.loadLibrary("zerodds_java_jni")) entspricht ServiceEnvironment.createInstance(...).

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java.

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 ServiceEnvironment.createInstance machen; ZeroDDS-Default ist Pure-Java (kein Native-Lib-Lookup); ServiceEnvironment-Implementation in crates/java-omgdds/java/src/main/java/org/zerodds/.

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java validieren ServiceEnvironment-Init.

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: Java-Side: crates/java-omgdds/java/src/main/java/org/omg/dds/{domain,core,topic,pub,sub,rpc}/ decken alle Factory-Aufgaben ab; Time/Duration aus crates/dcps/src/time.rs (Cross-Ref K14 §7.5.6).

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java.

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: Java-Side wirft Java-Exceptions über throw new ... mit RuntimeException-abgeleiteten Klassen (DDSException) bzw. TimeoutException als Checked.

Tests: crates/java-omgdds/java/src/test/java/.../*Test.java (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: Java-Methods returnen den Wert direkt ohne Exception (Default-Pfad in allen org.omg.dds.*-Methoden).

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: Java-Side returns Java-null oder leere Sample-Liste, keine Exception.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

Status: done

7.3.2.3 RETCODE_ERROR -> DDSException

Spec: §7.3.2 Tab.7.1, S. 9 — “RETCODE_ERROR: DDSException.”

Repo: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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: Java-Side wirft 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 für 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 für 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 für 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 für 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, Java-Code allokiert 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); Java-API- Bridge konvertiert via TimeUnit.MILLISECONDS.convert(...).

Tests: crates/dcps/src/time.rs::tests::* (14 Tests inkl. 6 Iron-Rule-Tracker für §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 für 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-Funktionalität — ZeroDDS-Java-Wrapper benötigt keinen Code dafür.

Tests: n/a — JRE-Standardfunktion.

Status: done

7.3.5.1.4 PolicyFactory-Interface für 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 über 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); Pure-Java-Implementation 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 DomainParticipantImpl.close().

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java (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 hält 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 können 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 über Status.getSource() (EventObject.getSource()) zugänglich.

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/DataReaderListener/ DataWriterListener generic; PublisherListener/SubscriberListener/ DomainParticipantListener mit <?>-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/java-omgdds/java/src/main/java/org/omg/dds/domain/ (Java-Implementation für Participant) + Codegen-Output in org.omg.dds.domain.*.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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; Pure-Java-Implementation 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 über Pure-Java-Implementation crates/java-omgdds/java/src/main/java/org/omg/dds/domain/.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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; Pure-Java-Implementation passes type-name-string an Rust-Core (intern Mapping in java-omgdds/src/topic.rs).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/CoreTypesTest.java.

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; Pure-Java-Implementation java-omgdds/src/topic.rs ist type-erased auf Rust-Side, Java-Wrapper hält das Generic-Type-Parameter via TopicType-Constraint.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/CoreTypesTest.java.

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() in crates/java-omgdds/java/src/main/java/org/omg/dds/topic/TopicImpl.java; entsprechender Rust-Topic-Manager liegt in crates/dcps/src/topic.rs::Topic und hält 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 DomainParticipantImpl.close().

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 can wrap a Topic.”

Repo: Codegen rendert interface ContentFilteredTopic<S extends TopicType<S>> extends TopicDescription<S>; Java-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; Java-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.*; Pure-Java-Implementation crates/java-omgdds/java/src/main/java/writer.rs.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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; Java-Side crates/java-omgdds/java/src/main/java/writer.rs ist type-erased.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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 an org.omg.dds.pub.DataWriter.write (Pure-Java) mit optionalen handle/timestamp-Parametern.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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.*; Pure-Java-Implementation crates/java-omgdds/java/src/main/java/reader.rs.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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; Java-API exposed getData() (returns null bei valid_data=false) + getInfo().

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java 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; Java-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; Java-Side crates/java-omgdds/java/src/main/java/reader.rs type-erased.

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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; Java-Side java-omgdds/src/reader.rs::read0/take0 reicht Vec nach Java durch (loan-Variante via Sample.Iterator, copy-into via list.addAll).

Tests: crates/java-omgdds/java/src/test/java/org/omg/dds/PubSubLoopbackTest.java.

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(). Java-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; Java-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; Pure-Java-Implementation 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 zusätzlich 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: org.zerodds.cdr.DynamicTypeFactory.createType(Class<?>) inspiziert die Klasse über dieselbe Introspektion wie der Marshaller (§1.2) und liefert ein DynamicType-Objekt (Name, Extensibility, geordnete Member mit Kind + Nesting + Key/Id) — Modell und Wire-Encoding garantiert konsistent.

Tests: über den §1.2-ReflectionTypeSupport-Pfad (Cross-Ref §8.1).

Status: done — createType(Class<?>) per Java-Reflection erfüllt „instantiate an equivalent DynamicType object” (§7.8.1.3).

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 für UInt32, BigInteger für UInt64, BigDecimal für 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[] für DDS::Bytes (Pure-Java-XCDR2-Marshal-Pfad).

Tests: crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java::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 für 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 für 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 zugehörigen 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 über 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 für 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 überschreibt 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-Einträge; Boxed-vs-Unboxed-Wahl pro Field-Optionalität.

Tests: Cross-Ref idl4-java-1.0.md Type-Mapping-Tests.

Status: done

8.4.2 Unsigned-Mapping: preserve-representation (gleiche Größe) 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 Größe), Spec-konforme Wahl. Logical-value-Variante via @SerializeAs-Override möglich.

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/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java 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 möglich.

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 für Sets, get(i)-Order für 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 für non-nested Types; Java-Side ruft ihn reflektiv via Class.getDeclaredConstructor().newInstance().

Tests: crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java::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: Pure-Java-Marshal benutzt Class.getDeclaredFields()-Order; static/transient sind ausgefiltert (siehe crates/java-omgdds/java/src/main/java/org/zerodds/cdr/Xcdr2Codec.java).

Tests: Cross-Ref §8.6.0 oben.

Status: done

8.6.0 Nicht-adressierte Fälle: 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 interface. The state is encapsulated and getters/ setters are provided through bean style property accessors.”

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. Vollständiges 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 enthält 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).

Keine offenen Punkte.