<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.opengis.net/wrs"
   xmlns:wrs="http://www.opengis.net/wrs"
   xmlns:ogc="http://www.opengis.net/ogc"
   xmlns:ebrim="urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.1"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="qualified"
   version="0.7.1">

  <xsd:annotation>
    <xsd:appinfo source="urn:opengis:specification:wrs:schema-xsd:transaction:v0.7.1" />
    <xsd:documentation xml:lang="en">
    This schema defines request and response messages for WRSTransaction operations.
    Copyright (c) 2002 OGC, All Rights Reserved.
    </xsd:documentation>
  </xsd:annotation>
  
  <!-- include query elements -->
  <xsd:include schemaLocation="WRS-query.xsd"/>
  <!-- import filter, ebRIM, and OGCRIM components -->
  <xsd:import namespace="http://www.opengis.net/ogc" 
      schemaLocation="../../filter/1.0.20/filter.xsd"/>
  <xsd:import namespace="urn:oasis:names:tc:ebxml-regrep:rim:xsd:2.1"
      schemaLocation="../../ogcrim/0.1.20/ebRIM.xsd"/>
  <!--
    Even though nothing from it is directly referenced in this schema,
    OGCRIM.xsd is imported so that an insert transaction message will validate
    against this schema when it contains an OGCExtrinsicObject.
  -->
  <xsd:include schemaLocation="../../ogcrim/0.1.20/OGCRIM.xsd"/>

   <!-- request messages -->
  <xsd:element name="Transaction" type="wrs:TransactionType"/>
  <xsd:element name="TransactionResponse" type="wrs:TransactionResponseType"/>
  <xsd:element name="RegisterResource" type="wrs:RegisterResourceType"/>
  <xsd:element name="RegisterResourceResponse" type="wrs:RegisterResourceResponseType" />
  <xsd:element name="LockRecord" type="wrs:LockRecordType"/>
  <xsd:element name="LockRecordResponse" type="wrs:LockRecordResponseType"/>
  
  <xsd:element name="SUCCESS" type="wrs:EmptyType"/>
  <xsd:element name="FAILED"  type="wrs:EmptyType"/>
  <xsd:element name="PARTIAL" type="wrs:EmptyType"/>
  
  <!-- type definitions -->
   
   <xsd:complexType name="RegisterResourceType">
     <xsd:annotation>
      <xsd:documentation xml:lang="en">
      Registers a resource according to the 'pull' model.
      name            : name of the resource;
      title           : title of the resource;
      description     : description of the resource;
      objectType      : a QName that specifies the type of resource;
      accessURL       : the URL by which a fresh copy of the resource may 
                        be accessed;
      ownerContactInfo: information about the owner of the resource;
      validityPeriod  : length of the period following registration during 
                        which the resource is considered valid. Upon expiry, 
                        the registry will attempt to harvest a fresh copy.
      </xsd:documentation>
    </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="name" type="xsd:string" minOccurs="0" />
         <xsd:element name="title" type="xsd:string" minOccurs="0" />
         <xsd:element name="description" type="xsd:string" minOccurs="0" />
         <xsd:element name="objectType" type="xsd:QName" />
         <xsd:element name="accessURL" type="xsd:anyURI" />
         <xsd:element name="ownerContactInfo" type="xsd:string" />
         <xsd:element name="validityPeriod" type="xsd:duration" />
      </xsd:sequence>
   </xsd:complexType>
   
   <xsd:complexType name="LockRecordType">
      <xsd:sequence>
         <xsd:element name="Expiry"
                      type="xsd:positiveInteger" minOccurs="0" maxOccurs="1"/>
         <xsd:element name="Lock"
                      type="wrs:LockType" minOccurs="1" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="version"
                     type="xsd:string" use="optional" fixed="0.6.20"/>
      <xsd:attribute name="service"
                     type="xsd:string" use="optional" fixed="WRS"/>
   </xsd:complexType>
   <xsd:complexType name="LockType">
      <xsd:sequence>
         <xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
      <xsd:attribute name="typeName" type="xsd:QName" use="required"/>
      <xsd:attribute name="handle" type="xsd:string" use="optional"/>
      <xsd:attribute name="lockAction" type="wrs:AllSomeType" use="optional"/>
   </xsd:complexType>
   <xsd:complexType name="TransactionType">
      <xsd:sequence>
         <xsd:element ref="wrs:LockId" minOccurs="0" maxOccurs="1"/>
         <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element ref="wrs:Insert" />
            <xsd:element ref="wrs:Update" />
            <xsd:element ref="wrs:Delete" />
            <xsd:element ref="wrs:Native" />
         </xsd:choice>
      </xsd:sequence>
      <xsd:attribute name="version"
                     type="xsd:string" use="optional" default="0.7.1"/>
      <xsd:attribute name="serviceType" type="xsd:anyURI" 
        use="optional" default="http://www.opengis.net/services#WRS"/>
      <xsd:attribute name="handle"
                     type="xsd:string" use="optional"/>
      <xsd:attribute name="releaseAction"
                     type="wrs:AllSomeType" use="optional"/>
   </xsd:complexType>
   <xsd:element name="LockId" type="xsd:string"/>
   <xsd:element name="Insert" type="wrs:InsertElementType"/>
   <xsd:complexType name="InsertElementType">
      <xsd:sequence>
         <xsd:element ref="ebrim:RegistryObject" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="handle" type="xsd:string" use="optional"/>
   </xsd:complexType>
   <xsd:element name="Update" type="wrs:UpdateElementType"/>
   <xsd:complexType name="UpdateElementType">
      <xsd:sequence>
         <xsd:element ref="ebrim:RegistryObject"/>
         <xsd:element ref="ogc:Filter" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
      <xsd:attribute name="handle" type="xsd:string" use="optional"/>
   </xsd:complexType>
   <xsd:element name="Delete" type="wrs:DeleteElementType"/>
   <xsd:complexType name="DeleteElementType">
      <xsd:sequence>
         <xsd:element ref="ogc:Filter" minOccurs="1" maxOccurs="1"/>
      </xsd:sequence>
      <xsd:attribute name="typeName" type="xsd:QName" use="optional"/>
      <xsd:attribute name="handle" type="xsd:string" use="optional"/>
   </xsd:complexType>
   <xsd:element name="Native" type="wrs:NativeType"/>
   <xsd:complexType name="LockRecordResponseType">
      <xsd:sequence>
         <xsd:element ref="wrs:LockId"/>
         <xsd:element name="RecordsLocked"
                      type="wrs:RecordsLockedType"
                      minOccurs="0"/>
         <xsd:element name="RecordsNotLocked"
                      type="wrs:RecordsNotLockedType"
                      minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="RecordsLockedType">
      <xsd:sequence maxOccurs="unbounded">
         <xsd:element ref="ogc:FeatureId"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="RecordsNotLockedType">
      <xsd:sequence maxOccurs="unbounded">
         <xsd:element ref="ogc:FeatureId"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="TransactionResponseType">
      <xsd:sequence>
         <xsd:element name="InsertResult"
                      type="wrs:InsertResultType"
                      minOccurs="0" maxOccurs="unbounded"/>
         <xsd:element name="TransactionResult"
                      type="wrs:TransactionResultType"/>
      </xsd:sequence>
      <xsd:attribute name="version" type="xsd:string" use="required"/>
   </xsd:complexType>
   <xsd:complexType name="TransactionResultType">
      <xsd:sequence>
         <xsd:element name="Status" type="wrs:StatusType"/>
         <xsd:element name="Locator" type="xsd:string" minOccurs="0"/>
         <xsd:element name="Message" type="xsd:string" minOccurs="0"/>
      </xsd:sequence>
      <xsd:attribute name="handle" type="xsd:string"/>
   </xsd:complexType>
   <xsd:complexType name="InsertResultType">
      <xsd:sequence>
         <xsd:element ref="ogc:FeatureId" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="handle" type="xsd:string"/>
   </xsd:complexType>
   <xsd:complexType name="StatusType">
      <xsd:choice>
         <xsd:element ref="wrs:SUCCESS"/>
         <xsd:element ref="wrs:FAILED"/>
         <xsd:element ref="wrs:PARTIAL"/>
      </xsd:choice>
   </xsd:complexType>
   
   <xsd:complexType name="NativeType">
     <xsd:attribute name="vendorId" type="xsd:string" use="required"/>
     <xsd:attribute name="safeToIgnore" type="xsd:boolean" use="required"/>
   </xsd:complexType>
   
   <xsd:complexType name="EmptyType" />
   
   <xsd:simpleType name="AllSomeType">
      <xsd:restriction base="xsd:string">
         <xsd:enumeration value="ALL"/>
         <xsd:enumeration value="SOME"/>
      </xsd:restriction>
   </xsd:simpleType>
   
   <xsd:complexType name="RegisterResourceResponseType">
      <xsd:sequence>
         <xsd:element name="accessURL" type="xsd:anyURI"
                      minOccurs="0" maxOccurs="1"/>
         <xsd:element name="RecordId" type="xsd:anyURI"
                      minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
      <xsd:attribute name="version" type="xsd:string" use="optional" default="0.7.1"/>
   </xsd:complexType>
   
</xsd:schema>
