[ https://issues.apache.org/jira/browse/ARIES-1447?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15104988#comment-15104988 ]
Christian Schneider edited comment on ARIES-1447 at 1/18/16 9:18 AM: --------------------------------------------------------------------- I did some tests with hibernate 5 now in my tasklist-ds example: https://github.com/cschneider/Karaf-Tutorial/tree/master/tasklist-ds The enhancement seems to work fine. Is this issue still relevant? I simply import the packages hibernate enhancement needs in my persistence bundle. As far as I know the hibernate team also aims at providing a solution that does not need the imports. Not sure if this is already done. was (Author: ch...@die-schneider.net): I did some tests with hibernate 5 now in my tasklist-ds example: https://github.com/cschneider/Karaf-Tutorial/tree/master/tasklist-ds The enhancement seems to work fine. Is this issue still relevant? > JPAWeavingHook transforming with wrong classloader > -------------------------------------------------- > > Key: ARIES-1447 > URL: https://issues.apache.org/jira/browse/ARIES-1447 > Project: Aries > Issue Type: Bug > Components: JPA > Affects Versions: jpa-2.2.0 > Environment: jpa 1.0.1 > Reporter: Tuomas Kiviaho > > {{PersistenceUnitInfo}} has a {{getNewTempClassLoader}} which includes both > provider and persistence unit classloader. The provider classloader is > important when enhancing the class, but now the transformations is only done > against persistence unit classloader that doesn't yet have needed the dynamic > imports in place. > As a workaround, I am mimicking the proper approach by using > {{TempBundleDelegatingClassLoader}} in my patched version of > {{WrappingTransformer}} > BTW: The {{org.apache.aries.jpa.container.weaving.packages}} (that seems to > be completely removed from 2.x???) could be replaced with ASM code that looks > for referenced packages before and after transformation and adds the > difference to dynamic imports. How I'm adding packages manually because the > wildcard approach just doesn't seem right. > {code:title=org/apache/aries/jpa/container/weaving/impl/WrappingTransformer.java > } > @@ -26,7 +26,9 @@ > import javax.persistence.spi.ClassTransformer; > > import org.apache.aries.jpa.container.impl.NLS; > +import > org.apache.aries.jpa.container.unit.impl.TempBundleDelegatingClassLoader; > import org.osgi.framework.Bundle; > +import org.osgi.framework.BundleReference; > import org.osgi.framework.Constants; > import org.osgi.framework.ServiceReference; > import org.osgi.framework.wiring.BundleCapability; > @@ -35,6 +37,7 @@ > > class WrappingTransformer implements ClassTransformer { > private final ClassTransformer delegate; > + private final ServiceReference<?> persistenceProvider; > private final Collection<String> packageImportsToAdd = new > HashSet<String>(); > > public WrappingTransformer(ClassTransformer delegate, > @@ -48,6 +51,7 @@ > } > > this.delegate = delegate; > + this.persistenceProvider = persistenceProvider; > > Object packages = > persistenceProvider.getProperty("org.apache.aries.jpa.container.weaving.packages"); > > @@ -56,7 +60,7 @@ > packageImportsToAdd.add(s); > } > } else { > - Bundle provider = persistenceProvider.getBundle(); > + Bundle provider = persistenceProvider.getBundle(); > String suffix = ";" + Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE + "=" + > provider.getSymbolicName() + ";" + Constants.BUNDLE_VERSION_ATTRIBUTE > + "=" + provider.getVersion(); > @@ -70,11 +74,25 @@ > > public WrappingTransformer(ClassTransformer transformer) { > delegate = transformer; > + persistenceProvider = null; > } > > public byte[] transform(ClassLoader arg0, String arg1, Class<?> arg2, > ProtectionDomain arg3, byte[] arg4) throws IllegalClassFormatException > { > - return delegate.transform(arg0, arg1, arg2, arg3, arg4); > + Bundle bundle = this.persistenceProvider.getBundle(); > + BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); > + ClassLoader classLoader = bundleWiring.getClassLoader(); > + BundleReference bundleReference = (BundleReference) arg0; > + bundle = bundleReference.getBundle(); > + classLoader = new TempBundleDelegatingClassLoader(bundle, classLoader); > + Thread thread = Thread.currentThread(); > + ClassLoader contextClassLoader = thread.getContextClassLoader(); > + thread.setContextClassLoader(classLoader); > + try { > + return delegate.transform(classLoader, arg1, arg2, arg3, arg4); > + } finally { > + thread.setContextClassLoader(contextClassLoader); > + } > } > > public Collection<String> getPackagesToAdd() { > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)