﻿<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright © 2019 COZYROC LLC. All rights reserved. -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Configuration">
    <xs:complexType>
      <xs:all>
        <xs:element name="Queues" type="Queues" />
        <xs:element name="Profiles" type="Profiles" />
        <xs:element name="Services" type="Services" />
      </xs:all>
      <xs:attribute name="XSDVersion" type="ServiceConfigXSDVersion" use="required" />
      <xs:anyAttribute />
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Queues">
    <xs:sequence>
      <xs:element name="Queue" type="Queue" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Profiles">
    <xs:sequence>
      <xs:element name="Profile" type="Profile" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Services">
    <xs:sequence>
      <xs:element name="Service" type="Service" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Queue">
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="Id" type="xs:string" use="required" />
    <xs:attribute name="ConnectionString" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="Inputs">
    <xs:sequence>
      <xs:element name="Input" type="Input" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Outputs">
    <xs:sequence>
      <xs:element name="Output" type="Output" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Profile">
    <xs:sequence>
      <xs:element name="Unit" type="Unit" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="LogConfigFile" type="xs:string" use="optional" />
    <xs:attribute name="Timeout" type="xs:int" use="optional" />
    <xs:attribute name="BatchSize" type="xs:int" use="optional" />
  </xs:complexType>

  <xs:complexType name="Service">
    <xs:all>
      <xs:element name="Package" type="Package" />
      <xs:element name="Inputs" type="Inputs" minOccurs="0" />
      <xs:element name="Outputs" type="Outputs" minOccurs="0" />
    </xs:all>
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="Tags" type="xs:string" use="optional" />
    <xs:attribute name="Timeout" type="xs:int" use="optional" />
    <xs:attribute name="BatchSize" type="xs:int" use="optional" />
    <xs:attribute name="Concurrency" type="xs:int" use="optional" />
    <xs:attribute name="StreamingMode" type="StreamingModeEnum" use="optional" />
  </xs:complexType>

  <xs:complexType name="Unit">
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="MinNumberOfRunners" type="xs:int" use="optional" />
    <xs:attribute name="MaxMemory" type="xs:int" use="optional" />
    <xs:attribute name="Queue" type="xs:string" use="required" />
    <xs:attribute name="SqlVersion" type="xs:int" use="required" />
    <xs:attribute name="Tags" type="xs:string" use="optional" />
    <xs:attribute name="LogConfigFile" type="xs:string" use="optional" />
    <xs:attribute name="StreamingMode" type="StreamingModeEnum" use="optional" />
    <xs:attribute name="KeepAliveInterval" type="xs:int" use="optional" default="30" />
    <!--Process start info, stored in connection string format.-->
    <xs:attribute name="ProcessStartInfo" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="Package">
    <xs:attribute name="Path" type="xs:string" use="required" />
    <xs:attribute name="Use32RuntimeOn64" type="xs:boolean" use="optional" />
    <xs:attribute name="ConnectionString" type="xs:string" use="optional" />
    <xs:attribute name="ConnectionType" type="ConnectionTypeEnum" use="optional" />
    <xs:attribute name="Password" type="xs:string" use="optional" />
  </xs:complexType>

  <xs:complexType name="Input" >
    <xs:complexContent>
      <xs:extension base="Channel" />
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Output" >
    <xs:complexContent>
      <xs:extension base="Channel" />
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Channel">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attributeGroup ref="Channel" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="ConnectionTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="File"/>
      <xs:enumeration value="SQL"/>
      <xs:enumeration value="DTS"/>
      <xs:enumeration value="Catalog"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="StreamingModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Default"/>
      <xs:enumeration value="Normal"/>
      <xs:enumeration value="Passive"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ChannelTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Parameter"/>
      <xs:enumeration value="Property"/>
      <xs:enumeration value="Variable"/>
      <xs:enumeration value="Connection"/>
      <xs:enumeration value="Stream"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:attributeGroup name="Channel">
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="ChannelType" type="ChannelTypeEnum" use="required" />
  </xs:attributeGroup>

  <xs:simpleType name="ServiceConfigXSDVersion">
    <xs:restriction base="ConfigVersion">
      <xs:minInclusive value="1.00" />
      <xs:maxExclusive value="1.01" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ConfigVersion">
    <xs:restriction base="xs:decimal">
      <xs:fractionDigits value="2" />
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

