/*******************************************************************************
 * Copyright (c) 2013-2020 LAAS-CNRS (www.laas.fr)
 * 7 Colonel Roche 31077 Toulouse - France
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Initial Contributors:
 *     Thierry Monteil : Project manager, technical co-manager
 *     Mahdi Ben Alaya : Technical co-manager
 *     Samir Medjiah : Technical co-manager
 *     Khalil Drira : Strategy expert
 *     Guillaume Garzone : Developer
 *     François Aïssaoui : Developer
 *
 * New contributors :
 *******************************************************************************/
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-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: 2015.04.15 at 03:56:27 PM CEST 
//

package org.eclipse.om2m.commons.resource;

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.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.eclipse.om2m.commons.constants.ShortName;

/**
 * <p>
 * Java class for anonymous complex type.
 * 
 * <p>
 * The following schema fragment specifies the expected content contained within
 * this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;extension base="{http://www.onem2m.org/xml/protocols}announceableResource">
 *       &lt;sequence>
 *         &lt;element name="nodeID" type="{http://www.onem2m.org/xml/protocols}nodeID"/>
 *         &lt;element name="hostedCSELink" type="{http://www.onem2m.org/xml/protocols}ID" minOccurs="0"/>
 *         &lt;choice minOccurs="0">
 *           &lt;element name="childResource" type="{http://www.onem2m.org/xml/protocols}childResourceRef" maxOccurs="unbounded"/>
 *           &lt;choice maxOccurs="unbounded">
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}memoryAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}batteryAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}areaNwkInfoAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}areaNwkDeviceInfoAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}firmwareAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}softwareAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}deviceInfoAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}deviceCapabilityAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}rebootAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}eventLogAnnc"/>
 *             &lt;element ref="{http://www.onem2m.org/xml/protocols}subscription"/>
 *           &lt;/choice>
 *         &lt;/choice>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = ShortName.NODE_ANNC)
public class NodeAnnc extends AnnouncedMgmtResource {

	@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
	@XmlElement(required = true, name = ShortName.NODE_ID, namespace="")
	protected String nodeID;
	
	@XmlElement(name = ShortName.HOSTED_CSE_LINK, namespace="")
	protected String hostedCSELink;
	
	@XmlElement(name = ShortName.HOSTED_SRV_LINK, namespace="")
	protected String hostedServiceLinks;

	@XmlElement(name = ShortName.CHILD_RESOURCE, namespace="")
	protected List<ChildResourceRef> childResource;
	
	@XmlElements({
		@XmlElement(name = ShortName.MEMORY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = MemoryAnnc.class),
		@XmlElement(name = ShortName.BATTERY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = BatteryAnnc.class),
		@XmlElement(name = ShortName.AREA_NWK_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkInfoAnnc.class),
		@XmlElement(name = ShortName.AREA_NWK_DEVICE_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkDeviceInfoAnnc.class),
		@XmlElement(name = ShortName.FIRMWARE_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = FirmwareAnnc.class),
		@XmlElement(name = ShortName.SOFTWARE_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = SoftwareAnnc.class),
		@XmlElement(name = ShortName.DEVICE_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = DeviceInfoAnnc.class),
		@XmlElement(name = ShortName.DEVICE_CAPABILITY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = DeviceCapabilityAnnc.class),
		@XmlElement(name = ShortName.REBOOT_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = RebootAnnc.class),
		@XmlElement(name = ShortName.EVENT_LOG_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = EventLogAnnc.class),
		@XmlElement(name = ShortName.SUB, namespace = "http://www.onem2m.org/xml/protocols", type = Subscription.class) })
	protected List<AnnouncedMgmtResource> mgmmtObjs;

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

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

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

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

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

	/**
	 * Gets the value of the memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc 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 memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc
	 * property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * 
	 * <pre>
	 * getMemoryAnncOrBatteryAnncOrAreaNwkInfoAnnc().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link MemoryAnnc } {@link BatteryAnnc } {@link AreaNwkInfoAnnc }
	 * {@link AreaNwkDeviceInfoAnnc } {@link FirmwareAnnc } {@link SoftwareAnnc }
	 * {@link DeviceInfoAnnc } {@link DeviceCapabilityAnnc } {@link RebootAnnc }
	 * {@link EventLogAnnc } {@link Subscription }
	 * 
	 * 
	 */
	public List<AnnouncedMgmtResource> getMgmtObjs() {
		if (mgmmtObjs == null) {
			mgmmtObjs = new ArrayList<AnnouncedMgmtResource>();
		}
		return this.mgmmtObjs;
	}

	/**
	 * @return the hostedAppLinks
	 */
	public String getHostedServiceLinks() {
		return hostedServiceLinks;
	}

	/**
	 * @param hostedAppLinks the hostedAppLinks to set
	 */
	public void setHostedServiceLinks(String hostedServiceLinks) {
		this.hostedServiceLinks = hostedServiceLinks;
	}

}
