| /* | |
| * Copyright 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 com.google.gwt.json.client; | |
| import com.google.gwt.core.client.JavaScriptObject; | |
| /** | |
| * Represents an array of {@link com.google.gwt.json.client.JSONValue} objects. | |
| */ | |
| public class JSONArray extends JSONValue { | |
| /** | |
| * Called from {@link #getUnwrapper()}. | |
| */ | |
| private static JavaScriptObject unwrap(JSONArray value) { | |
| return value.jsArray; | |
| } | |
| private final JavaScriptObject jsArray; | |
| /** | |
| * Creates an empty JSONArray. | |
| */ | |
| public JSONArray() { | |
| jsArray = JavaScriptObject.createArray(); | |
| } | |
| /** | |
| * Creates a new JSONArray from the supplied JavaScriptObject representing a | |
| * JavaScript array. | |
| * | |
| * @param arr a JavaScript array | |
| */ | |
| public JSONArray(JavaScriptObject arr) { | |
| jsArray = arr; | |
| } | |
| /** | |
| * Returns <code>true</code> if <code>other</code> is a {@link JSONArray} | |
| * wrapping the same underlying object. | |
| */ | |
| @Override | |
| public boolean equals(Object other) { | |
| if (!(other instanceof JSONArray)) { | |
| return false; | |
| } | |
| return jsArray.equals(((JSONArray) other).jsArray); | |
| } | |
| /** | |
| * Returns the value at the specified index position. | |
| * | |
| * @param index the index of the array item to retrieve | |
| * @return the value at this index, or <code>null</code> if this index is | |
| * empty | |
| */ | |
| public native JSONValue get(int index) /*-{ | |
| var v = this.@com.google.gwt.json.client.JSONArray::jsArray[index]; | |
| var func = @com.google.gwt.json.client.JSONParser::typeMap[typeof v]; | |
| return func ? func(v) : @com.google.gwt.json.client.JSONParser::throwUnknownTypeException(Ljava/lang/String;)(typeof v); | |
| }-*/; | |
| /** | |
| * Returns the underlying JavaScript array that this object wraps. | |
| */ | |
| public JavaScriptObject getJavaScriptObject() { | |
| return jsArray; | |
| } | |
| @Override | |
| public int hashCode() { | |
| return jsArray.hashCode(); | |
| } | |
| /** | |
| * Returns <code>this</code>, as this is a JSONArray. | |
| */ | |
| @Override | |
| public JSONArray isArray() { | |
| return this; | |
| } | |
| /** | |
| * Sets the specified index to the given value. | |
| * | |
| * @param index the index to set | |
| * @param value the value to set | |
| * @return the previous value at this index, or <code>null</code> if this | |
| * index was empty | |
| */ | |
| public JSONValue set(int index, JSONValue value) { | |
| JSONValue previous = get(index); | |
| set0(index, value); | |
| return previous; | |
| } | |
| /** | |
| * Returns the number of elements in this array. | |
| * | |
| * @return size of this array | |
| */ | |
| public native int size() /*-{ | |
| return this.@com.google.gwt.json.client.JSONArray::jsArray.length; | |
| }-*/; | |
| /** | |
| * Create the JSON encoded string representation of this JSONArray instance. | |
| * This method may take a long time to execute if the underlying array is | |
| * large. | |
| */ | |
| @Override | |
| public String toString() { | |
| StringBuffer sb = new StringBuffer(); | |
| sb.append("["); | |
| for (int i = 0, c = size(); i < c; i++) { | |
| if (i > 0) { | |
| sb.append(","); | |
| } | |
| sb.append(get(i)); | |
| } | |
| sb.append("]"); | |
| return sb.toString(); | |
| } | |
| @Override | |
| native JavaScriptObject getUnwrapper() /*-{ | |
| return @com.google.gwt.json.client.JSONArray::unwrap(Lcom/google/gwt/json/client/JSONArray;); | |
| }-*/; | |
| private native void set0(int index, JSONValue value) /*-{ | |
| if (value) { | |
| var func = value.@com.google.gwt.json.client.JSONValue::getUnwrapper()(); | |
| value = func(value); | |
| } else { | |
| // Coerce Java null to undefined; there's a JSONNull for null. | |
| value = undefined; | |
| } | |
| this.@com.google.gwt.json.client.JSONArray::jsArray[index] = value; | |
| }-*/; | |
| } |