/*******************************************************************************
 * Copyright (c) 2013-2015 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Thierry Monteil (Project co-founder) - Management and initial specification,
 *         conception and documentation.
 *     Mahdi Ben Alaya (Project co-founder) - Management and initial specification,
 *         conception, implementation, test and documentation.
 *     Christophe Chassot - Management and initial specification.
 *     Khalil Drira - Management and initial specification.
 *     Yassine Banouar - Initial specification, conception, implementation, test
 *         and documentation.
 *     Guillaume Garzone - Conception, implementation, test and documentation.
 *     Francois Aissaoui - Conception, implementation, test and documentation.
 ******************************************************************************/

// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7
// 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: 2014.01.25 at 04:25:45 PM CET
//


package org.eclipse.om2m.commons.resource;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;



/**
 * <p>Java Class for Groups complex type.
 *
 * <p>Groups resource is a Collection of {@link group} and {@link GroupAnnc} resources that
 * do not have a containment relation with a specific remote entity (Application or SCL).
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="Groups">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://uri.etsi.org/m2m}accessRightID" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}creationTime" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}lastModifiedTime" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}groupCollection" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}groupAnncCollection" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}subscriptionsReference" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 *
 *
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Groups extends Resource{

    @XmlSchemaType(name = "dateTime")
    protected String creationTime;
    @XmlSchemaType(name = "dateTime")
    protected String lastModifiedTime;
    protected NamedReferenceCollection groupCollection;
    protected NamedReferenceCollection groupAnncCollection;
    @XmlSchemaType(name = "anyURI")
    protected String subscriptionsReference;

    /**
     * Gets the value of the creationTime property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getCreationTime() {
        return creationTime;
    }

    /**
     * Sets the value of the property creationTime.
     *
     * @param value
     *
     *     allowed object is
     *     {@link String }
     *
     */
    public void setCreationTime(String value) {
        this.creationTime = value;
    }

    /**
     * Gets the value of the lastModifiedTime property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getLastModifiedTime() {
        return lastModifiedTime;
    }

    /**
     * Sets the value of the property lastModifiedTime.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setLastModifiedTime(String value) {
        this.lastModifiedTime = value;
    }

    /**
     * Gets the value of the groupCollection property.
     *
     * @return
     *     possible object is
     *     {@link NamedReferenceCollection }
     *
     */
    public NamedReferenceCollection getGroupCollection() {
        if (groupCollection == null){
            groupCollection = new NamedReferenceCollection();
        }

        return groupCollection;
    }

    /**
     * Sets the value of the property groupCollection.
     *
     * @param value
     *     allowed object is
     *     {@link NamedReferenceCollection }
     *
     */
    public void setGroupCollection(NamedReferenceCollection value) {
        this.groupCollection = value;
    }

    /**
     * Gets the value of the groupAnncCollection property.
     *
     * @return
     *     possible object is
     *     {@link NamedReferenceCollection }
     *
     */
    public NamedReferenceCollection getGroupAnncCollection() {
        if (groupAnncCollection == null){
            groupAnncCollection = new NamedReferenceCollection();
        }
        return groupAnncCollection;
    }

    /**
     * Sets the value of the property groupAnncCollection.
     *
     * @param value
     *     allowed object is
     *     {@link NamedReferenceCollection }
     *
     */
    public void setGroupAnncCollection(NamedReferenceCollection value) {
        this.groupAnncCollection = value;
    }

    /**
     * Gets the value of the subscriptionsReference property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     *
     *
     */
    public String getSubscriptionsReference() {
    	if (subscriptionsReference == null && uri != null) {
    		return uri+Refs.SUBSCRIPTIONS_REF;
    	} else {
			return subscriptionsReference;
    	}
    }

    /**
     * Sets the value of the property subscriptionsReference.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setSubscriptionsReference(String value) {
        this.subscriptionsReference = value;
    }

    @Override
    public String toString() {
        return "Groups [accessRightID=" + accessRightID + ", creationTime="
                + creationTime + ", lastModifiedTime=" + lastModifiedTime
                + ", groupCollection=" + groupCollection
                + ", groupAnncCollection=" + groupAnncCollection
                + ", subscriptionsReference=" + subscriptionsReference + "]";
    }

}
