/*
 * 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 primitive XSD data type UnsignedInt
 *
 * @see <a href="http://www.w3.org/TR/xmlschema-2/#unsignedInt">XML Schema 3.3.22</a>
 */
public class UnsignedInt extends java.lang.Number {

    private static final long serialVersionUID = -8915204168154746305L;
    
	protected Long lValue = new Long(0);

    public UnsignedInt() {
    }

    /**
     * ctor for UnsignedInt
     * @exception NumberFormatException will be thrown if validation fails
     */
    public UnsignedInt(long iValue) throws NumberFormatException {
      setValue(iValue);
    }

    public UnsignedInt(String stValue) throws NumberFormatException {
      setValue(Long.parseLong(stValue));
    }


    /**
     *
     * validates the data and sets the value for the object.
     *
     * @param iValue value
     */
    public void setValue(long iValue) throws NumberFormatException {
      if (!UnsignedInt.isValid(iValue))
            throw new NumberFormatException(
//                    Messages.getMessage("badUnsignedInt00") +
                    String.valueOf(iValue) + "]");
      lValue = new Long(iValue);
    }

    public String toString(){
      if (lValue != null)
        return lValue.toString();
      else
        return null;
    }

    public int hashCode(){
      if (lValue != null)
        return lValue.hashCode();
      else
        return 0;
    }

    /**
     *
     * validate the value against the xsd definition
     *
     */
    public static boolean isValid(long iValue) {
        return !((iValue < 0L) || (iValue > 4294967295L));
    }

    private Object __equalsCalc = null;
    public synchronized boolean equals(Object obj) {
        if (!(obj instanceof UnsignedInt)) return false;
        UnsignedInt other = (UnsignedInt) obj;
        if (this == obj) return true;
        if (__equalsCalc != null) {
            return (__equalsCalc == obj);
        }
        __equalsCalc = obj;
        boolean _equals;
        _equals = ((lValue == null && other.lValue == null) ||
                (lValue != null &&
                        lValue.equals(other.lValue)));
        __equalsCalc = null;
        return _equals;
    }

    // Implement java.lang.Number interface
    public byte byteValue() { return lValue.byteValue(); }
    public short shortValue() { return lValue.shortValue(); }
    public int intValue() { return lValue.intValue(); }
    public long longValue() { return lValue.longValue(); }
    public double doubleValue() { return lValue.doubleValue(); }
    public float floatValue() { return lValue.floatValue(); }


}
