//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.0.5-b02-fcs 
// 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: 2011.04.21 at 02:35:28 PM CDT 
//

package org.eclipse.ptp.rm.jaxb.core.data;

import java.util.ArrayList;
import java.util.List;

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

/**
 * 
 * The top-level control elements define the properties and attributes, files to
 * be staged, job script to be generated, commands specific to the resource
 * manager, and the layout of the Launch Tab. The resource manager
 * implementation constructs a variable map serving as the resource manager
 * "environment"; variables are dereferenced in the configuration file via
 * ${rm:name} or ${rm:name#getterName}; all properties and attributes defined in
 * the configuration are mapped. The following hard-coded variables are also
 * added at runtime:
 * 
 * control.user.name control.address
 * 
 * executablePath progArgs directory
 * 
 * 
 * <p>
 * Java class for control-type complex type.
 * 
 * <p>
 * The following schema fragment specifies the expected content contained within
 * this class.
 * 
 * <pre>
 * &lt;complexType name="control-type">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="property" type="{http://org.eclipse.ptp/rm}property-type" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="attribute" type="{http://org.eclipse.ptp/rm}attribute-type" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="managed-files" type="{http://org.eclipse.ptp/rm}managed-files-type" minOccurs="0"/>
 *         &lt;element name="script" type="{http://org.eclipse.ptp/rm}script-type" minOccurs="0"/>
 *         &lt;element name="start-up-command" type="{http://org.eclipse.ptp/rm}command-type" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;choice>
 *           &lt;sequence>
 *             &lt;element name="submit-interactive" type="{http://org.eclipse.ptp/rm}command-type"/>
 *             &lt;element name="submit-interactive-debug" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *           &lt;/sequence>
 *           &lt;sequence>
 *             &lt;element name="submit-batch" type="{http://org.eclipse.ptp/rm}command-type"/>
 *             &lt;element name="submit-batch-debug" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *           &lt;/sequence>
 *         &lt;/choice>
 *         &lt;element name="get-job-status" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="terminate-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="suspend-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="resume-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="hold-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="release-job" type="{http://org.eclipse.ptp/rm}command-type" minOccurs="0"/>
 *         &lt;element name="shut-down-command" type="{http://org.eclipse.ptp/rm}command-type" maxOccurs="unbounded" minOccurs="0"/>
 *         &lt;element name="launch-tab" type="{http://org.eclipse.ptp/rm}launch-tab-type" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "control-type", propOrder = { "property", "attribute", "managedFiles", "script", "startUpCommand",
		"submitInteractive", "submitInteractiveDebug", "submitBatch", "submitBatchDebug", "getJobStatus", "terminateJob",
		"suspendJob", "resumeJob", "holdJob", "releaseJob", "shutDownCommand", "launchTab" })
public class ControlType {

	protected List<PropertyType> property;
	protected List<AttributeType> attribute;
	@XmlElement(name = "managed-files")
	protected ManagedFilesType managedFiles;
	protected ScriptType script;
	@XmlElement(name = "start-up-command")
	protected List<CommandType> startUpCommand;
	@XmlElement(name = "submit-interactive")
	protected CommandType submitInteractive;
	@XmlElement(name = "submit-interactive-debug")
	protected CommandType submitInteractiveDebug;
	@XmlElement(name = "submit-batch")
	protected CommandType submitBatch;
	@XmlElement(name = "submit-batch-debug")
	protected CommandType submitBatchDebug;
	@XmlElement(name = "get-job-status")
	protected CommandType getJobStatus;
	@XmlElement(name = "terminate-job")
	protected CommandType terminateJob;
	@XmlElement(name = "suspend-job")
	protected CommandType suspendJob;
	@XmlElement(name = "resume-job")
	protected CommandType resumeJob;
	@XmlElement(name = "hold-job")
	protected CommandType holdJob;
	@XmlElement(name = "release-job")
	protected CommandType releaseJob;
	@XmlElement(name = "shut-down-command")
	protected List<CommandType> shutDownCommand;
	@XmlElement(name = "launch-tab")
	protected LaunchTabType launchTab;

	/**
	 * Gets the value of the attribute property.
	 * 
	 * <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 attribute property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * 
	 * <pre>
	 * getAttribute().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link AttributeType }
	 * 
	 * 
	 */
	public List<AttributeType> getAttribute() {
		if (attribute == null) {
			attribute = new ArrayList<AttributeType>();
		}
		return this.attribute;
	}

	/**
	 * Gets the value of the getJobStatus property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getGetJobStatus() {
		return getJobStatus;
	}

	/**
	 * Gets the value of the holdJob property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getHoldJob() {
		return holdJob;
	}

	/**
	 * Gets the value of the launchTab property.
	 * 
	 * @return possible object is {@link LaunchTabType }
	 * 
	 */
	public LaunchTabType getLaunchTab() {
		return launchTab;
	}

	/**
	 * Gets the value of the managedFiles property.
	 * 
	 * @return possible object is {@link ManagedFilesType }
	 * 
	 */
	public ManagedFilesType getManagedFiles() {
		return managedFiles;
	}

	/**
	 * Gets the value of the property property.
	 * 
	 * <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 property property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * 
	 * <pre>
	 * getProperty().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link PropertyType }
	 * 
	 * 
	 */
	public List<PropertyType> getProperty() {
		if (property == null) {
			property = new ArrayList<PropertyType>();
		}
		return this.property;
	}

	/**
	 * Gets the value of the releaseJob property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getReleaseJob() {
		return releaseJob;
	}

	/**
	 * Gets the value of the resumeJob property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getResumeJob() {
		return resumeJob;
	}

	/**
	 * Gets the value of the script property.
	 * 
	 * @return possible object is {@link ScriptType }
	 * 
	 */
	public ScriptType getScript() {
		return script;
	}

	/**
	 * Gets the value of the shutDownCommand property.
	 * 
	 * <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 shutDownCommand property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * 
	 * <pre>
	 * getShutDownCommand().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link CommandType }
	 * 
	 * 
	 */
	public List<CommandType> getShutDownCommand() {
		if (shutDownCommand == null) {
			shutDownCommand = new ArrayList<CommandType>();
		}
		return this.shutDownCommand;
	}

	/**
	 * Gets the value of the startUpCommand property.
	 * 
	 * <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 startUpCommand property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * 
	 * <pre>
	 * getStartUpCommand().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link CommandType }
	 * 
	 * 
	 */
	public List<CommandType> getStartUpCommand() {
		if (startUpCommand == null) {
			startUpCommand = new ArrayList<CommandType>();
		}
		return this.startUpCommand;
	}

	/**
	 * Gets the value of the submitBatch property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getSubmitBatch() {
		return submitBatch;
	}

	/**
	 * Gets the value of the submitBatchDebug property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getSubmitBatchDebug() {
		return submitBatchDebug;
	}

	/**
	 * Gets the value of the submitInteractive property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getSubmitInteractive() {
		return submitInteractive;
	}

	/**
	 * Gets the value of the submitInteractiveDebug property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getSubmitInteractiveDebug() {
		return submitInteractiveDebug;
	}

	/**
	 * Gets the value of the suspendJob property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getSuspendJob() {
		return suspendJob;
	}

	/**
	 * Gets the value of the terminateJob property.
	 * 
	 * @return possible object is {@link CommandType }
	 * 
	 */
	public CommandType getTerminateJob() {
		return terminateJob;
	}

	/**
	 * Sets the value of the getJobStatus property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setGetJobStatus(CommandType value) {
		this.getJobStatus = value;
	}

	/**
	 * Sets the value of the holdJob property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setHoldJob(CommandType value) {
		this.holdJob = value;
	}

	/**
	 * Sets the value of the launchTab property.
	 * 
	 * @param value
	 *            allowed object is {@link LaunchTabType }
	 * 
	 */
	public void setLaunchTab(LaunchTabType value) {
		this.launchTab = value;
	}

	/**
	 * Sets the value of the managedFiles property.
	 * 
	 * @param value
	 *            allowed object is {@link ManagedFilesType }
	 * 
	 */
	public void setManagedFiles(ManagedFilesType value) {
		this.managedFiles = value;
	}

	/**
	 * Sets the value of the releaseJob property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setReleaseJob(CommandType value) {
		this.releaseJob = value;
	}

	/**
	 * Sets the value of the resumeJob property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setResumeJob(CommandType value) {
		this.resumeJob = value;
	}

	/**
	 * Sets the value of the script property.
	 * 
	 * @param value
	 *            allowed object is {@link ScriptType }
	 * 
	 */
	public void setScript(ScriptType value) {
		this.script = value;
	}

	/**
	 * Sets the value of the submitBatch property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setSubmitBatch(CommandType value) {
		this.submitBatch = value;
	}

	/**
	 * Sets the value of the submitBatchDebug property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setSubmitBatchDebug(CommandType value) {
		this.submitBatchDebug = value;
	}

	/**
	 * Sets the value of the submitInteractive property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setSubmitInteractive(CommandType value) {
		this.submitInteractive = value;
	}

	/**
	 * Sets the value of the submitInteractiveDebug property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setSubmitInteractiveDebug(CommandType value) {
		this.submitInteractiveDebug = value;
	}

	/**
	 * Sets the value of the suspendJob property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setSuspendJob(CommandType value) {
		this.suspendJob = value;
	}

	/**
	 * Sets the value of the terminateJob property.
	 * 
	 * @param value
	 *            allowed object is {@link CommandType }
	 * 
	 */
	public void setTerminateJob(CommandType value) {
		this.terminateJob = value;
	}

}
