From e6a707af677f170f3dbf41081f6ff296b90437d1 Mon Sep 17 00:00:00 2001 From: aclement Date: Thu, 12 Oct 2006 19:58:09 +0000 Subject: [PATCH] test and fix for 160674: simpler strategy for loading bytecode on SAP --- .../bcel/util/ClassLoaderRepository.java | 6 +- .../util/NonCachingClassLoaderRepository.java | 167 ++++++++++++++++++ lib/bcel/bcel-src.zip | Bin 880253 -> 882691 bytes lib/bcel/bcel.jar | Bin 610708 -> 612466 bytes tests/bugs153/pr160674/MyAspect.java | 12 ++ tests/bugs153/pr160674/MyClass.java | 12 ++ tests/bugs153/pr160674/aop.xml | 7 + .../systemtest/ajc153/Ajc153Tests.java | 1 + .../org/aspectj/systemtest/ajc153/ajc153.xml | 22 +++ weaver/src/org/aspectj/weaver/World.java | 11 +- .../org/aspectj/weaver/bcel/BcelWorld.java | 12 +- .../reflect/Java15AnnotationFinder.java | 6 +- 12 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 bcel-builder/src/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository.java create mode 100644 tests/bugs153/pr160674/MyAspect.java create mode 100644 tests/bugs153/pr160674/MyClass.java create mode 100644 tests/bugs153/pr160674/aop.xml diff --git a/bcel-builder/src/org/aspectj/apache/bcel/util/ClassLoaderRepository.java b/bcel-builder/src/org/aspectj/apache/bcel/util/ClassLoaderRepository.java index 2f7325186..f7cdee26b 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/util/ClassLoaderRepository.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/util/ClassLoaderRepository.java @@ -80,7 +80,7 @@ import org.aspectj.apache.bcel.classfile.JavaClass; * * @see org.aspectj.apache.bcel.Repository * - * @version $Id: ClassLoaderRepository.java,v 1.8 2006/08/21 15:23:58 aclement Exp $ + * @version $Id: ClassLoaderRepository.java,v 1.9 2006/10/12 19:58:18 aclement Exp $ * @author M. Dahm * @author David Dixon-Peugh */ @@ -261,7 +261,7 @@ public class ClassLoaderRepository implements Repository { long time = System.currentTimeMillis(); java.net.URL url = toURL(className); timeManipulatingURLs += (System.currentTimeMillis() - time); - if (url==null) throw new ClassNotFoundException(className + " not found."); + if (url==null) throw new ClassNotFoundException(className + " not found - unable to determine URL"); JavaClass clazz = null; @@ -282,7 +282,7 @@ public class ClassLoaderRepository implements Repository { String classFile = className.replace('.', '/'); InputStream is = (useSharedCache?url.openStream():loader.getResourceAsStream( classFile + ".class" )); if (is == null) { - throw new ClassNotFoundException(className + " not found."); + throw new ClassNotFoundException(className + " not found "+(url==null?"":"- using url "+url)); } ClassParser parser = new ClassParser( is, className ); clazz = parser.parse(); diff --git a/bcel-builder/src/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository.java b/bcel-builder/src/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository.java new file mode 100644 index 000000000..20c82006d --- /dev/null +++ b/bcel-builder/src/org/aspectj/apache/bcel/util/NonCachingClassLoaderRepository.java @@ -0,0 +1,167 @@ +package org.aspectj.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.WeakHashMap; + +import org.aspectj.apache.bcel.classfile.ClassParser; +import org.aspectj.apache.bcel.classfile.JavaClass; + +/** + * The repository maintains information about which classes have + * been loaded. + * + * It loads its data from the ClassLoader implementation + * passed into its constructor. + * + * @see org.aspectj.apache.bcel.Repository + * + * @version $Id: NonCachingClassLoaderRepository.java,v 1.1 2006/10/12 19:58:18 aclement Exp $ + * @author M. Dahm + * @author David Dixon-Peugh + * + */ +public class NonCachingClassLoaderRepository + implements Repository +{ + private static java.lang.ClassLoader bootClassLoader = null; + + private java.lang.ClassLoader loader; + private WeakHashMap loadedClasses = + new WeakHashMap(); // CLASSNAME X JAVACLASS + + public NonCachingClassLoaderRepository( java.lang.ClassLoader loader ) { + this.loader = (loader != null) ? loader : getBootClassLoader(); + } + + private static synchronized java.lang.ClassLoader getBootClassLoader() { + if (bootClassLoader == null) { + bootClassLoader = new URLClassLoader(new URL[0]); + } + return bootClassLoader; + } + + /** + * Store a new JavaClass into this Repository. + */ + public void storeClass( JavaClass clazz ) { + loadedClasses.put( clazz.getClassName(), + clazz ); + clazz.setRepository( this ); + } + + /** + * Remove class from repository + */ + public void removeClass(JavaClass clazz) { + loadedClasses.remove(clazz.getClassName()); + } + + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass( String className ) { + if ( loadedClasses.containsKey( className )) { + return (JavaClass) loadedClasses.get( className ); + } else { + return null; + } + } + + /** + * Lookup a JavaClass object from the Class Name provided. + */ + public JavaClass loadClass( String className ) + throws ClassNotFoundException + { + String classFile = className.replace('.', '/'); + + JavaClass RC = findClass( className ); + if (RC != null) { return RC; } + + try { + InputStream is = + loader.getResourceAsStream( classFile + ".class" ); + + if(is == null) { + throw new ClassNotFoundException(className + " not found."); + } + + ClassParser parser = new ClassParser( is, className ); + RC = parser.parse(); + + storeClass( RC ); + + return RC; + } catch (IOException e) { + throw new ClassNotFoundException( e.toString() ); + } + } + + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + return loadClass(clazz.getName()); + } + + /** Clear all entries from cache. + */ + public void clear() { + loadedClasses.clear(); + } +} + diff --git a/lib/bcel/bcel-src.zip b/lib/bcel/bcel-src.zip index 0874f3767a6514305203e7849add8d3f89e054f6..54bfb3bcbc3f56bf803dcb2de197a4215b6c1faa 100644 GIT binary patch delta 17714 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 TB|Zuhh52!Xgd}K`cwzm2dR4b9 diff --git a/lib/bcel/bcel.jar b/lib/bcel/bcel.jar index b07a9820df7125cedbbba2ceaab472fae855ffc9..d49a8846cf03a2f021de81e61f725c727fcccf65 100644 GIT binary patch delta 17784 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 CF$=o@ delta 16312 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 + + + + + + diff --git a/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java b/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java index e1838f627..88435cf39 100644 --- a/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc153/Ajc153Tests.java @@ -28,6 +28,7 @@ public class Ajc153Tests extends org.aspectj.testing.XMLBasedAjcTestCase { // public void testCFlowXMLAspectLTW_pr149096() { runTest("cflow xml concrete aspect"); } // public void testAmbiguousBinding_pr121805() { runTest("ambiguous binding");} // public void testNegatedAnnotationMatchingProblem_pr153464() { runTest("negated annotation matching problem");} + public void testTurningOffBcelCaching_pr160674() { runTest("turning off bcel caching");} public void testNoIllegalStateExceptionWithGenericInnerAspect_pr156058() { runTest("no IllegalStateException with generic inner aspect"); } public void testNoIllegalStateExceptionWithGenericInnerAspect_pr156058_2() { runTest("no IllegalStateException with generic inner aspect - 2"); } public void testDeclareMethodAnnotations_pr159143() { runTest("declare method annotations");} diff --git a/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml b/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml index a6ddc8ec8..27b7effc1 100644 --- a/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml +++ b/tests/src/org/aspectj/systemtest/ajc153/ajc153.xml @@ -117,6 +117,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/weaver/src/org/aspectj/weaver/World.java b/weaver/src/org/aspectj/weaver/World.java index a670f0eb5..fb5fe193b 100644 --- a/weaver/src/org/aspectj/weaver/World.java +++ b/weaver/src/org/aspectj/weaver/World.java @@ -109,6 +109,7 @@ public abstract class World implements Dump.INode { private boolean fastDelegateSupportEnabled = isASMAround; private boolean runMinimalMemory = false; private boolean shouldPipelineCompilation = true; + protected boolean bcelRepositoryCaching = xsetBCEL_REPOSITORY_CACHING_DEFAULT.equalsIgnoreCase("true"); private boolean completeBinaryTypes = false; public boolean forDEBUG_structuralChangesCode = false; public boolean forDEBUG_bridgingCode = false; @@ -787,10 +788,12 @@ public abstract class World implements Dump.INode { public final static String xsetRUN_MINIMAL_MEMORY ="runMinimalMemory"; // default true public final static String xsetDEBUG_STRUCTURAL_CHANGES_CODE = "debugStructuralChangesCode"; // default false public final static String xsetDEBUG_BRIDGING = "debugBridging"; // default false + public final static String xsetBCEL_REPOSITORY_CACHING = "bcelRepositoryCaching"; public final static String xsetPIPELINE_COMPILATION = "pipelineCompilation"; public final static String xsetPIPELINE_COMPILATION_DEFAULT = "true"; public final static String xsetCOMPLETE_BINARY_TYPES = "completeBinaryTypes"; public final static String xsetCOMPLETE_BINARY_TYPES_DEFAULT = "false"; + public final static String xsetBCEL_REPOSITORY_CACHING_DEFAULT = "true"; public boolean isInJava5Mode() { return behaveInJava5Way; @@ -1175,7 +1178,13 @@ public abstract class World implements Dump.INode { getMessageHandler().handleMessage(MessageUtil.info("[activateLightweightDelegates=false] Disabling optimization to use lightweight delegates for non-woven types")); } - String s = p.getProperty(xsetPIPELINE_COMPILATION,xsetPIPELINE_COMPILATION_DEFAULT); + String s = p.getProperty(xsetBCEL_REPOSITORY_CACHING,xsetBCEL_REPOSITORY_CACHING_DEFAULT); + bcelRepositoryCaching = s.equalsIgnoreCase("true"); + if (!bcelRepositoryCaching) { + getMessageHandler().handleMessage(MessageUtil.info("[bcelRepositoryCaching=false] AspectJ will not use a bcel cache for class information")); + } + + s = p.getProperty(xsetPIPELINE_COMPILATION,xsetPIPELINE_COMPILATION_DEFAULT); shouldPipelineCompilation = s.equalsIgnoreCase("true"); s = p.getProperty(xsetCOMPLETE_BINARY_TYPES,xsetCOMPLETE_BINARY_TYPES_DEFAULT); diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java index a34454c8d..5dfeba271 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java @@ -48,6 +48,7 @@ import org.aspectj.apache.bcel.generic.PUTSTATIC; import org.aspectj.apache.bcel.generic.Type; import org.aspectj.apache.bcel.util.ClassLoaderRepository; import org.aspectj.apache.bcel.util.ClassPath; +import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository; import org.aspectj.apache.bcel.util.Repository; import org.aspectj.bridge.IMessageHandler; import org.aspectj.weaver.Advice; @@ -155,10 +156,18 @@ public class BcelWorld extends World implements Repository { setMessageHandler(handler); setCrossReferenceHandler(xrefHandler); // Tell BCEL to use us for resolving any classes - delegate = new ClassLoaderRepository(loader); + delegate = getClassLoaderRepositoryFor(loader); // TODO Alex do we need to call org.aspectj.apache.bcel.Repository.setRepository(delegate); // if so, how can that be safe in J2EE ?? (static stuff in Bcel) } + + public Repository getClassLoaderRepositoryFor(ClassLoader loader) { + if (bcelRepositoryCaching) { + return new ClassLoaderRepository(loader); + } else { + return new NonCachingClassLoaderRepository(loader); + } + } public void addPath (String name) { classPath.addPath(name, this.getMessageHandler()); @@ -355,6 +364,7 @@ public class BcelWorld extends World implements Repository { if (trace.isTraceEnabled()) trace.event("lookupJavaClass",this,new Object[] { name, jc }); return jc; } catch (ClassNotFoundException e) { + if (trace.isTraceEnabled()) trace.error("Unable to find class '"+name+"' in repository",e); return null; } } diff --git a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15AnnotationFinder.java b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15AnnotationFinder.java index be8d9fd62..c89278b2b 100644 --- a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15AnnotationFinder.java +++ b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15AnnotationFinder.java @@ -24,8 +24,8 @@ import java.util.Set; import org.aspectj.apache.bcel.classfile.JavaClass; import org.aspectj.apache.bcel.classfile.LocalVariable; import org.aspectj.apache.bcel.classfile.LocalVariableTable; +import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository; import org.aspectj.apache.bcel.util.Repository; -import org.aspectj.apache.bcel.util.ClassLoaderRepository; import org.aspectj.weaver.ResolvedType; import org.aspectj.weaver.UnresolvedType; import org.aspectj.weaver.World; @@ -45,7 +45,9 @@ public class Java15AnnotationFinder implements AnnotationFinder, ArgNameFinder { } public void setClassLoader(ClassLoader aLoader) { - this.bcelRepository = new ClassLoaderRepository(aLoader); + // TODO: No easy way to ask the world factory for the right kind of repository so + // default to the safe one! (pr160674) + this.bcelRepository = new NonCachingClassLoaderRepository(aLoader); this.classLoader = aLoader; } -- 2.39.5