<?xml version="1.0" encoding="UTF-8"?>

<!-- Authors: Paul Groth and Luc Moreau -->


<xs:schema targetNamespace="http://openprovenance.org/model/opmx#"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:opmx="http://openprovenance.org/model/opmx#"
           xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           jxb:version="2.0">


  <xs:element name="opmGraph" type="opmx:OPMGraph">
	<xs:annotation>
	  <xs:documentation>A set of assertions about the provenance of things</xs:documentation>
	</xs:annotation>
  </xs:element>

  <xs:complexType name="OPMGraph">
    <xs:annotation>
      <xs:appinfo>
        <jxb:class>
         <jxb:javadoc>
           <![CDATA[ Java class for OPMGraph complex type. See <A href="http://twiki.ipaw.info/bin/view/Challenge/OPM1-01Review">OPMGraph</A>.]]>
         </jxb:javadoc>
        </jxb:class>
      </xs:appinfo>
    </xs:annotation> 
	<xs:sequence>
	  <xs:element name="accounts" type="opmx:Accounts" minOccurs="0"/>
	  <xs:element name="processes" type="opmx:Processes" minOccurs="0"/>
	  <xs:element name="artifacts" type="opmx:Artifacts" minOccurs="0"/>
	  <xs:element name="agents" type="opmx:Agents" minOccurs="0"/>
	  <xs:element name="dependencies" type="opmx:Dependencies" minOccurs="0"/>
	  <xs:element name="annotations" type="opmx:Annotations" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="OPMGraphRef">
    <xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="ProcessRef">
	<xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="ArtifactRef">
	<xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="AgentRef">
	<xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="AccountRef">
	<xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="RoleRef">
    <xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="DependencyRef">
    <xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  <xs:complexType name="AnnotationRef">
    <xs:attribute name="ref" type="xs:IDREF"/>
  </xs:complexType>
  

  <xs:complexType name="Account">
	<xs:sequence>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="Role">
	<xs:sequence>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="value" type="xs:string"/>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>



  <xs:complexType name="Annotation">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
		<xs:sequence>
          <xs:choice minOccurs="0" maxOccurs="1">
            <xs:element name="externalSubject" type="xs:anyURI"/>
            <xs:element name="localSubject"    type="xs:IDREF"/>
          </xs:choice>
		</xs:sequence>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>

  <xs:complexType name="EmbeddedAnnotation">
     <xs:sequence>
        <xs:element name="property" type="opmx:Property"   minOccurs="1"    maxOccurs="unbounded"/>
        <xs:element name="account"  type="opmx:AccountRef" minOccurs="0"    maxOccurs="unbounded" />
	    <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
     </xs:sequence>
     <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Property">
     <xs:sequence>
        <xs:element name="value" type="xs:anyType"/>
     </xs:sequence>
     <xs:attribute name="key" type="xs:anyURI"/>
  </xs:complexType>


  <xs:element name="annotation" type="opmx:EmbeddedAnnotation"/>

  <xs:complexType name="Process">
	<xs:sequence>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Artifact">
	<xs:sequence>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Agent">
	<xs:sequence>
	  <xs:element name="account" minOccurs="0" maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="Used">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ProcessRef"/>
	  <xs:element name="role"    type="opmx:Role"/>
	  <xs:element name="cause"   type="opmx:ArtifactRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
      <xs:element name="time"    type="opmx:OTime" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
    <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasGeneratedBy">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ArtifactRef"/>
	  <xs:element name="role"    type="opmx:Role"/>
	  <xs:element name="cause"   type="opmx:ProcessRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
      <xs:element name="time"    type="opmx:OTime" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
    <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasControlledBy">
	<xs:sequence>
	  <xs:element name="effect"      type="opmx:ProcessRef"/>
	  <xs:element name="role"        type="opmx:Role"/>
	  <xs:element name="cause"       type="opmx:AgentRef"/>
	  <xs:element name="account"     minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
      <xs:element name="startTime"   type="opmx:OTime" minOccurs="0"/>
      <xs:element name="endTime"     type="opmx:OTime" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
    <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasDerivedFrom">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ArtifactRef"/>
	  <xs:element name="cause"   type="opmx:ArtifactRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
      <xs:element name="time"    type="opmx:OTime" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasTriggeredBy">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ProcessRef"/>
	  <xs:element name="cause"   type="opmx:ProcessRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
      <xs:element name="time"    type="opmx:OTime" minOccurs="0"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>


  <xs:complexType name="UsedStar">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ProcessRef"/>
	  <xs:element name="cause"   type="opmx:ArtifactRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
    <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasGeneratedByStar">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ArtifactRef"/>
	  <xs:element name="cause"   type="opmx:ProcessRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
    <xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasDerivedFromStar">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ArtifactRef"/>
	  <xs:element name="cause"   type="opmx:ArtifactRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="WasTriggeredByStar">
	<xs:sequence>
	  <xs:element name="effect"  type="opmx:ProcessRef"/>
	  <xs:element name="cause"   type="opmx:ProcessRef"/>
	  <xs:element name="account" minOccurs="0"    maxOccurs="unbounded" type="opmx:AccountRef"/>
	  <xs:element ref="opmx:annotation"  minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:attribute name="id" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="Dependencies">
	<xs:sequence>
	  <xs:choice minOccurs="0" maxOccurs="unbounded">
		<xs:element name="used"               type="opmx:Used"/>
		<xs:element name="wasGeneratedBy"     type="opmx:WasGeneratedBy"/>
		<xs:element name="wasTriggeredBy"     type="opmx:WasTriggeredBy"/>
		<xs:element name="wasDerivedFrom"     type="opmx:WasDerivedFrom"/>
		<xs:element name="wasControlledBy"    type="opmx:WasControlledBy"/>
		<xs:element name="usedStar"           type="opmx:UsedStar"/>
		<xs:element name="wasGeneratedByStar" type="opmx:WasGeneratedByStar"/>
		<xs:element name="wasDerivedFromStar" type="opmx:WasDerivedFromStar"/>
	  </xs:choice>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Artifacts">
	<xs:sequence>
	  <xs:element name="artifact" type="opmx:Artifact" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>


  <xs:complexType name="Accounts">
	<xs:sequence>
	  <xs:element name="account"  type="opmx:Account"  minOccurs="0" maxOccurs="unbounded"/>
	  <xs:element name="overlaps" type="opmx:Overlaps" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Overlaps">
	<xs:sequence>
	  <xs:element name="account" type="opmx:AccountRef" minOccurs="2" maxOccurs="2"/>
	</xs:sequence>
  </xs:complexType>


  <xs:complexType name="Processes">
	<xs:sequence>
	  <xs:element name="process" type="opmx:Process" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="Agents">
	<xs:sequence>
	  <xs:element name="agent"   type="opmx:Agent" minOccurs="0" maxOccurs="unbounded"/>
	</xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="Annotations">
    <xs:sequence>
      <xs:element name="annotation"   type="opmx:Annotation" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  

 <!-- Observed Time allow for interval of observation. -->

  <xs:complexType name="OTime">
	<xs:annotation>
	  <xs:documentation>Observed Time allow for interval of observation, where an event is said to occur no earlier than a given time t1 and no later than a given time t2. When the event is observed to occur at a specific time, it is not convenient to use an interval. Instead, one can use the alternate exactlyAt attribute. We note that exactlyAt is disjoint from noEarlierThan and noLaterThan.</xs:documentation>
	</xs:annotation>
	<xs:sequence>
	</xs:sequence>
	  <xs:attribute name="noEarlierThan" type="xs:dateTime" />
	  <xs:attribute name="noLaterThan"   type="xs:dateTime" />
	  <xs:attribute name="exactlyAt"     type="xs:dateTime" />
  </xs:complexType>


 <!-- XML Serialisations of OPM Core Annotations. -->

  
  <xs:element name="label" type="opmx:Label" substitutionGroup="opmx:annotation"/>

  <xs:complexType name="Label">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
        <xs:attribute name="value" type="xs:string"/>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>

  <xs:element name="type" type="opmx:Type" substitutionGroup="opmx:annotation"/>

  <xs:complexType name="Type">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
        <xs:attribute name="value" type="xs:anyURI"/>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>

  <xs:element name="value" type="opmx:Value" substitutionGroup="opmx:annotation"/>

  <xs:complexType name="Value">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
        <xs:sequence>
          <xs:element name="content"   type="xs:anyType" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="encoding" type="xs:anyURI"/>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>

  <xs:element name="profile" type="opmx:Profile" substitutionGroup="opmx:annotation"/>

  <xs:complexType name="Profile">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
        <xs:attribute name="value" type="xs:anyURI"/>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>

  <xs:element name="pname" type="opmx:PName" substitutionGroup="opmx:annotation"/>

  <xs:complexType name="PName">
	<xs:complexContent>
	  <xs:extension base="opmx:EmbeddedAnnotation">
        <xs:attribute name="value" type="xs:anyURI"/>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>


</xs:schema>

