【閑話休題】 DITA-OTのデバッグ

ちょっとはずれますがDITA Open Toolkitのデバッグの話です.たぶんDITA-OTをローカルで御使用の方はコマンドラインやoXygen、XMetaLなどのXMLエディタから起動してPDFやHTMLなどの目的の出力を得ておられると思います.でもDITA-OTにバグがあったり、DITAの仕様がどのように実現されているかを調べるとき、DITA-OTの中の動きを調べなければならない場合があります.
 
私が以前出くわしたのがDITA-OTのバグでした.複雑なセル結合のあるテーブルを処理すると、PDFの結果が崩れてしまうのです.自分のスタイルシートをいくら調べてもバグはありません.単にDITA-OTの作った中間ファイルをそのまま処理しているだけです.で中間ファイルを調べるとテーブルセルのentry要素のcolname属性が不正でした.sourceforgeにバグ報告してすぐにFIXしてもらえたのですが、修正は最新バージョンに反映されるので、お客さんのところのDITA-OT(すこし古いバージョン)はどうにもなりません.仕方がないのでDITA-OTの最新版のソースを落として、修正箇所をお客さんのバージョンのDITA-OTにマージし、[DITA-OT]/lib/dost.jarをビルドして納品しました.
 
このときバグフィックスだけでなく、お客さん特有のリクエストをインプリメントできるか、自分でDITA-OTに修正を試みたのですが、そのときもデバッグについてはコンソールデバッグの域を出ませんでした.つまりEclipseでdost.jarをビルドして、ターゲットのDITA-OTのdost.jarを置き換え、コマンドラインでDITA-OTを起動して結果を確かめるというものです.
 
今回DITA1.2のキーがどのように実装されているか調べるため、コンソールデバッグではなく、IDEEclipseデバッグしてDITA-OTの動きを見ることができました.まずDITAもこんなことまでやると廃人ですが、もしかしたら役に立つかもしれないので紹介します.
 
[DITA-OTのソースコード]
昔はDITA-OTがリリースされるたびに、ソースコード付の版もsourceforgeにアップされて、それからプロジェクトを作りさえすればよかったのですが、今のDITA-OTはこのようなソースコードリリースがなくなってしまいました.このため、sourceforgeから自分でソースファイルを落とさねばなりません.従来はDITA-OTのプロジェクトはCVSを使用していたようだったのですが、
 
 
どうも見てみるとソースが古いようです.今はGitに移行しているようです.
 
 
[EclipseでGitリポジトリをCloneする]
 
を参考にさせていただきました.EclipseにEGitがインストールされていれば、パースペクティブをGit Repository Exploreingに切り替えて、リポジトリのURLをペーストするだけです.
 
DITA-OTの場合は、git://git.code.sf.net/p/dita-ot/code をペーストすると、自動的に次のダイアログが出ます.
 
イメージ 1
 
ブランチを選択してNextを選択するとクローン処理が始まります.終わったときは以下のような感じになります.
 
イメージ 2
 
[Javaのプロジェクトを作成]
あとは、通常通りJavaのプロジェクトを作成するだけです.プロジェクトで設定する外部参照の.jarは[DITA-OT]/startcmd.batを参考にすると良いでしょう.[DITA-OT]/lib、[DITA-OT]/tools/ant/libの.jarをすべて設定します.うまくゆけばソースコードはエラーがとれて警告だけになります.
 
[デバッグの設定]
DITA-OTは2つの起動方法があります.ひとつはコマンドラインjavaを起動してdost.jarを実行するファイルに指定する方法です.あとはantを起動する方法です.ちょっと古いですが、以下はその両方の説明です.
 
私は昔はjavaしか起動したことがなかったのですが、今はantばかりです.今回Eclipseからデバッグするのにどちらにすべきかわからなかったのですが、メインクラスをdost.jarの org.dita.dost.invoker.CommandLineInvoker を起動する設定にしてデバッグするとログをすこし出してダンマリになってしまいます.おかしいと思って、再度起動しても結果は変わりません.タスクマネージャを見ると、java.exeのプロセスが起動した回数分だけ走っているのでこの方法は諦めました.⇒Eclipseを終了させるとjava.exeのプロセスはすべて消えました.
 
もうひとつはantから起動する方法です.この場合の設定は、上記のstartcmd.batに加え、[DITA-OT]/tools/bin/ant.batの内容を引き写す必要があります.
 
イメージ 3
 
このとき指定するメインクラスは org.apache.tools.ant.launch.Launcher です.antの環境変数も設定しておきます.(この画面はPDF5プラグインを起動するものです)
 
イメージ 4
 
[デバッグしてみる]
antから起動する方法は一発で動いてくれました.Eclipseの中でDITA-OTがログを吐きながら処理を進め、最後はFormatterを起動してPDF生成まで、ものの30秒もかからないで終了しました.あと必要なところにブレークポイントを置くと(あたりまえですが)止まってくれて、ステップ実行できます.これで目当てのクラスで@keyrefが処理されている箇所を確認できました.
 
イメージ 5
 
ソースコードを見るとDITA-OTの開発者の人たちが如何に大変であるかがよくわかります.また普段コマンドラインでしか使っていないDITA-OTの複雑な処理の片鱗を見ることができます.こういうこともDITAの勉強ではあっても良いかもしれません.