<?xml version="1.0" encoding="UTF-8"?>

<!-- This file contains the XML Schema Document (XSD) for the XML Domain
     Participant Representation defined by the OMG specification
     "DDS Consolidated XML Syntax" (DDS-XML). -->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified">

    <!-- ================================================================== -->
    <!-- Inclusion of other Building Blocks -->
    <!-- ================================================================== -->

    <xs:include schemaLocation="https://www.omg.org/spec/DDS-XML/20260301/dds-xml_domain_definitions_nonamespace.xsd" />

    <!-- ================================================================== -->
    <!-- Filter and Condition Types -->
    <!-- ================================================================== -->

    <!-- Content Filters and Query Conditions -->

    <xs:complexType name="filterParameterList">
        <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element name="param" type="xs:string" minOccurs="0"
                maxOccurs="100" />
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="filterKind">
        <xs:restriction base="xs:string">
            <xs:enumeration value="builtin.sql" />
            <xs:enumeration value="builtin.stringMatch" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="filter">
        <xs:sequence>
            <xs:element name="expression"     minOccurs="0" maxOccurs="1"
                type="xs:string" />
            <xs:element name="parameter_list" minOccurs="0" maxOccurs="1"
                type="filterParameterList" />
        </xs:sequence>
        <xs:attribute name="name" type="elementName" use="required" />
        <xs:attribute name="kind" type="filterKind" use="required" />
    </xs:complexType>

    <!-- Status Conditions -->

    <xs:simpleType name="statusKind">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse" />
            <xs:enumeration value="DATA_AVAILABLE" />
            <xs:enumeration value="INCONSISTENT_TOPIC" />
            <xs:enumeration value="OFFERED_DEADLINE_MISSED" />
            <xs:enumeration value="REQUESTED_DEADLINE_MISSED" />
            <xs:enumeration value="OFFERED_INCOMPATIBLE_QOS" />
            <xs:enumeration value="REQUESTED_INCOMPATIBLE_QOS" />
            <xs:enumeration value="SAMPLE_LOST" />
            <xs:enumeration value="SAMPLE_REJECTED" />
            <xs:enumeration value="LIVELINESS_LOST" />
            <xs:enumeration value="LIVELINESS_CHANGED" />
            <xs:enumeration value="PUBLICATION_MATCHED" />
            <xs:enumeration value="SUBSCRIPTION_MATCHED" />
            <xs:enumeration value="DATA_ON_READERS" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="statusCondition">
        <xs:sequence>
            <xs:element name="status" type="statusKind" />
        </xs:sequence>
    </xs:complexType>

    <!-- Read Conditions -->
    <xs:simpleType name="sampleStateKind">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse" />
            <xs:enumeration value="READ" />
            <xs:enumeration value="NOT_READ" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="viewStateKind">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse" />
            <xs:enumeration value="NEW" />
            <xs:enumeration value="NOT_NEW" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="instanceStateKind">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse" />
            <xs:enumeration value="ALIVE" />
            <xs:enumeration value="NOT_ALIVE_DISPOSED" />
            <xs:enumeration value="NOT_ALIVE_NO_WRITERS" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="readCondition">
        <xs:all>
            <xs:element name="sample_state"   minOccurs="0" type="sampleStateKind"/>
            <xs:element name="view_state"     minOccurs="0" type="viewStateKind"/>
            <xs:element name="instance_state" minOccurs="0" type="instanceStateKind"/>
        </xs:all>

        <xs:attribute name="name" type="elementName" use="required" />
    </xs:complexType>

    <!-- ================================================================== -->
    <!-- DDS Entities Definition -->
    <!-- ================================================================== -->

    <xs:attributeGroup name="commonPubSubEndpointAttributeGroup">
        <xs:attribute name="name" type="elementName" 
            use="required" />
        <xs:attribute name="topic_ref" type="elementNameReference"
            use="required" />
    </xs:attributeGroup>

    <xs:complexType name="dataReader">
        <xs:all>
                <xs:element name="datareader_qos"   minOccurs="0" type="datareaderQosInline"/>
                <xs:element name="content_filter"   minOccurs="0" type="filter"/>
                <xs:element name="status_condition" minOccurs="0" type="statusCondition" />
                <xs:element name="read_condition"   minOccurs="0" type="readCondition"/>
                <xs:element name="query_condition"  minOccurs="0" type="filter"/>
        </xs:all>

        <xs:attributeGroup ref="commonPubSubEndpointAttributeGroup"/>
    </xs:complexType>

    <xs:complexType name="dataWriter">
        <xs:all>
            <xs:element name="datawriter_qos" minOccurs="0" maxOccurs="1" 
                type="datawriterQosInline" />
        </xs:all>

        <xs:attributeGroup ref="commonPubSubEndpointAttributeGroup"/>
    </xs:complexType>

    <xs:attributeGroup name="commonServiceEndpointAttributeGroup">
        <xs:attribute name="name" type="elementName" use="required" />
        <xs:attribute name="publisher_ref" type="elementNameReference" />
        <xs:attribute name="subscriber_ref" type="elementNameReference" />
    </xs:attributeGroup>

    <xs:attributeGroup name="requesterReplierAttributeGroup">
        <xs:attributeGroup ref="commonServiceEndpointAttributeGroup"/>
        <xs:attribute name="request_reply_service_ref" type="elementNameReference"
            use="required" />
    </xs:attributeGroup>

    <xs:attributeGroup name="clientServerAttributeGroup">
        <xs:attributeGroup ref="commonServiceEndpointAttributeGroup"/>
        <xs:attribute name="rpc_service_ref" type="elementNameReference"
            use="required" />
    </xs:attributeGroup>

    <xs:complexType name="requester">
        <xs:all>
            <xs:element name="request_datawriter_qos" minOccurs="0"
                type="datawriterQosInline" />
            <xs:element name="reply_datareader_qos"   minOccurs="0"
                type="datareaderQosInline" />
        </xs:all>

        <xs:attributeGroup ref="requesterReplierAttributeGroup"/>
    </xs:complexType>

    <xs:complexType name="replier">
        <xs:all>
            <xs:element name="request_datareader_qos" minOccurs="0"
                type="datareaderQosInline" />
            <xs:element name="reply_datawriter_qos"   minOccurs="0"
                type="datawriterQosInline" />
        </xs:all>

        <xs:attributeGroup ref="requesterReplierAttributeGroup"/>
    </xs:complexType>

    <xs:complexType name="client">
        <xs:all>
            <xs:element name="request_datawriter_qos" minOccurs="0"
                type="datawriterQosInline" />
            <xs:element name="reply_datareader_qos"   minOccurs="0"
                type="datareaderQosInline" />
        </xs:all>

        <xs:attributeGroup ref="clientServerAttributeGroup"/>
    </xs:complexType>

    <xs:complexType name="server">
        <xs:all>
            <xs:element name="request_datareader_qos" minOccurs="0"
                type="datareaderQosInline" />
            <xs:element name="reply_datawriter_qos"   minOccurs="0"
                type="datawriterQosInline" />
        </xs:all>

        <xs:attributeGroup ref="clientServerAttributeGroup"/>
    </xs:complexType>

    <xs:complexType name="subscriber">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="data_reader"    type="dataReader" />
            <xs:element name="subscriber_qos" type="subscriberQosInline" />
        </xs:choice>
        <xs:attribute name="name" type="elementName" use="required" />
    </xs:complexType>

    <xs:complexType name="publisher">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="data_writer"   type="dataWriter" />
            <xs:element name="publisher_qos" type="publisherQosInline" />
        </xs:choice>

        <xs:attribute name="name" type="elementName" use="required" />
    </xs:complexType>

    <xs:simpleType name="interactionRoleUseDirectionKind">
        <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse" />
            <xs:enumeration value="DECLARED" />
            <xs:enumeration value="REVERSED" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="topicBinding">
        <xs:choice minOccurs="0" maxOccurs="1">
            <xs:element name="datawriter_qos" type="datawriterQosInline"  minOccurs="0" />
            <xs:element name="datareader_qos" type="datareaderQosInline"  minOccurs="0" />
        </xs:choice>
        <xs:attribute name="topic_ref" type="elementNameReference" use="required" />
        <xs:attribute name="bind" type="xs:boolean" use="optional" default="true"/>
    </xs:complexType>

    <xs:complexType name="serviceBinding">
        <xs:choice minOccurs="0" maxOccurs="1">
            <xs:sequence>
                <xs:element name="request_datawriter_qos" type="datawriterQosInline"  minOccurs="1" />
                <xs:element name="reply_datareader_qos"   type="datareaderQosInline"  minOccurs="0" />
            </xs:sequence>
            <xs:sequence>
                <xs:element name="reply_datareader_qos" type="datareaderQosInline"  minOccurs="1" />
                <xs:element name="request_datawriter_qos"   type="datawriterQosInline"  minOccurs="0" />
            </xs:sequence>
            <xs:sequence>
                <xs:element name="request_datareader_qos" type="datareaderQosInline"  minOccurs="1" />
                <xs:element name="reply_datawriter_qos"   type="datawriterQosInline"  minOccurs="0" />
            </xs:sequence>            
            <xs:sequence>
                <xs:element name="reply_datawriter_qos" type="datawriterQosInline"  minOccurs="1" />
                <xs:element name="request_datareader_qos"   type="datareaderQosInline"  minOccurs="0" />
            </xs:sequence>
        </xs:choice>
        <xs:attribute name="service_ref" type="elementNameReference" use="required" />
        <xs:attribute name="bind" type="xs:boolean" use="optional" default="true"/>
    </xs:complexType>

    <xs:complexType name="interactionRoleUse">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="topic_binding"   type="topicBinding" />
            <xs:element name="service_binding" type="serviceBinding" />
        </xs:choice>
        <xs:attribute name="name" type="elementName" use="required" />
        <xs:attribute name="direction" type="interactionRoleUseDirectionKind" use="required" />
        <xs:attribute name="interaction_role_ref" type="elementNameReference" use="required" />
    </xs:complexType>

    <xs:complexType name="domainParticipant">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="domain_participant_qos" type="domainparticipantQosInline" />

            <xs:element name="register_type"      type="registerType" />
            <xs:element name="register_interface" type="registerInterface" />

            <xs:element name="topic"                 type="topic" />
            <xs:element name="rpc_service"           type="rpcService" />
            <xs:element name="request_reply_service" type="requestReplyService" />

            <xs:element name="interaction_role" type="interactionRole" />

            <xs:element name="publisher"     type="publisher" />
            <xs:element name="subscriber"    type="subscriber" />

            <xs:element name="requester"     type="requester" />   
            <xs:element name="replier"       type="replier" />   
            <xs:element name="client"        type="client" /> 
            <xs:element name="server"        type="server" />   
                
            <xs:element name="interaction_role_binding" type="interactionRoleUse" />
        </xs:choice>

        <xs:attribute name="name"       type="elementName" use="required" />
        <xs:attribute name="base_name"  type="elementNameReference" />
        <xs:attribute name="domain_ref" type="elementNameReference" />
        <xs:attribute name="domain_id"  type="xs:nonNegativeInteger" />
        <xs:attribute name="domain_tag"  type="domainTagName"/>
    </xs:complexType>

    <!-- ================================================================== -->
    <!-- DomainParticipant Library Definition -->
    <!-- ================================================================== -->

    <xs:complexType name="domainParticipantLibrary">
        <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element name="domain_participant" type="domainParticipant" />
        </xs:choice>
        <xs:attribute name="name" type="elementName" use="required" />
    </xs:complexType>

</xs:schema>
