tohokuaikiのチラシの裏

技術的ネタとか。

ConfluenceのPluginSDKを使ってて困ったことなどメモ

atlas-run で開発環境Confluenceが起動しない

起動したかに見えて、
com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NullPointerException
とか言って500エラーで起動していない。

そういう時はシャットダウンして再度atlas-runnする。何故かわからないけど、5回くらいはトライしてみる価値がある。

pom.xml関連

シンボルを見つけられません。 とかorg.apache.maven.plugin.MojoExecutionException とかでる。

依存性でservletをpomに追加

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
「この文字は、エンコーディング MS932にマップできません。」とか出てコンパイルエラー

javacに-encoding UTF-8オプションを付けさせる。pom.xml

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>

のようにオプションを付ける。

やっぱしMojoが引っかかってエラー

atlas-cliで、piをしてプラグインインストールしようとすると

[INFO] Install Plugin: Uploading 'XXXXXXXX-1.0-SNAPSHOT.jar' to server via UPM: http://localhost:1990/confluence
[ERROR] Unable to complete running command: pi
java.lang.RuntimeException: org.apache.maven.plugin.MojoExecutionException: Unable to execute mojo
at org.twdata.maven.cli.commands.ExecuteGoalCommand.run(ExecuteGoalCommand.java:112)

ってエラーが出て進まない。
atlassian-plugin.xml
に日本語が入ってたのを無くしたらできた。

Confluenceのバージョンがあがらない。

pom.xml

    <properties>
        <confluence.version>5.3.1</confluence.version>
        <confluence.data.version>5.3.1</confluence.data.version>
        <amps.version>4.2.10</amps.version>
        <plugin.testrunner.version>1.1.2</plugin.testrunner.version>
        <create-content.version>1.5.25</create-content.version>
    </properties>

最新にしてもバージョンアップしない。
そんなときは、atlas-cleanコマンドで。単純にtargetフォルダを消すだけみたいなんだけどね。

やっぱりインストールできない

下記のステップでインストールしたものは状況が違うらしい。

  1. いったんインストール(成功)
  2. atlassian-plugin.xmlを書き換えてatlas-cli > pi (成功)

と、上記でいきなり書き換えたatlassian-plugin.xmlでatlas-run or atlas-cli>pi でのインストール。
後者だとダメなのも、前者だとうまく行っているように見える。

なので、piして「あれー?」って思ったら管理画面から一回プラグインを案インストールしてみるべし。

atlassian-plugin.xml のモジュールのkeyがかぶってはいけない

当たり前なんだけど、はまりました。

	<web-resource
		key="xxxxx-resources"
		name="xxxxxx Web Resources">

っていうキーがあった場合、同じキーはひとつのプラグインで使ってはいけない。

ただ、これ、既にプラグインをインストールしている状態で、追い討ちatlas-cli>piしてもエラーでない。
管理画面からプラグインをアンインストールしてからatlas-cli>piすると

[ERROR] Unable to complete running command: pi
java.lang.RuntimeException: org.apache.maven.plugin.MojoExecutionException: Unable to execute mojo
at org.twdata.maven.cli.commands.ExecuteGoalCommand.run(ExecuteGoalCommand.java:112)

って出るので注意。

というか、Mojoエラーってなんかやたら出る。何か依存性が無いとMojoエラー。atlassian-plugin.xmlでミスるとMojoエラー。なんでもかんでもMojoエラー・・・atlas-cliにはもうちょっと何とかしてほしいところ・・・。

の指定で画像を一括で

atlassia-plugin.xml

        <resource type="download" name="images/" location="images"/>

ってやると一括指定できる。name="images/"は固定表現。

エディターのボタンにフックして自分専用ボタンを作りたい

web-itemをatlassian-plugin.xmlに追加
<web-item key="唯一のキー" name="ボタン名。プラグインManagerで表示" section="表示する場所" weight="表示順">
    <label key="ボタンに表示するテキスト"/>
    <link linkId="このボタンのDOM上のID"/>
</web-item>

という感じ。
sectionがポイント。
今のところ、2つしかわかってない。

system.editor.more.formats
system.editor.featured.macros.default
tinyMCEでの動作は、
    AJS.$("#DOM上のID").click(function(){
        tinymce.activeEditor.execCommand("FormatBlock", false, "samp");
    });

Ref:tinymce.activeEditor.execCommand
ただし、これをAJS.bind('init.rte', function() {....})内でやらないとListenされないので注意。

tinyMCEでexecするコマンドは追加できて、

var ed = AJS.Rte.getEditor();
ed.addCommand('mceExample', function() {
tinyMCE.activeEditor.execCommand('mceExample');

というようにする。

Wikiマークアップを入れるボタンのJavaScriptはここに掛かれていて。
confluence-project/confluence-plugins/confluence-editor-plugins/confluence-editor/src/main/resources/tinymce3/plugins/insertwiki/editor_plugin_src.js
ここまで複雑にできるのかーと思いきや、まぁそこまで必要は無くて・・・。

単純に、Toolボタンを押したときにマクロを入れたい場合は、
confluence-project/confluence-plugins/confluence-editor-plugins/confluence-editor/src/main/resources/tinymce3/plugins/confluence/editor_plugin_src.js で「mceConfMacroBrowser」というtinymceコマンドが追加されている。

このコマンドは、

 tinymce.confluence.macrobrowser.macroBrowserToolbarButtonClicked()

へのショートカットで、パラメータとして{presetMacroName: マクロ名}を与えることでそのマクロブラウザーを開く。

 tinymce.activeEditor.execCommand("mceConfMacroBrowser", {presetMacroName:"info"});  

パラメータなしだと、普通のマクロブラウザになる。

いきなりInsertしたい場合
tinymce.confluence.MacroUtils.insertMacro({ contentId: AJS.Meta.get('content-id'), macro: {body: "",name: "info"}});

とすると、情報マクロが入る。bodyに空文字指定しているが、ここに適当な文言を入れるとそれがデフォルトで入った状態で表示される。

JavaScriptで現在のページIDを取得したい場合

AJS.Meta.get('content-id')

マクロは小文字に

今日のハマり。
ユーザーマクロは管理者画面から登録するときに大文字だと強制小文字になるけど、プラグイン登録の場合はそのままいけてしまうように「みえる」

が、マクロブラウザーで編集済みのものを開くときに「メタデータがありません」といわれる。
一見うまく行くように見えるだけに注意。