tohokuaikiのチラシの裏

技術的ネタとか。

ConfluenceのPlugin作成で一時データを取っておきたいときの方法 - ContentPropertyManagerとBandanaManager

Confluenceでデータを取っておきたい方法について。

2つある。ContentPropertyManagerとBandanaManager。*1
参考ページ
Persistence in Confluence - Atlassian Developers
Developing a Confluence Plugin « Luminis Software Development

基本的にどちらも、Key-Value式の保存である。

ContentPropertyManager

ページに対してデータを紐づけたいときに使う。
したがって、Pageオブジェクト(あるいは、ContentEntityObject)が必要になってくる。

値を保存
ContentPropertyManager cm;
Page page;
cm.setStringProperty(page, "保存したいキー", "保存したい値");
値を取得
ContentPropertyManager cm;
Page page;
String st = cm.getStringProperty(page, "保存したいキー");

となる。保存できるのはStringのみ。

BandanaManager

Confluenceにグローバル的に使いたい場合はこちらを使う。

ただし、グローバルに使うだけあって単純なキー・バリューではなくて、2段階の配列になっている。PHPでいうと、

<?php
$bandanaManagerSettings = array(
    'person' => array(
        'name' => 'foo',
        'url'  => 'http://www.example.com',
        'desc' => 'sample1',
        'sex' => 'male',
        ),
    'address' => array(
        'city' => 'Tokyo Shinjuku',
        'tel' => '03-xxxx-xxxx',
        'fax' => '04-xxxx-xxxx',
        'email' => 'itoh@example.com',
        ),
    );

といった感じで、itoh@examle.comを取ろうとすると、

BandanaManager bm;
Object email = bm.getValue(new ConfluenceBandanaContext("person"), "address");

となる。

値をセットする時は、

BandanaManager bm;
bm.setValue(new ConfluenceBandanaContext("person"), "address", "itoh@example.com");

となる。

ちなみに、これらの第一引数のConfluenceBanadanContextのコンストラクタ第一引数は無くてもいい。この場合は、グローバルな領域に第二引数の値が設定されたものとされる。グローバルというかfallback的なものかしら・・・。

更に、ConfluenceBanadanContextのソースコードを見てみるともともとBandanaContextはスペース毎の設定値を取っておくように考えられていたのか、コンストラクタ第一引数の変数名はspaceKeyになっている。そのため、第一引数にはSpaceオブジェクトも取れるようになっている*2。恐らく、最初はそのように使っていて途中から「あれ?これスペースキー入れるんなら普遍的に使えるじゃん」という感じになっていったのではないだろうか。

BandanaManager.getValue()の第三引数

この第三引数をtrueあるいは省略すると、第二引数のキーが無かった場合、グローバルなConfluenceBanadanContextで同じキーが無いか探す。

つまり、

Object email = bm.getValue(new ConfluenceBandanaContext("person"), "address");

のコードは、

Object email = bm.getValue(new ConfluenceBandanaContext("person"), "address", false);
if (email == null){
    email = bm.getValue(new ConfluenceBandanaContext(), "address");
}

と等価である。

*1:これらのManagerObjectをどうやって取るかは、別途ページを参照してもらうとして・・・・。

*2:結局スペースキーが入る