/*
* © Copyright IBM Corp. 2012-2013
*
* 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.ibm.commons.util.io.json;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.ibm.commons.Platform;
/**
*
*/
public class JsonJavaArray extends ArrayList<Object> implements JsonArray {
private static final long serialVersionUID = 1L;
public JsonJavaArray() {
}
public JsonJavaArray(int initialCapacity) {
super(initialCapacity);
}
public JsonJavaArray(List<Object> list) {
if(list!=null) {
addAll(list);
}
}
// Convert to a string
public String toString() {
try {
return JsonGenerator.toJson(JsonJavaFactory.instanceEx, this);
} catch(Exception ex) {
Platform.getInstance().log(ex);
return "";
}
}
/** @ibm-api */
public int length() {
return size();
}
/** @ibm-api */
public String getString(int index) {
Object o = get(index);
if(o!=null) {
return (String)o;
}
return null;
}
/** @ibm-api */
public double getNumber(int index) {
Object o = get(index);
if(o!=null) {
return ((Number)o).doubleValue();
}
return 0.0;
}
/** @ibm-api */
public boolean getBoolean(int index) {
Object o = get(index);
if(o!=null) {
return (Boolean)o;
}
return false;
}
/** @ibm-api */
public JsonObject getObject(int index) {
Object o = get(index);
if(o!=null) {
return (JsonObject)o;
}
return null;
}
/** @ibm-api */
public JsonArray getArray(int index) {
Object o = get(index);
if(o!=null) {
return (JsonArray)o;
}
return null;
}
/** @ibm-api */
public void put(int index, Object value) {
// Emulate JavaScript with put: add the missing elements, if needed
while(size()<=index) {
add((Object)null);
}
set(index, value);
}
/** @ibm-api */
public void putString(int index, String value) {
put(index,value);
}
/** @ibm-api */
public void putNumber(int index, double value) {
put(index,value);
}
/** @ibm-api */
public void putBoolean(int index, boolean value) {
put(index,value);
}
/** @ibm-api */
public void putObject(int index, JsonObject value) {
put(index,value);
}
/** @ibm-api */
public void putArray(int index, JsonArray value) {
put(index,value);
}
/** @ibm-api */
public void add(Object[] values) {
if(values!=null) {
for(int i=0; i<values.length; i++) {
add(values[i]);
}
}
}
//
// Typed helpers
//
/** @ibm-api */
public String getAsString(int index) {
Object v = get(index);
if(v!=null) {
return v.toString();
}
return null;
}
/** @ibm-api */
public double getAsDouble(int index) {
Object v = get(index);
if(v instanceof Number) {
return ((Number)v).doubleValue();
}
if(v instanceof String) {
return Double.parseDouble((String)v);
}
if(v instanceof Boolean) {
return (Boolean)v ? 1 : 0;
}
return 0;
}
/** @ibm-api */
public int getAsInt(int index) {
Object v = get(index);
if(v instanceof Number) {
return ((Number)v).intValue();
}
if(v instanceof String) {
return Integer.parseInt((String)v);
}
if(v instanceof Boolean) {
return (Boolean)v ? 1 : 0;
}
return 0;
}
/** @ibm-api */
public long getAsLong(JsonObject o, int index) {
Object v = get(index);
if(v instanceof Number) {
return ((Number)v).longValue();
}
if(v instanceof String) {
return Long.parseLong((String)v);
}
if(v instanceof Boolean) {
return (Boolean)v ? 1 : 0;
}
return 0;
}
/** @ibm-api */
public boolean getAsBoolean(JsonObject o, int index) {
Object v = get(index);
if(v instanceof Boolean) {
return ((Boolean)v).booleanValue();
}
if(v instanceof String) {
String s = (String)v;
if(s.equalsIgnoreCase("false") || s.equals("0")) {
return false;
}
return true;
}
if(v instanceof Number) {
return ((Number)o).doubleValue()!=0.0;
}
return v!=null;
}
/** @ibm-api */
@SuppressWarnings({ "rawtypes", "unchecked" })
public JsonJavaObject getAsObject(int index) {
Object v = get(index);
if(v instanceof JsonJavaObject) {
return (JsonJavaObject)v;
}
if(v instanceof Map) {
return new JsonJavaObject((Map)v);
}
return null;
}
/** @ibm-api */
@SuppressWarnings({ "rawtypes", "unchecked" })
public Map<String,Object> getAsMap(int index) {
Object v = get(index);
if(v instanceof Map) {
return (Map)v;
}
return null;
}
/** @ibm-api */
@SuppressWarnings({ "rawtypes", "unchecked" })
public JsonJavaArray getAsArray(int index) {
Object v = get(index);
if(v instanceof JsonJavaArray) {
return (JsonJavaArray)v;
}
if(v instanceof List) {
return new JsonJavaArray((List)v);
}
return null;
}
/** @ibm-api */
@SuppressWarnings("unchecked")
public List<Object> getAsList(int index) {
Object v = get(index);
if(v instanceof List) {
return (List<Object>)v;
}
return null;
}
//
// Extensions
//
/** @ibm-api */
public Date getJavaDate(int index) throws IOException, ParseException {
String s = getString(index);
if (s != null) {
return JsonGenerator.stringToDate(s);
}
return null;
}
/** @ibm-api */
public void putJavaDate(int index, Date value) throws IOException {
if (value != null) {
String dt = JsonGenerator.dateToString(value);
put(index, dt);
}
}
}