/*******************************************************************************
 * 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: 2013.06.24 at 02:12:54 AM CEST
//


package org.eclipse.om2m.commons.resource;

import javax.persistence.Embeddable;
import javax.persistence.Embedded;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java Class for PermissionHolderType complex type.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="PermissionHolderType">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://uri.etsi.org/m2m}holderRefs" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}applicationIDs" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}sclIDs" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}all" minOccurs="0"/>
 *         &lt;element ref="{http://uri.etsi.org/m2m}domains" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PermissionHolderType", propOrder = {
        "holderRefs",
        "applicationIDs",
        "sclIDs",
        "all",
        "domains"
})
@Embeddable
public class PermissionHolderType {
	@Embedded
    protected HolderRefListType holderRefs;
	@Embedded
    protected ApplicationIDs applicationIDs;
	@Embedded
    protected SclIDs sclIDs;
    @Transient
    protected All all;
    @Embedded
    protected DomainListType domains;

    /**
     * Gets the value of the property holderRefs.
     *
     * @return
     *     possible object is
     *     {@link HolderRefListType }
     *
     */
    public HolderRefListType getHolderRefs() {
        return holderRefs;
    }

    /**
     * Sets the value of the property holderRefs.
     *
     * @param value
     *     allowed object is
     *     {@link HolderRefListType }
     *
     */
    public void setHolderRefs(HolderRefListType value) {
        this.holderRefs = value;
    }

    /**
     * Gets the value of the property applicationIDs.
     *
     * @return
     *     possible object is
     *     {@link ApplicationIDs }
     *
     */
    public ApplicationIDs getApplicationIDs() {
        return applicationIDs;
    }

    /**
     * Sets the value of the property applicationIDs.
     *
     * @param value
     *     allowed object is
     *     {@link ApplicationIDs }
     *
     */
    public void setApplicationIDs(ApplicationIDs value) {
        this.applicationIDs = value;
    }

    /**
     * Gets the value of the property sclIDs.
     *
     * @return
     *     possible object is
     *     {@link SclIDs }
     *
     */
    public SclIDs getSclIDs() {
        return sclIDs;
    }

    /**
     * Sets the value of the property sclIDs.
     *
     * @param value
     *     allowed object is
     *     {@link SclIDs }
     *
     */
    public void setSclIDs(SclIDs value) {
        this.sclIDs = value;
    }

    /**
     * Gets the value of the property all.
     *
     * @return
     *     possible object is
     *     {@link All }
     *
     */
    public All getAll() {
        return all;
    }

    /**
     * Sets the value of the property all.
     *
     * @param value
     *     allowed object is
     *     {@link All }
     *
     */
    public void setAll(All value) {
        this.all = value;
    }

    /**
     * Gets the value of the property domains.
     *
     * @return
     *     possible object is
     *     {@link DomainListType }
     *
     */
    public DomainListType getDomains() {
        return domains;
    }

    /**
     * Sets the value of the property domains.
     *
     * @param value
     *     allowed object is
     *     {@link DomainListType }
     *
     */
    public void setDomains(DomainListType value) {
        this.domains = value;
    }

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((all == null) ? 0 : all.hashCode());
		result = prime * result
				+ ((applicationIDs == null) ? 0 : applicationIDs.hashCode());
		result = prime * result + ((domains == null) ? 0 : domains.hashCode());
		result = prime * result
				+ ((holderRefs == null) ? 0 : holderRefs.hashCode());
		result = prime * result + ((sclIDs == null) ? 0 : sclIDs.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		PermissionHolderType other = (PermissionHolderType) obj;
		if (all == null) {
			if (other.all != null) {
				return false;
			}
		} else if (!all.equals(other.all)) {
			return false;
		}
		if (applicationIDs == null) {
			if (other.applicationIDs != null) {
				return false;
			}
		} else if (!applicationIDs.equals(other.applicationIDs)) {
			return false;
		}
		if (domains == null) {
			if (other.domains != null) {
				return false;
			}
		} else if (!domains.equals(other.domains)) {
			return false;
		}
		if (holderRefs == null) {
			if (other.holderRefs != null) {
				return false;
			}
		} else if (!holderRefs.equals(other.holderRefs)) {
			return false;
		}
		if (sclIDs == null) {
			if (other.sclIDs != null) {
				return false;
			}
		} else if (!sclIDs.equals(other.sclIDs)) {
			return false;
		}
		return true;
	}

}
