<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. 
     OASIS trademark, IPR and other policies apply.  -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
   xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200903" 
   targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200903" 
   elementFormDefault="qualified">

   <import namespace="http://www.w3.org/XML/1998/namespace" 
           schemaLocation="http://www.w3.org/2001/xml.xsd"/>

   <!-- Common extension base for SCA definitions -->
   <complexType name="CommonExtensionBase">
      <sequence>
         <element ref="sca:documentation" minOccurs="0" 
                  maxOccurs="unbounded"/>
      </sequence>
      <anyAttribute namespace="##other" processContents="lax"/>
   </complexType>
   
   <element name="documentation" type="sca:Documentation"/>
   <complexType name="Documentation" mixed="true">
      <sequence>
         <any namespace="##other" processContents="lax" minOccurs="0" 
              maxOccurs="unbounded"/>
      </sequence>
      <attribute ref="xml:lang"/>
   </complexType>

   <!-- Component Type -->
   <element name="componentType" type="sca:ComponentType"/>
   <complexType name="ComponentType">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <element ref="sca:implementation" minOccurs="0"/>
               <choice minOccurs="0" maxOccurs="unbounded">
                  <element name="service" type="sca:ComponentService"/>
                  <element name="reference" 
                     type="sca:ComponentTypeReference"/>
                  <element name="property" type="sca:Property"/>
               </choice>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="constrainingType" type="QName" use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Composite -->
   <element name="composite" type="sca:Composite"/>
   <complexType name="Composite">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <element name="include" type="anyURI" minOccurs="0" 
                        maxOccurs="unbounded"/>
               <choice minOccurs="0" maxOccurs="unbounded">
                  <element name="service" type="sca:Service"/>
                  <element name="property" type="sca:Property"/>
                  <element name="component" type="sca:Component"/>
                  <element name="reference" type="sca:Reference"/>
                  <element name="wire" type="sca:Wire"/>
               </choice>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="targetNamespace" type="anyURI" use="required"/>
            <attribute name="local" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="autowire" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="constrainingType" type="QName" use="optional"/>
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>
   
   <!-- Contract base type for Service, Reference -->
   <complexType name="Contract" abstract="true">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <element ref="sca:interface" minOccurs="0" maxOccurs="1" />
               <element ref="sca:binding" minOccurs="0" 
                        maxOccurs="unbounded" />
               <element ref="sca:callback" minOccurs="0" maxOccurs="1" />
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded" />
            </sequence>
            <attribute name="name" type="NCName" use="required" />
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional" />
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Service -->
   <complexType name="Service">
      <complexContent>
         <extension base="sca:Contract">
            <attribute name="promote" type="anyURI" use="required"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Interface -->
   <element name="interface" type="sca:Interface" abstract="true"/>
   <complexType name="Interface" abstract="true">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <attribute name="remotable" type="boolean" use="optional"/>
	        <attribute name="requires" type="sca:listOfQNames" 
               use="optional"/>
	        <attribute name="policySets" type="sca:listOfQNames" 
               use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Reference -->
   <complexType name="Reference">
      <complexContent>
         <extension base="sca:Contract">
            <attribute name="autowire" type="boolean" use="optional"/>
            <attribute name="target" type="sca:listOfAnyURIs" 
                       use="optional"/>
            <attribute name="wiredByImpl" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="multiplicity" type="sca:Multiplicity" 
                       use="optional" default="1..1"/>
            <attribute name="promote" type="sca:listOfAnyURIs" 
                       use="required"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Property -->
   <complexType name="SCAPropertyBase" mixed="true">
      <sequence>
         <any namespace="##any" processContents="lax" minOccurs="0"/>
         <!-- NOT an extension point; This any exists to accept
             the element-based or complex type property
             i.e. no element-based extension point under "sca:property" -->
      </sequence>
      <!-- mixed="true" to handle simple type -->
      <attribute name="requires" type="sca:listOfQNames" use="optional"/>
      <attribute name="policySets" type="sca:listOfQNames" use="optional"/>
   </complexType>
   
   <complexType name="Property" mixed="true">
      <complexContent mixed="true">
         <extension base="sca:SCAPropertyBase">
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="type" type="QName" use="optional"/>
            <attribute name="element" type="QName" use="optional"/>
            <attribute name="many" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="mustSupply" type="boolean" use="optional" 
                       default="false"/>
            <anyAttribute namespace="##any" processContents="lax"/>
         </extension>
         <!-- extension defines the place to hold default value -->
         <!-- an extension point ; attribute-based only -->
      </complexContent>
   </complexType>
   
   <!-- ConstrainingProperty is equivalent to the Property type but removes 
        the capability to contain a value -->
   <complexType name="ConstrainingProperty" mixed="true">
      <complexContent mixed="true">
         <restriction base="sca:Property">
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="type" type="QName" use="optional"/>
            <attribute name="element" type="QName" use="optional"/>
            <attribute name="many" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="mustSupply" type="boolean" use="optional" 
                       default="false"/>
            <anyAttribute namespace="##any" processContents="lax"/>
         </restriction>
      </complexContent>
   </complexType>
   
   <complexType name="PropertyValue" mixed="true">
      <complexContent mixed="true">
         <extension base="sca:SCAPropertyBase">
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="type" type="QName" use="optional"/>
            <attribute name="element" type="QName" use="optional"/>
            <attribute name="many" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="source" type="string" use="optional"/>
            <attribute name="file" type="anyURI" use="optional"/>
            <anyAttribute namespace="##any" processContents="lax"/>
         </extension>
         <!-- an extension point ; attribute-based only -->
      </complexContent>
   </complexType>

   <!-- Binding -->
   <element name="binding" type="sca:Binding" abstract="true"/>
   <complexType name="Binding" abstract="true">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <element ref="sca:wireFormat" minOccurs="0" maxOccurs="1" />
               <element ref="sca:operationSelector" minOccurs="0" 
                        maxOccurs="1" />
            </sequence>
            <attribute name="uri" type="anyURI" use="optional"/>
            <attribute name="name" type="NCName" use="optional"/>
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Binding Type -->
   <element name="bindingType" type="sca:BindingType"/>
   <complexType name="BindingType">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="type" type="QName" use="required"/>
            <attribute name="alwaysProvides" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="mayProvide" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>
   
   <!-- WireFormat Type -->
   <element name="wireFormat" type="sca:WireFormatType"/>
   <complexType name="WireFormatType" abstract="true">
      <sequence>
         <any namespace="##other" processContents="lax" minOccurs="0" 
              maxOccurs="unbounded" />
      </sequence>
      <anyAttribute namespace="##other" processContents="lax"/>
   </complexType>

   <!-- OperationSelector Type -->
   <element name="operationSelector" type="sca:OperationSelectorType"/>
   <complexType name="OperationSelectorType" abstract="true">
      <sequence>
         <any namespace="##other" processContents="lax" minOccurs="0" 
              maxOccurs="unbounded" />
      </sequence>
      <anyAttribute namespace="##other" processContents="lax"/>
   </complexType>
   
   <!-- Callback -->
   <element name="callback" type="sca:Callback"/>
   <complexType name="Callback">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <choice minOccurs="0" maxOccurs="unbounded">
               <element ref="sca:binding"/>
               <any namespace="##other" processContents="lax"/>
            </choice>
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Component -->
   <complexType name="Component">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <element ref="sca:implementation" minOccurs="0"/>
               <choice minOccurs="0" maxOccurs="unbounded">
                  <element name="service" type="sca:ComponentService"/>
                  <element name="reference" type="sca:ComponentReference"/>
                  <element name="property" type="sca:PropertyValue"/>
               </choice>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="autowire" type="boolean" use="optional"/>
            <attribute name="constrainingType" type="QName" use="optional"/>
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Component Service -->
   <complexType name="ComponentService">
      <complexContent>
         <extension base="sca:Contract">
         </extension>
      </complexContent>
   </complexType>
   
   <!-- Constraining Service -->
   <complexType name="ConstrainingService">
      <complexContent>
         <restriction base="sca:ComponentService">
            <sequence>
               <element ref="sca:interface" minOccurs="0" maxOccurs="1" />
               <element ref="sca:callback" minOccurs="0" maxOccurs="1" />
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded" />
            </sequence>
            <attribute name="name" type="NCName" use="required" />
         </restriction>
      </complexContent>
   </complexType>
   

   <!-- Component Reference -->
   <complexType name="ComponentReference">
      <complexContent>
         <extension base="sca:Contract">
            <attribute name="autowire" type="boolean" use="optional"/>
            <attribute name="target" type="sca:listOfAnyURIs" 
                       use="optional"/>
            <attribute name="wiredByImpl" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="multiplicity" type="sca:Multiplicity" 
                       use="optional" default="1..1"/>
            <attribute name="nonOverridable" type="boolean" use="optional" 
                       default="false"/>
         </extension>
      </complexContent>
   </complexType>
   
   <!-- Constraining Reference -->
   <complexType name="ConstrainingReference">
      <complexContent>
         <restriction base="sca:ComponentReference">
            <sequence>
               <element ref="sca:interface" minOccurs="0" maxOccurs="1" />
               <element ref="sca:callback" minOccurs="0" maxOccurs="1" />
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded" />
            </sequence>
            <attribute name="name" type="NCName" use="required" />
            <attribute name="autowire" type="boolean" use="optional"/>
            <attribute name="wiredByImpl" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="multiplicity" type="sca:Multiplicity" 
                       use="optional" default="1..1"/>
         </restriction>
      </complexContent>
   </complexType>   
   
   <!-- Component Type Reference -->
   <complexType name="ComponentTypeReference">
      <complexContent>
         <restriction base="sca:ComponentReference">
            <sequence>
               <element ref="sca:documentation" minOccurs="0" 
                        maxOccurs="unbounded"/>
               <element ref="sca:interface" minOccurs="0"/>
               <element ref="sca:binding" minOccurs="0" 
                        maxOccurs="unbounded"/>
               <element ref="sca:callback" minOccurs="0"/>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="autowire" type="boolean" use="optional"/>
            <attribute name="wiredByImpl" type="boolean" use="optional" 
                       default="false"/>
            <attribute name="multiplicity" type="sca:Multiplicity" 
                       use="optional" default="1..1"/>
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
            <anyAttribute namespace="##other" processContents="lax"/>
         </restriction>
      </complexContent>
   </complexType>
   

   <!-- Implementation -->
   <element name="implementation" type="sca:Implementation" abstract="true"/>
   <complexType name="Implementation" abstract="true">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <attribute name="requires" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="policySets" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Implementation Type -->
   <element name="implementationType" type="sca:ImplementationType"/>
   <complexType name="ImplementationType">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="type" type="QName" use="required"/>
            <attribute name="alwaysProvides" type="sca:listOfQNames" 
                       use="optional"/>
            <attribute name="mayProvide" type="sca:listOfQNames" 
                       use="optional"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Wire -->
   <complexType name="Wire">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="source" type="anyURI" use="required"/>
            <attribute name="target" type="anyURI" use="required"/>
            <attribute name="replace" type="boolean" use="optional" 
               default="false"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Include -->
   <element name="include" type="sca:Include"/>
   <complexType name="Include">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <attribute name="name" type="QName"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Constraining Type -->
   <element name="constrainingType" type="sca:ConstrainingType"/>
   <complexType name="ConstrainingType">
      <complexContent>
         <extension base="sca:CommonExtensionBase">
            <sequence>
               <choice minOccurs="0" maxOccurs="unbounded">
                  <element name="service" type="sca:ConstrainingService"/>
                  <element name="reference" 
                           type="sca:ConstrainingReference"/>
                  <element name="property" type="sca:ConstrainingProperty"/>
               </choice>
               <any namespace="##other" processContents="lax" minOccurs="0" 
                    maxOccurs="unbounded"/>
            </sequence>
            <attribute name="name" type="NCName" use="required"/>
            <attribute name="targetNamespace" type="anyURI"/>
         </extension>
      </complexContent>
   </complexType>

   <!-- Intents within WSDL documents -->
   <attribute name="requires" type="sca:listOfQNames"/>

   <!-- Global attribute definition for @callback to mark a WSDL port type    
        as having a callback interface defined in terms of a second port 
        type. -->
   <attribute name="callback" type="anyURI"/>

   <!-- Miscellaneous simple type definitions -->
   <simpleType name="Multiplicity">
      <restriction base="string">
         <enumeration value="0..1"/>
         <enumeration value="1..1"/>
         <enumeration value="0..n"/>
         <enumeration value="1..n"/>
      </restriction>
   </simpleType>
   
   <simpleType name="OverrideOptions">
      <restriction base="string">
         <enumeration value="no"/>
         <enumeration value="may"/>
         <enumeration value="must"/>
      </restriction>
   </simpleType>
   
   <simpleType name="listOfQNames">
      <list itemType="QName"/>
   </simpleType>
   
   <simpleType name="listOfAnyURIs">
      <list itemType="anyURI"/>
   </simpleType>

</schema>

