ConfluenceのプラグインでXWork/WebWork2の仕組みを使ってプログラムを書く
純粋に情報を表示させるだけの目的であれば、servletプラグインだけで十分だがフォームを使ってデータの入出力をさせる場合はWebフレームワークを使わないといろいろと面倒で仕方がない。
Confluence(というかAtlassianApplication群?)では、XWork/WebWorks2を使ったプラグインが書ける。
チュートリアルに従って進めてみる。
XWork-WebWork Module - Confluence Development - Atlassian Developer Documentation
atlassian-plugin.xml にXWorkの定義を書く
<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>
Actionの記述
XWorkのActionは com.opensymphony.xwork.Action をimplementしなければいけないが、Confluenceのプラグインの場合、ConfluenceActionSupportを継承したものにすると色々とヘルパーメソッドが使えて便利である。
また、他のActionも色々とConfluence自体に存在しているが、それらはちょっと複雑に入り組みすぎていてを継承するのは難しいので、ConfluenceActionSupportを使った方が良い。
Actionへのアクセス方法
atlassian-plugin.xmlのxwork/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; } }
とかかなぁと思ったけど、これだとダメみたい。