Index: src/org/aspectj/weaver/loadtime/Aj.java =================================================================== RCS file: /home/technology/org.aspectj/modules/loadtime/src/org/aspectj/weaver/loadtime/Aj.java,v retrieving revision 1.15 diff -u -r1.15 Aj.java --- src/org/aspectj/weaver/loadtime/Aj.java 13 Dec 2005 22:23:24 -0000 1.15 +++ src/org/aspectj/weaver/loadtime/Aj.java 4 Jan 2006 07:52:11 -0000 @@ -52,8 +52,8 @@ */ public byte[] preProcess(String className, byte[] bytes, ClassLoader loader) { //TODO AV needs to doc that - if (loader == null || className == null) { - // skip boot loader or null classes (hibernate) + if (loader == null || className == null || className.startsWith("org/aspectj/")) { + // skip boot loader, null classes (hibernate), and any AspectJ implementation classes (if weaving into aspectjweaver.jar) return bytes; } @@ -117,21 +117,30 @@ static class ExplicitlyInitializedClassLoaderWeavingAdaptor { private final ClassLoaderWeavingAdaptor weavingAdaptor; - private boolean isInitialized; + private final static int NOT_INITIALIZED = 0; + private final static int IS_INITIALIZING = 1; + private final static int FINISHED_INITIALIZING = 2; + private int initializationState; public ExplicitlyInitializedClassLoaderWeavingAdaptor(ClassLoaderWeavingAdaptor weavingAdaptor) { this.weavingAdaptor = weavingAdaptor; - this.isInitialized = false; + this.initializationState = NOT_INITIALIZED; } private void initialize(ClassLoader loader, IWeavingContext weavingContext) { - if (!isInitialized) { - isInitialized = true; + //thread safety? + if (initializationState == NOT_INITIALIZED) { + initializationState = IS_INITIALIZING; weavingAdaptor.initialize(loader, weavingContext); + initializationState = FINISHED_INITIALIZING; } } - + public ClassLoaderWeavingAdaptor getWeavingAdaptor(ClassLoader loader, IWeavingContext weavingContext) { + if (initializationState == IS_INITIALIZING) { + // can't weave myself while initializing: the null return causes the system to return unwoven bytes + return null; + } initialize(loader, weavingContext); return weavingAdaptor; }