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 で参照)
    • 事前準備として、javax.xml.parsers.SAXParserFactory のインスタンスを生成しておいて
    • javax.xml.parsers.SAXParserFactory#newSAXParser でオブジェクト生成
  • YahooImageSearchResultHandler オブジェクトの生成 (handler で参照)

な準備をしておいて parser.parse(ins, handler) ですか。

で、sun なソレから調べてみた所、javax.xml.parsers.SAXParser#parse のプロトタイプは

void parse(File f, DefaultHandler dh)

となっており、機能としては

指定されたファイルのコンテンツを、指定された DefaultHandler を使用して XML として構文解析します。

との事。(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 方面へのデプロイ
  • カレンダなナニとしての request - responce の仕様
  • 検索結果セットの仕様
  • DB スキーマの設計
  • UI の設計

ッスか。微妙だなぁ。作業多スギ。

とりあえず tomcat な環境を作って eclipse で作った war をコピって動くかどうか、ですか??
# なんか違うような気もするがヤッてみないと分からん。