ポートレットの開発環境

現在、VFSポートレットをFaces Dev フィルタを利用した開発スタイルを適用中。Faces Dev フィルタを使うと何がいいのかというと、ポートレットだけど、サーブレットとして、開発することができる(開発中のアプリケーション内にポートレットAPI固有のクラス・メソッドを呼び出したとしても、Faces Dev フィルタがエミュレートしてくれます。つまり、Faces Dev フィルタがポータルサーバーっぽく動いてくれる)。さらに、Seasar の HotDeploy を適用して、スムーズな開発が行えます。

現状のVFSポートレットについて、説明しておくと、Teeda ベースの普通の JSF なポートレットです(Teeda Extension は利用していません)。Teeda ベースのポートレットを作るときは、今までは、ポータルサーバー上において、動作確認していました(動作確認するのに時間がかかっていました・・・)。しかし、Faces Dev フィルタを適用することで、Teeda ベースのポートレットをサーブレットとして、起動することで、Eclipse 上から Tomcat に配備して、サーブレットの開発と同様に、ポータルサーバーを介さずに、そのポートレットにアクセスすることができるようになりました。しかも、Seasar の Hotdeploy を適用しておけば、Eclipse 上でソースコード上に変更を加えて、保存すれば、Tomcat を再起動することなしに、反映されます。これで、かなりスムーズな開発ができるようになりました 🙂

参考までに、現状の VFS ポートレットのコードは

http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/pal/vfs-portlets/

にあります。チェックアウトしても、そこにある状態は、Faces Dev フィルタは無効になっています。

ant servlet

と実行することで、Faces Dev フィルタが有効になります。この有効にすることで、サーブレットしてアクセスすることが可能になるので、Eclipse 上から Hotdeployを使って、スムーズな開発ができるでしょう。っで、実際にポートレットして、ポータルサーバーに配備するときには、Faces Dev フィルタが有効になっている状態でwarを作っても、ポータルサーバー上では動作しないので(Faces Devフィルタが提供するポートレットAPIと衝突を起こすので)、

ant portlet

を実行して、Faces Dev フィルタを無効にします。これで、ポータルサーバーにポートレットして、配備することができます。

という感じで、開発するときには、Faces Dev フィルタを有効にして、開発を進め、実際にポータルサーバーに配備するときになったら、Faces Dev フィルタを無効にして、利用するという感じでしょうか。

Feature ’http://apache.org/xml/features/xinclude’ is not recognized.

PALポータルのナイトリーで、Teedaなポートレットが~/xinclude問題で起動できなかったのだが、原因は、Tomcat の compat を入れることから来るみたい。というわけで、PALポータルからは、Tomcat の compat を抜くことにした。

でも、書いていて思ったのだが、これだと、普通の J2 のバイナリを持ってきた環境では動かんと言うことだよな・・・。ということは、PALポータルで対応するのではなくて、各ポートレットで対応する必要があると言うことに・・・。明示的に pom.xml で xercesImpl-2.6.2.jar を指定すれば解決するのかな・・・。

Teeda for Portlet

デフォルトの StateManager で、ポートレットのときはどう保存するのがいいか考える。

  • viewId+namespace にして、保存
  • viewId+namespace にして、WeakMap を使って保存
  • viewId+namespace にして、SoftReference とか使って何とかする
  • viewId+namespace にして、LruMap みたいなものを使って保存
  • stateをリストアするときに clientId を消す
  • セッションに保存

などを検討してみる。1番目のはメモリを食いつぶすだろうし、2、3番目のはいろいろとやらないと、いけなそうだし。4番目のも、長い間使っていない古いものを消すと言うより、使ってないものを消して欲しい。5番目のもこのためだけに、そこいらをいじると良くないと思うし、予期しない問題が起こる気がする。という感じで、検討した結果、ポートレットのときは単純にセッションに保存を採用した。