<?xml version="1.0" encoding="UTF-8"?>

<!-- 
    
    DIG 2.0 Interface
    DIG Reponses XML Schema Definition
    ==================================
    Original Author: Timo Weithoener, Ulm University, Dept. of AI
    
    12.09.2006 - Creation
    
    This file currently contains an overall suggestion for
    handling of error messages and warnings applicable
    for responses to core asks as well as reponses to queries
    answered by extensions (like told, NSI) and a concrete
    suggestion for the response schema of core asks.
    
    ??? How to integrate reponses from extensions ???
    
-->

<xs:schema 
    targetNamespace="http://dl.kr.org/dig/lang/responses-schema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://dl.kr.org/dig/lang/responses-schema"
    xmlns:lang="http://dl.kr.org/dig/lang/schema"
    attributeFormDefault="unqualified"
    elementFormDefault="qualified">

    <xs:import namespace="http://dl.kr.org/dig/lang/schema" schemaLocation="http://dig.cs.manchester.ac.uk/schema.xsd"/>
    
    <xs:attributeGroup name="messageAttributes">
        <xs:attribute name="code" type="xs:int" use="required"/>
    </xs:attributeGroup>
    
    <xs:attributeGroup name="responseAttributes">
       <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:attributeGroup>
    
    <xs:simpleType name="booleanValue">
        <xs:restriction base="xs:string">
            <xs:enumeration value="true|false"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="synonymSet">
        <xs:choice>
            <xs:group ref="lang:description" minOccurs="1" maxOccurs="unbounded"/>
            <xs:group ref="lang:dataPropertyExpression" minOccurs="1" maxOccurs="unbounded"/>
            <xs:group ref="lang:objectPropertyExpression" minOccurs="1" maxOccurs="unbounded"/>
            <xs:element ref="lang:individual" minOccurs="1" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    
    <xs:complexType name="message">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attributeGroup ref="messageAttributes"/>        
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    
    <xs:complexType name="warning">
        <xs:complexContent>
            <xs:extension base="message"/>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="error">
        <xs:complexContent>
            <xs:extension base="message"/>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:group name="coreAskResult">
        <xs:choice>
            <xs:element name="boolean" type="booleanValue"/>
            <!-- TBD: Is a long list of synonyms OK? The client has to
                know how to interpret such a list. How many synomy sets per
                answer are expected. Alternatively "rows" and "cols" need to be modeled -->
            <xs:element name="synonyms" type="synonymSet" minOccurs="1" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:group>
    
    <xs:group name="result">
        <xs:choice>
            <xs:group ref="coreAskResult"/>
            <!-- EXTENSION PROPOSAL: How to integrate other responses at this place? -->
        </xs:choice>
    </xs:group>
    
    <xs:complexType name="response">
        <xs:choice>
            <xs:element name="error" type="error" minOccurs="1" maxOccurs="unbounded"/>
            <xs:sequence>
                <xs:group ref="result"/>
                <xs:element name="warning" type="warning" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:choice>
        <xs:attributeGroup ref="responseAttributes"/>
    </xs:complexType>   
    
    <xs:complexType name="responses">
        <xs:choice>
            <xs:element name="error" type="error" minOccurs="1" maxOccurs="unbounded"/>
            <xs:sequence>
                <xs:element name="response" type="response" minOccurs="1" maxOccurs="unbounded"/>
                <xs:element name="warning" type="warning" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
    
    <xs:element name="responses" type="responses"/>
    
</xs:schema>
