2015-01-12 153 views
3

我有一個使用ReportLibraries中的組件動態組合BIRT ReportDesigns的環境。這些ReportLibraries存儲在數據庫中,不會在文件系統的任何位置找到。將BIRT庫引入InputStream報告(BIRT DEAPI)

我所試圖做的是在一個會話打開一個圖書館,讓圖書館的名稱,(從測試資源的FileInputStream)的InputStream

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從非FileSystem資源中包含Library,或者從Session中包含Library,因爲它具有相同的名稱?

我想避免必須將我的FielSystem上的rptlibrary文件不惜一切代價組裝ReportDesign。

+0

我不能回答你的問題,但你的環境的想法聽起來很有趣。有沒有關於它的公開信息? – hvb

+0

@hvb不幸的是,我無法公開比我在這裏寫的更多。有什麼具體的,你想知道這個項目? – mwhs

+0

這只是因爲它聽起來與我有的想法相似,但缺乏實現的資源:讓數據庫應用程序中的高級用戶通過組裝預定義組件創建報告;所有這些都存儲在數據庫中(包括版本控制,權限管理等)。 – hvb

回答

1

我還沒有測試過,我認爲你的報告需要首先包含庫,然後才能嘗試從報告庫中獲取報告中的元素句柄。

includeLibrary(filename, namespace)該函數只能用於從文件系統加載庫。所以我認爲你必須從數據庫的內容創建一個臨時文件,但是你可以在創建報告後刪除它。

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

ElementFactory elementFactory = reportDesign.getElementFactory(); 

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

DesignElementHandle ldeh1 = elementFactory.newElementFrom(deh1, "newTable");