Before you read this article, I suppose you know well about JSNI and JavaScriptObject. We are going to talk about three classes in this package:
- JavaScriptObjectHelper
- BaseJavaScriptObjectImpl
-
BaseJavaScriptObject
1. JavaScriptObjectHelper
Some useful methods in this class, now just one method "toJavaScriptArray", This method is used to convert Object[] of java to JavaScript Array.(" BaseJavaScriptObjectImpl.setProperty " will be mentioned in the next class)
package org.gwtopenmaps.openlayers.client.common;
import com.google.gwt.core.client.JavaScriptObject;
public class JavaScriptObjectHelper {
/**
* notice: if element of objs is primitive type which is not supported, it must be cast to its packaged class
*
* @param objs java.lang.Integer, java.lang.Float, java.lang.Double, java.lang.Boolean, java.lang.String, JavaScriptObject
* @return JavaScript Array
*/
public static JavaScriptObject toJavaScriptArray(Object... objs) {
JavaScriptObject javaScriptArray = JavaScriptObject.createArray();
for(int i = 0; i < objs.length; i ++) {
Object obj = objs[i];
if(obj.getClass().equals(java.lang.Integer.class)) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), Integer.valueOf(obj.toString()));
}
if(obj.getClass().equals(java.lang.Float.class)) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), Float.valueOf(obj.toString()));
}
if(obj.getClass().equals(java.lang.Double.class)) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), Double.valueOf(obj.toString()));
}
if(obj.getClass().equals(java.lang.Boolean.class)) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), Boolean.valueOf(obj.toString()));
}
if(obj.getClass().equals(java.lang.String.class)) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), obj.toString());
}
if(obj instanceof JavaScriptObject) {
BaseJavaScriptObjectImpl.setProperty(javaScriptArray, String.valueOf(i), (JavaScriptObject) obj);
}
}
return javaScriptArray;
}
}
2. BaseJavaScriptObjectImpl
This class has 18 static native methods(JSNI), 6 getProperty, 6 setProperty and 6 invokeMethod which for operating JavaScriptObject. The number 6 means 6 types: int, float, double, boolean, String and JavaScriptObject. If method of JavaScriptObject has no return value, then the return value is "undefined" which is also type of JavaScriptObject.
Please pay attention to the param "arrayArguments " of the invoke methods, then relate it to the method above "toJavaScriptArray "...
package org.gwtopenmaps.openlayers.client.common;
import com.google.gwt.core.client.JavaScriptObject;
public class BaseJavaScriptObjectImpl {
/*-- set ----------------------------------------------------------------------------*/
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, int propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, float propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, double propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, boolean propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, String propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
public static native void setProperty(JavaScriptObject javaScriptObject, String propertyName, JavaScriptObject propertyValue) /*-{
javaScriptObject[propertyName] = propertyValue;
}-*/;
/*-- get ----------------------------------------------------------------------------*/
public static native int getPropertyAsInt(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
public static native float getPropertyAsFloat(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
public static native double getPropertyAsDouble(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
public static native boolean getPropertyAsBoolean(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
public static native String getPropertyAsString(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
public static native JavaScriptObject getPropertyAsJavaScriptObject(JavaScriptObject javaScriptObject, String propertyName) /*-{
return javaScriptObject[propertyName];
}-*/;
/*-- invoke method ----------------------------------------------------------------------------*/
public static native int invokeMethodReturnInt(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
public static native float invokeMethodReturnFloat(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
public static native double invokeMethodReturnDouble(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
public static native boolean invokeMethodReturnBoolean(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
public static native String invokeMethodReturnString(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
public static native JavaScriptObject invokeMethodReturnJavaScriptObject(JavaScriptObject javaScriptObject, String methodName, JavaScriptObject arrayArguments) /*-{
return javaScriptObject[methodName].apply(javaScriptObject, arrayArguments);
}-*/;
}
3. BaseJavaScriptObject
It is the base class, who can be extended by any JavaScript class. It has one protected constructor, one static method "createNew" and 6 setProperty, 6 getProperty, 6 invokeMethod. After reading the code, you can understand the 18 protected final methods provide convenience for you to access JavaScriptObject properties and methods, keep you far away from JSNI because all the JSNI methods come to one place "BaseJavaScriptObjectImpl" .
Also pay attention to the param objs of invoke methods, see this line
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
We convert Object[] to JavaScript Array which is used by apply method of js.
package org.gwtopenmaps.openlayers.client.common;
import com.google.gwt.core.client.JavaScriptObject;
public class BaseJavaScriptObject extends JavaScriptObject {
protected BaseJavaScriptObject() {}
public static BaseJavaScriptObject createNew() {
return (BaseJavaScriptObject) JavaScriptObject.createObject();
}
/*-- set ----------------------------------------------------------------------------*/
protected final void setProperty(String propertyName, int propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
protected final void setProperty(String propertyName, float propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
protected final void setProperty(String propertyName, double propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
protected final void setProperty(String propertyName, boolean propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
protected final void setProperty(String propertyName, String propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
protected final void setProperty(String propertyName, JavaScriptObject propertyValue) {
BaseJavaScriptObjectImpl.setProperty(this, propertyName, propertyValue);
}
/*-- get ----------------------------------------------------------------------------*/
protected final int getPropertyAsInt(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsInt(this, propertyName);
}
protected final float getPropertyAsFloat(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsFloat(this, propertyName);
}
protected final double getPropertyAsDouble(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsDouble(this, propertyName);
}
protected final boolean getPropertyAsBoolean(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsBoolean(this, propertyName);
}
protected final String getPropertyAsString(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsString(this, propertyName);
}
protected final JavaScriptObject getPropertyAsJavaScriptObject(String propertyName) {
return BaseJavaScriptObjectImpl.getPropertyAsJavaScriptObject(this, propertyName);
}
/*-- invoke method ----------------------------------------------------------------------------*/
protected final int invokeMethodReturnInt(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnInt(this, methodName, arrayArguments);
}
protected final float invokeMethodReturnFloat(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnFloat(this, methodName, arrayArguments);
}
protected final double invokeMethodReturnDouble(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnDouble(this, methodName, arrayArguments);
}
protected final boolean invokeMethodReturnBoolean(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnBoolean(this, methodName, arrayArguments);
}
protected final String invokeMethodReturnString(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnString(this, methodName, arrayArguments);
}
protected final JavaScriptObject invokeMethodReturnJavaScriptObject(String methodName, Object... objs) {
JavaScriptObject arrayArguments = JavaScriptObjectHelper.toJavaScriptArray(objs);
return BaseJavaScriptObjectImpl.invokeMethodReturnJavaScriptObject(this, methodName, arrayArguments);
}
}
4. Epilogue
Now all the JavaScript class in your js file can be make the same class in GWT by extend BaseJavaScriptObject, have fun.
Next Chapter : OpenLayers.Map