//
// 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 org.apache.batchee.container.jsl.ExecutionElement;

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.XmlElements;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.ArrayList;
import java.util.List;


/**
 * The type of a job definition, whether concrete or
 * abstract. This is the type of the root element of any JSL document.
 * <p/>
 * <p/>
 * <p>Java class for Job complex type.
 * <p/>
 * <p>The following schema fragment specifies the expected content contained within this class.
 * <p/>
 * <pre>
 * &lt;complexType name="Job">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="properties" type="{http://xmlns.jcp.org/xml/ns/javaee}Properties" minOccurs="0"/>
 *         &lt;element name="listeners" type="{http://xmlns.jcp.org/xml/ns/javaee}Listeners" minOccurs="0"/>
 *         &lt;choice maxOccurs="unbounded" minOccurs="0">
 *           &lt;element name="decision" type="{http://xmlns.jcp.org/xml/ns/javaee}Decision"/>
 *           &lt;element name="flow" type="{http://xmlns.jcp.org/xml/ns/javaee}Flow"/>
 *           &lt;element name="split" type="{http://xmlns.jcp.org/xml/ns/javaee}Split"/>
 *           &lt;element name="step" type="{http://xmlns.jcp.org/xml/ns/javaee}Step"/>
 *         &lt;/choice>
 *       &lt;/sequence>
 *       &lt;attribute name="version" use="required" type="{http://www.w3.org/2001/XMLSchema}string" fixed="1.0" />
 *       &lt;attribute name="id" use="required" type="{http://www.w3.org/2001/XMLSchema}ID" />
 *       &lt;attribute name="restartable" type="{http://www.w3.org/2001/XMLSchema}string" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Job", propOrder = {
    "properties",
    "listeners",
    "executionElements"
})
public class JSLJob {

    protected JSLProperties properties;
    protected Listeners listeners;
    @XmlElements({
        @XmlElement(name = "flow", type = Flow.class),
        @XmlElement(name = "step", type = Step.class),
        @XmlElement(name = "split", type = Split.class),
        @XmlElement(name = "decision", type = Decision.class)
    })
    protected List<ExecutionElement> executionElements;
    @XmlAttribute(name = "version", required = true)
    protected String version;
    @XmlAttribute(name = "id", required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name = "ID")
    protected String id;
    @XmlAttribute(name = "restartable")
    protected String restartable;

    /**
     * Gets the value of the properties property.
     *
     * @return possible object is
     * {@link JSLProperties }
     */
    public JSLProperties getProperties() {
        return properties;
    }

    /**
     * Sets the value of the properties property.
     *
     * @param value allowed object is
     *              {@link JSLProperties }
     */
    public void setProperties(JSLProperties value) {
        this.properties = value;
    }

    /**
     * Gets the value of the listeners property.
     *
     * @return possible object is
     * {@link Listeners }
     */
    public Listeners getListeners() {
        return listeners;
    }

    /**
     * Sets the value of the listeners property.
     *
     * @param value allowed object is
     *              {@link Listeners }
     */
    public void setListeners(Listeners value) {
        this.listeners = value;
    }

    /**
     * Gets the value of the executionElements property.
     * <p/>
     * <p/>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the executionElements property.
     * <p/>
     * <p/>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getExecutionElements().add(newItem);
     * </pre>
     * <p/>
     * <p/>
     * <p/>
     * Objects of the following type(s) are allowed in the list
     * {@link Flow }
     * {@link Step }
     * {@link Split }
     * {@link Decision }
     */
    public List<ExecutionElement> getExecutionElements() {
        if (executionElements == null) {
            executionElements = new ArrayList<ExecutionElement>();
        }
        return this.executionElements;
    }

    /**
     * Gets the value of the version property.
     *
     * @return possible object is
     * {@link String }
     */
    public String getVersion() {
        if (version == null) {
            return "1.0";
        } else {
            return version;
        }
    }

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

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

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

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

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

}
