eclipse-birt / birt

Eclipse BIRT™ The open source reporting and data visualization project.
http://www.eclipse.org/birt
Eclipse Public License 2.0
451 stars 389 forks source link

JDBC issue with OSGi runtime #787

Closed wimjongman closed 2 years ago

wimjongman commented 2 years ago

Originally posted by @hvbtup in https://github.com/eclipse/birt/issues/781#issuecomment-1020141330

Well, I tried to use the OSGI runtime in our application, but now I am facing a different issue.

If I understand correctly, in order to switch the application code from POJO to OSGI runtime, the following steps are necessary:

Download the OSGI runtime instead of the POJO runtime (of course). The ZIP structure is basically the same, but the OSGI ZIP contains an additional folder ReportEngine\platform.

In the startup code, add a line

engineConfig.setBIRTHome(birt_home); 

where birt_home is the path to ReportEngine\platform before calling

Platform.startup(engineConfig);

Without this modification the startup is not working.

Now I am facing this issue:

Cannot open the connection for the driver: org.eclipse.birt.report.data.oda.jdbc. ... Caused by: org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Properties). at org.eclipse.birt.report.data.oda.jdbc.Connection.open(Connection.java:134) at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaConnection.open(OdaConnection.java:250) at org.eclipse.birt.data.engine.odaconsumer.ConnectionManager.openConnection(ConnectionManager.java:153) ... 27 more

Note: My setup - which always worked with the POJO runtime so far - is as follows.

The reports are using an Oracle JDBC data source. This data source definition is defined in a library lisa_basis.rptlibrary. The reports (and all other libraries) are referencing the data source from the library.

The data source definition of lisa_basis.rptlibrary contains fake connection data, the actual properties are then supplied by the calling code as system properties when BIRT runtime is used - or as environment variables when the All-In-One designer is used:

grafik

grafik

lisa.getProperty(...) is defined in a *.js ressource and is just a thin wrapper around System.getProperty.

It seems that is no longer sufficient to have the ojdbc8.jar (Oracle JDBC driver) in the class path. I also tried copying that file into ReportEngine\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_4.9.0.v202201232020\drivers and specifying the path to that file in the appContext. The exception traceback stays the same.

Originally posted by @hvbtup in https://github.com/eclipse/birt/issues/781#issuecomment-1020141330

wimjongman commented 2 years ago

@hvbtup Did you restart after adding the driver? Are you sure BIRT home is to the platform directory and not the one before?

hvbtup commented 2 years ago

2x yes

wimjongman commented 2 years ago

Are all the properties set correctly? Please attach the stacktrace.

wimjongman commented 2 years ago

Take a look at that Connection class starting from line 119. It is clear that it cannot find information in the connection properties.

hvbtup commented 2 years ago

The full stack trace:

org.eclipse.birt.report.engine.api.EngineException: An exception occurred during processing. Please see the following message for details: Cannot open the connection for the driver: org.eclipse.birt.report.data.oda.jdbc. org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Properties). at org.eclipse.birt.report.engine.executor.ExecutionContext.addException(ExecutionContext.java:1060) at org.eclipse.birt.report.engine.executor.ExecutionContext.addException(ExecutionContext.java:1045) at org.eclipse.birt.report.engine.executor.QueryItemExecutor.executeQuery(QueryItemExecutor.java:84) at org.eclipse.birt.report.engine.executor.GridItemExecutor.execute(GridItemExecutor.java:63) at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:73) at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeAll(ReportExecutorUtil.java:77) at org.eclipse.birt.report.engine.executor.ReportExecutor.createPageExecutor(ReportExecutor.java:198) at org.eclipse.birt.report.engine.internal.executor.dup.SuppressDuplciateReportExecutor.createPageExecutor(SuppressDuplciateReportExecutor.java:57) at org.eclipse.birt.report.engine.internal.executor.wrap.WrappedReportExecutor.createPageExecutor(WrappedReportExecutor.java:44) at org.eclipse.birt.report.engine.executor.ReportExecutorUtil.executeMasterPage(ReportExecutorUtil.java:56) at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.start(HTMLPageLM.java:132) at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.layout(HTMLPageLM.java:85) at org.eclipse.birt.report.engine.layout.html.HTMLReportLayoutEngine.layout(HTMLReportLayoutEngine.java:96) at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.doRun(RunAndRenderTask.java:144) at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.run(RunAndRenderTask.java:68) at com.tp.server.lisa.birt.report.BirtReportGenerator.run(BirtReportGenerator.java:433) Caused by: org.eclipse.birt.report.data.adapter.api.AdapterException: An exception occurred during processing. Please see the following message for details: Cannot open the connection for the driver: org.eclipse.birt.report.data.oda.jdbc. org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Properties). at org.eclipse.birt.report.data.adapter.impl.DataRequestSessionImpl.execute(DataRequestSessionImpl.java:585) at org.eclipse.birt.report.engine.data.dte.DteDataEngine.doExecuteQuery(DteDataEngine.java:137) at org.eclipse.birt.report.engine.data.dte.AbstractDataEngine.execute(AbstractDataEngine.java:249) at org.eclipse.birt.report.engine.executor.ExecutionContext.executeQuery(ExecutionContext.java:1628) at org.eclipse.birt.report.engine.executor.QueryItemExecutor.executeQuery(QueryItemExecutor.java:73) ... 13 more Caused by: org.eclipse.birt.data.engine.odaconsumer.OdaDataException: Cannot open the connection for the driver: org.eclipse.birt.report.data.oda.jdbc. org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Properties). at org.eclipse.birt.data.engine.odaconsumer.ExceptionHandler.newException(ExceptionHandler.java:50) at org.eclipse.birt.data.engine.odaconsumer.ConnectionManager.openConnection(ConnectionManager.java:162) at org.eclipse.birt.data.engine.executor.DataSource.newConnection(DataSource.java:201) at org.eclipse.birt.data.engine.executor.DataSource.open(DataSource.java:190) at org.eclipse.birt.data.engine.impl.DataSourceRuntime.openOdiDataSource(DataSourceRuntime.java:191) at org.eclipse.birt.data.engine.impl.QueryExecutor.openDataSource(QueryExecutor.java:412) at org.eclipse.birt.data.engine.impl.QueryExecutor.prepareExecution(QueryExecutor.java:297) at org.eclipse.birt.data.engine.impl.PreparedQuery.doPrepare(PreparedQuery.java:378) at org.eclipse.birt.data.engine.impl.PreparedDataSourceQuery.produceQueryResults(PreparedDataSourceQuery.java:156) at org.eclipse.birt.data.engine.impl.PreparedDataSourceQuery.execute(PreparedDataSourceQuery.java:145) at org.eclipse.birt.data.engine.impl.PreparedOdaDSQuery.execute(PreparedOdaDSQuery.java:160) at org.eclipse.birt.report.data.adapter.impl.DataRequestSessionImpl.execute(DataRequestSessionImpl.java:572) ... 17 more Caused by: org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Properties). at org.eclipse.birt.report.data.oda.jdbc.Connection.open(Connection.java:134) at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaConnection.open(OdaConnection.java:250) at org.eclipse.birt.data.engine.odaconsumer.ConnectionManager.openConnection(ConnectionManager.java:153) ... 27 more

The same code in the same environment works if I change the flollowing:

So yes, the properties are correct.

hvbtup commented 2 years ago

@wimjongman Do you have an Oracle DB at hand? If yes, I can try to create a stand-alone test case, though this will cost me several hours of work.

wimjongman commented 2 years ago

No, I don't have that.

hvbtup commented 2 years ago

Sorry, it was my fault.

I forgot to copy one of our JARs to the ReportEngine/lib directory. This caused the logic in the data source property bindings to "think" that the report is running in the all-in-one designer and thus expecting the properties as environment variables instead of system properties, resulting in null properties.

So this is issue can be closed. The effort was not in vain, though, because in my comments I described the tiny changes that are necessary to migrate a POJO runtime program to an OSGI runtime program ;-)

BTW, when I captured stderr, I found that the OSGI runtime produces lots of error messages on startup as described here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=547526

In my case they are looking like this:

org.eclipse.equinox.internal.p2.extensionlocation.SiteListener@666f4066: java.lang.UnsupportedOperationException: Not able to create StateObjectFactory implementation: org.eclipse.osgi.internal.resolver.StateObjectFactoryImpl.

I have no idea what these messages mean and why there are so many of them.

wimjongman commented 2 years ago

BTW, when I captured stderr, I found that the OSGI runtime produces lots of error messages on startup as described here: https://bugs.eclipse.org/bugs/show_bug.cgi?id=547526

In my case they are looking like this:

org.eclipse.equinox.internal.p2.extensionlocation.SiteListener@666f4066: java.lang.UnsupportedOperationException: Not able to create StateObjectFactory implementation: org.eclipse.osgi.internal.resolver.StateObjectFactoryImpl.

I have no idea what these messages mean and why there are so many of them.

That is another issue (see #835).