<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Unified Component Model                                      -->
<!-- for Distributed, Real-Time and Embedded Systems (UCM)        -->
<!-- version 1.2                                                  -->
<!-- Object Management Group, Inc.                                -->
<!-- document number: ptc/2019-04-06                              -->
<!-- chapter 10: XML syntax for UCM declarations                  -->

<!-- Thomas Vergnaud <thomas.vergnaud@thalesgroup.com>            -->
<!-- copyright 2016-2019, Thales                                  -->
<!-- copyright 2016-2019, Object Management Group, Inc.           -->

<!-- The companies listed above have granted to the Object        -->
<!-- Management Group, Inc. (OMG) a nonexlcusive, royalty-free,   -->
<!-- paid up, worldwide license to copy, distribute and modify    -->
<!-- this document and distribute copies of the modified version. -->
<!-- Each of the copyright holders listed above has agreed that   -->
<!-- no person shall be deemed to have infringed the copyright    -->
<!-- in the included material of any such copyright holder by     -->
<!-- reason of having used the specification set forth herein or  -->
<!-- having conformed any computer software to the specification. -->

<!-- XML schema for UCM v1.2                                      -->
<!-- This schema specifies the valid structure for UCM XML files  -->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="NameRefElement">
    <xsd:attribute name="ref" type="NameRef" use="required"/>
  </xsd:complexType>
  <xsd:simpleType name="NameRef">
    <xsd:annotation>
      <xsd:documentation>
        A UCM name reference is a list of UCM names separated
        by pairs of colons (::), possibly with a leading pair of
        colons; the last name is possibly separated by a dot (.)
      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(::)?([\w_]+::)*[\w_]+(\.[\w_]+)?"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="UcmName">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[\w_]+"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="TechnicalAspectContraint">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="any_number"/>
      <xsd:enumeration value="at_most_one"/>
      <xsd:enumeration value="exactly_one"/>
      <xsd:enumeration value="at_least_one"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="TechnicalPolicyApplicability">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="on_component_only"/>
      <xsd:enumeration value="on_all_ports"/>
      <xsd:enumeration value="on_some_ports"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="ParamDirection">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="in"/>
      <xsd:enumeration value="out"/>
      <xsd:enumeration value="inout"/>
      <xsd:enumeration value="return"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="AttributeMode">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="read"/>
      <xsd:enumeration value="readwrite"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="PrimitiveFloatKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="float"/>
      <xsd:enumeration value="double"/>
      <xsd:enumeration value="longdouble"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="PrimitiveIntegerKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="int8"/>
      <xsd:enumeration value="int16"/>
      <xsd:enumeration value="int32"/>
      <xsd:enumeration value="int64"/>
      <xsd:enumeration value="uint8"/>
      <xsd:enumeration value="uint16"/>
      <xsd:enumeration value="uint32"/>
      <xsd:enumeration value="uint64"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="PrimitiveCharKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="char8"/>
      <xsd:enumeration value="wchar"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="InteractionItemKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="data"/>
      <xsd:enumeration value="interface"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:simpleType name="PortElementKind">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="provided"/>
      <xsd:enumeration value="required"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <!-- name spaces -->
  
  <xsd:complexType name="Namespace">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:choice minOccurs="1" maxOccurs="1">
        <xsd:element minOccurs="0" maxOccurs="1" name="namespace" type="Namespace"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="applicationModule" type="ApplicationModule"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="contractModule" type="ContractModule"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="componentModule" type="ComponentModule"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="platformModule" type="PlatformModule"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="interactionModule" type="InteractionDefinitionModule"/>
        <xsd:element minOccurs="0" maxOccurs="1" name="policyModule" type="NonfunctionalAspectModule"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <!-- contracts -->
  
  <xsd:complexType name="ContractModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="integer" type="Integer"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="char" type="Char"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="float" type="Float"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="bool" type="Bool"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="octet" type="Octet"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="string" type="String"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="array" type="Array"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="sequence" type="Sequence"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="struct" type="Struct"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="union" type="Union"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="enum" type="Enum"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="native" type="Native"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="alias" type="Alias"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="exception" type="Exception"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="interface" type="Interface"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="abstractInterface" type="AbstractInterface"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="abstractDataType" type="AbstractDataType"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="constant" type="Constant"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotationDef" type="AnnotationDef"/>          
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Integer">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="kind" type="PrimitiveIntegerKind" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Char">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="kind" type="PrimitiveCharKind" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Float">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="kind" type="PrimitiveFloatKind" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Bool">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Octet">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="String">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="base" type="PrimitiveCharKind" use="required"/>
    <xsd:attribute name="maxSize" type="xsd:long" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Array">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="1" maxOccurs="unbounded" name="dim">
        <xsd:complexType>
          <xsd:attribute name="size" type="xsd:positiveInteger" use="required"/>
          <xsd:attribute name="indexType" type="PrimitiveIntegerKind" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Sequence">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="indexType" type="PrimitiveIntegerKind" use="required"/>
    <xsd:attribute name="maxSize" type="xsd:long" use="optional"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Struct">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="1" maxOccurs="unbounded" name="field">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
          <xsd:attribute name="type" type="NameRef" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Union">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="1" maxOccurs="unbounded" name="case">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
          <xsd:attribute name="when" type="xsd:string" use="required"/>
          <xsd:attribute name="type" type="NameRef" use="required"/>
          <xsd:attribute name="default" type="xsd:boolean" default="false"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="selectorType" type="NameRef" use="required"/>
    <xsd:attribute name="selector" type="xsd:NCName" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Enum">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="1" maxOccurs="unbounded" name="value">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="index" type="xsd:integer" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="indexType" type="PrimitiveIntegerKind" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Native">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="maxSize" type="xsd:long" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Alias">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Exception">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="excepField">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
          <xsd:attribute name="type" type="NameRef" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Interface">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="extends" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="attribute" type="Attribute"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="method">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="excep" type="NameRefElement"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="param">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
                </xsd:sequence>
                <xsd:attribute name="name" type="UcmName" use="required"/>
                <xsd:attribute name="dir" type="ParamDirection" use="required"/>
                <xsd:attribute name="type" type="NameRef" use="required"/>
              </xsd:complexType>
            </xsd:element>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="AbstractInterface">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="AbstractDataType">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Constant">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="AnnotationDef">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="1" name="extends" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="configParam" type="ConfigurationParameter"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="ConfigurationParameter">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
    <xsd:attribute name="defaultValue" type="xsd:string" use="optional"/>
    <xsd:attribute name="min" type="xsd:int" default="1" use="optional"/>
    <xsd:attribute name="max" type="xsd:int" default="1" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="ConfigurationParameterValue">
    <xsd:attribute name="def" type="NameRef" use="required"/>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="Attribute">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="type" type="NameRef" use="required"/>
    <xsd:attribute name="mode" type="AttributeMode"/>
    <xsd:attribute name="defaultValue" type="xsd:string" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Annotation">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="config" type="ConfigurationParameterValue"/>
    </xsd:sequence>
    <xsd:attribute name="def" type="NameRef" use="required"/>
  </xsd:complexType>
  
  <!-- platform -->
  
  <xsd:complexType name="PlatformModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="platformModule" type="PlatformModule"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="interactionModule" type="InteractionDefinitionModule"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyModule" type="NonfunctionalAspectModule"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <!-- platform: interactions -->
  
  <xsd:complexType name="InteractionDefinitionModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="interactionModule" type="InteractionDefinitionModule"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="pattern" type="Pattern"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="portRole" type="PortRole"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="portType" type="PortType"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="connectorDef" type="ConnectorDef"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Pattern">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="1" name="extends" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="item">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="nature" type="InteractionItemKind" use="required"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="role">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="itemRef" type="NameRefElement"/>
          </xsd:sequence>
          <xsd:attribute default="1" name="min" type="xsd:int"/>
          <xsd:attribute default="1" name="max" type="xsd:int"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="PortRole">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="PortType">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="portElement" type="PortElement"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="role" type="NameRef" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="ConnectorDef">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="1" name="extends" type="NameRefElement"/>

      <xsd:element minOccurs="0" maxOccurs="unbounded" name="connPort">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="type" type="NameRef" use="required"/>
          <xsd:attribute name="role" type="NameRef" use="required"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="itemBinding">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="pItem" type="xsd:string" use="required"/>
          <xsd:attribute name="cItem" type="NameRef" use="required"/>
        </xsd:complexType>        
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="configParam" type="ConfigurationParameter"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="portConf">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="configParam" type="ConfigurationParameter"/>
          </xsd:sequence>
          <xsd:attribute name="port" type="NameRef" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    
    <xsd:attribute name="pattern" type="NameRef" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="PortElement">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
    </xsd:sequence>
    <xsd:attribute name="interface" type="NameRef" use="required"/>
    <xsd:attribute name="kind" type="PortElementKind" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <!-- platform: non functional aspects -->
  
  <xsd:complexType name="NonfunctionalAspectModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyModule" type="NonfunctionalAspectModule"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="language" type="Language"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="technicalAspect" type="TechnicalAspect"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyDef" type="PolicyDef"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Language">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>  
  
  <xsd:complexType name="TechnicalAspect">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
    </xsd:sequence>
    <xsd:attribute name="constraint" type="TechnicalAspectContraint" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="PolicyDef">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="1" name="extends" type="NameRefElement"/>      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="portElement" type="PortElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="configParam" type="ConfigurationParameter"/>
    </xsd:sequence>
    <xsd:attribute name="aspect" type="NameRef" use="required"/>
    <xsd:attribute name="applicability" type="TechnicalPolicyApplicability" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <!-- application -->
  
  <xsd:complexType name="ApplicationModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="applicationModule" type="ApplicationModule"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="componentModule" type="ComponentModule"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <!-- application: components -->
  
  <xsd:complexType name="ComponentModule">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="componentModule" type="ComponentModule"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="contractModule" type="ContractModule"/>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="bindingSet" type="BindingSet"/>
        <xsd:element name="compType" type="CompType"/>          
        <xsd:element name="atomic" type="Atomic"/>
        <xsd:element name="composite" type="Composite"/>
        <xsd:element name="policy" type="Policy"/>
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="BindingSet">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="binding">
        <xsd:complexType>
          <xsd:attribute name="abstract" type="NameRef" use="required"/>
          <xsd:attribute name="actual" type="NameRef" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
  </xsd:complexType>
  
  <xsd:complexType name="CompType">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="refines" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="port">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="refines" type="NameRefElement"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
          </xsd:sequence>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
          <xsd:attribute name="type" type="NameRef" use="required"/>
          <xsd:attribute name="bindings" type="NameRef" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="attribute" type="Attribute"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Atomic">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyRef" type="NameRefElement"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="NameRef" use="required"/>
    <xsd:attribute name="lang" type="NameRef" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>          
  
  <xsd:complexType name="Composite">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="refines" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="part">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="refines" type="NameRefElement"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="annotation" type="Annotation"/>
          </xsd:sequence>
          <xsd:attribute name="ref" type="NameRef" use="required"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="connection">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="refines" type="NameRefElement"/>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="end">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
                  <xsd:element minOccurs="0" maxOccurs="unbounded" name="config" type="ConfigurationParameterValue"/>
                </xsd:sequence>
                <xsd:attribute name="port" type="NameRef" use="required"/>
                <xsd:attribute name="part" type="NameRef" use="required"/>
                <xsd:attribute name="name" type="UcmName" use="required"/>
                <xsd:attribute name="id" type="xsd:ID" use="optional"/>
              </xsd:complexType>
            </xsd:element>
            
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="config" type="ConfigurationParameterValue"/>
          </xsd:sequence>
          <xsd:attribute name="ref" type="NameRef" use="optional"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="portDelegation">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="extPort" type="NameRef" use="required"/>
          <xsd:attribute name="port" type="NameRef" use="required"/>
          <xsd:attribute name="part" type="NameRef" use="required"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="attrDelegation">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
          </xsd:sequence>
          <xsd:attribute name="extAttr" type="NameRef" use="required"/>
          <xsd:attribute name="attr" type="NameRef" use="required"/>
          <xsd:attribute name="part" type="NameRef" use="required"/>
          <xsd:attribute name="name" type="UcmName" use="required"/>
          <xsd:attribute name="id" type="xsd:ID" use="optional"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="type" type="NameRef" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <xsd:complexType name="Policy">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
      <xsd:element minOccurs="1" maxOccurs="unbounded" name="componentRef" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="portRef" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyRef" type="NameRefElement"/>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="config" type="ConfigurationParameterValue"/>
    </xsd:sequence>
    <xsd:attribute name="def" type="NameRef" use="required"/>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
    <xsd:attribute name="bindings" type="NameRef" use="optional"/>
  </xsd:complexType>
  
  <xsd:element name="namespace" type="Namespace"/>
  <xsd:element name="platformModule" type="PlatformModule"/>
  <xsd:element name="applicationModule" type="ApplicationModule"/>
  <xsd:element name="interactionModule" type="InteractionDefinitionModule"/>
  <xsd:element name="contractModule" type="ContractModule"/>
  <xsd:element name="policyModule" type="NonfunctionalAspectModule"/>
  <xsd:element name="componentModule" type="ComponentModule"/>

</xsd:schema>
