/*
* Copyright 2013 cruxframework.org.
*
* 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 org.cruxframework.crux.core.client.utils;
import java.util.ArrayList;
import java.util.List;
import org.cruxframework.crux.core.client.collection.FastList;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayMixed;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONNull;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
/**
* @author Thiago da Rosa de Bustamante
*
*/
public class JsUtils
{
/**
* Append all values contained in input array into the output array
* @param in
* @param out
*/
public static native void copyValues(JsArrayMixed input, JsArrayMixed output)/*-{
for (var i=0; i< input.length; i++)
{
output.push(input[i]);
}
}-*/;
/**
* Create a JSONValue Object from a native javascript object
* @param object
* @return
*/
public static JSONValue toJSONValue(JavaScriptObject object)
{
if (object == null)
{
return JSONNull.getInstance();
}
if (isArray(object))
{
return new JSONArray(object);
}
return new JSONObject(object);
}
/**
* Extract the associated native javascript object from the given json string
* @param jsonValue
* @return
*/
public static <T extends JavaScriptObject> T fromString(String encodedObject)
{
if (StringUtils.isEmpty(encodedObject))
{
return null;
}
if (encodedObject.startsWith("data:"))
{
return FileUtils.fromDataURI(encodedObject).cast();
}
return fromJSONValue(encodedObject);
}
/**
* Extract the associated native javascript object from the given json string
* @param jsonValue
* @return
*/
public static <T extends JavaScriptObject> T fromJSONValue(String encodedObject)
{
JSONValue jsonValue = JSONParser.parseStrict(encodedObject);
return fromJSONValue(jsonValue).cast();
}
/**
* Extract the associated native javascript object from the given json object
* @param jsonValue
* @return
*/
public static JavaScriptObject fromJSONValue(JSONValue jsonValue)
{
if (jsonValue.isNull() != null)
{
return null;
}
JSONArray jsonArray = jsonValue.isArray();
if (jsonArray != null)
{
return jsonArray.getJavaScriptObject();
}
return jsonValue.isObject().getJavaScriptObject();
}
/**
* Check if the given native object represents an array
* @param obj
* @return
*/
public static native boolean isArray(JavaScriptObject obj)/*-{
return (Object.prototype.toString.call(obj) === '[object Array]');
}-*/;
/**
* Return true if given object has a property with specified name.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native boolean hasPropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
return (object !== undefined);
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param output an array where the output will be written
*/
public static void readPropertyValue(JavaScriptObject object, String property, JsArrayMixed output)
{
readPropertyValue(object, property, output, true);
}
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param output an array where the output will be written
* @param includeNull if true, includes null values on output array
*/
public static native void readPropertyValue(JavaScriptObject object, String property, JsArrayMixed output, boolean includeNull)/*-{
function getDescendantProp(obj, desc) {
var arr = desc.split(".");
while(arr.length && (obj = obj[arr.shift()]));
return obj;
}
var ret = getDescendantProp(object, property);
if (includeNull || (ret != null && ret !== undefined))
{
output.push(ret);
}
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native String readStringPropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
return object;
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native int readIntPropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
return object;
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native double readDoublePropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
return object;
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native boolean readBooleanPropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
if (typeof object == "string")
{
return (object == 'true');
}
return object;
}-*/;
/**
* Read properties from native javascript objects.
* @param object the Object where the property will be read from.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
*/
public static native JavaScriptObject readObjectPropertyValue(JavaScriptObject object, String property)/*-{
var arr = property.split(".");
while(arr.length && (object = object[arr.shift()]));
return object;
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input an array containing the property value.
* @param extractArrayContent It true, the first element from input array is used as property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, JsArrayMixed input, boolean extractArrayContent)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
if (input)
{
if (extractArrayContent && input.length > 0)
{
obj[arr.shift()] = input[0];
}
else if (input.length > 0)
{
obj[arr.shift()] = input;
}
else
{
obj[arr.shift()] = null;
}
}
else
{
obj[arr.shift()] = null;
}
}
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input the property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, String input)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
obj[arr.shift()] = input;
}
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input the property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, double input)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
obj[arr.shift()] = input;
}
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input the property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, int input)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
obj[arr.shift()] = input;
}
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input the property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, boolean input)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
obj[arr.shift()] = input;
}
}-*/;
/**
* Write property to native javascript objects.
* @param object the Object where the property will be written.
* @param property the name of the property. You can pass inner properties using dot notation (prop1.prop2)
* @param input the property value.
*/
public static native void writePropertyValue(JavaScriptObject object, String property, JavaScriptObject input)/*-{
var obj = object;
var arr = property.split(".");
while((arr.length-1) && (obj = obj[arr.shift()]));
if (obj)
{
obj[arr.shift()] = input;
}
}-*/;
public static String[] toArray(JsArrayString jSArray)
{
String[] result = new String[jSArray.length()];
for (int i = 0; i < jSArray.length(); i++)
{
result[i] = jSArray.get(i);
}
return result;
}
public static List<String> toList(JsArrayString jSArray)
{
List<String> result = new ArrayList<String>(jSArray.length());
for (int i = 0; i < jSArray.length(); i++)
{
result.add(jSArray.get(i));
}
return result;
}
public static FastList<String> toFastList(JsArrayString jSArray)
{
FastList<String> result = new FastList<String>();
for (int i = 0; i < jSArray.length(); i++)
{
result.add(jSArray.get(i));
}
return result;
}
public static JsArrayString toJsArray(List<String> list)
{
JsArrayString js = JsArrayString.createArray().cast();
for (int i = 0; i < list.size(); i++)
{
js.set(i, list.get(i));
}
return js;
}
public static JsArrayString toJsArray(String[] args)
{
JsArrayString js = JsArrayString.createArray().cast();
for (int i = 0; i < args.length; i++)
{
js.set(i, args[i]);
}
return js;
}
public static native String escape(String input)/*-{
return escape(input);
}-*/;
public static native String unescape(String input)/*-{
return unescape(input);
}-*/;
}