/*   Copyright 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.xmlbeans;

import javax.xml.namespace.QName;
import java.util.List;
import java.util.Date;
import java.util.Calendar;
import java.math.BigInteger;
import java.math.BigDecimal;

/**
 * All XmlObject implementations can be coerced to SimpleValue.
 * For any given schema type, only a subset of the conversion
 * methods will work.  Others will throw an exception.
 * <p>
 * SimpleValue is useful for declaring variables which can hold
 * more than one similar schema type that may not happen to
 * have a common XML base type, for example, two list types,
 * or two unrelated integer restrictions that happen to fit
 * into an int.
 */
public interface SimpleValue extends XmlObject
{
    /**
     * The same as getSchemaType unless this is a union instance
     * or nil value.
     * <p>
     * For unions, this returns the non-union consituent type of
     * this instance. This type may change if setters are called
     * that cause the instance to change to another constituent
     * type of the union.
     * <p>
     * For nil values, this returns null.
     */
    SchemaType instanceType();

    /** Returns the value as a {@link String}. */
    String getStringValue();
    /** Returns the value as a boolean. */
    boolean getBooleanValue();
    /** Returns the value as a byte. */
    public byte getByteValue();
    /** Returns the value as a short. */
    public short getShortValue();
    /** Returns the value as an int. */
    public int getIntValue();
    /** Returns the value as a long. */
    public long getLongValue();
    /** Returns the value as a {@link BigInteger}. */
    public BigInteger getBigIntegerValue();
    /** Returns the value as a {@link BigDecimal}. */
    public BigDecimal getBigDecimalValue();
    /** Returns the value as a float. */
    public float getFloatValue();
    /** Returns the value as a double. */
    public double getDoubleValue();
    /** Returns the value as a byte array. */
    byte[] getByteArrayValue();
    /** Returns the value as a {@link StringEnumAbstractBase}. */
    StringEnumAbstractBase getEnumValue();
    /** Returns the value as a {@link Calendar}. */
    Calendar getCalendarValue();
    /** Returns the value as a {@link Date}. */
    Date getDateValue();
    /** Returns the value as a {@link GDate}. */
    GDate getGDateValue();
    /** Returns the value as a {@link GDuration}. */
    GDuration getGDurationValue();
    /** Returns the value as a {@link QName}. */
    QName getQNameValue();
    /** Returns the value as a {@link List} of friendly Java objects (String, Integer, Byte, Short, Long, BigInteger, Decimal, Float, Double, byte[], Calendar, GDuration). */
    List getListValue();
    /** Returns the value as a {@link List} of XmlAnySimpleType objects. */
    List xgetListValue();

    /** Returns a union value as a its natural friendly Java object (String, Integer, Byte, Short, Long, BigInteger, Decimal, Float, Double, byte[], Calendar, GDuration). */
    Object getObjectValue();

    // following are simple type value setters

    /** Sets the value as a {@link String}. */
    void setStringValue(String obj);
    /** Sets the value as a boolean. */
    void setBooleanValue(boolean v);
    /** Sets the value as a byte. */
    void setByteValue(byte v);
    /** Sets the value as a short. */
    void setShortValue(short v);
    /** Sets the value as an int. */
    void setIntValue(int v);
    /** Sets the value as a long. */
    void setLongValue(long v);
    /** Sets the value as a {@link BigInteger}. */
    void setBigIntegerValue(BigInteger obj);
    /** Sets the value as a {@link BigDecimal}. */
    void setBigDecimalValue(BigDecimal obj);
    /** Sets the value as a float. */
    void setFloatValue(float v);
    /** Sets the value as a double. */
    void setDoubleValue(double v);
    /** Sets the value as a byte array. */
    void setByteArrayValue(byte[] obj);
    /** Sets the value as a {@link StringEnumAbstractBase}. */
    void setEnumValue(StringEnumAbstractBase obj);
    /** Sets the value as a {@link Calendar}. */
    void setCalendarValue(Calendar obj);
    /** Sets the value as a {@link Date}. */
    void setDateValue(Date obj);
    /** Sets the value as a {@link GDate}. */
    void setGDateValue(GDate obj);
    /** Sets the value as a {@link GDuration}. */
    void setGDurationValue(GDuration obj);
    /** Sets the value as a {@link QName}. */
    void setQNameValue(QName obj);
    /** Sets the value as a {@link List}. */
    void setListValue(List obj);
    /** Sets the value as an arbitrary {@link Object}. */
    void setObjectValue(Object obj);

    /**
     * Returns the value as a {@link String}. *
     * @deprecated replaced with {@link #getStringValue}
     */
    String stringValue();
    /**
     * Returns the value as a boolean. *
     * @deprecated replaced with {@link #getBooleanValue}
     */
    boolean booleanValue();
    /**
     * Returns the value as a byte. *
     * @deprecated replaced with {@link #getByteValue}
     */
    public byte byteValue();
    /**
     * Returns the value as a short. *
     * @deprecated replaced with {@link #getShortValue}
     */
    public short shortValue();
    /**
     * Returns the value as an int. *
     * @deprecated replaced with {@link #getIntValue}
     */
    public int intValue();
    /**
     * Returns the value as a long. *
     * @deprecated replaced with {@link #getLongValue}
     */
    public long longValue();
    /**
     * Returns the value as a {@link BigInteger}. *
     * @deprecated replaced with {@link #getBigIntegerValue}
     */
    public BigInteger bigIntegerValue();
    /**
     * Returns the value as a {@link BigDecimal}. *
     * @deprecated replaced with {@link #getBigDecimalValue}
     */
    public BigDecimal bigDecimalValue();
    /**
     * Returns the value as a float. *
     * @deprecated replaced with {@link #getFloatValue}
     */
    public float floatValue();
    /**
     * Returns the value as a double. *
     * @deprecated replaced with {@link #getDoubleValue}
     */
    public double doubleValue();
    /**
     * Returns the value as a byte array. *
     * @deprecated replaced with {@link #getByteArrayValue}
     */
    byte[] byteArrayValue();
    /**
     * Returns the value as a {@link StringEnumAbstractBase}. *
     * @deprecated replaced with {@link #getEnumValue}
     */
    StringEnumAbstractBase enumValue();
    /**
     * Returns the value as a {@link Calendar}. *
     * @deprecated replaced with {@link #getCalendarValue}
     */
    Calendar calendarValue();
    /**
     * Returns the value as a {@link Date}. *
     * @deprecated replaced with {@link #getDateValue}
     */
    Date dateValue();
    /**
     * Returns the value as a {@link GDate}. *
     * @deprecated replaced with {@link #getGDateValue}
     */
    GDate gDateValue();
    /**
     * Returns the value as a {@link GDuration}. *
     * @deprecated replaced with {@link #getGDurationValue}
     */
    GDuration gDurationValue();
    /**
     * Returns the value as a {@link QName}. *
     * @deprecated replaced with {@link #getQNameValue}
     */
    QName qNameValue();
    /**
     * Returns the value as a {@link List} of friendly Java objects (String, Integer, Byte, Short, Long, BigInteger, Decimal, Float, Double, byte[], Calendar, GDuration). *
     * @deprecated replaced with {@link #getListValue}
     */
    List listValue();
    /**
     * Returns the value as a {@link List} of XmlAnySimpleType objects. *
     * @deprecated replaced with {@link #getListValue}
     */
    List xlistValue();
    
    /**
     * Returns a union value as a its natural friendly Java object (String, Integer, Byte, Short, Long, BigInteger, Decimal, Float, Double, byte[], Calendar, GDuration). *
     * @deprecated replaced with {@link #getObjectValue}
     */
    Object objectValue();

    // following are simple type value setters

    /**
     * Sets the value as a {@link String}. *
     * @deprecated replaced with {@link #setStringValue}
     */
    void set(String obj);
    /**
     * Sets the value as a boolean. *
     * @deprecated replaced with {@link #setBooleanValue}
     */
    void set(boolean v);
    /**
     * Sets the value as a byte.
     * @deprecated replaced with {@link #setByteValue}
     **/
    void set(byte v);
    /**
     * Sets the value as a short.
     * @deprecated replaced with {@link #setShortValue}
     **/
    void set(short v);
    /**
     * Sets the value as an int.
     * @deprecated replaced with {@link #setIntValue}
     **/
    void set(int v);
    /**
     * Sets the value as a long.
     * @deprecated replaced with {@link #setLongValue}
     **/
    void set(long v);
    /**
     * Sets the value as a {@link BigInteger}.
     * @deprecated replaced with {@link #setBigIntegerValue}
     **/
    void set(BigInteger obj);
    /**
     * Sets the value as a {@link BigDecimal}
     * @deprecated replaced with {@link #setBigDecimalValue}
     **/
    void set(BigDecimal obj);
    /**
     * Sets the value as a float.
     * @deprecated replaced with {@link #setFloatValue}
     **/
    void set(float v);
    /**
     * Sets the value as a double.
     * @deprecated replaced with {@link #setDoubleValue}
     **/
    void set(double v);
    /**
     * Sets the value as a byte array.
     * @deprecated replaced with {@link #setByteArrayValue}
     **/
    void set(byte[] obj);
    /**
     * Sets the value as a {@link StringEnumAbstractBase}.
     * @deprecated replaced with {@link #setEnumValue}
     **/
    void set(StringEnumAbstractBase obj);
    /**
     * Sets the value as a {@link Calendar}.
     * @deprecated replaced with {@link #setCalendarValue}
     **/
    void set(Calendar obj);
    /**
     * Sets the value as a {@link Date}.
     * @deprecated replaced with {@link #setDateValue}
     **/
    void set(Date obj);
    /**
     * Sets the value as a {@link GDate}.
     * @deprecated replaced with {@link #setGDateValue}
     **/
    void set(GDateSpecification obj);
    /**
     * Sets the value as a {@link GDuration}.
     * @deprecated replaced with {@link #setGDurationValue}
     **/
    void set(GDurationSpecification obj);
    /**
     * Sets the value as a {@link QName}.
     * @deprecated replaced with {@link #setQNameValue}
     **/
    void set(QName obj);
    /**
     * Sets the value as a {@link List}.
     * @deprecated replaced with {@link #setListValue}
     **/
    void set(List obj);
    /**
     * Sets the value as an arbitrary {@link Object}.
     * @deprecated replaced with {@link #setObjectValue}
     **/
    void objectSet(Object obj);
}
