content/ns/2008/xml/t2flow/t2flow.xsd (854 lines of code) (raw):
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<schema targetNamespace="http://taverna.sf.net/2008/xml/t2flow"
elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tav="http://taverna.sf.net/2008/xml/t2flow" xml:lang="en">
<annotation>
<documentation>
<p xmlns='http://www.w3.org/1999/xhtml'>
This is a descriptive, informative XML Schema
describing
the serialisation format of Taverna 2 workflows, as of
Taverna 2.0.
Such workflows are commonly served with the extension
.t2flow and
served using the content-type
application/vnd.taverna.t2flow+xml
</p>
<p xmlns='http://www.w3.org/1999/xhtml'>
Stable as of 2009-09-11 by Stian Soiland-Reyes, should correctly
describe workflows as saved from Taverna 2.0, 2.1 b1 and 2.1 b2, but
as this schema has been made in retrospect no guarantees are made.
To test the schema against the examples, try xmllint:
<code>xmllint --noout --schema t2flow.xsd examples/*t2flow</code>
</p>
</documentation>
</annotation>
<element name="workflow" type="tav:Workflow">
<annotation>
<documentation>The container element for a .t2flow workflow
definition. Future versions of Taverna may support other kinds of
flows, like control flows, but currently only Dataflows are
supported. The Dataflow with role="top" is the main workflows.
</documentation>
</annotation>
</element>
<complexType name="Workflow">
<annotation>
<documentation>
The container of a workflow definition. This schema
specifies workflow definitions where version="1" (as
used by Taverna
2.0) - although this schema also permits
any future minor versions
like "1.1".
At least one dataflow must be present, and it must have
role="top". Other dataflows would typically be
referenced by their id
from the nested workflow
activity.
</documentation>
</annotation>
<sequence>
<element name="dataflow" type="tav:Dataflow" maxOccurs="unbounded"
minOccurs="1">
</element>
</sequence>
<attribute use="required" name="version" type="tav:Version1">
</attribute>
<attribute name="producedBy" type="string" use="optional">
<annotation>
<documentation>Application that produced (ie. saved/serialised) this
workflow.
Example: taverna-2.1-beta-1
Introduced in Taverna 2.1 Beta
1 - if the value is missing it's safe to
assume 'taverna-2.0' -
although it might also be a workflow saved
through another
application using the pre 2.1 APIs, such as the
Taverna Platform.
</documentation>
</annotation>
</attribute>
</complexType>
<complexType name="Dataflow">
<annotation>
<documentation>A dataflow, that is a workflow that is data-driven.
When running a dataflow, data is pushed onto the inputPorts, leading
through the datalinks to the input ports of processors. The output
ports of these processors again have datalinks to other processors,
and to outputPorts, which are the results of the workflow.
Additional control links can be listed under 'conditions', and
annotations (descriptions) about the Dataflow under 'annotations'.
The "role" attribute should be "top" for the main dataflow, and
"nested" for nested dataflows. The uuid-s in "id" can be referenced
from a nested dataflow activity.
</documentation>
</annotation>
<sequence>
<element name="name" type="string">
<annotation>
<documentation></documentation>
</annotation>
</element>
<element name="inputPorts" type="tav:AnnotatedGranularDepthPorts">
<annotation>
<documentation>List of dataflow input ports. Input ports are the
"parameters" or inputs to running a workflow and must be described
with depth and granular depth.
</documentation>
</annotation>
</element>
<element name="outputPorts" type="tav:AnnotatedPorts">
<annotation>
<documentation>List of output ports of the dataflows. Results are
delivered to the output ports, the depth of the output port is
calculated at runtime.
</documentation>
</annotation>
</element>
<element name="processors" type="tav:Processors">
<annotation>
<documentation>List of processors. Processors receive, process and
produce data and are linked with each other using datalinks.
</documentation>
</annotation>
</element>
<element name="conditions" type="tav:Conditions">
<annotation>
<documentation>List of conditional control link. A control link
between processor A and B means that processor B will not run
until processor A has finished all it's iterations.
</documentation>
</annotation>
</element>
<element name="datalinks" type="tav:Datalinks">
<annotation>
<documentation>List of datalinks. A datalink goes between ports,
for instance from a processor output port to a processor input
port. The "source" end of the link can also come from a dataflow
input port, and the "sink" end can go to a dataflow output port. A
processor output port and a dataflow input port can have several
links to different ports, but a processor input port or a dataflow
output port can't have several incoming links. However, a
processor input port can have several incoming links through a
'merge', which will wrap the inputs into an ordered list.
</documentation>
</annotation>
</element>
<element name="annotations" type="tav:Annotations" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>List of annotations, ie. descriptions and metadata
about the dataflow such as "title" and "author".
</documentation>
</annotation>
</element>
</sequence>
<attribute name="id" type="tav:uuid" use="required">
<annotation>
<documentation>A unique identifier for this dataflow (UUID). This id
should change whenever a structural change has been done to the
dataflow.
</documentation>
</annotation>
</attribute>
<attribute name="role" type="tav:role" use="required">
<annotation>
<documentation>The role of this Dataflow within the Workflow
container. The "top" dataflow is the main one, while "nested"
dataflows might be referenced by id from activities.
</documentation>
</annotation>
</attribute>
</complexType>
<simpleType name="uuid">
<annotation>
<documentation>A hex-formatted UUID. (Universial Unique IDentifier).
UUIDs should be generated using a random algorithm so that they
can't identify the machine who saved the dataflow.
</documentation>
</annotation>
<restriction base="string">
<pattern
value="[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}">
</pattern>
</restriction>
</simpleType>
<simpleType name="role">
<annotation>
<documentation>The role of a dataflow within a workflow.
</documentation>
</annotation>
<restriction base="string">
<enumeration value="top"></enumeration>
<enumeration value="nested"></enumeration>
</restriction>
</simpleType>
<complexType name="Ports">
<annotation>
<documentation>List of ports.</documentation>
</annotation>
<sequence>
<element name="port" type="tav:Port" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="Processors">
<annotation>
<documentation>List of processors.</documentation>
</annotation>
<sequence>
<element name="processor" type="tav:Processor" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="Conditions">
<annotation>
<documentation>List of conditional control links.
</documentation>
</annotation>
<sequence>
<element name="condition" type="tav:Condition" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="Datalinks">
<annotation>
<documentation>List of datalinks between dataflow ports and
processors in a workflow.
</documentation>
</annotation>
<sequence>
<element name="datalink" type="tav:DataLink" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="Port">
<sequence>
<element name="name" type="tav:PortName"></element>
</sequence>
</complexType>
<complexType name="Processor">
<annotation>
<documentation>A processor of a dataflow. A processor is a dataflow
unit that receives input to its input ports, iterates over it using
the iteration strategy stack, and pushes it down the dispatch stack
to reach the activities that invokes the actual services. The
outputs from the services buble up through the dispatch stack and is
pushed out on the output ports, indexed according to the iteration
strategy.
</documentation>
</annotation>
<sequence>
<element name="name" type="tav:ProcessorName">
<annotation>
<documentation>Name of processor within the dataflow. This name is
used to describe datalinks. The name of a processor must be
locally unique within a dataflow. (However the name can be reused
in a nested dataflow)
</documentation>
</annotation>
</element>
<element name="inputPorts" type="tav:DepthPorts">
<annotation>
<documentation>List of processor input ports. Inputs are described
with depth. Inputs served at a lower depth will be wrapped, if it
is served at a higher depth the iteration strategy stack will be
involved to do the iteration over the input. "Depth" means the
granularity of data, single strings are depth 0, a list of strings
are depth 1, lists of such lists are depth 2, etc.
</documentation>
</annotation>
</element>
<element name="outputPorts" type="tav:GranularDepthPorts">
<annotation>
<documentation>List of processor output ports. Output ports must be
described with both depth and granular depth, although in most
cases the two are equal. The "depth" describes the granularity of
the final output produced by a data port (assuming no iteration,
the additional depth from this is added at runtime). If a
processor (and its activity) produces intermediate outputs at
lower granularity than the granularDepth can be set to describe at
which level the intermediate outputs will be produced. (Note that
such a processor would still need to produce the final list of the
defined depth in the end).
</documentation>
</annotation>
</element>
<element name="annotations" type="tav:Annotations" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>List of processor annotations, describing this
processor. For instance a description could say what is the role
of this processor in the dataflow.
</documentation>
</annotation>
</element>
<element name="activities" type="tav:Activities">
<annotation>
<documentation>List of activities that is to be invoked by this
processor. It is down to the dispatch stack to do the activity
selection (typically by the Failover layer) so that in the bottom
a single activity is invoked at a time. The activities must have
output mapping to be able to populate all of this processors
outputPorts, and can have input mapping to use one or more of the
input ports. Note that the depth of the mapped activity ports must
match the defined depths in the Processor ports.
</documentation>
</annotation>
</element>
<element name="dispatchStack" type="tav:DispatchStack">
<annotation>
<documentation>The dispatch stack. The stack is made out of layers
that send jobs down and receive job results (or failure) from
below. The typical stack takes care of parallelizing, retries on
failure, failover to alternative activities, and handling errors.
The elements of the stack can be reordered and replaced for
individual processors, for instance if one wants to do failover
before retries, or do a customized layer that does service
selection at runtime by doing a lookup in a service repository
like BioCatalogue.
</documentation>
</annotation>
</element>
<element name="iterationStrategyStack" type="tav:IterationStrategyStack">
<annotation>
<documentation>The stack of iteration strategies. The iteration
strategies takes care of iterating when a processor is served with
inputs of higher granularity than what it expects. The typical
usecase is a single iteration strategy in the stack, and by
default a single cross product of all the input ports (meaning
all-to-all iteration).
</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="Annotations">
<annotation>
<documentation>List of annotation chains</documentation>
</annotation>
<choice maxOccurs="unbounded" minOccurs="0">
<element name="annotation_chain" type="tav:AnnotationChain">
</element>
<element name="annotation_chain_2_2" type="tav:AnnotationChain">
</element>
</choice>
</complexType>
<complexType name="Activities">
<annotation>
<documentation>List of activities. The list can be empty, used for
"abstract" processors, placeholders until a matching activity is
found.
</documentation>
</annotation>
<sequence>
<element name="activity" type="tav:Activity" maxOccurs="unbounded"
minOccurs="0" />
</sequence>
</complexType>
<complexType name="Activity">
<annotation>
<documentation>An activity is the link between a processor and the
actual service. Typical activities can be the WSDL activity that
knows how to communicate with WSDL-services, the Beanshell activity
that knows how to locally execute a Beanshell script, or a Dataflow
activity that knows how to execute a nested dataflow. (Typically
included as another dataflow element within this Workflow
description).
</documentation>
</annotation>
<sequence>
<element name="raven" type="tav:Raven" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>Raven artifact from which the activity
implementation class is to be loaded. The version of this artifact
is mainly informational, as the currently loaded artifact is
preferred.
</documentation>
</annotation>
</element>
<element name="class" type="string">
<annotation>
<documentation>Fully qualified Java class name defining this
activity implementation. An instance of this class will be
constructed and then configured with the deserialised configBean.
</documentation>
</annotation>
</element>
<element name="inputMap" type="tav:Map">
<annotation>
<documentation>Mapping from the processor's input ports to this
activity's input ports (determined at run-time after
configuration). Not all processor inputs need to be mapped, and
neither does all the activity input ports need a mapping. Notice
that this mapping is processorPort -> activityPort , while the
order is opposite for outputMap. Each activity have their own
mapping, which means that you can have alternative activities with
different port names (but same depths). If one of the activities
requires additional input ports this can be arrange by having
additional processor ports, and only map them in that activity.
(If the other activity is invoked those inputs are ignored - but
note that they would still be iterated over according ot the
iteration strategy).
</documentation>
</annotation>
</element>
<element name="outputMap" type="tav:Map">
<annotation>
<documentation>Mapping from the activity's output ports (determined
at run-time after configuration) to the processor's output ports.
Not all of the activity's output ports need to be mapped, but all
of the processor output ports need to have a mapping. Notice that
this mapping is activityPort -> processorPort, while the order is
opposite for inputMap.
</documentation>
</annotation>
</element>
<element name="configBean" type="tav:ConfigBean">
<annotation>
<documentation>Serialised configuration bean. After constructing
the activity instance of the defined class, this configuration
bean is passed as configuration to the activity. The activity
input and output ports will be defined at runtime after this
configuration. (For some activities the configuration bean
includes this port definition, while other calculate the ports by
parsing service descriptions, etc).
</documentation>
</annotation>
</element>
<element name="annotations" type="tav:Annotations" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>List of annotations describing this activity.
</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="Raven">
<annotation>
<documentation>Raven artifact described using typical Maven groupId,
artifactId and version. When loading a dataflow this artifact must
have already been loaded from one of the plugins.
</documentation>
</annotation>
<sequence>
<element name="group" type="string" />
<element name="artifact" type="string" />
<element name="version" type="string" />
</sequence>
</complexType>
<complexType name="Mapping">
<annotation>
<documentation>A mapping of port names. For instance in an inputMap,
where a processor input port "database" is to be mapped to the
activity input port "db", an inputMap would be made with
from="database" to="db".
</documentation>
</annotation>
<attribute use="required" name="from" type="tav:PortName" />
<attribute use="required" name="to" type="tav:PortName" />
</complexType>
<element name="abstractConfigBean" abstract="true"
type="tav:AbstractConfigBean" />
<complexType name="AbstractConfigBean" />
<complexType name="ConfigBean">
<annotation>
<documentation>A serialised configuration bean to configure a
dispatch layer or activity. Typically the serialisation is done
using a Java XML serialisation from libraries such as xstream, and
the serialisation is therefore also dependent on the plugin defining
the activity or dispatch layer. The alternative schema
t2flow-extended.xsd adds descriptions of the most typical activities
and dispatch layers.
</documentation>
</annotation>
<sequence>
<any namespace="##any" processContents="lax" />
</sequence>
<attribute name="encoding" type="string" use="required" />
</complexType>
<complexType name="DispatchStack">
<annotation>
<documentation>List of dispatch layers. This would typically contain
at least the Invoke layer to perform the actual invocation of the
activity.
</documentation>
</annotation>
<sequence>
<element name="dispatchLayer" type="tav:DispatchLayer"
maxOccurs="unbounded" minOccurs="0" />
</sequence>
</complexType>
<complexType name="DispatchLayer">
<annotation>
<documentation>A dispatch layer, identified by Java class name.
</documentation>
</annotation>
<sequence>
<element name="raven" type="tav:Raven" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>Raven artifact from which the layer class is to be
loaded. The version of this artifact is mainly informational, as
the currently loaded artifact is preferred.
</documentation>
</annotation>
</element>
<element name="class" type="string">
<annotation>
<documentation>Fully qualified Java class name defining this
dispatch layer. An instance of this class will be constructed and
then configured with the deserialised configBean.
</documentation>
</annotation>
</element>
<element name="configBean" type="tav:ConfigBean">
<annotation>
<documentation>A serialised configuration for the dispatch layer.
The deserialised version of this bean will be passed to the layer
instance after initialisation.
</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="IterationStrategyStack">
<sequence>
<element name="iteration" type="tav:Iteration"></element>
</sequence>
</complexType>
<complexType name="Iteration">
<sequence>
<element name="strategy" type="tav:TopIterationNode"
minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="TopIterationNode">
<choice maxOccurs="1" minOccurs="0">
<element name="cross" type="tav:CrossProduct" />
<element name="dot" type="tav:DotProduct" />
</choice>
</complexType>
<complexType name="IterationNode">
</complexType>
<complexType name="IterationNodeParent">
<complexContent>
<extension base="tav:IterationNode">
<choice maxOccurs="unbounded" minOccurs="0">
<element name="cross" type="tav:CrossProduct" />
<element name="dot" type="tav:DotProduct" />
<element name="port" type="tav:PortProduct" />
</choice>
</extension>
</complexContent>
</complexType>
<complexType name="CrossProduct">
<complexContent>
<extension base="tav:IterationNodeParent" />
</complexContent>
</complexType>
<complexType name="DotProduct">
<complexContent>
<extension base="tav:IterationNodeParent" />
</complexContent>
</complexType>
<complexType name="DepthPort">
<complexContent>
<extension base="tav:Port">
<sequence>
<element name="depth" type="nonNegativeInteger"></element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GranularDepthPort">
<complexContent>
<extension base="tav:DepthPort">
<sequence>
<element name="granularDepth" type="nonNegativeInteger">
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="GranularDepthPorts">
<annotation>
<documentation>List of ports that have both depth and granular depth.
</documentation>
</annotation>
<sequence>
<element name="port" type="tav:GranularDepthPort" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="AnnotatedGranularDepthPort">
<complexContent>
<extension base="tav:GranularDepthPort">
<sequence>
<element name="annotations" type="tav:Annotations"
maxOccurs="1" minOccurs="0">
<annotation>
<documentation>
List of annotations, describing this port. For
instance a description could say what type of data the port
expects, and an example annotation could say an example value
</documentation>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="AnnotatedGranularDepthPorts">
<annotation>
<documentation>List of annotated ports that have both depth and
granular depth.
</documentation>
</annotation>
<sequence>
<element name="port" type="tav:AnnotatedGranularDepthPort"
maxOccurs="unbounded" minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="LastPredictedDepthPort">
<complexContent>
<extension base="tav:Port">
<sequence>
<element name="lastPredictedDepth" type="integer" minOccurs="0">
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="AnnotatedPort">
<complexContent>
<extension base="tav:LastPredictedDepthPort">
<sequence>
<element name="annotations" type="tav:Annotations"
maxOccurs="1" minOccurs="0">
<annotation>
<documentation>
List of annotations, describing this port. For
instance a description could say what type of data the port
expects, and an example annotation could say an example value
</documentation>
</annotation>
</element>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="AnnotatedPorts">
<annotation>
<documentation>List of annotated ports.
</documentation>
</annotation>
<sequence>
<element name="port" type="tav:AnnotatedPort" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="Map">
<annotation>
<documentation>0 or more mappings.</documentation>
</annotation>
<sequence>
<element name="map" type="tav:Mapping" maxOccurs="unbounded"
minOccurs="0"></element>
</sequence>
</complexType>
<complexType name="DataLink">
<annotation>
<documentation>A link between two dataflow units, from source to
link.
</documentation>
</annotation>
<sequence>
<element name="sink" type="tav:Link">
<annotation>
<documentation>The sink of the link - where the data will be
flowing to. This must be either a processor input port or a
dataflow output port.
</documentation>
</annotation>
</element>
<element name="source" type="tav:Link">
<annotation>
<documentation>The source of the link - where the data will be
flowing from. This must be a dataflow input port or a processor
output port.
</documentation>
</annotation>
</element>
</sequence>
</complexType>
<complexType name="Link">
<annotation>
<documentation>One end of the links in the Datalink. A link goes
from/to a port, either a dataflow port or a processor port. If the
type is "dataflow", then the "processor" element must not be
present, and the port defines a dataflow input (if this link is a
source) or output port (if this link is a sink). The must not be
more than one DataLink with a sink to the same dataflow output port.
If the type is "processor", then the "processor" element must be
present, and name a processor in the same dataflow. The port must
name a defined processor input port (if this link is a sink) or
processor output port (if this link is a source). There must not be
more than one DataLink with a sink to the same processor input port.
If the type is "merge", this link must be used as a source (merge
can't be used with a sink), and is similar to the type of
"processor", except that more than one link to the processor is
allowed. A "merge" element will be inserted in front of the defined
processor input port, and the incoming links will be added to the
merge in the order they have been defined in the dataflow.
</documentation>
</annotation>
<sequence>
<element name="processor" type="tav:ProcessorName" maxOccurs="1"
minOccurs="0">
<annotation>
<documentation>If the type is "processor" or "merge" this element
must be present and describe the processor name of this link. If
the type is "dataflow" this element must not be present.
</documentation>
</annotation>
</element>
<element name="port" type="tav:PortName">
<annotation>
<documentation>If type is "processor" or "merge" this describes a
processor input port (if this link is a sink) or output port (if
this link is a source).
</documentation>
</annotation>
</element>
</sequence>
<attribute use="required" name="type" type="tav:LinkType"></attribute>
</complexType>
<simpleType name="LinkType">
<restriction base="string">
<enumeration value="dataflow"></enumeration>
<enumeration value="processor"></enumeration>
<enumeration value="merge"></enumeration>
</restriction>
</simpleType>
<complexType name="DepthPorts">
<annotation>
<documentation>List of ports that have depths.</documentation>
</annotation>
<sequence>
<element name="port" type="tav:DepthPort" maxOccurs="unbounded"
minOccurs="0">
</element>
</sequence>
</complexType>
<complexType name="PortProduct">
<complexContent>
<extension base="tav:IterationNode">
<attribute use="required" name="name" type="tav:PortName"></attribute>
<attribute use="required" name="depth" type="nonNegativeInteger"></attribute>
</extension>
</complexContent>
</complexType>
<complexType name="AnnotationChain">
<annotation>
<documentation>Chain of annotations. Annotations are serialised Java
objects, similar to the ConfigBeans.
</documentation>
</annotation>
<sequence>
<element name="net.sf.taverna.t2.annotation.AnnotationChainImpl"
form="unqualified">
<complexType>
<sequence>
<element name="annotationAssertions" form="unqualified"
type="tav:AnnotationAssertionImpl">
</element>
</sequence>
</complexType>
</element>
</sequence>
<attribute use="required" name="encoding" type="string"></attribute>
</complexType>
<complexType name="AnnotationAssertionImpl">
<sequence>
<element name="net.sf.taverna.t2.annotation.AnnotationAssertionImpl"
form="unqualified">
<complexType>
<sequence>
<element name="annotationBean" form="unqualified" type="tav:AnnotationBean" />
<element name="date" form="unqualified" type="tav:datetime" />
<element name="creators" form="unqualified" />
<element name="curationEventList" form="unqualified" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
<complexType name="AnnotationBean">
<sequence>
<any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</sequence>
<attribute name="class" form="unqualified" />
</complexType>
<simpleType name="datetime">
<annotation>
<documentation>ISO 8601 datetime with spaces and letter time zones; YYYY-mm-dd hh:mm:ss.nnn TTT
</documentation>
</annotation>
<restriction base="string">
<pattern value="\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\.?\d* .*"></pattern>
</restriction>
</simpleType>
<simpleType name="Version1">
<annotation>
<documentation>Version of workflow element covered by this schema -
restricted to "1" or "1.x" - for instance "1.2" would be allowed.
</documentation>
</annotation>
<restriction base="string">
<pattern value="1(|\..*)"></pattern>
</restriction>
</simpleType>
<complexType name="Condition">
<annotation>
<documentation>A conditional link. The processor named in "target"
will not be invoked before the processor named in "control" has
finished all its iterations. (Note that the target processor will
also wait for any required input data before invoking).
</documentation>
</annotation>
<attribute use="required" name="control" type="tav:ProcessorName"></attribute>
<attribute use="required" name="target" type="tav:ProcessorName"></attribute>
</complexType>
<simpleType name="ProcessorName">
<annotation>
<documentation>Name of a processor within a dataflow. Each processor
in the same dataflow need a unique processor name. It is not
required, but recommended, to avoid 'special' characters like space,
", -, ', \, etc.
</documentation>
</annotation>
<restriction base="string"></restriction>
</simpleType>
<simpleType name="PortName">
<annotation>
<documentation>Name of a port, either a dataflow input/output port,
processor input/output port or a activity input/output port. Port
names must be unique for a given grouping of ports. For instance you
can't have two input ports on a dataflow with the same name, but you
can have two separate dataflows, both having an input port with the
same name, or an output port with the same name. In the same way a
processor or an activity can have an input port and an output port
with the same name (but they are separate ports), but not two input
ports or output ports with the same name. It is not required, but
recommended, to avoid 'special' characters like space, ", -, ', \,
etc.
</documentation>
</annotation>
<restriction base="string"></restriction>
</simpleType>
</schema>