tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発で、Eventを使う方法(Annotation Based)

ConfluenceのPluginでEventをあれこれする方法です。参考文献はこの辺りで。

Annotation Basedの方が新しくて良いようだ。ので、以下Annotation Basedの方法で。なので上記の参考文献で読んだのは上の2つだけ。
まだコードを書いてないのですが、とりあえずまとめ。

Listenerを登録する方法

atlassian-plugins.xmlコンポーネントとして登録する
    <component
        key="foo-listener"
        class="com.example.confluence.plugin.FooListener" />

として登録。

実際のクラスを書く

  • 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));
@deprecatedなEvent発火方法

ソース読んでて何を発火させているかを知りたい場合の為にこの方法も。
サンプルにしたのは
confluence-core/confluence/src/java/com/atlassian/confluence/labels/DefaultLabelManager.java

import com.atlassian.event.EventManager;
EventManager eventManager;
eventManager.publishEvent(new LabelCreateEvent(label));

Eventの注意

  1. EventはListenerで削除することはできない
  2. ListenerでEventを発生させてしまうと無限ループになる可能性がある。