AspectWerkz fails to preprocess a class

View: New views
1 Messages — Rating Filter:   Alert me  

AspectWerkz fails to preprocess a class

by Amit Modi-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Some parts of this message have been removed. Learn more about Nabble's security policy.
Hi,

I was preprocessing the OracleDriver (oracle.jdbc.driver.OracleDriver) using aspectwerkz and it failed while preprocessing. I got the following error.

AW::WARNING - could not load class [oracle/security/pki/OracleWallet] as a resource in loader [sun.misc.Launcher$AppClassLoader@1d14e6]

java.io.IOException: Class not found
    at org.codehaus.aspectwerkz.org.objectweb.asm.ClassReader.readClass(Ljava.io.InputStream;)[B(Unknown Source)
    at org.codehaus.aspectwerkz.org.objectweb.asm.ClassReader.<init>(Ljava.io.InputStream;)V(Unknown Source)
    at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(Ljava.io.InputStream;Ljava.lang.ClassLoader;)Lorg.codehaus.aspectwerkz.reflect.ClassInfo;(AsmClassInfo.java:304)
    at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(Ljava.io.InputStream;Ljava.lang.ClassLoader;Z)Lorg.codehaus.aspectwerkz.reflect.ClassInfo;(AsmClassInfo.java:331)
    at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.createClassInfoFromStream(Ljava.lang.String;Ljava.lang.ClassLoader;Z)Lorg.codehaus.aspectwerkz.reflect.ClassInfo;(AsmClassInfo.java:790)
    at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(Ljava.lang.String;Ljava.lang.ClassLoader;)Lorg.codehaus.aspectwerkz.reflect.ClassInfo;(AsmClassInfo.java:273)
    at org.codehaus.aspectwerkz.transform.inlining.weaver.ConstructorCallVisitor$ReplaceNewInstructionCodeAdapter.visitTypeInsn(ILjava.lang.String;)V(ConstructorCallVisitor.java:252)
    at org.codehaus.aspectwerkz.org.objectweb.asm.CodeAdapter.visitTypeInsn(ILjava.lang.String;)V(Unknown Source)
    at org.codehaus.aspectwerkz.transform.inlining.weaver.AfterObjectInitializationCodeAdapter.visitTypeInsn(ILjava.lang.String;)V(AfterObjectInitializationCodeAdapter.java:43)
    at org.codehaus.aspectwerkz.org.objectweb.asm.CodeAdapter.visitTypeInsn(ILjava.lang.String;)V(Unknown Source)
    at org.codehaus.aspectwerkz.org.objectweb.asm.CodeAdapter.visitTypeInsn(ILjava.lang.String;)V(Unknown Source)
    at org.codehaus.aspectwerkz.org.objectweb.asm.ClassReader.accept(Lorg.codehaus.aspectwerkz.org.objectweb.asm.ClassVisitor;[Lorg.codehaus.aspectwerkz.org.objectweb.asm.Attribute;Z)V(Unknown Source)
    at org.codehaus.aspectwerkz.transform.inlining.InliningWeavingStrategy.transform(Ljava.lang.String;Lorg.codehaus.aspectwerkz.transform.Context;)V(InliningWeavingStrategy.java:198)
    at org.codehaus.aspectwerkz.transform.AspectWerkzPreProcessor._preProcess(Ljava.lang.String;[BLjava.lang.ClassLoader;)Lorg.codehaus.aspectwerkz.transform.Context;(AspectWerkzPreProcessor.java:173)
    at org.codehaus.aspectwerkz.transform.AspectWerkzPreProcessor.preProcess(Ljava.lang.String;[BLjava.lang.ClassLoader;)[B(AspectWerkzPreProcessor.java:148)
    at org.codehaus.aspectwerkz.extension.jrockit.JRockitPreProcessor.preProcess(Ljava.lang.ClassLoader;Ljava.lang.String;[B)[B(JRockitPreProcessor.java:85)
    at jrockit.vm.ClassPreProcessorManager.notifyClassPreProcessor(ILjava.lang.String;[B)[B(Unknown Source)
    at jrockit.vm.Classes.defineClass0(ILjava.lang.String;[BII)I(Unknown Source)
    at jrockit.vm.Classes.defineClass(Ljava.lang.ClassLoader;Ljava.lang.String;[BII)Ljava.lang.Class;(Unknown Source)
    at java.lang.ClassLoader.defineClass(Ljava.lang.String;[BIILjava.security.ProtectionDomain;)Ljava.lang.Class;(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Ljava.lang.String;[BIILjava.security.CodeSource;)Ljava.lang.Class;(SecureClassLoader.java:123)
    at java.net.URLClassLoader.defineClass(Ljava.lang.String;Lsun.misc.Resource;)Ljava.lang.Class;(URLClassLoader.java:251)
    at java.net.URLClassLoader.access$100(Ljava.net.URLClassLoader;Ljava.lang.String;Lsun.misc.Resource;)Ljava.lang.Class;(URLClassLoader.java:55)
    at java.net.URLClassLoader$1.run()Ljava.lang.Object;(URLClassLoader.java:194)
    at jrockit.vm.AccessController.do_privileged_exc(Ljava.security.PrivilegedExceptionAction;Ljava.security.AccessControlContext;I)Ljava.lang.Object;(Unknown Source)
    at jrockit.vm.AccessController.doPrivileged(Ljava.security.PrivilegedExceptionAction;Ljava.security.AccessControlContext;)Ljava.lang.Object;(Unknown Source)
    at java.net.URLClassLoader.findClass(Ljava.lang.String;)Ljava.lang.Class;(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(Ljava.lang.String;Z)Ljava.lang.Class;(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Ljava.lang.String;Z)Ljava.lang.Class;(Launcher.java:274)
    at java.lang.ClassLoader.loadClass(Ljava.lang.String;)Ljava.lang.Class;(Unknown Source)
    at java.lang.ClassLoader.loadClassFromNative(II)Ljava.lang.Class;(Unknown Source)
    at jrockit.vm.Classes.defineClass0(ILjava.lang.String;[BII)I(Unknown Source)


I did some research and found that if oraclepki.jar which has the OracleWallet class is not in the classpath, we get this error. If I add that to the classpath along with ojdbc14.jar, we do not get this error. However the oraclepki.jar is not mandatory for oracle driver to work, so aspectwerkz preprocessor should be able to preprocess the OracleDriver even if oraclepki.jar is not in classpath.

I tried to look through the source code and saw that even if we fail to obtain a dependent class as stream, we still call new ASMClassInfo(stream) on it which causes this exception and hence complete preprocessing fails. I looked at the CVS repository and see that there has been some change in version 1.15 of AsmClassInfo which probably resulted in this. (http://cvs.aspectwerkz.codehaus.org/browse/aspectwerkz/aspectwerkz4/src/main/org/codehaus/aspectwerkz/reflect/impl/asm/AsmClassInfo.java?r1=1.14&r2=1.15)

if (componentClassAsStream == null) {
                // might be more than one dimension
                if (componentName.indexOf('[') > 0) {
                    return getClassInfo(componentName, loader);
                }
                System.out.println(
                        "AW::WARNING - could not load class ["
                        + componentName
                        + "] as a resource in loader ["
                        + loader
                        + "]"
                );
                componentInfo = new ClassInfo.NullClassInfo();
            }
//The 1.14 version returned the ClassInfo.NullClassInfo() if componentClassAsStream was null and did not proceed further
            try {
                componentInfo = AsmClassInfo.getClassInfo(componentClassAsStream, loader, lazyAttributes);
            } finally {
                try {
                    componentClassAsStream.close();
                } catch (Exception e) {
                    ;
                }
            }


Any help with this will be greatly appreciated

Thanks Much
Amit







Be a better friend, newshound, and know-it-all with Yahoo! Mobile. Try it now.