//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-2 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2013.08.27 at 09:45:12 AM CEST 
//


package org.apache.batchee.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * Java class for Chunk complex type.
 * <p>
 * The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="Chunk"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="reader" type="{http://xmlns.jcp.org/xml/ns/javaee}ItemReader"/&gt;
 *         &lt;element name="processor" type="{http://xmlns.jcp.org/xml/ns/javaee}ItemProcessor" minOccurs="0"/&gt;
 *         &lt;element name="writer" type="{http://xmlns.jcp.org/xml/ns/javaee}ItemWriter"/&gt;
 *         &lt;element name="checkpoint-algorithm" type="{http://xmlns.jcp.org/xml/ns/javaee}CheckpointAlgorithm" minOccurs="0"/&gt;
 *         &lt;element name="skippable-exception-classes" type="{http://xmlns.jcp.org/xml/ns/javaee}ExceptionClassFilter" minOccurs="0"/&gt;
 *         &lt;element name="retryable-exception-classes" type="{http://xmlns.jcp.org/xml/ns/javaee}ExceptionClassFilter" minOccurs="0"/&gt;
 *         &lt;element name="no-rollback-exception-classes" type="{http://xmlns.jcp.org/xml/ns/javaee}ExceptionClassFilter" minOccurs="0"/&gt;
 *       &lt;/sequence&gt;
 *       &lt;attribute name="checkpoint-policy" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
 *       &lt;attribute name="item-count" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
 *       &lt;attribute name="time-limit" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
 *       &lt;attribute name="skip-limit" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
 *       &lt;attribute name="retry-limit" type="{http://www.w3.org/2001/XMLSchema}string" /&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Chunk", propOrder = {
    "reader",
    "processor",
    "writer",
    "checkpointAlgorithm",
    "skippableExceptionClasses",
    "retryableExceptionClasses",
    "noRollbackExceptionClasses"
})
public class Chunk {

    @XmlElement(required = true)
    protected ItemReader reader;
    protected ItemProcessor processor;
    @XmlElement(required = true)
    protected ItemWriter writer;
    @XmlElement(name = "checkpoint-algorithm")
    protected CheckpointAlgorithm checkpointAlgorithm;
    @XmlElement(name = "skippable-exception-classes")
    protected ExceptionClassFilter skippableExceptionClasses;
    @XmlElement(name = "retryable-exception-classes")
    protected ExceptionClassFilter retryableExceptionClasses;
    @XmlElement(name = "no-rollback-exception-classes")
    protected ExceptionClassFilter noRollbackExceptionClasses;
    @XmlAttribute(name = "checkpoint-policy")
    protected String checkpointPolicy;
    @XmlAttribute(name = "item-count")
    protected String itemCount;
    @XmlAttribute(name = "time-limit")
    protected String timeLimit;
    @XmlAttribute(name = "skip-limit")
    protected String skipLimit;
    @XmlAttribute(name = "retry-limit")
    protected String retryLimit;

    /**
     * Gets the value of the reader property.
     *
     * @return possible object is
     * {@link ItemReader }
     */
    public ItemReader getReader() {
        return reader;
    }

    /**
     * Sets the value of the reader property.
     *
     * @param value allowed object is
     *              {@link ItemReader }
     */
    public void setReader(ItemReader value) {
        this.reader = value;
    }

    /**
     * Gets the value of the processor property.
     *
     * @return possible object is
     * {@link ItemProcessor }
     */
    public ItemProcessor getProcessor() {
        return processor;
    }

    /**
     * Sets the value of the processor property.
     *
     * @param value allowed object is
     *              {@link ItemProcessor }
     */
    public void setProcessor(ItemProcessor value) {
        this.processor = value;
    }

    /**
     * Gets the value of the writer property.
     *
     * @return possible object is
     * {@link ItemWriter }
     */
    public ItemWriter getWriter() {
        return writer;
    }

    /**
     * Sets the value of the writer property.
     *
     * @param value allowed object is
     *              {@link ItemWriter }
     */
    public void setWriter(ItemWriter value) {
        this.writer = value;
    }

    /**
     * Gets the value of the checkpointAlgorithm property.
     *
     * @return possible object is
     * {@link CheckpointAlgorithm }
     */
    public CheckpointAlgorithm getCheckpointAlgorithm() {
        return checkpointAlgorithm;
    }

    /**
     * Sets the value of the checkpointAlgorithm property.
     *
     * @param value allowed object is
     *              {@link CheckpointAlgorithm }
     */
    public void setCheckpointAlgorithm(CheckpointAlgorithm value) {
        this.checkpointAlgorithm = value;
    }

    /**
     * Gets the value of the skippableExceptionClasses property.
     *
     * @return possible object is
     * {@link ExceptionClassFilter }
     */
    public ExceptionClassFilter getSkippableExceptionClasses() {
        return skippableExceptionClasses;
    }

    /**
     * Sets the value of the skippableExceptionClasses property.
     *
     * @param value allowed object is
     *              {@link ExceptionClassFilter }
     */
    public void setSkippableExceptionClasses(ExceptionClassFilter value) {
        this.skippableExceptionClasses = value;
    }

    /**
     * Gets the value of the retryableExceptionClasses property.
     *
     * @return possible object is
     * {@link ExceptionClassFilter }
     */
    public ExceptionClassFilter getRetryableExceptionClasses() {
        return retryableExceptionClasses;
    }

    /**
     * Sets the value of the retryableExceptionClasses property.
     *
     * @param value allowed object is
     *              {@link ExceptionClassFilter }
     */
    public void setRetryableExceptionClasses(ExceptionClassFilter value) {
        this.retryableExceptionClasses = value;
    }

    /**
     * Gets the value of the noRollbackExceptionClasses property.
     *
     * @return possible object is
     * {@link ExceptionClassFilter }
     */
    public ExceptionClassFilter getNoRollbackExceptionClasses() {
        return noRollbackExceptionClasses;
    }

    /**
     * Sets the value of the noRollbackExceptionClasses property.
     *
     * @param value allowed object is
     *              {@link ExceptionClassFilter }
     */
    public void setNoRollbackExceptionClasses(ExceptionClassFilter value) {
        this.noRollbackExceptionClasses = value;
    }

    /**
     * Gets the value of the checkpointPolicy property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getCheckpointPolicy() {
        return checkpointPolicy;
    }

    /**
     * Sets the value of the checkpointPolicy property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setCheckpointPolicy(String value) {
        this.checkpointPolicy = value;
    }

    /**
     * Gets the value of the itemCount property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getItemCount() {
        return itemCount;
    }

    /**
     * Sets the value of the itemCount property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setItemCount(String value) {
        this.itemCount = value;
    }

    /**
     * Gets the value of the timeLimit property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getTimeLimit() {
        return timeLimit;
    }

    /**
     * Sets the value of the timeLimit property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setTimeLimit(String value) {
        this.timeLimit = value;
    }

    /**
     * Gets the value of the skipLimit property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getSkipLimit() {
        return skipLimit;
    }

    /**
     * Sets the value of the skipLimit property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setSkipLimit(String value) {
        this.skipLimit = value;
    }

    /**
     * Gets the value of the retryLimit property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getRetryLimit() {
        return retryLimit;
    }

    /**
     * Sets the value of the retryLimit property.
     *
     * @param value allowed object is
     *              {@link String }
     */
    public void setRetryLimit(String value) {
        this.retryLimit = value;
    }

}
