[
https://issues.apache.org/jira/browse/ARIES-1615?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15601287#comment-15601287
]
Christian Schneider commented on ARIES-1615:
--------------------------------------------
Not sure if we can avoid this. After all the DummyDataSource is not a working
DataSource.
createAndCloseDummyEMF() is mainly meant to let the PersistenceProvider call
addTransformer so we can do the class enhancement.
I would be glad about any better way to achieve that.
The problem is that if we wait until the real DataSource is present then user
code might already have accessed classes from the bundle and the enhancement
will not be possible at that point.
> Calling the method createAndCloseDummyEMF() causes NullPointerException
> -----------------------------------------------------------------------
>
> Key: ARIES-1615
> URL: https://issues.apache.org/jira/browse/ARIES-1615
> Project: Aries
> Issue Type: Bug
> Components: JPA
> Affects Versions: jpa-2.4.0
> Environment: JPA: 2.4.0, EclipseLink: 2.6.3
> Reporter: Jens Offenbach
> Assignee: Christian Schneider
> Labels: jpa, jpa-container
> Fix For: jpa-2.5.0
>
>
> In the current version of JPAContainer the method call
> {{createAndCloseDummyEMF}} throws the following {{NullPointerException}}:
> {code}
> [EL Warning]: 2016-09-20
> 14:59:39.373--ServerSession(1864482722)--Thread(Thread[Start Level: Equinox
> Container:
> 80090ef3-307f-0016-1904-9194b7ab7645,5,main])--java.lang.NullPointerException
> [EL Severe]: 2016-09-20
> 14:59:39.373--ServerSession(1864482722)--Thread(Thread[Start Level: Equinox
> Container:
> 80090ef3-307f-0016-1904-9194b7ab7645,5,main])--java.lang.NullPointerException
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:892)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:964)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:633)
> at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:560)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2056)
> at
> org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:271)
> at
> org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:251)
> at
> org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:85)
> at
> org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.internalExecuteQuery(AbstractSession.java:3271)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1790)
> at
> org.eclipse.persistence.internal.sessions.AbstractSession.priviledgedExecuteNonSelectingCall(AbstractSession.java:5079)
> at
> org.eclipse.persistence.tools.schemaframework.DatabaseObjectDefinition.createOnDatabase(DatabaseObjectDefinition.java:202)
> at
> org.eclipse.persistence.tools.schemaframework.SchemaManager.createObject(SchemaManager.java:223)
> at
> org.eclipse.persistence.tools.schemaframework.TableCreator.createTables(TableCreator.java:171)
> at
> org.eclipse.persistence.tools.schemaframework.TableCreator.createTables(TableCreator.java:148)
> at
> org.eclipse.persistence.tools.schemaframework.TableCreator.createTables(TableCreator.java:140)
> at
> org.eclipse.persistence.tools.schemaframework.SchemaManager.createDefaultTables(SchemaManager.java:1032)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.generateDefaultTables(EntityManagerFactoryProvider.java:109)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.writeDDLToDatabase(EntityManagerSetupImpl.java:4225)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.writeDDL(EntityManagerSetupImpl.java:4153)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.writeDDL(EntityManagerSetupImpl.java:4053)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:777)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getDatabaseSession(EntityManagerFactoryDelegate.java:183)
> at
> org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getDatabaseSession(EntityManagerFactoryImpl.java:528)
> at
> org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactoryImpl(PersistenceProvider.java:385)
> at
> org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:313)
> at
> org.apache.aries.jpa.eclipselink.adapter.EclipseLinkPersistenceProvider.createContainerEntityManagerFactory(EclipseLinkPersistenceProvider.java:52)
> at
> org.apache.aries.jpa.container.impl.PersistenceProviderTracker.createAndCloseDummyEMF(PersistenceProviderTracker.java:105)
> at
> org.apache.aries.jpa.container.impl.PersistenceProviderTracker.addingService(PersistenceProviderTracker.java:85)
> at
> org.apache.aries.jpa.container.impl.PersistenceProviderTracker.addingService(PersistenceProviderTracker.java:44)
> at
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
> at
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
> at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
> at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
> at
> org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
> at
> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:914)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
> at
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
> at
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862)
> at
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801)
> at
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127)
> at
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:464)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:482)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:998)
> at
> org.apache.aries.jpa.eclipselink.adapter.Activator.handlePotentialEclipseLink(Activator.java:116)
> at org.apache.aries.jpa.eclipselink.adapter.Activator.start(Activator.java:72)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:771)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
> at java.security.AccessController.doPrivileged(Native Method)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:764)
> at
> org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:721)
> at
> org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:941)
> at
> org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:318)
> at org.eclipse.osgi.container.Module.doStart(Module.java:571)
> at org.eclipse.osgi.container.Module.start(Module.java:439)
> at
> org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1582)
> at
> org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1562)
> at
> org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1533)
> at
> org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1476)
> at
> org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
> at
> org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
> {code}
> In the class {{DatabaseAccessor}} of EclipseLink the following code is called
> (line 1570):
> {code}
> statement = nativeConnection.prepareStatement(call.getSQLString());
> {code}
> The {{nativeConnection}} is return by the class {{DummyDataSource}} and is a
> dynamic proxy using {{DummyHandler}} as InvocationHandler. Because the method
> {{prepareStatement}} returns an instance of the type
> {{java.sql.PreparedStatement}} the method {{proxyClasses}} gets called. This
> method now returns {{null}}, because the type {{PreparedStatement}} is not
> covered by the if-clauses. The following call (line: 892)
> {code}
> rowCount = ((PreparedStatement)statement).executeUpdate(); }}
> {code}
> in the class {{DatabaseAccessor}} now results in a {{NullPointerExcpetion}}.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)