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);
}

N2 Collabo

N2 Groupware と呼んでたものだけど、グループウェア系以外にもガジェット系もあったりするので、名前が N2 Collabo となりました。物自体は、Apache ライセンスでいく予定。まぁ、PAL自体が Apache ライセンスだし。そんな感じで、公開テスト的な意味も込めて、来週あたりにリリースしたいと考える今日この頃。