//
// 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.03.26 at 05:14:19 PM CDT 
//

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

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

/**
 * <p>
 * Java class for entry complex type.
 * 
 * <p>
 * The following schema fragment specifies the expected content contained within
 * this class.
 * 
 * <pre>
 * &lt;complexType name="entry">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;attribute name="key" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="keyGroup" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
 *       &lt;attribute name="keyIndex" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
 *       &lt;attribute name="value" type="{http://www.w3.org/2001/XMLSchema}string" />
 *       &lt;attribute name="valueGroup" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
 *       &lt;attribute name="valueIndex" type="{http://www.w3.org/2001/XMLSchema}int" default="0" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entry")
public class Entry {

	@XmlAttribute
	protected String key;
	@XmlAttribute
	protected Integer keyGroup;
	@XmlAttribute
	protected Integer keyIndex;
	@XmlAttribute
	protected String value;
	@XmlAttribute
	protected Integer valueGroup;
	@XmlAttribute
	protected Integer valueIndex;

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

	/**
	 * Gets the value of the keyGroup property.
	 * 
	 * @return possible object is {@link Integer }
	 * 
	 */
	public int getKeyGroup() {
		if (keyGroup == null) {
			return 0;
		} else {
			return keyGroup;
		}
	}

	/**
	 * Gets the value of the keyIndex property.
	 * 
	 * @return possible object is {@link Integer }
	 * 
	 */
	public int getKeyIndex() {
		if (keyIndex == null) {
			return 0;
		} else {
			return keyIndex;
		}
	}

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

	/**
	 * Gets the value of the valueGroup property.
	 * 
	 * @return possible object is {@link Integer }
	 * 
	 */
	public int getValueGroup() {
		if (valueGroup == null) {
			return 0;
		} else {
			return valueGroup;
		}
	}

	/**
	 * Gets the value of the valueIndex property.
	 * 
	 * @return possible object is {@link Integer }
	 * 
	 */
	public int getValueIndex() {
		if (valueIndex == null) {
			return 0;
		} else {
			return valueIndex;
		}
	}

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

	/**
	 * Sets the value of the keyGroup property.
	 * 
	 * @param value
	 *            allowed object is {@link Integer }
	 * 
	 */
	public void setKeyGroup(Integer value) {
		this.keyGroup = value;
	}

	/**
	 * Sets the value of the keyIndex property.
	 * 
	 * @param value
	 *            allowed object is {@link Integer }
	 * 
	 */
	public void setKeyIndex(Integer value) {
		this.keyIndex = value;
	}

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

	/**
	 * Sets the value of the valueGroup property.
	 * 
	 * @param value
	 *            allowed object is {@link Integer }
	 * 
	 */
	public void setValueGroup(Integer value) {
		this.valueGroup = value;
	}

	/**
	 * Sets the value of the valueIndex property.
	 * 
	 * @param value
	 *            allowed object is {@link Integer }
	 * 
	 */
	public void setValueIndex(Integer value) {
		this.valueIndex = value;
	}

}
