tohokuaikiのチラシの裏

技術的ネタとか。

ConfluenceのプラグインでXWork/WebWork2の仕組みを使ってプログラムを書く

純粋に情報を表示させるだけの目的であれば、servletプラグインだけで十分だがフォームを使ってデータの入出力をさせる場合はWebフレームワークを使わないといろいろと面倒で仕方がない。

Confluence(というかAtlassianApplication群?)では、XWork/WebWorks2を使ったプラグインが書ける。

チュートリアルに従って進めてみる。
XWork-WebWork Module - Confluence Development - Atlassian Developer Documentation

atlassian-plugin.xmlXWorkの定義を書く

    <xwork name="livesearchaction" key="livesearchaction">
        <package name="livesearch" extends="default" namespace="/plugins/livesearch">
            <default-interceptor-ref name="defaultStack" />
 
            <action name="livesearch"
                class="com.atlassian.confluence.extra.livesearch.LiveSearchAction">
                <result name="success" type="velocity">/templates/extra/livesearch/livesearchaction.vm</result>
            </action>
        </package>
    </xwork>
  1. XWorkJavaのclassを指定しない(actionにclassを指定する)
  2. 1つのXWorkにパッケージ(package)はいくつも指定できる
  3. 要素は、1行のスペース無しの行にすること。

Actionの記述

XWorkのActionは com.opensymphony.xwork.Action をimplementしなければいけないが、Confluenceのプラグインの場合、ConfluenceActionSupportを継承したものにすると色々とヘルパーメソッドが使えて便利である。

また、他のActionも色々とConfluence自体に存在しているが、それらはちょっと複雑に入り組みすぎていてを継承するのは難しいので、ConfluenceActionSupportを使った方が良い。

Actionへのアクセス方法

atlassian-plugin.xmlxwork/package@namespaceで決めるらしい。上記の場合だと
http://confluence.example.com/plugins/livesearch.action
となる。

この場合、

Velocityテンプレートの指定

上記の例だと、
/src/resources/templates/extra/livesearch/livesearchaction.vm
に設置するということになる。

Actionクラスの設定

上記の例だと、
com.atlassian.confluence.extra.livesearch.LiveSearchActionクラスを作る。
/src/main/java/com/atlassian/confluence/extra/livesearch/LiveSearchAction.java

package com.atlassian.confluence.extra.livesearch;

import com.atlassian.confluence.core.ConfluenceActionSupport;

/**
 * Actionを作ってみるサンプル
 * @author Takashi
 */
public class LivesearchAction extends ConfluenceActionSupport{
}

を作るだけでOK。とりあえずこれで指定のURLにアクセスすると、先ほどのテンプレートを表示されるようになる。
Velocityで使用できるConfluenceから与えられている変数などは
Confluence Objects Accessible From Velocity - Confluence Development - Atlassian Developer Documentation
を確認

注意事項など

  • ConfluenceActionSupportを継承してConfluenceのパッケージを拡張した形でActionを作成すること
  • Action-Packageのネームスペースは自由に決めて良いが、なるべくユニークになるようにすることと、「servlet」は他のサーブレットとぶつかってしまうので使ってはいけない。
  • ViewはVelocityテンプレートのみである。
  • このActionは既にConfluenceのSpringコンポーネントを使える状態になっている。スペース情報やページ情報などのメンバが揃っている。使えるメンバについては、Accessing Confluence Components from Plugin Modules - Confluence Development - Atlassian Developer Documentationを参照
  • packageのnamespaceが/adminから始まる場合は、自動的に管理者かどうかをチェックするようになっている。この機構はservletやRESTによる提供では存在していない。/adminでかつ一般ユーザーにもアクセスさせたい場合は、WebSudoNotRequiredアノテーションを使うこと。アノテーションはどうやって使っていいかはまだわからない・・・。単純に
@WebSudoNotRequired
public class LivesearchAction extends ConfluenceActionSupport {

    /**
     *
     * @return @throws Exception
     */
    @WebSudoNotRequired
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

とかかなぁと思ったけど、これだとダメみたい。