John Ross created OPENJPA-2342:
----------------------------------
Summary: Consider modifying PCEnhancer.run to use
serp.bytecode.BCClass.getDeclaredInterfaceNames instead of
getDeclaredInterfaceTypes.
Key: OPENJPA-2342
URL: https://issues.apache.org/jira/browse/OPENJPA-2342
Project: OpenJPA
Issue Type: Improvement
Components: Enhance
Affects Versions: 2.2.2
Reporter: John Ross
Caused by: <openjpa-2.2.2-SNAPSHOT-r422266:1446295 nonfatal general error>
org.apache.openjpa.util.GeneralException: An error occurred while enhancing
itemjpa.ItemJPA. Exception message: java.lang.ClassNotFoundException:
org.apache.aries.proxy.weaving.WovenProxy
at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:578)
at
org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:153)
at
org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:126)
at
org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:290)
at
org.apache.aries.jpa.container.weaving.impl.WrappingTransformer.transform(WrappingTransformer.java:80)
at
org.apache.aries.jpa.container.weaving.impl.JPAWeavingHook.weave(JPAWeavingHook.java:71)
... 48 more
Caused by: java.lang.IllegalArgumentException:
java.lang.ClassNotFoundException: org.apache.aries.proxy.weaving.WovenProxy
at serp.util.Strings.toClass(Strings.java:164)
at serp.util.Strings.toClass(Strings.java:108)
at serp.bytecode.BCClass.getDeclaredInterfaceTypes(BCClass.java:740)
at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:537)
... 53 more
This issue occurs when the Apache Aries Proxy weaving hook gets called before
the Apache Aries JPA weaving hook. Proxy weaves the class with the WovenProxy
interface and adds the necessary dynamic package imports. JPA then gets called
and uses PCEnhancer which, in turn, calls BCClass.getDeclaredInterfaceTypes,
which ultimately calls Class.forName using the woven interface's name. The
class loader is from the bundle whose class is being woven. Per the OSGi spec,
dynamic imports do not take effect until after the entire weaving process is
complete. Consequently, the bundle's class loader does not yet have visibility
to the class.
One solution to this, at least in the Aries case, is to order the weaving hook
calls using the osgi service ranking property. However, all weaving hook
services with potential conflicts may not be under the control of the same
entity.
Basically, PCEnhancer.run is using the information from BCClass to determine
whether or not the class has already been woven. It's only interested in
knowing if the PersistenceCapable interface is there. It seems that
BCClass.getDeclaredInterfaceNames avoids the Class.forName call and could be
used instead, particularly considering that only the class names are compared.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira