package com.redspr.redquerybuilder.js.client; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayMixed; import com.google.gwt.core.client.JsDate; public final class JsList extends JavaScriptObject { private static final JsList INSTANCE = (JsList) JavaScriptObject.createObject(); public static JsList get() { return INSTANCE; } protected JsList() { } public native boolean isNull(JavaScriptObject array, int i) /*-{ return array[i] == null; }-*/; public native boolean isDate(JavaScriptObject array, int i) /*-{ return Boolean(array[i].getMonth); }-*/; public Date getDate(JavaScriptObject array, int i) { JsDate jsDate = getJsDate(array, i); return new Date((long) jsDate.getTime()); } private native JsDate getJsDate(JavaScriptObject array, int i) /*-{ return array[i]; }-*/; public native boolean isString(JavaScriptObject array, int i) /*-{ return (typeof array[i] == 'string' || array[i] instanceof String); }-*/; public native boolean isNumber(JavaScriptObject array, int i) /*-{ return (typeof array[i] == 'number' || array[i] instanceof Number); }-*/; public native String debugString(JavaScriptObject array, int i) /*-{ return 'typeof=' + typeof array[i] + ' toString="' + array[i] + '"'; }-*/; public JsArrayMixed toJso(List<Object> args) { JsArrayMixed result = (JsArrayMixed) JavaScriptObject.createArray(); for (Object o : args) { if (o == null) { result.push((JavaScriptObject) null); } else if (o instanceof String) { result.push((String) o); } else if (o instanceof Date) { result.push(JsDate.create(((Date) o).getTime())); } else if (o instanceof Double) { result.push(((Double) o).doubleValue()); } else { throw new IllegalArgumentException("Don't know how to handle " + o); } } return result; } private Object get(JsArrayMixed args, int i) { if (isNull(args, i)) { return i; } else if (isDate(args, i)) { return getDate(args, i); } else if (isString(args, i)) { return args.getString(i); } else if (isNumber(args, i)) { return args.getNumber(i); } throw new RuntimeException("Unable to handle value " + debugString(args, i)); } public List<Object> toList(JsArrayMixed args) { List<Object> result = new ArrayList<Object>(); if (args != null) { for (int i = 0; i < args.length(); i++) { result.add(get(args, i)); } } return result; } }