Tracのwikiに図面を入れる(PlantUML編)

Tracのwikiに図面を入れるの続き。GraphvizやMscgenも良いけど、やっぱりUMLの図面が欲しいと思うことは多いはずだ。そこで今回はUMLの図面を入れてみる。テキストで記述したスクリプトからUMLを描くためのツールとして、PlantUMLというJavaのソフトがある。

このツールをtracから呼び出すプラグインを作ってくれた人がいた(ページの履歴を見る限り、つい最近のようだ)ので、早速テストしてみた。動作環境は前回と同じ。

PlantUML

$ sudo port install graphviz
export GRAPHVIZ_DOT=/opt/local/bin/dot
$ svn co http://trac-hacks.org/svn/tracplantumlplugin/
  • そのままインストールする。
$ sudo /opt/local/bin/python2.6 setup.py install
  • プロジェクトのconf/trac.iniに下記を追記する。
[components]
...
plantuml.* = enabled

[plantuml]
plantuml_jar = /path/to/plantuml.jar
  • wikiに下記のような記述を書いて更新すると、シーケンス図が表示される。
{{{
#!PlantUML

@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response

Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
@enduml
}}}
  • 表示例

  • ステートチャート図
{{{
#!PlantUML
@startuml

[*] --> State1
State1 --> [*]
State1 : this is a string
State1 : this is another string

State1 -> State2
State2 --> [*]

@enduml
}}}
  • 表示例

{{{
#!PlantUML

@startuml

User -> (Start)
User --> (Use the application) : A small label

:Main Admin: ---> (Use the application) : This is\nyet another\nlabel

@enduml
}}}
  • 表示例

  • クラス図
{{{
#!PlantUML
@startuml

abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection

List <|-- AbstractList
Collection <|-- AbstractCollection

Collection <|- List
AbstractCollection <|- AbstractList
AbstractList <|-- ArrayList

ArrayList : Object[] elementData
ArrayList : size()

enum TimeUnit
TimeUnit : DAYS
TimeUnit : HOURS
TimeUnit : MINUTES

@enduml
}}}
  • 表示例

MacOS X環境で動作させると、plantuml.jarが起動する毎にアプリケーションがアクティブになってしまうとか*1Javaのソフトなので起動がやや緩慢である*2とか問題は有るけれど、UMLを適切に描いてくれることは便利だ。wiki愛好家としては、手軽に画像を入れられる方法が広まるのは嬉しい。プラグインを作ってくれた方に感謝したい。



2010/4/20追記

  • tracdでは問題ないが、Apacheで動作させると下記のpermissionエラーが発生する場合(MacOS X)、plantuml.jarをヘッドレスモードで動作させる。(Windows環境では発生しない)
Error running plantuml: Tue Apr 20 19:11:30 foo.local java[21435] <Error>: kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged. Exception in thread "main" java.lang.InternalError: Can't connect to window server - not enough permissions.
  • plantuml.jar起動時にdotが見つからないというエラーが発生する場合、環境変数に指定されているdotのパスを拾えないのが原因なのでJVM起動時に明示する。(plantuml.jarのデフォルトでは/usr/bin/dotなので、MacPortsでインストールしたパス/opt/local/bin/dotを指定)

以上の変更を加えたplantuml/macro.pyはこんな感じ。このプラグインをインストールすれば良い。

cmd = "java -Djava.awt.headless=true -DGRAPHVIZ_DOT=/opt/local/bin/dot -jar \"%s\" -pipe" % (self.plantuml_jar)



2010/9/15追記



関連

*1:Apacheではなく、tracdで起動させた時の動作です。(2010/4/15追記)

*2:最初のバージョンでは画面表示の度に画像データを生成していましたが、その後プラグインがバージョンアップして表示用のキャッシュを使うように改良されていました。(2010/4/20追記)