ReportLibraries のコンポーネントを使用して BIRT ReportDesign を動的に組み立てる環境があります。これらの ReportLibraries はデータベースに保存され、ファイル システムのどこにもありません。
私がやろうとしているのは、セッションでライブラリを開いて、ライブラリに名前を付け、InputStream (テスト リソースからの FileInputStream) を指定することです。
SessionHandle session = de.newSessionHandle(ULocale.ENGLISH);
LibraryHandle library = session.openLibrary("lib01.rptlibrary", is);
次に、ReportDesign を作成し、ライブラリを (名前で?) インクルードします。
ReportDesignHandle reportDesign = session.createDesign();
reportDesign.includeLibrary("lib01.rptlibrary", "lib01");
後で、ライブラリでテーブル要素を検索し、それをデザインにコピーしようとします。
ElementFactory elementFactory = reportDesign.getElementFactory();
DesignElementHandle deh1 = library.findElement("NewTable");
DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");
この時点で、次の例外が発生します。
org.eclipse.birt.report.model.api.command.InvalidParentException: The library for the parent element "Table("NewTable")" is not included.
at org.eclipse.birt.report.model.api.ElementFactoryImpl.newElementFrom(ElementFactoryImpl.java:968)
at org.eclipse.birt.report.model.api.ElementFactory.newElementFrom(ElementFactory.java:1)
ライブラリが見つかり、DesignElementHandle が実際にデザインにコピーしたいコンポーネントを指しているように見えますが、セッションで開かれたライブラリが ReportDesign で見つかりません。
FileSystem 以外のリソースからライブラリを含めるか、セッションからライブラリを含めるように ReportDesign に指示する方法はありますか?
ReportDesign をアセンブルするために自分の FielSystem に rptlibrary ファイルを配置する必要は、どうしても避けたいと考えています。