#   Licensed to the Apache Software Foundation (ASF) under one or more
#   contributor license agreements.  See the NOTICE file distributed with
#   this work for additional information regarding copyright ownership.
#   The ASF licenses this file to You under the Apache License, Version 2.0
#   (the "License"); you may not use this file except in compliance with
#   the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
@prefix roevo: <http://purl.org/wf4ever/roevo#> .
@prefix ro: <http://purl.org/wf4ever/ro#> .
@prefix wfdesc: <http://purl.org/wf4ever/wfdesc#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix terms: <http://purl.org/dc/terms/> .
@prefix scufl2: <http://ns.taverna.org.uk/2010/scufl2#> .
@prefix : <#> .

<wf-v3> a wfdesc:Workflow, scufl2:Workflow, roevo:VersionableResource, prov:Entity ;
    terms:identifier "23481928391283" ;
    prov:wasGeneratedBy <wf-v3-change> ;
    roevo:wasChangedBy <wf-v3-change> .
    
<wf-v3-change-spec> a roevo:ChangeSpecification, prov:Activity ;
    prov:endedAtTime "2012-12-24T18:00:00+01" ;
    roevo:fromVersion <wf-v2> ;
    roevo:toVersion <wf-v3> ;
    roevo:hasChange <wf-v3-change> .

<wf-v3-change> a roevo:Change, roevo:Addition, prov:Activity ;
    prov:wasGeneratedBy <wf-v3-change> ;
    prov:used <nested-workflow1> ;
    roevo:relatedResource <nested-workflow1> .

# Short-hand form without any related resource
<wf-v2> a roevo:VersionableResource ;
     roevo:wasChangedBy [ a roevo:ChangeSpecification ;
         roevo:fromVersion <wf-v1> ;
         roevo:hasChange [ a roevo:Addition
		roevo:relatedResource <nested-workflow1>.
	]	
     ] .

# Simple
<simple-v3> a prov:Entity ;
    prov:generatedAtTime  "2012-12-24T18:00:00+01" ;
    prov:wasRevisionOf <simple-v2> .


# Joined
<joint-v3> a prov:Entity ;
    prov:generatedAtTime  "2012-12-24T18:00:00+01" ;
    prov:wasRevisionOf <joint-v2> ;
    roevo:wasChangedBy [ a roevo:ChangeSpecification, prov:Activity;
        roevo:fromVersion <joint-v2> ;
        roevo:hasChange [ a roevo:Addition;
            roevo:relatedResource <nested-workflow1> 
        ] 
    ] .


<VersionableResource rdf:about="joint-v3">
  <wasChangedBy>
    <ChangeSpecification>
      <fromVersion rdf:resource="joint-v2"/>
      <hasChange>
        <Addition>
          <relatedResource rdf:resource="nested-workflow1"/>
        </Addition>
      </hasChange>
    </ChangeSpecification>
  </wasChangedBy>
  <prov:generatedAtTime>2012-12-24T18:00:00+01</prov:generatedAtTime>
  <prov:wasRevisionOf rdf:resource="joint-v2"/>
</VersionableResource>

<VersionableResource rdf:about="joint-v2">
  <wasChangedBy>
    <ChangeSpecification>
      <fromVersion rdf:resource="joint-v1"/>
      <hasChange>
        <Addition>
          <relatedResource rdf:resource="nested-workflow1"/>
        </Addition>
      </hasChange>
    </ChangeSpecification>
  </wasChangedBy>
  <prov:generatedAtTime>2012-12-24T18:00:00+01</prov:generatedAtTime>
  <prov:wasRevisionOf rdf:resource="joint-v1"/>
</VersionableResource>


