Включить библиотеку BIRT в отчет из InputStream (BIRT DEAPI)

У меня есть среда, в которой я динамически собираю BIRT ReportDesigns, используя компоненты в 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.

Можно ли указать ReportDesign включить библиотеку из ресурса, не являющегося файловой системой, или включить библиотеку из сеанса, поскольку она имеет то же имя?

Я хочу избежать размещения файлов rptlibrary на моей FielSystem для сборки ReportDesign любой ценой.

1 ответ

Я не проверял его, так как считаю, что ваш отчет должен сначала включать библиотеку, прежде чем вы сможете попытаться получить дескрипторы элементов внутри отчета из библиотеки.

includeLibrary (имя файла, пространство имен) функция может использоваться только для загрузки библиотеки из файловой системы. Поэтому я думаю, что вы должны создать временный файл из содержимого вашей базы данных, но вы можете удалить его после создания вашего отчета.

//add this
reportDesign.includeLibrary(filename, namespace);

ElementFactory elementFactory = reportDesign.getElementFactory();

DesignElementHandle deh1 = library.findElement("NewTable");

DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");
Другие вопросы по тегам