<?xml version="1.0" encoding="UTF-8"?>
<!-- 
Copyright (c) 2008 ASKALON Sotware License 
(www.askalon.org/copyright/licence.html)

         Distributed and Parallel Systems Group 
         Institute of Computer Science,
         University of Innsbruck, Austria
         represented by Thomas Fahringer
                   

We provide the software of this file (below described as "ASKALON") on an AS IS 
basis, and do not warrant its validity or performance.  We reserve the right to 
update, modify, or discontinue this software at any time.  We shall have no 
obligation to supply such updates or modifications or any other form of support 
to you.

This license is for non-commerical and non-industry use only. (For commercial or 
industry use please contact us at askalon@dps.uibk.ac.at)


The user agrees that any publications, or other disclosure of results obtained 
with this software will acknowledge its use by the following citation:

Thomas Fahringer, Radu Prodan, Rubing Duan, Juergen Hofer, Farrukh Nadeem, 
Francesco Nerieri, Stefan Podlipnig, Jun Qin, Mumtaz Siddiqui, Hong-Linh Truong, 
Alex Villazon and Marek Wieczorek. ASKALON: A Development and Grid Computing 
Environment for Scientific Workflows. In book of Workflows for eScience - - 
Scientific Workflows for Grids. Springer Verlag, 2007.


The full licence text can be found under www.askalon.org/copyright/licence.html 
All copyright notices must be kept intact.
-->
<!--  AGWL XML Schema v1.2 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.askalon.org/agwl" targetNamespace="http://www.askalon.org/agwl" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!--Definitions for types-->
	<xs:complexType name="DataInType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="source" type="xs:string" use="optional"/>
	</xs:complexType>
	<xs:complexType name="DataInsType">
		<xs:sequence>
			<xs:element name="dataIn" type="DataInType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="DataOutType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="source" type="xs:string" use="optional"/>
		<xs:attribute name="saveto" type="xs:string" use="optional"/>
	</xs:complexType>
	<xs:complexType name="DataOutsType">
		<xs:sequence>
			<xs:element name="dataOut" type="DataOutType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="DataLoopType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="initSource" type="xs:string" use="optional"/>
		<xs:attribute name="loopSource" type="xs:string" use="optional"/>
	</xs:complexType>
	<xs:complexType name="DataLoopsType">
		<xs:sequence>
			<xs:element name="dataLoop" type="DataLoopType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="DataEvalType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="source" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="LoopCounterType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="from" type="xs:string" use="required"/>
		<xs:attribute name="to" type="xs:string" use="required"/>
		<xs:attribute name="step" type="xs:string" use="optional"/>
	</xs:complexType>
	<xs:complexType name="LoopElementType">
		<xs:all>
			<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
			<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
		</xs:all>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
		<xs:attribute name="collection" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="PropertyType">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="value" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="PropertiesType">
		<xs:sequence>
			<xs:element name="property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ConstraintType">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="value" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="ConstraintsType">
		<xs:sequence>
			<xs:element name="constraint" type="ConstraintType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ActivityBlockType">
		<xs:sequence>
			<xs:element ref="genericactivity" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="CaseBranchType">
		<xs:complexContent>
			<xs:extension base="ActivityBlockType">
				<xs:attribute name="value" type="xs:string"/>
				<xs:attribute name="break" type="xs:boolean" default="true"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DagNodeType">
		<xs:complexContent>
			<xs:extension base="ActivityBlockType">
				<xs:attribute name="name" type="xs:string"/>
				<xs:attribute name="predecessors" type="xs:string"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DagBodyType">
		<xs:sequence>
			<xs:element name="dagNode" type="DagNodeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ParallelBodyType">
		<xs:sequence>
			<xs:element name="section" type="ActivityBlockType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="GenericActivityType" abstract="true">
		<xs:attribute name="name" type="xs:string"/>
	</xs:complexType>
	<!--Definitions for elements-->
	<xs:element name="genericactivity" type="GenericActivityType" abstract="true"/>
	<xs:element name="activity" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="properties" type="PropertiesType" minOccurs="0"/>
						<xs:element name="constraints" type="ConstraintsType" minOccurs="0"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
					<xs:attribute name="type" type="xs:string"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="sequence" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="sequenceBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="if" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="condition" type="xs:string"/>
						<xs:element name="then" type="ActivityBlockType"/>
						<xs:element name="else" type="ActivityBlockType" minOccurs="0"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="switch" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dataEval" type="DataEvalType"/>
						<xs:element name="case" type="CaseBranchType" maxOccurs="unbounded"/>
						<xs:element name="default" type="ActivityBlockType" minOccurs="0"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="while" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dataLoops" type="DataLoopsType"/>
						<xs:element name="condition" type="xs:string"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="doWhile" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dataLoops" type="DataLoopsType"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="condition" type="xs:string"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="for" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dataLoops" type="DataLoopsType"/>
						<xs:element name="loopCounter" type="LoopCounterType"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="forEach" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dataLoops" type="DataLoopsType"/>
						<xs:element name="loopElement" type="LoopElementType"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="dag" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="dagBody" type="DagBodyType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="parallel" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="parallelBody" type="ParallelBodyType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="parallelFor" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="loopCounter" type="LoopCounterType"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="parallelForEach" substitutionGroup="genericactivity">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="dataIns" type="DataInsType" minOccurs="0"/>
						<xs:element name="loopElement" type="LoopElementType"/>
						<xs:element name="loopBody" type="ActivityBlockType"/>
						<xs:element name="dataOuts" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="agwl">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="workflowInput" type="DataInsType" minOccurs="0"/>
						<xs:element name="workflowBody" type="ActivityBlockType"/>
						<xs:element name="workflowOutput" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:element name="gwio">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="GenericActivityType">
					<xs:sequence>
						<xs:element name="workflowInput" type="DataInsType" minOccurs="0"/>
						<xs:element name="workflowOutput" type="DataOutsType" minOccurs="0"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
</xs:schema>
