マルチスレッドレンダリングなど

PALポータルでポートレットをマルチスレッドでレンダリングするとこで、デッドロックしていたのを修正。これで、指定した時間以上かかるポートレットの表示はタイムアウトとして表示されます(ポートレットのデバッグ時にはこれだと普通にタイムアウトするので同期モードで実行する必要があるかと)。ひとまず、ポータル側の修正はこれくらいにして、こっからはグループウェア系のポートレットたちの修正に移ろうかな。とりあえず、ユーザー情報テーブルにアカウントの状態情報がなかったので、状態カラムを追加してみた。そのついでに、DBFlute も 0.8.2 を使っていたので、0.8.7 にアップグレード(全部のポートレットでテストできていないけど、たぶん大丈夫そう)。ポートレットたちの修正もたまっているので、処理していこ。

OSC

来年の 2/20 と 2/21 に OSC2009 Tokyo/Spring が開催されるそうな。2/20(金) の方は時間的に無理だと思うけど、2/21(土) の方はブース出展をしておこうかと考え中。ここでのセミナーの方は、ターゲットがちょっと異なるので、やらなくて良いかなっと思っている。というわけで、調整をしよう。

PALポータルのマルチスレッドレンダリング

PALポータルというか、Jetspeed2なのだけど、ポートレットをマルチスレッドでレンダリングする機能がある。っで、PALポータルではこれをデフォルトにしようと思っていて、いろいろと試している。ひとまず、ポータルのリクエスト属性をマルチスレッドでアクセスして Exception になる問題を直したのだけど、まだ、何かが notify されるのを wait しっぱなしになる現象がたまに見られる。ちょっと重い修正になる感じがするのだけど、こいつを直して、1 月には PALポータルをリリースしたいところ。がんばろ。

SAStruts なポートレットを Liferay と JBoss Portal で試す

Jetspeed2/PALポータルでは、メインで使っているので、SAStruts なポートレットも動くのは確実なのですけど、Liferayとかであまり試していなかったので、動かしてみました。使ったのは、Liferay 5.1.2 と JBoss Portal 2.7.0 です。

で、まず、Liferayから試したけど、普通にうごきませんね・・・。PAL の英語の ML でも動かんと突っ込まれていたけど、ほんとに動いてないみたい。確認してみると、ActionServlet が見つからんと怒られる。原因は、Liferay が配備後に、web.xml に com.liferay.portal.kernel.servlet.PortletContextListener をリスナーとして追加するのだけど、こいつが org.seasar.struts.portlet.servlet.ActionServlet より先に実行して、ポートレットを初期化するもんだから、ActionServlet が存在しないときにアクセスされて、ActionServlet がないと言われる。というわけで、これについては、ポートレットが init() で ActionServlet にアクセスするのをやめて、render() とかで必要に応じてアクセスするように SAStruts ポートレットを変更した。

あと、うちの社内テストで Liferay にポートレットを配備したときに、何かをサブミットすると動きませんみたいなことも言われていて、試したら、確かにサブミットで文句を言う。これも確認したら、サブミットした後の render あたりの処理で INCLUDE でポートレット内のサーブレットにアクセスするもんだから、PortletRequestFilter が処理してしまって、NPE になっていた。これは SAStruts ポートレットの processAction() と render() の処理時に処理中フラグを立てているのだけど、処理後に削除することで無事に解決。

次に JBoss Portal で試したら、上の問題も修正されていることもあってか、普通に動いていた。良かった。でも、SAStruts とは関係ないけど、JBoss Portal って、何か、前から進歩がないというか、使いにくいというか・・・。ポートレットのインスタンスを作るときに ID にスペースをいれたら、Exception が出て何ともできなくなり、再インストール・・・(結構、致命的な問題な気もするのだけど、これでいいものなのかね)。そんな感じで、個人的な印象は悪くなった。こんな感じのレベルだと、PAL や SAStruts ポートレットのサポート優先度は下げるべきかなっと。

SAStrutsポートレットについては、修正をコミットしたので、もうちょっとテストしたら、1.0.0-rc4 をリリースしておきます。

外部CSSファイルを後から読み込み

ポートレットの場合、ページの断片を作るから外部の CSS を読み込むのに link や style タグが使うタイミングがないのだけど、javascript でやればできるのね。ポートレットのインストール後に、css の設定を変えてください、みたいな依頼をするのもちょっとな~っと思っていたので、以下のような感じのコードで対応することにしてみた。

var cssFile="/css/pal-extension.css";
var isMSIE = /*@cc_on!@*/false;
if(isMSIE) {
document.createStyleSheet(cssFile);
} else {
var link = document.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("href", cssFile);
link.setAttribute("type", "text/css");
document.getElementsByTagName('head')[0].appendChild(link);
}