JsonTreeReader.java 6.52 KB
package com.google.gson.internal.bind;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

public final class JsonTreeReader
  extends JsonReader
{
  private static final Reader a = new Reader()
  {
    public final void close()
      throws IOException
    {
      throw new AssertionError();
    }
    
    public final int read(char[] paramAnonymousArrayOfChar, int paramAnonymousInt1, int paramAnonymousInt2)
      throws IOException
    {
      throw new AssertionError();
    }
  };
  private static final Object b = new Object();
  private final List<Object> c = new ArrayList();
  
  public JsonTreeReader(JsonElement paramJsonElement)
  {
    super(a);
    this.c.add(paramJsonElement);
  }
  
  private Object a()
  {
    return this.c.get(this.c.size() - 1);
  }
  
  private void a(JsonToken paramJsonToken)
    throws IOException
  {
    if (peek() != paramJsonToken) {
      throw new IllegalStateException("Expected " + paramJsonToken + " but was " + peek());
    }
  }
  
  private Object b()
  {
    return this.c.remove(this.c.size() - 1);
  }
  
  public final void beginArray()
    throws IOException
  {
    a(JsonToken.BEGIN_ARRAY);
    JsonArray localJsonArray = (JsonArray)a();
    this.c.add(localJsonArray.iterator());
  }
  
  public final void beginObject()
    throws IOException
  {
    a(JsonToken.BEGIN_OBJECT);
    JsonObject localJsonObject = (JsonObject)a();
    this.c.add(localJsonObject.entrySet().iterator());
  }
  
  public final void close()
    throws IOException
  {
    this.c.clear();
    this.c.add(b);
  }
  
  public final void endArray()
    throws IOException
  {
    a(JsonToken.END_ARRAY);
    b();
    b();
  }
  
  public final void endObject()
    throws IOException
  {
    a(JsonToken.END_OBJECT);
    b();
    b();
  }
  
  public final boolean hasNext()
    throws IOException
  {
    JsonToken localJsonToken = peek();
    return (localJsonToken != JsonToken.END_OBJECT) && (localJsonToken != JsonToken.END_ARRAY);
  }
  
  public final boolean nextBoolean()
    throws IOException
  {
    a(JsonToken.BOOLEAN);
    return ((JsonPrimitive)b()).getAsBoolean();
  }
  
  public final double nextDouble()
    throws IOException
  {
    JsonToken localJsonToken = peek();
    if ((localJsonToken != JsonToken.NUMBER) && (localJsonToken != JsonToken.STRING)) {
      throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + localJsonToken);
    }
    double d = ((JsonPrimitive)a()).getAsDouble();
    if ((!isLenient()) && ((Double.isNaN(d)) || (Double.isInfinite(d)))) {
      throw new NumberFormatException("JSON forbids NaN and infinities: " + d);
    }
    b();
    return d;
  }
  
  public final int nextInt()
    throws IOException
  {
    JsonToken localJsonToken = peek();
    if ((localJsonToken != JsonToken.NUMBER) && (localJsonToken != JsonToken.STRING)) {
      throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + localJsonToken);
    }
    int i = ((JsonPrimitive)a()).getAsInt();
    b();
    return i;
  }
  
  public final long nextLong()
    throws IOException
  {
    JsonToken localJsonToken = peek();
    if ((localJsonToken != JsonToken.NUMBER) && (localJsonToken != JsonToken.STRING)) {
      throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + localJsonToken);
    }
    long l = ((JsonPrimitive)a()).getAsLong();
    b();
    return l;
  }
  
  public final String nextName()
    throws IOException
  {
    a(JsonToken.NAME);
    Map.Entry localEntry = (Map.Entry)((Iterator)a()).next();
    this.c.add(localEntry.getValue());
    return (String)localEntry.getKey();
  }
  
  public final void nextNull()
    throws IOException
  {
    a(JsonToken.NULL);
    b();
  }
  
  public final String nextString()
    throws IOException
  {
    JsonToken localJsonToken = peek();
    if ((localJsonToken != JsonToken.STRING) && (localJsonToken != JsonToken.NUMBER)) {
      throw new IllegalStateException("Expected " + JsonToken.STRING + " but was " + localJsonToken);
    }
    return ((JsonPrimitive)b()).getAsString();
  }
  
  public final JsonToken peek()
    throws IOException
  {
    Object localObject;
    boolean bool;
    for (;;)
    {
      if (this.c.isEmpty()) {
        return JsonToken.END_DOCUMENT;
      }
      localObject = a();
      if (!(localObject instanceof Iterator)) {
        break label105;
      }
      bool = this.c.get(this.c.size() - 2) instanceof JsonObject;
      localObject = (Iterator)localObject;
      if (!((Iterator)localObject).hasNext()) {
        break;
      }
      if (bool) {
        return JsonToken.NAME;
      }
      this.c.add(((Iterator)localObject).next());
    }
    if (bool) {
      return JsonToken.END_OBJECT;
    }
    return JsonToken.END_ARRAY;
    label105:
    if ((localObject instanceof JsonObject)) {
      return JsonToken.BEGIN_OBJECT;
    }
    if ((localObject instanceof JsonArray)) {
      return JsonToken.BEGIN_ARRAY;
    }
    if ((localObject instanceof JsonPrimitive))
    {
      localObject = (JsonPrimitive)localObject;
      if (((JsonPrimitive)localObject).isString()) {
        return JsonToken.STRING;
      }
      if (((JsonPrimitive)localObject).isBoolean()) {
        return JsonToken.BOOLEAN;
      }
      if (((JsonPrimitive)localObject).isNumber()) {
        return JsonToken.NUMBER;
      }
      throw new AssertionError();
    }
    if ((localObject instanceof JsonNull)) {
      return JsonToken.NULL;
    }
    if (localObject == b) {
      throw new IllegalStateException("JsonReader is closed");
    }
    throw new AssertionError();
  }
  
  public final void promoteNameToValue()
    throws IOException
  {
    a(JsonToken.NAME);
    Map.Entry localEntry = (Map.Entry)((Iterator)a()).next();
    this.c.add(localEntry.getValue());
    this.c.add(new JsonPrimitive((String)localEntry.getKey()));
  }
  
  public final void skipValue()
    throws IOException
  {
    if (peek() == JsonToken.NAME)
    {
      nextName();
      return;
    }
    b();
  }
  
  public final String toString()
  {
    return getClass().getSimpleName();
  }
}


/* Location:              /home/merong/decompile/hackery-dex2jar.jar!/com/google/gson/internal/bind/JsonTreeReader.class
 * Java compiler version: 6 (50.0)
 * JD-Core Version:       0.7.1
 */