Chapter 1: The common package

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:

  1. JavaScriptObjectHelper
  2. BaseJavaScriptObjectImpl
  3. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值