[ 
https://issues.apache.org/jira/browse/OPENJPA-1491?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Timothy Ward updated OPENJPA-1491:
----------------------------------

    Description: 
When attempting to create an EntityManagerFactory in an OSGi environment the 
org.apache.openjpa.kernel.Bootstrap class attempts to instantiate a 
BrokerFactory using reflection. When the Bootstrap class attempts to load this 
class it only ever uses the ClassLoader passed in by the PersistenceUnitInfo. 
This means that the default broker (contained within OpenJPA) can never be 
loaded. The client bundle should not have to import the internals of OpenJPA to 
make this work, so OpenJPA should attempt to load the class using its own 
bundle classloader. This is the expected behaviour for an OSGi bundle.

Additionally, the implementation uses Class.forName() which should be used 
carefully in an OSGi envrionment (to see why read 
http://blog.bjhargrave.com/2007/09/classforname-caches-defined-class-in.html ). 
It should be fine here because the variant that takes a ClassLoader is used.

The following exception is generated when OpenJPA attempts to use the 
application classloader to load an internal class.

<openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.persistence.ArgumentException: Could not invoke the static 
newInstance method on the named factory class 
"<<openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.util.UserException: The named BrokerFactory 
"org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.>".
        at 
org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:70)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:145)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:180)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:62)
        at 
org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:227)
        at 
org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.bundleStateChange(EntityManagerFactoryManager.java:121)
        at 
org.apache.aries.jpa.container.impl.PersistenceBundleManager.modifiedBundle(PersistenceBundleManager.java:197)
        at 
org.apache.aries.util.tracker.MultiBundleTracker$InternalBundleTracker.modifiedBundle(MultiBundleTracker.java:108)
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:453)
        at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:237)
        at 
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:413)
        at 
org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:916)
        at 
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)
        at 
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:149)
        at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1350)
        at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1301)
        at 
org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:490)
        at 
org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:546)
        at 
org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1098)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.suspendBundle(PackageAdminImpl.java:314)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.processDelta(PackageAdminImpl.java:460)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.doResolveBundles(PackageAdminImpl.java:241)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl$1.run(PackageAdminImpl.java:176)
        at java.lang.Thread.run(Thread.java:735)
Caused by: <openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.persistence.ArgumentException: The named BrokerFactory 
"org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.
        at 
org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:159)
        at org.apache.openjpa.kernel.Bootstrap.invokeFactory(Bootstrap.java:111)
        at 
org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:62)
        ... 23 more
Caused by: java.lang.ClassNotFoundException: 
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory
        at java.lang.Class.forName(Class.java:169)
        at 
org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:157)
        ... 25 more

  was:
When attempting to create an EntityManagerFactory in an OSGi environment the 
org.apache.openjpa.kernel.Bootstrap class attempts to instantiate a 
BrokerFactory using reflection. When the Bootstrap class attempts to load this 
class it only ever uses the ClassLoader passed in by the PersistenceUnitInfo. 
This means that the default broker (contained within OpenJPA) can never be 
loaded. The client bundle should not have to import the internals of OpenJPA to 
make this work, so OpenJPA should attempt to load the class using its own 
bundle classloader. This is the expected behaviour for an OSGi bundle.

Additionally, the implementation uses Class.forName() which should be avoided 
in an OSGi envrionment (to see why read 
http://blog.bjhargrave.com/2007/09/classforname-caches-defined-class-in.html ).

The following exception is generated when OpenJPA attempts to use the 
application classloader to load an internal class.

<openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.persistence.ArgumentException: Could not invoke the static 
newInstance method on the named factory class 
"<<openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.util.UserException: The named BrokerFactory 
"org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.>".
        at 
org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:70)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:145)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:180)
        at 
org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:62)
        at 
org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:227)
        at 
org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.bundleStateChange(EntityManagerFactoryManager.java:121)
        at 
org.apache.aries.jpa.container.impl.PersistenceBundleManager.modifiedBundle(PersistenceBundleManager.java:197)
        at 
org.apache.aries.util.tracker.MultiBundleTracker$InternalBundleTracker.modifiedBundle(MultiBundleTracker.java:108)
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:453)
        at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:237)
        at 
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:413)
        at 
org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:916)
        at 
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)
        at 
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:149)
        at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1350)
        at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1301)
        at 
org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:490)
        at 
org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:546)
        at 
org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1098)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.suspendBundle(PackageAdminImpl.java:314)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.processDelta(PackageAdminImpl.java:460)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl.doResolveBundles(PackageAdminImpl.java:241)
        at 
org.eclipse.osgi.framework.internal.core.PackageAdminImpl$1.run(PackageAdminImpl.java:176)
        at java.lang.Thread.run(Thread.java:735)
Caused by: <openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
org.apache.openjpa.persistence.ArgumentException: The named BrokerFactory 
"org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.
        at 
org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:159)
        at org.apache.openjpa.kernel.Bootstrap.invokeFactory(Bootstrap.java:111)
        at 
org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:62)
        ... 23 more
Caused by: java.lang.ClassNotFoundException: 
org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory
        at java.lang.Class.forName(Class.java:169)
        at 
org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:157)
        ... 25 more


> org.apache.openjpa.kernel.Bootstrap uses the application classloader to load 
> OpenJPA internals
> ----------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1491
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1491
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: integration
>    Affects Versions: 2.0.0-beta
>         Environment: OSGi
>            Reporter: Timothy Ward
>
> When attempting to create an EntityManagerFactory in an OSGi environment the 
> org.apache.openjpa.kernel.Bootstrap class attempts to instantiate a 
> BrokerFactory using reflection. When the Bootstrap class attempts to load 
> this class it only ever uses the ClassLoader passed in by the 
> PersistenceUnitInfo. This means that the default broker (contained within 
> OpenJPA) can never be loaded. The client bundle should not have to import the 
> internals of OpenJPA to make this work, so OpenJPA should attempt to load the 
> class using its own bundle classloader. This is the expected behaviour for an 
> OSGi bundle.
> Additionally, the implementation uses Class.forName() which should be used 
> carefully in an OSGi envrionment (to see why read 
> http://blog.bjhargrave.com/2007/09/classforname-caches-defined-class-in.html 
> ). It should be fine here because the variant that takes a ClassLoader is 
> used.
> The following exception is generated when OpenJPA attempts to use the 
> application classloader to load an internal class.
> <openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
> org.apache.openjpa.persistence.ArgumentException: Could not invoke the static 
> newInstance method on the named factory class 
> "<<openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
> org.apache.openjpa.util.UserException: The named BrokerFactory 
> "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.>".
>       at 
> org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:70)
>       at 
> org.apache.openjpa.persistence.PersistenceProviderImpl.getBrokerFactory(PersistenceProviderImpl.java:145)
>       at 
> org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:180)
>       at 
> org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:62)
>       at 
> org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.createEntityManagerFactories(EntityManagerFactoryManager.java:227)
>       at 
> org.apache.aries.jpa.container.impl.EntityManagerFactoryManager.bundleStateChange(EntityManagerFactoryManager.java:121)
>       at 
> org.apache.aries.jpa.container.impl.PersistenceBundleManager.modifiedBundle(PersistenceBundleManager.java:197)
>       at 
> org.apache.aries.util.tracker.MultiBundleTracker$InternalBundleTracker.modifiedBundle(MultiBundleTracker.java:108)
>       at 
> org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:453)
>       at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:237)
>       at 
> org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:413)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:916)
>       at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)
>       at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:149)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1350)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1301)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:490)
>       at 
> org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:546)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1098)
>       at 
> org.eclipse.osgi.framework.internal.core.PackageAdminImpl.suspendBundle(PackageAdminImpl.java:314)
>       at 
> org.eclipse.osgi.framework.internal.core.PackageAdminImpl.processDelta(PackageAdminImpl.java:460)
>       at 
> org.eclipse.osgi.framework.internal.core.PackageAdminImpl.doResolveBundles(PackageAdminImpl.java:241)
>       at 
> org.eclipse.osgi.framework.internal.core.PackageAdminImpl$1.run(PackageAdminImpl.java:176)
>       at java.lang.Thread.run(Thread.java:735)
> Caused by: <openjpa-2.0.0-SNAPSHOT-r422266:905001 fatal user error> 
> org.apache.openjpa.persistence.ArgumentException: The named BrokerFactory 
> "org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory" is not valid.
>       at 
> org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:159)
>       at org.apache.openjpa.kernel.Bootstrap.invokeFactory(Bootstrap.java:111)
>       at 
> org.apache.openjpa.kernel.Bootstrap.newBrokerFactory(Bootstrap.java:62)
>       ... 23 more
> Caused by: java.lang.ClassNotFoundException: 
> org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory
>       at java.lang.Class.forName(Class.java:169)
>       at 
> org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:157)
>       ... 25 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to