BuriActivitySelectorの動作とAPIについて
#ほとんど、id:makotanさんへの業務連絡なエントリです。
まくら
Baoメソッドの_ACTIVITYアノテーションの値とか、データが現在とどまっているアクティビティ(ステータス)とか、ロール(Participant)とかを元に、今の処理で実行対象とすべきアクティビティを選択/限定していくのがBuriActivitySelectorの役目なわけで。
問題&対処方法(暫定)
で、本題ですが、ParticipantBuriActivitySelectorが(私の)期待する動作をしてくれません。
事象としては以下の通り。
ParticipantBuriActivitySelector#getActivityList()で権限のあるアクティビティだけに絞り込んだ結果を返しているが、それをBuriActivitySelector#select()で activitys.addAll(acts) としてそれまでのアクティビティセットにORマージしてるので、結果的に絞り込まれない。
他のSelectorだと、getActivityList()側で第1引数のactivitiesを使って activities.clear()することで大本のSetを空にしてから返しているので、うまいこといっているようです。
つまり、ParticipantBuriActivitySelector#getActivityList()でも同じようにreturn前に activities.clear() の1行を追加すれば修正されると思います。
で、実験したところ実際に期待通りになりました。
これで一安心。
考え方に問題がなければ、これをコミットしたいと思いますがいかがでしょうか?>id:makotanさん
実は、もう一つ対処案があるので、↓もご検討いただけると幸いです。
対処方法(案)
Selectorが結局フィルタのように働くわけですよね。
入力:(先に実行されたSelectorによって返された結果の)アクティビティセット
出力:自前のルールに則って決定したアクティビティセット
で、あるSelectorが結果として返したアクティビティセットというのは、それ自体が最終的な結果になるべきセットなのではないかと思いました。
つまり何が言いたいかというと、
BuriActivitySelector#select()側では毎回getActivityList()が返した結果でactivitiesを差し替える
(現状はSelector実装側が必要に応じて第1引数のSetをclear()する作りになっている)
という実装がいいのではないかと。
または、逆に、
BuriActivitySelector#select()側からgeActivityList()にアクティビティセットのインスタンスを渡すから、後は参照経由で自由にセット内容を書き換えてもらう。
(現状は戻り値でListを返してもらって適用はselect()側の責務になっている)
としてしまうとか。後者の場合、メソッド名もgetActivityList() → applyRule()みたいにしてしまうとよりわかりやすいかと思います。
後者の場合、ソースはこんな感じになります。
public abstract class AbstractBuriActivitySelector implements BuriActivitySelector { public int select(Set activitys, BuriSystemContext systemContext,BuriExecProcess execProcess) { if( ! checkCanActivitySelect(activitys, systemContext,execProcess)) { return SELECT_NEXT; } applyRule(activitys, systemContext,execProcess); return getDefaultResultType(); } protected int getDefaultResultType() { return SELECT_NEXT; } protected abstract void applyRule(Set activitys, BuriSystemContext systemContext,BuriExecProcess execProcess); protected abstract boolean checkCanActivitySelect(Set activitys, BuriSystemContext systemContext,BuriExecProcess execProcess); }
いかがでしょうか?