XDocReport では、管理するモジュラー API レポートが必要でした:
- あらゆる種類のドキュメント(docx、odt、pptx...)。また、必要に応じて独自のドキュメントの種類を実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます。
- 任意のテンプレート エンジンの種類 (Freemarker、Velocity...)。また、必要に応じて独自のテンプレートの種類を実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます。
- 任意のコンバーター タイプ (POI+iText を使用する docx->pdf コンバーター、POI を使用する docx->xhtml コンバーター、ODFDOM+iText を使用する odt->pdf コンバーター、ODFDOM を使用する odt->xhtml コンバーター...)。また、必要に応じて独自のコンバーターを実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます (例: docx->pdf コンバーターを docx4j+FOP で実装し、docx->pdf コンバーターを JODConverter で実装するなど)。
ご理解のとおり、javax.imageio.spi.ServiceRegistryは OSGi バンドルではなくOSGi フラグメント (同じクラスローダーを共有) を使用するため、OSGi コンテキストで動作します。非 OSGi コンテキストと OSGi コンテキストの両方を同じコードで管理するために、この選択を行いました。
以下の理由により、OSGi バンドルではなく OSGi フラグメントを使用することにしました。
- OSGi バンドルを使用する場合は、OSGi Activator を開発してディスカバリを登録する必要があります (このコンテキスト バンドルでは、javax.imageio.spi.ServiceRegistry は機能しません)。
- OSGi バンドルを使用する場合、検出を登録する各バンドルの開始レベルを構成する必要があります。
OSGi フラグメントを使用する唯一の欠点は、OSGi コンテナーで XDocReport テンプレート、コンバーター、ドキュメントの複数のバージョンを使用できないことです。しかし、それは XDocReport の優れた機能でしょうか?
javax.imageio.spi.ServiceRegistryが JDK5 (および JDK6) で動作することに注意してください。JDK6 では、javax.imageio.spi.ServiceRegistry としてサービスを登録するための新しいクラスであるjava.util.ServiceLoaderが提供されます。
XDocReport では、JDK5+JDK6 をサポートしたいと考えています。XDocReport 0.9.8 はjavax.imageio.spi.ServiceRegistryのみを使用していました。しかし、Google App Engine はこのクラスの使用を禁止しているようです (問題 132を参照)。そこで、JDK5 と JDK6 のjava.util.ServiceLoader とjavax.imageio.spi.ServiceRegistryの両方を Java リフレクションで管理するXDocReport 1.0.0 JDKServiceLoaderを開発しました。
よろしくアンジェロ