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"); }
と等価である。