/*******************************************************************************
 * 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.07.17 at 02:24:48 PM CEST
//


package org.eclipse.om2m.commons.resource;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java Class for Notify complex type.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="Notify">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://uri.etsi.org/m2m}statusCode"/>
 *         &lt;element name="representation" type="{http://www.w3.org/2005/05/xmlmime}base64Binary" minOccurs="0"/>
 *         &lt;element name="subscriptionReference" type="{http://www.w3.org/2001/XMLSchema}anyURI"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 *
 *
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Notify", propOrder = {
        "statusCode",
        "representation",
        "subscriptionReference"
})
public class Notify {

    @XmlElement(namespace = "http://uri.etsi.org/m2m", required = true)
    protected StatusCode statusCode;
    protected Base64Binary representation;
    @XmlElement(required = true)
    @XmlSchemaType(name = "anyURI")
    protected String subscriptionReference;


    public Notify(){
        super();
        this.representation = new Base64Binary();
    }

    /**
     * Gets the value of the property statusCode.
     *
     * @return
     *     possible object is
     *     {@link StatusCode }
     *
     */
    public StatusCode getStatusCode() {
        return statusCode;
    }

    /**
     * Sets the value of the property statusCode.
     *
     * @param value
     *     allowed object is
     *     {@link StatusCode }
     *
     */
    public void setStatusCode(StatusCode value) {
        this.statusCode = value;
    }

    /**
     * Gets the value of the property representation.
     *
     * @return
     *     possible object is
     *     {@link Base64Binary }
     *
     */
    public Base64Binary getRepresentation() {
        return representation;
    }

    /**
     * Sets the value of the property representation.
     *
     * @param value
     *     allowed object is
     *     {@link Base64Binary }
     *
     */
    public void setRepresentation(Base64Binary value) {
        this.representation = value;
    }

    /**
     * Gets the value of the property subscriptionReference.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getSubscriptionReference() {
        return subscriptionReference;
    }

    /**
     * Sets the value of the property subscriptionReference.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setSubscriptionReference(String value) {
        this.subscriptionReference = value;
    }

}
