まずいDITA-OTのPDF2プラグイン

DITA-OT1.6.3を入れたので変更点をいろいろ見ていたのですが、まずDITA-OTのルートフォルダが整理されたのに気がつきます.以前はやたらbuild_*.xmlファイルが乱立していたのですが、整理されました.またplug-inもすべて[DITA-OT]/demoにあったものは、[DITA-OT]/pluginsに移されたようです.
 
ところが、PDF2プラグインの組み込み方法を見て驚いていしまいました.DITA-OTのプラグインは、[DITA-OT]/pluginsのプラグインフォルダにintegrator.xmlとplugin.xmlというファイルを配置して組み込みます.組み込むのはご存知のように、startcmd.batを起動してコマンドウィンドウをひらき"ant -f integrator.xml"と入力します.
PDF2プラグインの場合は、[DITA-OT]/plugins/org.dita.pdf2/integrator.xmlの内容が[DITA-OT]/build.xmlに反映されて組み込みが完了します.
 
ところがDITA-OT1.6.3の場合、このintegrator.xmlの内容はこんなものでした.
 
<?xml version="1.0" encoding="UTF-8"?>
<project>
  <import file="build.xml"/>
</project>
 
あれ!っと思ってさかのぼってみるとDITA-OT1.5.3からplugin固有のbuild.xmlを[DITA-OT]/build.xmlにインポートするようになっているようです.以前は、[DITA-OT]/build.xmlでやらなければならない最低限のことをやって、そのあとは[DITA-OT]/plugins (もしくはdemo)/fo/build.xmlをantで再度呼び出すという構造をしていました.(例えばDITA-OT1.5.2)
 
このDITA-OT1.6.3のintegrator.xmlの作法はまずいと考えています.なぜかというとプラグインは勝手に作れて、自分の都合でやりたいことがあるのですが、これがインポートで大本の[DITA-OT]/build.xmlにすべて反映されてしまいます.プラグインが一つのときは問題なくても複数になると互いに干渉して動かなくなるということが実際あるのです.
 
以前やっていたプロジェクトで、私がPDFのプラグインを作り別の開発会社がHTMLのプラグインを作るということをやっていたことがあります.PDFプラグイン単独だと動くけれども、HTMLプラグインを一緒にすると、PDFプラグインがまともに動かなくなります.(HTMLプラグインは動きます)
 
ともかく原因が全然わからなくて、自分のPDFプラグインのバグだとばかり思っていたのですが、デバッグしてやっとわかった原因はHTMLプラグインの干渉でした.HTMLプラグインが、integrator.xmlの中で、グローバルなプロパティを自分の都合でOFFに設定していたのです.以下がそのバグの1ステップですこれがすべてのプラグインに影響していました.
 
<property name="preprocess.copy-image.skip" value="true" />
 
これで画像ファイルが出力フォルダにコピーされなくなり、正常なPDFが作れなくなっていたのです.
 
これ以来、プラグインのintegrator.xml
 
1.[DITA-OT]/build.xmlでやらなければならない最低限のことをやる.
2.そのあとは[DITA-OT]/plugins (もしくはdemo)/[プラグインフォルダ]/build.xmlをantで再度呼び出す
 
を厳格に守っています.ですから私のお客様には複数のプラグインを納品していますが、決して互いに干渉しないようになっています.
 
DITA-OTの標準といわれるPDF2プラグインが、かつての作法を捨てて自分のbuild.xmlを[DITA-OT]/build.xmlにインポートしているのは非常にまずいと思います.たいていのPDFプラグイン開発者は、PDF2プラグインを参考に自分のプラグインを作ることは目に見えているからです.
 
DITA-OTもバージョンアップに従って良くなっていると思ったのですが、このようなところに思わぬ落とし穴がありました.こういうのは参考にしてはいけません.
 
[補足]
自分のプラグインがpreprocessなどのDITA-OTの共通のターゲットをビルドするとき、特定のプロパティを設定して行わせたい場合があり得ます.このようなときは、
 
  <condition property="preprocess.copy-image.skip" value="true">
      <equals arg1="${transtype}" arg2="[プラグイン名]" casesensitive="false"/>
  </condition>
 
などとすればよいでしょう.こうすれば他のプラグインに迷惑をかけずにすみます.