<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  xmlns="http://bibiserv.techfak.uni-bielefeld.de/xsd/2005/11/sdl"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:sdl="http://bibiserv.techfak.uni-bielefeld.de/xsd/2005/11/sdl"
  targetNamespace="http://bibiserv.techfak.uni-bielefeld.de/xsd/2005/11/sdl"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">
  <!-- ################################################### -->
  <xs:element name="process" type="sdl:Tprocess"/> 
  <xs:element name="service" type="sdl:Tservice"/>
  <!-- ################################################### -->
  <xs:complexType name="Tprocess">
    <xs:annotation>
      <xs:documentation> Beschreibt einen Process der mindestens aus einem Service oder Menge von
        Services besteht, die mittels sogenannter Connectoren verknüpft sind. Idee und Umsetzung
        basiert auf BPEL (Businuess Process E. Language). </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="connectors" type="sdl:Tconnectors" minOccurs="0" maxOccurs="1"/>
      <xs:choice>
        <xs:element name="sequence" type="sdl:Tsequence"/>
        <xs:element name="flow" type="sdl:Tflow"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="id" use="required" type="xs:NCName"/>
    <xs:attribute name="name" use="optional" type="xs:NCName"/>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tconnectors">
    <xs:annotation>
      <xs:documentation>Eine Liste von Connectoren</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="connector" type="sdl:Tconnector" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tconnector">
    <xs:annotation>
      <xs:documentation>Ein Connector verknüpft die Ausgabe eines Service mit der angebenen Eingabe
        eines anderen Service</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="from" type="sdl:Tfrom"/>
      <xs:element name="to" type="sdl:Tto"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:NCName"/>
    <xs:attribute name="name" type="xs:NCName"/>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tsequence">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element name="service"  type="sdl:Tservice"/>
      <xs:element name="sequence"  type="sdl:Tsequence"/>
      <xs:element name="flow"  type="sdl:Tflow"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tflow">
    <xs:sequence>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="service"  type="sdl:Tservice"/>
        <xs:element name="sequence"  type="sdl:Tsequence"/>
        <xs:element name="flow"  type="sdl:Tflow"/>
        </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tfrom">
    <xs:attribute name="id" use="required" type="xs:NCName"/>
  </xs:complexType>
  <!-- ################################################### -->
  <xs:complexType name="Tto">
    <xs:attribute name="id" use="required" type="xs:NCName"/>
    <xs:attribute name="name" use="required" type="xs:NCName"/>
  </xs:complexType>
  <!-- ################################################### -->
  
  <!-- # Tservice ################################### -->
  <xs:complexType name="Tservice">
    <xs:sequence>
      <xs:element name="description" type="xs:string"/>
      <xs:choice>
        <xs:element name="webservice" type="sdl:Twebservice"/>
        <xs:element name="biodom" type="sdl:Tbiodom"/>
        <xs:element name="data" type="sdl:Tdata"/>
      </xs:choice>
      <xs:element name="input"  type="sdl:Tinput" maxOccurs="unbounded"/>
      <xs:element name="output"  type="sdl:Toutput" maxOccurs="1"/>    
    </xs:sequence>
    <xs:attribute name="id" type="xs:ID" use="required"/>
    <xs:attribute name="name" type="xs:string" use="optional"/>        
  </xs:complexType>
  
  
  <!-- # TWebService ################################### -->
  <xs:complexType name="Twebservice">
    <xs:sequence>
      <xs:element name="wsdl" type="xs:anyURI"/>
      <xs:element name="port" type="sdl:TWSport"/>
      <xs:element name="type" type="sdl:TWStype"/>           
      <xs:element name="request" type="xs:string"/>
      <xs:element name="response" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="optional"/>
  </xs:complexType>
  
  <!-- # TBioDOM ################################### -->
  <xs:complexType name="Tbiodom">
    <xs:sequence>
      <xs:element name="class" type="xs:string"/>
      <xs:element name="function" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>    
  
  <!-- # Data ################################### -->
  <xs:complexType name="Tdata">
    <!-- type contains nothing until now -->
  </xs:complexType> 
  
  <!-- # TInput ################################### -->
  <xs:complexType name="Tinput">
    <xs:choice>
      <xs:element name="primitive" type="sdl:Tprimitive"/>
      <xs:element name="parameterlist" type="sdl:Tparameterlist"/>
      <xs:element name="document" type="sdl:Tdocument"/>
    </xs:choice>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>
  
  <!-- # Toutput ################################### -->
  <xs:complexType name="Toutput">
    <xs:choice>
      <xs:element name="primitive" type="sdl:Tprimitive"/>
      <xs:element name="document" type="sdl:Tdocument"/>
    </xs:choice>
    <xs:attribute name="name" type="xs:string" use="optional"/>
  </xs:complexType>
  
  <!-- # TWSport ################################### -->
  <xs:complexType name="TWSport">
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="addresslocation" type="xs:anyURI" use="required"/>
  </xs:complexType>
  
  <!-- # TWStype ################################### -->
  <xs:simpleType name="TWStype" >
    <xs:restriction base="xs:string">
      <xs:pattern value="sync|async|syncHOBIT|asyncHOBIT"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- # Tprimitive ################################### -->
  <xs:complexType name="Tprimitive">
    <xs:simpleContent>
      <xs:extension base="xs:anySimpleType">
        <xs:attribute name="type" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="string|boolean|byte|short|int|long|float|double"/>
            </xs:restriction>        
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  
  <!-- # Tparameter/Tparameterlist ################################### -->
  <xs:complexType name="Tparameterlist">
    <xs:sequence>
      <xs:element name="parameter" type="sdl:Tparameter" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Tparameter">
    <xs:simpleContent>
      <xs:extension base="xs:anySimpleType">
        <xs:attribute name="name" use="required" type="xs:string"/>
        <xs:attribute name="use" use="optional" default="optional">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="optional|required"></xs:pattern>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="type" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="string|boolean|byte|short|int|long|float|double"/>
            </xs:restriction>        
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="min" type="xs:double" use="optional"/>
        <xs:attribute name="max" type="xs:double" use="optional"/>
        <xs:attribute name="regexp" type="xs:string" use="optional"/>
        <xs:attribute name="default" type="xs:anySimpleType" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
    
  </xs:complexType>
  
  <!-- # Tdocument ################################### -->
  <xs:complexType name="Tdocument">
    <xs:attribute name="namespace" type="xs:string" use="optional"/>
    <xs:attribute name="schemaLocation" type="xs:anyURI" use="optional"></xs:attribute>
  </xs:complexType>
</xs:schema>

