<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:sodium:USQL:services"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="urn:sodium:USQL:services"
  xmlns:core="urn:sodium:USQL"
  xmlns="urn:sodium:USQL:services"
  elementFormDefault="qualified">
  
  <!--
    Unified Service Query Language (USQL) version 1.0
    Developed by NKUA, Copyright(c) 2004-2006 NKUA, All rights reserved.

    Services Part.
    This part of the USQL Schema captures all service type-specific 
    requirements, in order to absract the core part from such details. 
    Thus, any modifications regarding supported service types will have 
    no affect to the core part of the language.
    -->
  
  <xs:import namespace="urn:sodium:USQL" schemaLocation="USQL.xsd"/>
  
  <!-- Common set of attributes for all types of response services. -->
  <xs:attributeGroup name="ServiceAttributes">
    <xs:attribute name="degreeOfMatch" type="xs:float" use="required"/>
    <xs:attribute name="verified" type="xs:boolean" use="optional" default="false"/>
  </xs:attributeGroup>
  
  <!-- Supported service types. -->
  <xs:simpleType name="tServiceType">
    <xs:annotation>
      <xs:documentation>Enumerates service types that are supported by USQL.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="WebService"/>
      <xs:enumeration value="P2PService"/>
      <xs:enumeration value="GridService"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Supported P2P network types. -->
  <xs:simpleType name="tNetworkType">
    <xs:annotation>
      <xs:documentation>Enumerates P2P networks that are supported by USQL.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="JXTA"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- A simple type to represent a list of supported service types. -->
  <xs:simpleType name="tServiceTypes">
    <xs:list itemType="tns:tServiceType"/>
  </xs:simpleType>
  
  <xs:attributeGroup name="RequestServiceAttributes">
    <xs:attribute name="serviceType" use="optional">
      <xs:simpleType>
        <xs:restriction base="tns:tServiceTypes">
          <xs:minLength value="1"/>
          <xs:maxLength value="3"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  
  <!-- Service operation structure. (Contains an extension point) -->
  <xs:complexType name="tOperation">
    <xs:sequence>
      <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="name" type="xs:string" nillable="false"/>
    </xs:sequence>
    <xs:attribute name="degreeOfMatch" type="xs:float" use="required"/>
  </xs:complexType>
  
  <!-- Service operation element. -->
  <xs:element name="Operation">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="tns:tOperation">
          <xs:group ref="core:AdditionalOperationProperties"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <!-- Generic response service element (Contains extension point) -->
  <xs:element name="Service" type="tns:tService"/>
  <xs:complexType name="tService">
    <xs:sequence>
      <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="descriptionDocUrl" type="xs:anyURI"/>
      <xs:element name="resourceInstance" type="xs:string" minOccurs="0"/>
      <xs:group ref="core:AdditionalServiceProperties"/>
      <xs:element name="interface" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="tns:Operation" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attributeGroup ref="tns:ServiceAttributes"/>
    <xs:attribute name="type" type="tns:tServiceType" use="required"/>
    <xs:attribute name="networkType" type="tns:tNetworkType" use="optional"/>
  </xs:complexType>
  
  <xs:element name="Services">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:Service" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
</xs:schema>
