package org.ovirt.engine.ui.webadmin.plugin.jsni; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; /** * Helper class for working with {@link JsArray}. */ public class JsArrayHelper { /** * Creates a {@link JsArray} containing String values. */ public static JsArray<?> createStringArray(String... values) { JsArrayString array = JavaScriptObject.createArray().cast(); if (values != null) { for (int i = 0; i < values.length; i++) { array.push(values[i]); } } return toGenericArray(array); } /** * Creates a {@link JsArray} containing mixed values. * <p> * Supported value types: * <ul> * <li>{@link JavaScriptObject}, maps to native JS object * <li>String, maps to JS {@code string} * <li>Double, maps to JS {@code number} * <li>Boolean, maps to JS {@code boolean} * </ul> */ public static JsArray<JavaScriptObject> createMixedArray(Object... values) { JsArray<JavaScriptObject> array = JavaScriptObject.createArray().cast(); if (values != null) { for (int i = 0; i < values.length; i++) { Object obj = values[i]; if (obj instanceof JavaScriptObject) { array.push((JavaScriptObject) obj); } else if (obj instanceof String) { pushString(array, (String) obj); } else if (obj instanceof Double) { pushNumber(array, (Double) obj); } else if (obj instanceof Boolean) { pushBoolean(array, (Boolean) obj); } } } return array; } private static native void pushString(JavaScriptObject arrayObj, String value) /*-{ arrayObj[arrayObj.length] = value; }-*/; private static native void pushNumber(JavaScriptObject arrayObj, Double value) /*-{ arrayObj[arrayObj.length] = value.@java.lang.Double::doubleValue()(); }-*/; private static native void pushBoolean(JavaScriptObject arrayObj, Boolean value) /*-{ arrayObj[arrayObj.length] = value.@java.lang.Boolean::booleanValue()(); }-*/; /** * Casts the given native array object into {@link JsArray} representation. * <p> * Returns {@code null} if {@code arrayObj} is not a native array object. */ private static native JsArray<?> toGenericArray(JavaScriptObject arrayObj) /*-{ return (Object.prototype.toString.call(arrayObj) === '[object Array]') ? arrayObj : null; }-*/; }