2009年2月5日木曜日

GWT + Twitter の 例(?)

Twitterへのリクエストとその戻り値(JSONオブジェクトの配列)を処理.
参考:Using GWT for JSON Mashups

Java Native Interface(JNI)を利用したJavascript直接記述部がポイントでしょうか♪.

pg/net/y30/client/TwitterFactory.java
 protected HashMap<Integer, Object> callbacks = new HashMap<Integer, Object>();
protected HashMap<String, Element> scriptTags = new HashMap<String, Element>();

public void requestTwitter(String name, int count) {
String gdata = "http://twitter.com/statuses/user_timeline/" + name
+ ".json?count=" + count + "&callback=";
String callbackName = reserveCallback();
setup(this, callbackName);
addScript(callbackName, gdata + callbackName);
}

public native static void setup(TwitterFactory g, String callback)
/*-{
$wnd[callback] = function(someData) {
g.@pg.net.y30.client.TwitterFactory::handle(Lcom/google/gwt/core/client/JavaScriptObject;)(someData);
}
}-*/;

public String reserveCallback() {
while (true) {
if (!callbacks.containsKey(new Integer(curIndex))) {
callbacks.put(new Integer(curIndex), null);
return "myCallBack" + curIndex++;
}
}
}

public void addScript(String uniqueId, String url) {
Element e = DOM.createElement("script");
DOM.setElementProperty(e, "language", "JavaScript");
DOM.setElementProperty(e, "src", url);
scriptTags.put(uniqueId, e);
DOM.appendChild(RootPanel.get().getElement(), e);
}

public void handle(JavaScriptObject jso) {
JSONObject json = new JSONObject(jso); // This is an array of twitter's json objects.
JSONValue val;
int i = 0;
while ((val = json.get((new Integer(i++)).toString())) != null) {
JSONObject obj = val.isObject(); // This is a twitter's json object.
Window.alert(obj.toString());
}
}

requestTwitter
スタート♪.urlを作成後,callback関数を用意して関数を用意して, script要素でtwitterへjsonを要求.
setup
reserveCallbackで作成したcallback関数(名)をjavascriptの関数として登録.
reserveCallback
ユニークなcallback関数名を作成.(ユニークでなくてはいけないのかしら?)
addScript
callback関数の形でjsonオブジェクトを返してもらうリクエストをscript要素として追加する.
handle
callback関数の処理の実態.setupの中で記述してあるのは(赤色)これ.


GWTFusenで利用しています.

0 件のコメント: