[
https://issues.apache.org/jira/browse/ARIES-808?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13186821#comment-13186821
]
Timothy Ward commented on ARIES-808:
------------------------------------
Hi Brian,
Having reviewed the patch I have significant reservations about adding it to
the codebase. Composites are a deprecated feature of Eclipse, that are entirely
replaced by Resolver Hooks. I would not want to add more complex code to
special case the structure of your environment.
There is also a much simpler fix for your issue - you highighted the following
code:
if(packages instanceof String[]) {
for(String s : (String[]) packages) {
if (s.contains(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
packageImportsToAdd.add(s);
else packageImportsToAdd.add(s + suffix);
}
}
Looking closely, wouldn't the simplest fix for you be to add the weaving
packages property (complete with bundle-symbolicname attributes) to your
Persistence Provider service? This would not need any change to the JPA
container, and is how it was intended to be used.
Tim
> Problem with JPAWeavingHook in an environment that uses Composite Bundles
> -------------------------------------------------------------------------
>
> Key: ARIES-808
> URL: https://issues.apache.org/jira/browse/ARIES-808
> Project: Aries
> Issue Type: Bug
> Components: JPA
> Environment: I am using Equinox
> org.eclipse.osgi_3.7.2.R37x_v20111028-1418.jar with Apache Aries revision
> 1187719
> Reporter: Brian DePradine
> Priority: Critical
> Attachments: patch.txt
>
>
> When running my OSGi application that uses JPA I get the following error:
> java.lang.reflect.InvocationTargetException
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
> at java.lang.reflect.Method.invoke(Method.java:611)
> at com.ibm.osgi.jpa.jpa2.TestTools.run(TestTools.java:60)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
> at java.lang.reflect.Method.invoke(Method.java:611)
> at
> org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:238)
> at
> org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:838)
> at
> org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:638)
> at
> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:726)
> at
> org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:71)
> at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
> at java.util.concurrent.FutureTask.run(FutureTask.java:149)
> at
> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:79)
> at
> org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:220)
> at
> org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:154)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:630)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:326)
> at
> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:228)
> at
> org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
> at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
> at java.util.concurrent.FutureTask.run(FutureTask.java:149)
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:109)
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:218)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
> at java.lang.Thread.run(Thread.java:736)
> Caused by: java.lang.NoClassDefFoundError:
> org.apache.openjpa.enhance.PersistenceCapable
> at java.lang.ClassLoader.defineClassImpl(Native Method)
> at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
> at
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
> at
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:601)
> at
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:567)
> at
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:490)
> at
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:478)
> at
> org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:458)
> at
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
> at
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:619)
> at java.lang.Class.forNameImpl(Native Method)
> at java.lang.Class.forName(Class.java:172)
> at
> org.apache.openjpa.meta.MetaDataRepository.classForName(MetaDataRepository.java:1552)
> at
> org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypesInternal(MetaDataRepository.java:1528)
> at
> org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypes(MetaDataRepository.java:1506)
> at
> org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:282)
> at
> org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:238)
> at
> org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:212)
> at
> org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
> at
> org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227)
> at
> com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:50)
> at
> com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:35)
> at
> org.apache.aries.jpa.container.impl.CountingEntityManagerFactory.createEntityManager(CountingEntityManagerFactory.java:65)
> at
> Proxy476b6bea_8a4d_42a3_ba7d_e0257275a826.createEntityManager(Unknown Source)
> at com.ibm.osgi.jpa.jpa2.NewAPITest.primeDB(NewAPITest.java:86)
> at com.ibm.osgi.jpa.jpa2.NewAPITest.before(NewAPITest.java:35)
> ... 31 more
> Caused by: java.lang.ClassNotFoundException:
> org.apache.openjpa.enhance.PersistenceCapable
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
> at
> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
> at
> org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:619)
> ... 62 more
> I am using Apache Aries with Composite Bundles in order to run my
> application. Due to the fact that we are using OSGi 4.3 we are using the
> JPAWeavingHook to perform load time enhancement of our entities. The
> JPAWeavingHook makes use of the
> org.apache.aries.jpa.container.weaving.impl.WrappingTransformer to help it
> determine which packages need to be added as dynamic imports. It contains the
> following code:
> public WrappingTransformer(ClassTransformer delegate,
> ServiceReference<?> persistenceProvider) {
> if(delegate == null)
> throw new
> NullPointerException(NLS.MESSAGES.getMessage("jpa.weaving.null.transformer"));
>
> if(persistenceProvider == null) {
> throw new
> NullPointerException(NLS.MESSAGES.getMessage("jpa.weaving.null.provider"));
> }
>
> this.delegate = delegate;
>
> Object packages =
> persistenceProvider.getProperty("org.apache.aries.jpa.container.weaving.packages");
>
> Bundle provider = persistenceProvider.getBundle();
> String suffix = ";" + Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE + "=" +
> provider.getSymbolicName() + ";" + Constants.BUNDLE_VERSION_ATTRIBUTE
> + "=" + provider.getVersion();
>
> if(packages instanceof String[]) {
> for(String s : (String[]) packages) {
> if (s.contains(Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE))
> packageImportsToAdd.add(s);
> else packageImportsToAdd.add(s + suffix);
> }
> } else {
> BundleRevision br = provider.adapt(BundleWiring.class).getRevision();
> for(BundleCapability bc :
> br.getDeclaredCapabilities(BundleRevision.PACKAGE_NAMESPACE)) {
>
> packageImportsToAdd.add(bc.getAttributes().get(BundleRevision.PACKAGE_NAMESPACE)
> + suffix);
> }
> }
> }
> The problem is that the suffix is meant to tie the dynamic imports to the
> persistence provider bundle so that they only work if the packages come from
> that bundle. When using Composite Bundles, however, the bundle that provides
> those packages will be the surrogate bundle and not the original persistence
> provider bundle. This results in the ClassNotFoundException listed above. As
> a workaround I can remove the suffix so that the imports can be used from any
> bundle, but I am not sure what the long term fix should be that would allow
> the JPAWeavingHook to work both with and without Composite Bundles.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira