I'm seeing a problem I can't figure out with javassist's attempt to create a 
proxy using our BundleClassloader.  Sometimes it works (with classes from 
OpenWebBeans) but sometimes it doesn't (with classes from the bundle the 
BundleClassLoader is wrapping).

Basically, javassist gets a class in the bundle, constructs bytecode for a 
subclass, and calls defineClass on the BundleClassloader: it gets an exception 
back that the superclass (that we started with) can't be loaded.  I mucked 
around in OWB so that the classloader hidden inside the bundle is used, and 
this problem goes away.  If anyone has some classloader expertise to figure out 
what is going on or make plausible suggestions that would be great.

To see this for yourself, relatively quickly, set the tests to

       <packages>
           <package name="org.jboss.jsr299.tck.tests.lookup.injectionpoint.*"/>
       </packages>

in jcdi-tck-runner/src/test/resources/tck-tests.xml
and run

mvn clean test -Dgeronimo-assembly -Dincontainer -DassemblyId=tomcat7-javaee6

in jcdi-test-runner



I get something like this in the report at 
geronimo/tck/branches/3.0/jcdi-tck-runner/target/surefire-reports/JSR-299 
TCK/JSR-299 TCK.html

java.lang.RuntimeException: by java.lang.IllegalAccessError: class 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean_$$_javassist_14
 cannot access its superclass 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean
        at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:509)
        at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:486)
        at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:422)
        at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:394)
        at 
org.apache.webbeans.util.SecurityUtil$PrivilegedActionForProxyFactory.run(SecurityUtil.java:301)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
org.apache.webbeans.util.SecurityUtil.doPrivilegedCreateClass(SecurityUtil.java:184)
        at 
org.apache.webbeans.proxy.JavassistProxyFactory.getProxyClass(JavassistProxyFactory.java:303)
        at 
org.apache.webbeans.proxy.JavassistProxyFactory.createNormalScopedBeanProxy(JavassistProxyFactory.java:170)
        at 
org.apache.webbeans.container.BeanManagerImpl.getReference(BeanManagerImpl.java:817)
        at 
org.apache.webbeans.container.InjectableBeanManager.getReference(InjectableBeanManager.java:137)
        at 
org.jboss.jsr299.tck.impl.OldSPIBridge.getInstanceByType(OldSPIBridge.java:42)
        at 
org.jboss.jsr299.tck.AbstractJSR299Test.getInstanceByType(AbstractJSR299Test.java:160)
        at 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.InjectionPointTest.testApiTypeInjectionPoint(InjectionPointTest.java:192)
        at org.jboss.testharness.AbstractTest.run(AbstractTest.java:244)
        at org.jboss.testharness.impl.runner.TestRunner.run(TestRunner.java:61)
        at 
org.jboss.testharness.impl.runner.servlet.ServletTestRunner.doGet(ServletTestRunner.java:120)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:237)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
        at 
org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:713)
        at 
org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47)
        at 
org.apache.geronimo.tomcat.valve.ProtectedTargetValve.invoke(ProtectedTargetValve.java:53)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:146)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:402)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:254)
        at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
        at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
        at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
        at org.apache.geronimo.pool.ThreadPool$1.run(ThreadPool.java:243)
        at 
org.apache.geronimo.pool.ThreadPool$ContextClassLoaderRunnable.run(ThreadPool.java:373)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:637)
Caused by: javassist.CannotCompileException: by java.lang.IllegalAccessError: 
class 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean_$$_javassist_14
 cannot access its superclass 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean
        at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:169)
        at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:501)
        ... 64 more
Caused by: java.lang.IllegalAccessError: class 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean_$$_javassist_14
 cannot access its superclass 
org.jboss.jsr299.tck.tests.lookup.injectionpoint.FieldInjectionPointBean
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at javassist.util.proxy.FactoryHelper.toClass2(FactoryHelper.java:181)
        at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:163)
        ... 65 more
... Removed 29 stack frames
(I've set my geronimo copy to use javassist 3.12.0.GA and OWB 1.1.0-SNAPSHOT so 
the line numbers might be off a little bit).

I can avoid this problem with the following OWB patch which has nothing to 
recommend it except that it works.  It makes javassist use the classloader that 
loaded the provided class (the superclass that can't be found above) instead of 
the BundleClassLoader.

Index: 
webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
===================================================================
--- 
webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
    (revision 1005613)
+++ 
webbeans-impl/src/main/java/org/apache/webbeans/proxy/JavassistProxyFactory.java
    (working copy)
@@ -282,6 +282,10 @@

    public  Class<?> getProxyClass(ProxyFactory factory)
    {
+        return doGetProxyClass(factory);
+    }
+
+    private static synchronized Class<?> doGetProxyClass(ProxyFactory factory) 
{
        Class<?> proxyClass = null;
        try
        {
@@ -290,6 +294,7 @@
        }
        catch(Exception e)
        {
+            ProxyFactory.ClassLoaderProvider old = 
ProxyFactory.classLoaderProvider;
            ProxyFactory.classLoaderProvider = new 
ProxyFactory.ClassLoaderProvider(){

                @Override
@@ -300,12 +305,16 @@

            };

-            proxyClass = SecurityUtil.doPrivilegedCreateClass(factory);
+            try {
+                proxyClass = SecurityUtil.doPrivilegedCreateClass(factory);
+            } finally {
+                ProxyFactory.classLoaderProvider = old;
+            }
        }

        return proxyClass;
    }
-    
+
    public  ProxyFactory createProxyFactory(Bean<?> bean) throws Exception
    {
        Set<Type> types = bean.getTypes();


thanks!
david jencks

Reply via email to