/* 
 | 
 * Copyright (C) 2008 Google Inc. 
 | 
 * 
 | 
 * 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 cn.emay.sdk.util.json.gson; 
 | 
  
 | 
import java.io.IOException; 
 | 
import java.io.StringWriter; 
 | 
import java.math.BigDecimal; 
 | 
import java.math.BigInteger; 
 | 
  
 | 
import cn.emay.sdk.util.json.gson.internal.Streams; 
 | 
import cn.emay.sdk.util.json.gson.stream.JsonWriter; 
 | 
  
 | 
/** 
 | 
 * A class representing an element of Json. It could either be a 
 | 
 * {@link JsonObject}, a {@link JsonArray}, a {@link JsonPrimitive} or a 
 | 
 * {@link JsonNull}. 
 | 
 * 
 | 
 * @author Inderjeet Singh 
 | 
 * @author Joel Leitch 
 | 
 */ 
 | 
public abstract class JsonElement { 
 | 
    /** 
 | 
     * Returns a deep copy of this element. Immutable elements like primitives and 
 | 
     * nulls are not copied. 
 | 
     */ 
 | 
    abstract JsonElement deepCopy(); 
 | 
  
 | 
    /** 
 | 
     * provides check for verifying if this element is an array or not. 
 | 
     * 
 | 
     * @return true if this element is of type {@link JsonArray}, false otherwise. 
 | 
     */ 
 | 
    public boolean isJsonArray() { 
 | 
        return this instanceof JsonArray; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * provides check for verifying if this element is a Json object or not. 
 | 
     * 
 | 
     * @return true if this element is of type {@link JsonObject}, false otherwise. 
 | 
     */ 
 | 
    public boolean isJsonObject() { 
 | 
        return this instanceof JsonObject; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * provides check for verifying if this element is a primitive or not. 
 | 
     * 
 | 
     * @return true if this element is of type {@link JsonPrimitive}, false 
 | 
     *         otherwise. 
 | 
     */ 
 | 
    public boolean isJsonPrimitive() { 
 | 
        return this instanceof JsonPrimitive; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * provides check for verifying if this element represents a null value or not. 
 | 
     * 
 | 
     * @return true if this element is of type {@link JsonNull}, false otherwise. 
 | 
     * @since 1.2 
 | 
     */ 
 | 
    public boolean isJsonNull() { 
 | 
        return this instanceof JsonNull; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link JsonObject}. If the 
 | 
     * element is of some other type, a {@link IllegalStateException} will result. 
 | 
     * Hence it is best to use this method after ensuring that this element is of 
 | 
     * the desired type by calling {@link #isJsonObject()} first. 
 | 
     * 
 | 
     * @return get this element as a {@link JsonObject}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of another type. 
 | 
     */ 
 | 
    public JsonObject getAsJsonObject() { 
 | 
        if (isJsonObject()) { 
 | 
            return (JsonObject) this; 
 | 
        } 
 | 
        throw new IllegalStateException("Not a JSON Object: " + this); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link JsonArray}. If the element 
 | 
     * is of some other type, a {@link IllegalStateException} will result. Hence it 
 | 
     * is best to use this method after ensuring that this element is of the desired 
 | 
     * type by calling {@link #isJsonArray()} first. 
 | 
     * 
 | 
     * @return get this element as a {@link JsonArray}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of another type. 
 | 
     */ 
 | 
    public JsonArray getAsJsonArray() { 
 | 
        if (isJsonArray()) { 
 | 
            return (JsonArray) this; 
 | 
        } 
 | 
        throw new IllegalStateException("This is not a JSON Array."); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link JsonPrimitive}. If the 
 | 
     * element is of some other type, a {@link IllegalStateException} will result. 
 | 
     * Hence it is best to use this method after ensuring that this element is of 
 | 
     * the desired type by calling {@link #isJsonPrimitive()} first. 
 | 
     * 
 | 
     * @return get this element as a {@link JsonPrimitive}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of another type. 
 | 
     */ 
 | 
    public JsonPrimitive getAsJsonPrimitive() { 
 | 
        if (isJsonPrimitive()) { 
 | 
            return (JsonPrimitive) this; 
 | 
        } 
 | 
        throw new IllegalStateException("This is not a JSON Primitive."); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link JsonNull}. If the element 
 | 
     * is of some other type, a {@link IllegalStateException} will result. Hence it 
 | 
     * is best to use this method after ensuring that this element is of the desired 
 | 
     * type by calling {@link #isJsonNull()} first. 
 | 
     * 
 | 
     * @return get this element as a {@link JsonNull}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of another type. 
 | 
     * @since 1.2 
 | 
     */ 
 | 
    public JsonNull getAsJsonNull() { 
 | 
        if (isJsonNull()) { 
 | 
            return (JsonNull) this; 
 | 
        } 
 | 
        throw new IllegalStateException("This is not a JSON Null."); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a boolean value. 
 | 
     * 
 | 
     * @return get this element as a primitive boolean value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid boolean value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public boolean getAsBoolean() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link Boolean} value. 
 | 
     * 
 | 
     * @return get this element as a {@link Boolean} value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid boolean value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    Boolean getAsBooleanWrapper() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link Number}. 
 | 
     * 
 | 
     * @return get this element as a {@link Number}. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid number. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public Number getAsNumber() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a string value. 
 | 
     * 
 | 
     * @return get this element as a string value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid string value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public String getAsString() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive double value. 
 | 
     * 
 | 
     * @return get this element as a primitive double value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid double value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public double getAsDouble() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive float value. 
 | 
     * 
 | 
     * @return get this element as a primitive float value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid float value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public float getAsFloat() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive long value. 
 | 
     * 
 | 
     * @return get this element as a primitive long value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid long value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public long getAsLong() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive integer value. 
 | 
     * 
 | 
     * @return get this element as a primitive integer value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid integer value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public int getAsInt() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive byte value. 
 | 
     * 
 | 
     * @return get this element as a primitive byte value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid byte value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     * @since 1.3 
 | 
     */ 
 | 
    public byte getAsByte() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive character value. 
 | 
     * 
 | 
     * @return get this element as a primitive char value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid char value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     * @since 1.3 
 | 
     */ 
 | 
    public char getAsCharacter() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link BigDecimal}. 
 | 
     * 
 | 
     * @return get this element as a {@link BigDecimal}. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive}. * @throws 
 | 
     *             NumberFormatException if the element is not a valid 
 | 
     *             {@link BigDecimal}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     * @since 1.2 
 | 
     */ 
 | 
    public BigDecimal getAsBigDecimal() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a {@link BigInteger}. 
 | 
     * 
 | 
     * @return get this element as a {@link BigInteger}. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive}. 
 | 
     * @throws NumberFormatException 
 | 
     *             if the element is not a valid {@link BigInteger}. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     * @since 1.2 
 | 
     */ 
 | 
    public BigInteger getAsBigInteger() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * convenience method to get this element as a primitive short value. 
 | 
     * 
 | 
     * @return get this element as a primitive short value. 
 | 
     * @throws ClassCastException 
 | 
     *             if the element is of not a {@link JsonPrimitive} and is not a 
 | 
     *             valid short value. 
 | 
     * @throws IllegalStateException 
 | 
     *             if the element is of the type {@link JsonArray} but contains more 
 | 
     *             than a single element. 
 | 
     */ 
 | 
    public short getAsShort() { 
 | 
        throw new UnsupportedOperationException(getClass().getSimpleName()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Returns a String representation of this element. 
 | 
     */ 
 | 
    @Override 
 | 
    public String toString() { 
 | 
        try { 
 | 
            StringWriter stringWriter = new StringWriter(); 
 | 
            JsonWriter jsonWriter = new JsonWriter(stringWriter); 
 | 
            jsonWriter.setLenient(true); 
 | 
            Streams.write(this, jsonWriter); 
 | 
            return stringWriter.toString(); 
 | 
        } catch (IOException e) { 
 | 
            throw new AssertionError(e); 
 | 
        } 
 | 
    } 
 | 
} 
 |