| /* |
| * 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()}. |
| */ |
| @SuppressWarnings("unused") |
| 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 === null) { |
| value = undefined; |
| } else { |
| var func = value.@com.google.gwt.json.client.JSONValue::getUnwrapper()(); |
| value = func(value); |
| } |
| this.@com.google.gwt.json.client.JSONArray::jsArray[index] = value; |
| }-*/; |
| } |