Hi all. I'm porting some javascript libraries to GWT and in this thread I 
hope I can share and learn best ways of accessing Js native arrays from 
java language. 

I try to add the minimun overhead so I'm using GWT's JsArray, JsArrayMixed, 
JsArrayString, etc for referencing arrays whenever I can. But this is not 
so friendly for a Java programmer accustomed to work with real java arryas 
(String[]) or with java.util.Collection API. 

The first thing I thought of was convert js arrays to Java arrays. 
Unfortunately i didn't found a way of doing this without (linear overhead); 

public static JsArrayNumber toJsArrayDouble(double[]a) {
    if(a==null)
        return null;
    JsArrayNumber jsa = (JsArrayNumber) JsArrayNumber.createArray();
    for (int i = 0; i < a.length; i++) {
        jsa.push(a[i]);
    }
    return jsa;
}

Now I'm experimenting on wrapping a Js Array into a java Collection. For 
this I made a simple Java class that extends java.util.AbstractCollection 
[0] and wrapps a pure js array. So from jsni code now I can return Java 
Collections instead JsArray like types and the final user of my libs can 
write java statements like for(String s : myOverlay.getArrayProp()) {..}.  

Also this solution adds very few (constant) overhead. So now I'm using two 
getters for js arrays, one that return the real js array object using GWT's 
JsArray* and other that return a Java Collection: 

/**
 * Returns 'columns' property (JavaScript array)
 * @return
 */
public native final JsArrayString columns() /*-{
    return this["columns"]; 
}-*/;
/**
 * Returns 'columns' property (Java Collection)
 * @return
 */
public native final Collection<String> getColumns() /*-{    
    return 
@org.sgx.test1.client.JsUtil::toJavaCollection(Lcom/google/gwt/core/client/JavaScriptObject;)(this["columns"]);
 

}-*/;


I would like to hear what others in the same situation do. Use JsArray* 
GWT's classes vs more Java friendly API ???  Thanks in advance any 
suggestion or comment is most appreciated. 



[0] - Source code for my Java Collection class wrapper 


import java.util.AbstractCollection;
import java.util.Iterator;
import com.google.gwt.core.client.JavaScriptObject;

/**
 * a Java Friendly way of working with Js Arrays using the 
Java.util.Collection API
 * @author sg
 *
 * @param <T>
 */
public class JsArrayCollection<T> extends  AbstractCollection<T> {

    private JsArr<T> _data; 
    /**
     * creates an empty array
     */
    public JsArrayCollection() {
        _data = JsArr.create().cast(); 
    }
    /**
     * creates JsArrayCollection wrapping an existing js array
     */
    public JsArrayCollection(JavaScriptObject data) {
        this._data = data.cast(); 
    }
    public static <T> JsArrayCollection<T> create(JavaScriptObject data) {
        return new JsArrayCollection<T>(data); 
    }


@Override
public Iterator<T> iterator() {
    return new JsArrayIterator<T>(this); 
}

@Override
public int size() {
    return _data.size(); 
}


public static class JsArrayIterator<T> implements Iterator<T> {

    private JsArrayCollection<T> arr;
    int currentIndex; 
    public JsArrayIterator(JsArrayCollection<T> arr) {
        this.arr = arr; 
        currentIndex=0; 
    }
    
    @Override
    public boolean hasNext() {
//        System.out.println(currentIndex+" - "+arr.size());
        return currentIndex < arr.size(); 
    }

    @Override
    public T next() {
        currentIndex++;
        return arr._data.get(currentIndex-1); 
    }

    @Override
    public void remove() {
        arr._data.slice(currentIndex-1, currentIndex); 
    }
    
}

/** untyped array */
private static class JsArr<T> extends JavaScriptObject {
protected JsArr(){}
public native final JsArr<T> slice(int start, int end)/*-{
    return this.slice(start, end); 
}-*/;
public static final native <T> JsArr<T> create() /*-{
    return []; 
}-*/;
public final native int size() /*-{
    return this.length; 
}-*/;
public final native T get(int i) /*-{
return this[i]; 
}-*/;
}


}

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-web-toolkit/-/DbMp1hrjhVUJ.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to