ConfluenceのPluginでEventをあれこれする方法です。参考文献はこの辺りで。
Annotation Basedの方が新しくて良いようだ。ので、以下Annotation Basedの方法で。なので上記の参考文献で読んだのは上の2つだけ。
まだコードを書いてないのですが、とりあえずまとめ。
Listenerを登録する方法
実際のクラスを書く
- Listenerにするメソッドは、受けるEventを引数にする+@EventLisnterアノテーションを付ける
- コンストラクタで各種マネージャを受け取る。とりあえず、受け取れるのを確認できたのは下記であるが、第一引数にはEventPublisherを付けておかなければならないみたい。
- EventPublisher
- ContentPropertyManager
- PageManager
- UserAccessor
- BandanaManager
なので、LoginEventをキャッチするListenerは
public class FooListener implements DisposableBean { /** * イベントパブリッシャ */ protected EventPublisher eventPublisher; /** * コンストラクタ */ public FooListener(EventPublisher eventPublisher, ContentPropertyManager contentPropertyManager, PageManager pageManager, UserAccessor userAccessor, BandanaManager bandanaManager) { } /** * イベントリスナー * @param event ログインイベント */ @EventListener public void loginLister(LoginEvent event) { } @Override public void destroy() throws Exception { this.eventPublisher.unregister(this); } }
Eventを発生させる方法
ソースを見るとConfluenceEventManagerを使う方法とConfluenceEventPublisherManagerを使う方法がある。ConfluenceEventManagerは@Deprecatedだったので、ConfluenceEventPublisherManagerを使う。
サンプルは、LoginEvent。
Event自体の定義
confluence-core/confluence/src/java/com/atlassian/confluence/event/events/security/LoginEvent.java
ConfluenceEventを継承すること。
Eventの発火
confluence-core/confluence/src/java/com/atlassian/confluence/user/ConfluenceAuthenticator.java
をサンプルに。
import com.atlassian.spring.container.ContainerManager; ... EventPublisher eventPublisher = (EventPublisher) ContainerManager.getInstance().getContainerContext().getComponent("eventPublisher"); eventPublisher.publish(new LoginEvent(this, principal.getName(), httpServletRequest.getSession().getId(), remoteHost, remoteIP, direct ? LoginEvent.DIRECT : LoginEvent.COOKIE));
Eventの注意
- EventはListenerで削除することはできない
- ListenerでEventを発生させてしまうと無限ループになる可能性がある。