经过BIRT报表工具开发出来的报表,在运行时每每是走一个统一的生产环境数据源,可是开发时每每是一个开发测试用的数据源,这就 须要随时可以在两个环境下进行切换。目前针对这个问题,公开可检索到的资料,基本上是经过数据源的beforeopen事件,经过写脚本的方式解决,这个 方式仍是比较复杂,在报表数量较多,开发人数较多时,开发人员须要注意的地方仍是有些多,并不完美。本文的处理方式,将可以根本性的解决该问题。java
不能在报表制做上作文章了,这样要么须要大量修改报表文件,要么须要每一个报表继承一个公共的库文件,只能在BIRT的开放API上想办法了。经过研究BIRT的源代码,找到了以下解决方案,基本上完美的解决了这个问题。app
IReportEngine birtEngine = ...; IReportRunnable runnable = birtEngine.openReportDesign(...); IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask(runnable); Map appContext = runAndRenderTask.getAppContext(); Connection conn = ...; appContext.put(IConnectionFactory.PASS_IN_CONNECTION,conn);
这个方案须要在运行时手工获取链接,而后还须要注意处理链接的关闭等问题。工具
这个方法已经在BIRT的4.2系列和4.4系列测试经过,BIRT的其余版本未验证。
测试
其实,这个appContext是BIRT的一个重要的开放扩展接口,经过它能够对BIRT的不少功能进行扩展和自定义。
code