/*
* Copyright 2015 Grow Bit
*
* 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.turbogwt.core.util;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
/**
* Utility methods for Overlay Types manipulation.
*
* @author Danilo Reinert
* @author Javier Ferrero (#deepCopy)
*/
public final class Overlays {
private Overlays() {
}
@SuppressWarnings("unchecked")
public static <T extends JavaScriptObject> T deepCopy(T obj) {
return (T) deepCopyNative(obj);
}
public static native boolean getBoolean(JavaScriptObject jso, String property) /*-{
return jso[property];
}-*/;
public static native Boolean getBoxedBoolean(JavaScriptObject jso, String property) /*-{
return jso[property] != null ? @java.lang.Boolean::valueOf(Z)(jso[property]) : null;
}-*/;
public static native Double getBoxedDouble(JavaScriptObject jso, String property) /*-{
return jso[property] != null ? @java.lang.Double::valueOf(D)(jso[property]) : null;
}-*/;
public static native Integer getBoxedInteger(JavaScriptObject jso, String property) /*-{
return jso[property] != null ? @java.lang.Integer::valueOf(I)(jso[property]) : null;
}-*/;
public static native Long getBoxedLong(JavaScriptObject jso, String property) /*-{
return jso[property] != null ? @java.lang.Long::valueOf(Ljava/lang/String;)(jso[property] + '') : null;
}-*/;
public static native double getDouble(JavaScriptObject jso, String property) /*-{
return jso[property];
}-*/;
public static native int getInt(JavaScriptObject jso, String property) /*-{
return jso[property];
}-*/;
@SuppressWarnings("unchecked")
public static <T> T getObject(JavaScriptObject jso, String property) {
return (T) getObjectNative(jso, property);
}
public static String[] getPropertyNames(JavaScriptObject jso) {
return getPropertyNames(jso, false);
}
public static String[] getPropertyNames(JavaScriptObject jso, boolean sorted) {
if (GWT.isScript()) {
return getPropertyNamesNativeToArray(jso, sorted);
}
return Util.toArray(getPropertyNamesNative(jso, sorted));
}
public static native String getString(JavaScriptObject jso, String property) /*-{
return jso[property];
}-*/;
public static native boolean isPropertyNullOrUndefined(JavaScriptObject jso, String property) /*-{
return jso[property] == null;
}-*/;
public static native void setBoolean(JavaScriptObject jso, String property, boolean value) /*-{
jso[property] = value;
}-*/;
public static void setBoxedBoolean(JavaScriptObject jso, String property, Boolean value) {
if (value != null) {
setBoolean(jso, property, value.booleanValue());
} else {
setNull(jso, property);
}
}
public static void setBoxedDouble(JavaScriptObject jso, String property, Double value) {
if (value != null) {
setDouble(jso, property, value.doubleValue());
} else {
setNull(jso, property);
}
}
public static void setBoxedInteger(JavaScriptObject jso, String property, Integer value) {
if (value != null) {
setInt(jso, property, value.intValue());
} else {
setNull(jso, property);
}
}
public static void setBoxedLong(JavaScriptObject jso, String property, Long value) {
if (value != null) {
setDouble(jso, property, value.doubleValue());
} else {
setNull(jso, property);
}
}
public static native void setDouble(JavaScriptObject jso, String property, double value) /*-{
jso[property] = value;
}-*/;
public static native void setInt(JavaScriptObject jso, String property, int value) /*-{
jso[property] = value;
}-*/;
public static native void setNull(JavaScriptObject jso, String property) /*-{
jso[property] = null;
}-*/;
public static native void setString(JavaScriptObject jso, String property, String value) /*-{
jso[property] = value;
}-*/;
public static native String stringify(JavaScriptObject jso) /*-{
return JSON.stringify(jso);
}-*/;
private static native JavaScriptObject deepCopyNative(JavaScriptObject obj) /*-{
if (obj == null) return obj;
var copy;
if (obj instanceof Date) {
// Handle Date
copy = new Date();
copy.setTime(obj.getTime());
} else if (obj instanceof Array) {
// Handle Array
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
if (obj[i] == null || typeof obj[i] != "object") copy[i] = obj[i];
// CHECKSTYLE:OFF
else copy[i] = @org.turbogwt.core.util.Overlays::deepCopyNative(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
// CHECKSTYLE:ON
}
} else {
// Handle Object
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
if (obj[attr] == null || typeof obj[attr] != "object") copy[attr] = obj[attr];
// CHECKSTYLE:OFF
else copy[attr] = @org.turbogwt.core.util.Overlays::deepCopyNative(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[attr]);
// CHECKSTYLE:ON
}
}
}
return copy;
}-*/;
private static native Object getObjectNative(JavaScriptObject jso, String property) /*-{
return jso[property];
}-*/;
private static native JsArrayString getPropertyNamesNative(JavaScriptObject jso, boolean sorted) /*-{
if (sorted) return Object.keys(jso).sort();
return Object.keys(jso);
}-*/;
private static native String[] getPropertyNamesNativeToArray(JavaScriptObject jso, boolean sorted) /*-{
if (sorted) return Object.keys(jso).sort();
return Object.keys(jso);
}-*/;
}