RSS Reader について

再度プロジェクトから作り直してみる

プロジェクト作成

  • File -> New -> Project 選択
  • Dynamic Web Project 選択で next
  • Project name を入力し、COnfigurations は Default Googlipse Project 選択で finish
  • File -> New -> Other 選択
  • Googlipse 内の GWT Module 選択し next
  • 上テキストボックス右にある Create... ボタンをクリック
  • Source folder には設定ズミ。Name に com.lodgon.ajax.demo1 と入力し Finish した後に Name (モジュール名??) に LodgonDemo と入力して Finish
  • これで src の中に以下のディレクトリが作成
    • com/lodgon/ajax/demo1/
    • com/lodgon/ajax/demo1/public
    • com/lodgon/ajax/demo1/client
    • com/lodgon/ajax/demo1/server
  • applicationCreator.cmd 実行
> applicationCreator.cmd -eclipse LodgonDemo2 -out d:\workspace\LodgonDemo2 -ignore com.lodgon.ajax.demo1.client.LodgonDemo
    • いくつか skip されるが ignore
  • import
    • com.lodgon.ajax.demo1 を選択し、右クリック -> import を選択
    • General 内の File System を選択し next
    • ソースが展開されているフォルダ (この場合は com.lodgon.ajax.demo1) を選択して右側のボックスに表示されているファイルをチェック
    • 一応、Overwrite にもチェックを入れて Finish クリック
    • public、client、server についても同様の手順で import を行なう

動作確認

とりあえず、何も手を入れずに動かしてみる。
  • Run -> Run 選択
  • Gwt Application 選択し New ボタンをクリック
  • Project 右にある Browse ボタンをクリックし、プロジェクト選択
  • Module も上記と同様に選択し、Run ボタンをクリック

ダイアログのメセジは以下

Failed to load module 'com.lodgon.ajax.demo1.LodgonDemo'. Please see the log in the development shell for details.

Development Shell のメセジは以下

  • Use of deprecated hosted mode servlet path mapping
    • The client code is invoking the servlet with a URL that is not module-relative: /ajax/blogservice
    • Prepend GWT.getModuleBaseURL() to the URL in client code to create a module-relative URL: /com.lodgon.ajax.demo1.LodgonDemo/ajax/blogservice
    • Using module-relative URLs ensures correct URL-independent behavior in external servlet containers
  • Unable to load module entry point class com.lodgon.ajax.demo1.client.LodgonDemo
  • Failure to load module 'com.lodgon.ajax.demo1.LodgonDemo'

ちなみに Console でもソレなメセジ (例外検出) が出力されている。が、getPostings メソドは終了、な println な出力もあり。前回エントリな原因で例外処理をしているが、endElement で例外を throw してないから printStackTrace が出てるだけ、と見てよいかな。メセジは以下 (先頭のみ)

java.text.ParseException: Unparseable date: "i-merge.net's Brandbreeding Blog"

パーザの修正

上記の Development Shell のメセジによれば、GWT.getModuleBaseURL メソドの呼び出しのあたりも要修正かとは思うが、とりあえずパーザを修正してみる (簡単なんで ...
修正点は

  • startElement メソドにおいて、inContent を true にするのは this.target が null でない状態、かつ qName が "content" 又は "description" の場合とする
  • クラス変数 sdf は "EEE, d MMMM yyyy HH:mm:ss Z, new Locale("en")" で初期化

で、再度実行。ダイアログは同じメセジが出力された。Development Shell 上でも同様のメセジが出力されている (当たり前
getPosting 自体は正常に終了している模様。Console なメセジを見るに、server/BlogServiceImpl.java の getCategories メソドも呼び出されている様子。各メソドの先頭に println が仕込んであるようなので出力メセジとメソドを列挙しとく。

  • get category (client/CategoryWidget.java)
  • BS called (server/BlogServiceImpl.javaコンストラクタ)
  • gd called (server/BlogServiceImpl.java の getData メソド)
  • categories asked (server/BlogServiceImpl.java の getCategories メソド)

クライアント側

上記の出力メセジを見るに動作が微妙そげ。(どこ弁だ
とゆーのも client 側のメソドにも、そこかしこに println が仕込んであるんだけれど、それらが全て出力されていないんだよねぇ。(基本的に Development Shell でもダイアログボックスでも異常を検出したメセジが出ている以上は正常動作していないと見るのが当たり前なんですが)
呼び出し階層と出力されるべきメセジを以下に列挙してみます。

  • onModuleLoad#LodgonDemo
    • CategoryWidget.CategoryWidget
      • CategoryWidget#getCategory (ここで "get category" が出力され、エントリポイントを設定している)
      • ちなみに "get category" が出力された後に getPostings メソドが呼び出されている模様
      • その後、クライアント側から blogService.getCategories していてメセジも出力されている。"categories asked" なメセジ出力がこれにあたるの? 順番微妙やっさ。
    • PostingsWidget.PostingsWidget
      • PostingsWidget#getEntries (ここで "get entries" が出力され、ここでもエントリポイントが設定されている)
    • ContentWidget.ContentWidget
      • ContentWidget#setHTML (ここで "set html to ほにゃらら" が出力される)

で、結局出力されているのは BlogServiceImpl#getCategory 処理開始直後のメセジ (categories asked) まで。PostingsWidget のコンストラクタで呼び出されているナニからのメセジは出力されていないな。

微妙な点が二点

  • エントリポイントが複数
  • クライアントから直接のサーバ側メソド呼び出しはセイフ?? (直接ではないか

ちょっと調べてみます。

記録すんのかったりぃ

動かぬ。
いくつかググッてみたら微妙なナニを発見。
http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/a04970eb58d68d20
にて GWT Engineer を名乗る方が race condition によるものだと思われるため、ブラウザの refresh を何度か (以下略) なリプライをされている。無駄と思いつつトライしてみたが駄目。しかもこの投稿自体が今年の 5 月頃だし。
別なトコ経由で hosted mode だったらクラスパスがナニ、というものも発見。
http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.Fundamentals.HostedMode.html

むむ、と思いつつも @IT のサンプルはこんなコトしねぇでも動いてるんだよねぇ。って投入ズミのエントリをチェキ入れてみると @IT なサンプルは tomcat 上で正常動作してないんだな、これが。tomcat にデプロイしてあるヤツにアクセスしてみたら Serialization (以下略) だって。

まだマトモに動作するナニに出会っていない、というのが現状ですか??

あ、ちなみに上記にて 2 点の微妙なポイントを列挙しておりますが、以下のような対応を行ない、挙動は変化せず (あ、Use of deprecated hosted mode servlet path mapping なメセジは解決してます)。

  • CategoryWidget.java および PostingWidget.java におけるエントリポイントな準備処理は LodgonDemo.java の onModuleLoad メソドに集約。
  • CategoryWidget.java における BlogServiceAsync#getCategories メソドやら PostingWidget.jara における BlogServiceAsync#getEntries メソドの呼び出しは LodgonDemo に private な BlogServiceAsync の参照と getter を作成して対処 (CategoryWidget やら PostingWidget に LodgonDemo オブジェクトの参照をクラス変数として保持していたので助かり)。

な、長いな。説明文が冗長だな。でも動いてないんだな。

GWT の 1.3 がリリースされるまで待った方が良いかも。いちおう Web サービスとしての i/f は検討するってコトで (って駄目??