<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified" targetNamespace="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:jsl="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
	<xs:annotation>
		<xs:documentation> Job Specification Language (JSL) specifies a job,
			its steps, and directs their execution. JSL also can be referred to
			as "Job XML". </xs:documentation>
	</xs:annotation>
	<xs:simpleType name="artifactRef">
		<xs:annotation>
			<xs:documentation> This is a helper type. Though it is not otherwise
				called out by this name in the specification, it captures the fact
				that the xs:string value refers to a batch artifact, across numerous
				other JSL type definitions. </xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string" />
	</xs:simpleType>
	<xs:complexType name="Job">
		<xs:annotation>
			<xs:documentation> The type of a job definition, whether concrete or

				abstract. This is the type of the root element of any JSL document.
			</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation> The job-level properties, which are accessible
						via the JobContext.getProperties() API in a batch artifact.
					</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="listeners" type="jsl:Listeners"
				minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation> Note that "listeners" sequence order in XML does
						not imply order of execution by the batch runtime, per the
						specification. </xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element name="decision" type="jsl:Decision" />
				<xs:element name="flow" type="jsl:Flow" />
				<xs:element name="split" type="jsl:Split" />
				<xs:element name="step" type="jsl:Step" />
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="version" use="required" type="xs:string"
			fixed="1.0" />
		<xs:attribute name="id" use="required" type="xs:ID" />
		<xs:attribute name="restartable" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:element name="job" type="jsl:Job">
		<xs:annotation>
			<xs:documentation> The definition of an job, whether concrete or
				abstract. This is the

				type of the root element of any JSL document. </xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="Listener">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="Split">
		<xs:sequence>
			<xs:element name="flow" type="jsl:Flow" minOccurs="0"
				maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="id" use="required" type="xs:ID" />
		<xs:attribute name="next" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="Flow">
		<xs:sequence>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element name="decision" type="jsl:Decision" />
				<xs:element name="flow" type="jsl:Flow" />
				<xs:element name="split" type="jsl:Split" />
				<xs:element name="step" type="jsl:Step" />
			</xs:choice>
			<xs:group ref="jsl:TransitionElements" minOccurs="0" maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="id" use="required" type="xs:ID" />
		<xs:attribute name="next" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:group name="TransitionElements">
		<xs:annotation>
			<xs:documentation> This grouping provides allows for the reuse of the
				'end', 'fail', 'next', 'stop' element sequences which may appear at
				the end of a 'step', 'flow', 'split' or 'decision'. The term
				'TransitionElements' does not formally appear in the spec, it is a
				schema convenience.

</xs:documentation>
		</xs:annotation>
		<xs:choice>
			<xs:element name="end" type="jsl:End" />
			<xs:element name="fail" type="jsl:Fail" />
			<xs:element name="next" type="jsl:Next" />
			<xs:element name="stop" type="jsl:Stop" />
		</xs:choice>
	</xs:group>
	<xs:complexType name="Decision">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
			<xs:group ref="jsl:TransitionElements" minOccurs="0"
				maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="id" use="required" type="xs:ID" />
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:attributeGroup name="TerminatingAttributes">
		<xs:attribute name="on" use="required" type="xs:string" />
		<xs:attribute name="exit-status" use="optional" type="xs:string" />
	</xs:attributeGroup>
	<xs:complexType name="Fail">
		<xs:attributeGroup ref="jsl:TerminatingAttributes" />
	</xs:complexType>
	<xs:complexType name="End">
		<xs:attributeGroup ref="jsl:TerminatingAttributes" />
	</xs:complexType>
	<xs:complexType name="Stop">
		<xs:attributeGroup ref="jsl:TerminatingAttributes" />
		<xs:attribute name="restart" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="Next">
		<xs:attribute name="on" use="required" type="xs:string" />
		<xs:attribute name="to" use="required" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="CheckpointAlgorithm">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />

		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="ExceptionClassFilter">
		<xs:sequence>
			<xs:element name="include" minOccurs="0" maxOccurs="unbounded">
				<xs:complexType>
					<xs:sequence />
					<xs:attribute name="class" use="required" type="xs:string" />
				</xs:complexType>
			</xs:element>
			<xs:element name="exclude" minOccurs="0" maxOccurs="unbounded">
				<xs:complexType>
					<xs:sequence />
					<xs:attribute name="class" use="required" type="xs:string" />
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="Step">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
			<xs:element name="listeners" type="jsl:Listeners"
				minOccurs="0" maxOccurs="1">
				<xs:annotation>
					<xs:documentation> Note that "listeners" sequence order in XML does
						not imply order of execution by the batch runtime, per the
						specification. </xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="batchlet" type="jsl:Batchlet" />
				<xs:element name="chunk" type="jsl:Chunk" />
			</xs:choice>
			<xs:element name="partition" type="jsl:Partition"
				minOccurs="0" maxOccurs="1" />
			<xs:group ref="jsl:TransitionElements" minOccurs="0"
				maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="id" use="required" type="xs:ID" />
		<xs:attribute name="start-limit" use="optional" type="xs:string" />
		<xs:attribute name="allow-start-if-complete" use="optional"
			type="xs:string" />
		<xs:attribute name="next" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="Batchlet">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="Chunk">
		<xs:sequence>
			<xs:element name="reader" type="jsl:ItemReader" />
			<xs:element name="processor" type="jsl:ItemProcessor"
				minOccurs="0" maxOccurs="1" />
			<xs:element name="writer" type="jsl:ItemWriter" />
			<xs:element name="checkpoint-algorithm" type="jsl:CheckpointAlgorithm"
				minOccurs="0" maxOccurs="1" />
			<xs:element name="skippable-exception-classes" type="jsl:ExceptionClassFilter"
				minOccurs="0" maxOccurs="1" />
			<xs:element name="retryable-exception-classes" type="jsl:ExceptionClassFilter"
				minOccurs="0" maxOccurs="1" />
			<xs:element name="no-rollback-exception-classes" type="jsl:ExceptionClassFilter"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="checkpoint-policy" use="optional"
			type="xs:string">
			<xs:annotation>
				<xs:documentation> Specifies the checkpoint policy that governs
					commit behavior for this chunk. Valid values are: "item" or
					"custom". The "item" policy means the chunk is checkpointed after a
					specified number of items are processed. The "custom" policy means

					the chunk is checkpointed according to a checkpoint algorithm
					implementation. Specifying "custom" requires that the
					checkpoint-algorithm element is also specified. It is an optional
					attribute. The default policy is "item". However, we chose not to
					define a schema-specified default for this attribute.
				</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="item-count" use="optional" type="xs:string">
			<xs:annotation>
				<xs:documentation> Specifies the number of items to process per
					chunk when using the item checkpoint policy. It must be valid XML
					integer. It is an optional attribute. The default is 10. The
					item-count attribute is ignored for "custom" checkpoint policy.
					However, to make it easier for implementations to support JSL
					inheritance we abstain from defining a schema-specified default for
					this attribute. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="time-limit" use="optional" type="xs:string">
			<xs:annotation>
				<xs:documentation> Specifies the amount of time in seconds before
					taking a checkpoint for the item checkpoint policy. It must be
					valid XML integer. It is an optional attribute. The default is 0,
					which means no limit. However, to make it easier for
					implementations to support JSL inheritance we abstain from defining
					a schema-specified default for this attribute.

					When a value greater than zero is specified, a checkpoint is taken when
					time-limit is reached or item-count items have been processed,
					whichever comes first. The time-limit attribute is ignored for
					"custom" checkpoint policy. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="skip-limit" use="optional" type="xs:string">
			<xs:annotation>
				<xs:documentation> Specifies the number of exceptions a step will
					skip if any configured skippable exceptions are thrown by chunk
					processing. It must be a valid XML integer value. It is an optional
					attribute. The default is no limit. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="retry-limit" use="optional" type="xs:string">
			<xs:annotation>
				<xs:documentation> Specifies the number of times a step will retry
					if any configured retryable exceptions are thrown by chunk
					processing. It must be a valid XML integer value. It is an optional
					attribute. The default is no limit. </xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<xs:complexType name="ItemReader">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />

		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="ItemProcessor">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="ItemWriter">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="Property">
		<xs:attribute name="name" type="xs:string" use="required" />
		<xs:attribute name="value" type="xs:string" use="required" />
	</xs:complexType>
	<xs:complexType name="Properties">
		<xs:sequence>
			<xs:element name="property" type="jsl:Property" maxOccurs="unbounded"
				minOccurs="0" />
		</xs:sequence>
		<xs:attribute name="partition" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="Listeners">
		<xs:sequence>
			<xs:element name="listener" type="jsl:Listener" maxOccurs="unbounded"
				minOccurs="0" />
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="Partition">
		<xs:sequence>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="mapper" type="jsl:PartitionMapper" />
				<xs:element name="plan" type="jsl:PartitionPlan" />
			</xs:choice>
			<xs:element name="collector" type="jsl:Collector"

				minOccurs="0" maxOccurs="1" />
			<xs:element name="analyzer" type="jsl:Analyzer" minOccurs="0"
				maxOccurs="1" />
			<xs:element name="reducer" type="jsl:PartitionReducer"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="PartitionPlan">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="unbounded" />
		</xs:sequence>
		<xs:attribute name="partitions" use="optional" type="xs:string" />
		<xs:attribute name="threads" use="optional" type="xs:string" />
	</xs:complexType>
	<xs:complexType name="PartitionMapper">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="Collector">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="Analyzer">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
	<xs:complexType name="PartitionReducer">
		<xs:sequence>
			<xs:element name="properties" type="jsl:Properties"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>

		<xs:attribute name="ref" use="required" type="jsl:artifactRef" />
	</xs:complexType>
</xs:schema>
