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 をリリースしておきます。

DBFluteでnot like

not like って、あまり機会がないのかもしれないけど、これが必要になって、ちょっと調べる。DBFlute を確認したけど、like を not like にするようなオプションも見当たらない気がしたので、not like の ConditionKey を追加して対応した。やったことは、

ConditionKeyNotLikeSearch の作成

~/allcommon/cbean/ckey/ConditionKeyLikeSearch.java を ConditionKeyNotLikeSearch.java としてコピーして、_operand を not like にしておく。

ConditionKeyNotLikeSearchを追加

以下みたいな感じで、AbstractConditionQuery と ConditionKey を変更しておく。

--- ~/allcommon/cbean/AbstractConditionQuery.java
+++ ~/allcommon/cbean/AbstractConditionQuery.java
protected static final ConditionKey CK_LS = ConditionKey.CK_LIKE_SEARCH;
+    protected static final ConditionKey CK_NLS = ConditionKey.CK_NOT_LIKE_SEARCH;
+
protected static final ConditionKey CK_INS = ConditionKey.CK_IN_SCOPE;
protected static final ConditionKey CK_NINS = ConditionKey.CK_NOT_IN_SCOPE;
--- ~/allcommon/cbean/ckey/ConditionKey.java
+++ ~/allcommon/cbean/ckey/ConditionKey.java
/** The condition key of likeSearch. */
public static final ConditionKey CK_LIKE_SEARCH = new ConditionKeyLikeSearch();
+    /** The condition key of notLikeSearch. */
+    public static final ConditionKey CK_NOT_LIKE_SEARCH = new ConditionKeyNotLikeSearch();
+
/** The condition key of inScope. */
public static final ConditionKey CK_IN_SCOPE = new ConditionKeyInScope();

~CQ にメソッド追加

あとは、not like をしたいカラムでできるようにメソッドを追加しておく。以下みたいな感じ。

--- ~/cbean/cq/bs/AbstractBs~CQ.java
+++ ~/cbean/cq/bs/AbstractBs~CQ.java
"content", "Content", "content", likeSearchOption);
}
+    public void setContent_NotLikeSearch(
+            String content,
+            ~.allcommon.cbean.coption.LikeSearchOption likeSearchOption) {
+        registerLikeSearchQuery(CK_NLS, fRES(content), getCValueContent(),
+                "content", "Content", "content", likeSearchOption);
+    }
+
/**
* InScope(in ('a', 'b')). And NullOrEmptyIgnored,
* NullOrEmptyElementIgnored, SeveralRegistered.

あとは、like と同様にやれば良いのではないかな(いろんなLikeSearchOptionで実験とかはしてない)。

SAStrutsベースのポートレット開発

OSC で使った Flash デモを再編集しました。公開するまでに時間がかかったのですが、OSC で使ったやつがVMWare上で作っていたのですけど、先週、そのイメージが壊れてデータを失い、ゼロから作りなおしてました・・・。という感じで作りなおして、コメントなども入れておきました。興味がありましたら、どうそ(Flashが表示されるまでがちょっと重いかも)。

http://labs.n2sm.co.jp/?p=108