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

<!-- Unified Component Model                                      -->
<!-- for Distributed, Real-Time and Embedded Systems (UCM)        -->
<!-- version 1.0                                                  -->
<!-- Object Management Group, Inc.                                -->
<!-- document number: ptc/17-05-07                                -->
<!-- chapter 10: XML syntax for UCM declarations                  -->
     
<!-- copyright 2016-2017, Thales                                  -->
<!-- copyright 2016-2017, 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.0                                      -->     
<!-- 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="short"/>
      <xsd:enumeration value="long"/>    
      <xsd:enumeration value="longlong"/>           
      <xsd:enumeration value="ushort"/>
      <xsd:enumeration value="ulong"/>        
      <xsd:enumeration value="ulonglong"/>
    </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>
    
  <!-- 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 name="integer">
          <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="kind" type="PrimitiveIntegerKind" use="required"/>        
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="char">
          <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="kind" type="PrimitiveCharKind" use="required"/>        
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="float">
          <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="kind" type="PrimitiveFloatKind" use="required"/>        
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="bool">
          <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:complexType>  
        </xsd:element>
       
         <xsd:element name="octet">
          <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:complexType>  
        </xsd:element>
              
        <xsd:element name="string">
          <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="base" type="PrimitiveCharKind" use="required"/>        
            <xsd:attribute name="maxSize" type="xsd:long" use="optional"/>
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="array">
          <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="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:element>
        
        <xsd:element name="sequence">
          <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="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:element>
        
        <xsd:element name="struct">
          <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="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:element>
        
        <xsd:element name="union">  
          <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="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="when" type="xsd:string" use="required"/>                
                  <xsd:attribute name="type" type="NameRef" use="required"/>            
                  <xsd:attribute name="default" type="xsd:boolean" 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:attribute name="selectorType" type="NameRef" use="required"/>    
            <xsd:attribute name="selector" type="xsd:NCName" use="required"/>    
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="enum">
          <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="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:element>
        
        <xsd:element name="native">        
          <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="maxSize" type="xsd:long" use="required"/>  
          </xsd:complexType>  
        </xsd:element>
        
        <xsd:element name="alias">
          <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:element name="exception">        
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="field">
                <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="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:element name="interface">        
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="extends" type="NameRefElement"/>
              
              <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <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="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="exception" 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:choice>
            </xsd:sequence>    
            <xsd:attribute name="name" type="UcmName" use="required"/>    
            <xsd:attribute name="id" type="xsd:ID" use="optional"/>
          </xsd:complexType>
        </xsd:element>
        
        <xsd:element name="abstractInterface">        
          <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:complexType>
        </xsd:element>
        
        <xsd:element name="abstractDataType">        
          <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:complexType>
        </xsd:element>
        
        <xsd:element name="constant">                
          <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="value" type="xsd:string" use="required"/>        
            <xsd:attribute name="type" type="NameRef" use="required"/> 
          </xsd:complexType>
        </xsd:element>
        
        <xsd:element name="annotationDef">                
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>
              <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:element>
      </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="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: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:element minOccurs="0" maxOccurs="unbounded" name="pattern">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
              <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="item">
                      <xsd:complexType>
                        <xsd:attribute name="name" type="UcmName" use="required"/>
                      </xsd:complexType>
                    </xsd:element>
                  </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:choice>      
          </xsd:sequence>
          
          
          <xsd:attribute name="extends" 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="portType">
        <xsd:complexType>
          <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:complexType>
      </xsd:element>
      
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="connectorDef">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>     
              <xsd:element name="port">
                <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="comment" type="xsd:anyType"/>                          
                    <xsd:element minOccurs="1" maxOccurs="unbounded" name="configParam" type="ConfigurationParameter"/>
                  </xsd:sequence>
                  <xsd:attribute name="port" type="NameRef" use="required"/>
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:sequence>
          
          <xsd:attribute name="pattern" type="NameRef" use="required"/>
          <xsd:attribute name="extends" 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:sequence>          
    <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="1" name="supportedLanguages">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="1" maxOccurs="unbounded" name="language">
                <xsd:complexType>
                  <xsd:attribute name="name" type="UcmName" use="required"/>   
                  <xsd:attribute name="id" type="xsd:ID" use="optional"/>
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
        
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="technicalAspect">
          <xsd:complexType>
            <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:element>
        
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="policyDef">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="comment" type="xsd:anyType"/>                                       
              <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="extends" type="NameRef" use="optional"/>    
            <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>            
        </xsd:element>
      </xsd:choice>
    </xsd:sequence>
    <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>
        <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="compType">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="extends" type="NameRefElement"/>
              <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="port">
                <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:choice minOccurs="0" maxOccurs="unbounded">
                      <xsd:element name="typeSpec">
                        <xsd:complexType>
                          <xsd:sequence>
                            <xsd:element 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="type" type="NameRef" use="required"/>
                        </xsd:complexType>
                      </xsd:element>
                      
                      <xsd:element name="roleSpec">
                        <xsd:complexType>
                          <xsd:sequence>
                            <xsd:element name="binding">
                              <xsd:complexType>
                                <xsd:attribute name="item" type="NameRef" use="required"/>
                                <xsd:attribute name="actual" type="NameRef" use="required"/>
                              </xsd:complexType>
                            </xsd:element>
                          </xsd:sequence>
                          <xsd:attribute name="role" type="NameRef" use="required"/>
                        </xsd:complexType>
                      </xsd:element>
                    </xsd:choice>
                    
                  </xsd:sequence>
                  <xsd:attribute name="refines" 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="attribute" type="Attribute"/>                    
            </xsd:sequence>
            
            <xsd:attribute name="refines" 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 name="atomic">
          <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="policy" type="NameRefElement"/>                    
            </xsd:sequence>
            
            <xsd:attribute name="type" type="NameRef" use="required"/>
            <xsd:attribute name="language" 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 name="composite">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="refines" type="NameRefElement"/>
              <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="part">
                <xsd:complexType>
                  <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:attribute name="refines" type="NameRef" 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="end">
                      <xsd:complexType>
                        <xsd:sequence>
                          <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="required"/>
                  <xsd:attribute name="refines" 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: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: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:element>
        
        <xsd:element name="policy">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element minOccurs="1" maxOccurs="unbounded" name="component" type="NameRefElement"/>                    
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="port" type="NameRefElement"/>
              <xsd:element minOccurs="0" maxOccurs="unbounded" name="policy" type="NameRefElement"/>
              <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: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:complexType>
        </xsd:element>
        
      </xsd:choice>
    </xsd:sequence>
    <xsd:attribute name="name" type="UcmName" use="required"/>
    <xsd:attribute name="id" type="xsd:ID" use="optional"/>
  </xsd:complexType>
  
  <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:element name="project">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:choice>
          <xsd:element ref="platformModule"/>
          <xsd:element ref="applicationModule"/>
          <xsd:element ref="interactionModule"/>
          <xsd:element ref="contractModule"/>
          <xsd:element ref="policyModule"/>
          <xsd:element ref="componentModule"/>
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  
</xsd:schema>
