/*
 * Copyright 2001-2004 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.axis2.databinding.types;


/**
 * Custom class for supporting XSD data type NOTATION.
 *
 * @see <a href="http://www.w3.org/TR/xmlschema-1/#element-notation">XML Schema Part 1: 3.12 Notation Declarations</a>
 */

public class Notation implements java.io.Serializable {
	
    private static final long serialVersionUID = 2393074651972192536L;
    
	NCName name;
    URI publicURI;
    URI systemURI;

    public Notation() {
    }

    public Notation(NCName name, URI publicURI, URI systemURI) {
        this.name = name;
        this.publicURI = publicURI;
        this.systemURI = systemURI;
    }

    public NCName getName() {
        return name;
    }

    public void setName(NCName name) {
        this.name = name;
    }

    public URI getPublic() {
        return publicURI;
    }

    public void setPublic(URI publicURI) {
        this.publicURI = publicURI;
    }

    public URI getSystem() {
        return systemURI;
    }

    public void setSystem(URI systemURI) {
        this.systemURI = systemURI;
    }

    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof Notation))
            return false;
        Notation other = (Notation) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (publicURI == null) {
            if (other.publicURI != null) {
                return false;
            }
        } else if (!publicURI.equals(other.publicURI)) {
            return false;
        }
        if (systemURI == null) {
            if (other.systemURI != null) {
                return false;
            }
        } else if (!systemURI.equals(other.systemURI)) {
            return false;
        }
        return true;
    }

    /**
     * Returns the sum of the hashcodes of {name,publicURI,systemURI}
     * for whichever properties in that set is non null.  This is
     * consistent with the implementation of equals, as required by
     * {@link java.lang.Object#hashCode() Object.hashCode}.
     *
     * @return an <code>int</code> value
     */
    public int hashCode() {
        int hash = 0;
        if (null != name) {
            hash += name.hashCode();
        }
        if (null != publicURI) {
            hash += publicURI.hashCode();
        }
        if (null != systemURI) {
            hash += systemURI.hashCode();
        }
        return hash;
    }

    /**
     * Note - A lot of code that depended on certain descriptions has been deleted from this class
     */

}
