execute を解析してみる
JavaScript×HTMLとJavaのシームレスな開発環境を体験してみようのサンプルソースを見てみる。
チェキ入れるのは GWT サーバの execute メソド。以下、コードのみ。
src/jp/littlesoft/gwttest1/server/ImageSearchServiceImpl.java
public ImageSearchResultSet execute(int start, int size, String keyword) throws Exception { String requestParam = "http://api.search.yahoo.co.jp/ImageSearchService/V1/imageSearch" + "?appid=Search001" + "&query=" + java.net.URLEncoder.encode("\"" + keyword + "\"", "UTF-8") + "&start=" + start + "&results=" + size; ImageSearchResultSet resultSet = new ImageSearchResultSet(); java.net.URL url = new java.net.URL(requestParam); java.net.HttpURLConnection urlCon = (java.net.HttpURLConnection)url.openConnection(); try { org.xml.sax.InputSource ins = new org.xml.sax.InputSource(urlCon.getInputStream()); javax.xml.parsers.SAXParserFactory fact = javax.xml.parsers.SAXParserFactory.newInstance(); javax.xml.parsers.SAXParser parser = fact.newSAXParser(); YahooImageSearchResultHandler handler = new YahooImageSearchResultHandler(resultSet); parser.parse(ins, handler); } finally { urlCon.getInputStream().close(); urlCon.disconnect(); } return resultSet; }
最初の 8 行 (try の前まで) が Web サービスに request を送信する部分で、それ以降がレスポンスを受け取り、検索結果セットに値を設定して返却している処理になっている (はず)。
基本的には
- org.xml.sax.InputSource オブジェクトの生成 (ins で参照)
- javax.xml.parsers.SAXParser オブジェクトの生成 (parser で参照)
- YahooImageSearchResultHandler オブジェクトの生成 (handler で参照)
- コンストラクタに検索結果セットを渡す必要あり
な準備をしておいて parser.parse(ins, handler) ですか。
で、sun なソレから調べてみた所、javax.xml.parsers.SAXParser#parse のプロトタイプは
void parse(File f, DefaultHandler dh)
となっており、機能としては
との事。(Sun の SAXParser のドキュメントより引用)
成程。YahooImageSearchResultHandler は DefaultHandler を継承しとりますな。このクラスで定義されているメソドは以下。
- characters メソド
- startElement メソド
- endElement メソド
- setValue メソド
DefaultHandler クラスのドキュメントを見てみると setValue が無いが、よくよく見てみると endElement で呼び出されておりますな。(参考にしているドキュメントがいずれも 1.4 なあたり、微妙かも)
ドキュメントから継承したメソドの説明を引用しておく
DefaultHandler#characters
デフォルトでは何も行いません。アプリケーションの作成者は、このメソッドをオーバーライドして、各文字データチャンクに対して特殊なアクション (ノードまたはバッファへのデータの追加、データのファイルへの出力など) を実行することができます。
DefaultHandler クラスのドキュメントより引用
DefaultCharacter#startElement
要素の開始通知を受け取ります。
デフォルトでは何も行いません。アプリケーションの作成者は、サブクラス内でこのメソッドをオーバーライドして、各要素の先頭で特殊なアクション (新しいツリーノードの割り当て、出力内容のファイルへの書き込みなど) を実行することができます。
DefaultHandler クラスのドキュメントより引用
DefaultCharacter#endElement
要素の終了通知を受け取ります。
デフォルトでは何も行いません。アプリケーションの作成者は、サブクラス内でこのメソッドをオーバーライドして、各要素の終わりで特殊なアクション (ツリーノードのファイナライズ、出力内容のファイルへの書き込みなど) を実行することができます。
DefaultHandler クラスのドキュメントより引用
成程ね。rails でカスタムな XML を返却する Web サービスからの responce を処理するにあたってはここらへんのモディファイが必要になってくる訳ですな。この execute は REST な形であればリクエストパラメータと DefaultHandler を継承したクラスを変更すれば流用がキキそう。
ここの例における YahooImageSearchResultHandler の中身も見てみましたが、理解不能な処理はしておりません。さしあたってのハードルとしては
ッスか。微妙だなぁ。作業多スギ。
とりあえず tomcat な環境を作って eclipse で作った war をコピって動くかどうか、ですか??
# なんか違うような気もするがヤッてみないと分からん。