[jboss-cvs] jboss-aop/src/main/org/jboss/aop ...
Kabir Khan
kkhan at jboss.com
Thu Jul 13 14:31:09 EDT 2006
User: kkhan
Date: 06/07/13 14:31:09
Modified: src/main/org/jboss/aop ClassicWeavingStrategy.java
AspectManager.java Domain.java
SuperClassesFirstWeavingStrategy.java
Removed: src/main/org/jboss/aop
AOPScopedClassLoaderHelper.java AOPClassPool.java
ClassPoolFactory.java AOPClassPoolFactory.java
Log:
Refactor to wrap arouind ScopedClassPoolRepository and ScopedClassPool which has been moved to javassist
Revision Changes Path
1.6 +2 -1 jboss-aop/src/main/org/jboss/aop/ClassicWeavingStrategy.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ClassicWeavingStrategy.java
===================================================================
RCS file: /cvsroot/jboss/jboss-aop/src/main/org/jboss/aop/ClassicWeavingStrategy.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- ClassicWeavingStrategy.java 10 Jul 2006 19:09:29 -0000 1.5
+++ ClassicWeavingStrategy.java 13 Jul 2006 18:31:08 -0000 1.6
@@ -21,6 +21,7 @@
*/
package org.jboss.aop;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.instrument.Instrumentor;
import org.jboss.aop.instrument.InstrumentorFactory;
@@ -113,7 +114,7 @@
}
byte[] rtn = clazz.toBytecode();
- if (AspectManager.prune) clazz.prune();
+ if (AspectManager.getPrune()) clazz.prune();
return rtn;
}
else
1.165 +51 -159 jboss-aop/src/main/org/jboss/aop/AspectManager.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: AspectManager.java
===================================================================
RCS file: /cvsroot/jboss/jboss-aop/src/main/org/jboss/aop/AspectManager.java,v
retrieving revision 1.164
retrieving revision 1.165
diff -u -b -r1.164 -r1.165
--- AspectManager.java 12 Jul 2006 09:57:18 -0000 1.164
+++ AspectManager.java 13 Jul 2006 18:31:08 -0000 1.165
@@ -25,8 +25,6 @@
import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Collection;
@@ -50,6 +48,9 @@
import org.jboss.aop.advice.PrecedenceDefEntry;
import org.jboss.aop.advice.PrecedenceSorter;
import org.jboss.aop.advice.Scope;
+import org.jboss.aop.classpool.AOPClassPool;
+import org.jboss.aop.classpool.AOPClassPoolRepository;
+import org.jboss.aop.classpool.AOPScopedClassLoaderHelper;
import org.jboss.aop.instrument.GeneratedAdvisorInstrumentor;
import org.jboss.aop.instrument.Instrumentor;
import org.jboss.aop.instrument.InstrumentorFactory;
@@ -73,7 +74,8 @@
import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
import javassist.ClassPool;
import javassist.CtClass;
-import javassist.LoaderClassPath;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepositoryImpl;
/**
* This singleton class manages all pointcuts and metadata.
@@ -87,15 +89,14 @@
* to do that.
*
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision: 1.164 $
+ * @version $Revision: 1.165 $
*/
public class AspectManager
implements Translator
{
// Attributes ---------------------------------------------------
- protected final WeakHashMap registeredCLs = new WeakHashMap();
- protected final HashMap ucl2classes = new HashMap();
+ //protected static AOPClassPoolRepository classpoolRepository = new AOPClassPoolRepository(ScopedClassPoolRepositoryImpl.getInstance());
protected final WeakHashMap advisors = new WeakHashMap();
/** A map of domains by classloader, maintaned by the top level AspectManager */
@@ -110,7 +111,7 @@
/** A queue for adding new subscribed subdomains to */
protected final WeakHashMap subscribedSubDomainsQueue = new WeakHashMap();
protected int subscribedDomainQueueRef;
- protected ClassPool classpool;
+// protected ClassPool classpool;
protected final LinkedHashMap interfaceIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationOverrides = new LinkedHashMap();
@@ -225,7 +226,6 @@
protected static AspectManager manager;
public static boolean optimize = true;
- public static boolean prune = true;
public static boolean debugClasses;//If true, the generated advisor instrumentor will output the generated classes
public static ClassLoaderValidation classLoaderValidator;
@@ -233,7 +233,6 @@
* logging switch. We don't use log4j to avoid another heavy library
*/
public static boolean verbose = false;
- public static ClassPoolFactory classPoolFactory = new AOPClassPoolFactory();
public static synchronized AspectManager getTopLevelAspectManager()
{
@@ -268,7 +267,7 @@
String pruneit = System.getProperty("jboss.aop.prune", null);
if (pruneit != null)
{
- prune = (new Boolean(pruneit)).booleanValue();
+ AOPClassPoolRepository.getInstance().setPrune((new Boolean(pruneit)).booleanValue());
}
manager = new AspectManager();
@@ -341,7 +340,7 @@
if (scopedClassLoader != null)
{
Domain scopedManager = null;
- synchronized (manager.registeredCLs)
+ synchronized (AOPClassPoolRepository.getInstance().getRegisteredCLs())
{
scopedManager = (Domain)manager.scopedClassLoaderDomains.get(scopedClassLoader);
if (scopedManager == null)
@@ -432,14 +431,20 @@
public static boolean suppressReferenceErrors = true;
// Constructors -------------------------------------------------
- public AspectManager()
+ private AspectManager(AOPClassPoolRepository repository)
{
- classpool = ClassPool.getDefault();
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- classpool.insertClassPath(new LoaderClassPath(cl));
+ //This is the top-lvel aspect manager
+ AOPClassPoolRepository.getInstance().setAspectManager(this);
}
/**
+ * Called by subclasses
+ */
+ public AspectManager()
+ {
+
+ }
+ /**
* Every <class-metadata> tag corresponds to
* a ClassMetaDataLoader. The ClassMetaDataLoader knows how to take
* arbitrary XML and apply it to SimpleMetaData.
@@ -608,41 +613,17 @@
// Public -------------------------------------------------------
- public Map getRegisteredCLs()
+ public static Map getRegisteredCLs()
{
- clearUnregisteredClassLoaders();
- return registeredCLs;
+ return AOPClassPoolRepository.getInstance().getRegisteredCLs();
}
- private Map getRegisteredCLsNoClear()
- {
- return registeredCLs;
- }
/**
* This method will check to see if a register classloader has been undeployed (as in JBoss)
*/
- public void clearUnregisteredClassLoaders()
- {
- ArrayList toUnregister = null;
- synchronized (getRegisteredCLsNoClear())
- {
- Iterator it = getRegisteredCLsNoClear().values().iterator();
- while (it.hasNext())
- {
- AOPClassPool pool = (AOPClassPool) it.next();
- if (pool.isUnloadedClassLoader())
- {
- it.remove();
- }
- }
- if (toUnregister != null)
- {
- for (int i = 0; i < toUnregister.size(); i++)
+ public static void clearUnregisteredClassLoaders()
{
- unregisterClassLoader((ClassLoader) toUnregister.get(i));
- }
- }
- }
+ AOPClassPoolRepository.getInstance().clearUnregisteredClassLoaders();
}
/**
@@ -687,36 +668,12 @@
public ClassPool registerClassLoader(ClassLoader ucl)
{
- synchronized (getRegisteredCLs())
- {
- // FIXME: Probably want to take this method out later
- // so that AOP framework can be independent of JMX
- // This is in here so that we can remove a UCL from the ClassPool as a
- // ClassPool.classpath
- if (getRegisteredCLs().containsKey(ucl))
- {
- return (ClassPool) getRegisteredCLs().get(ucl);
- }
- AOPClassPool pool = AOPClassPool.createAOPClassPool(ucl, classpool, this);
- getRegisteredCLs().put(ucl, pool);
- return pool;
- }
- }
-
- protected Map getUcl2Classes()
- {
- return ucl2classes;
+ return AOPClassPoolRepository.getInstance().registerClassLoader(ucl);
}
protected void registerClass(Class clazz)
{
- HashSet classes = (HashSet) getUcl2Classes().get(clazz.getClassLoader());
- if (classes == null)
- {
- classes = new HashSet();
- getUcl2Classes().put(clazz.getClassLoader(), classes);
- }
- classes.add(clazz);
+ AOPClassPoolRepository.getInstance().registerClass(clazz);
}
protected Map getScopedClassLoaderDomains()
@@ -726,55 +683,10 @@
public void unregisterClassLoader(ClassLoader cl)
{
- if (System.getSecurityManager() == null)
- {
- UnregisterClassLoaderAction.NON_PRIVILEGED.unregister(this, cl);
- }
- else
- {
- UnregisterClassLoaderAction.PRIVILEGED.unregister(this, cl);
- }
- }
-
- private void doUnregisterClassLoader(ClassLoader cl)
- {
- synchronized (getRegisteredCLs())
- {
- AOPClassPool pool = (AOPClassPool) getRegisteredCLs().remove(cl);
- if (pool != null) pool.close();
- HashSet classes = (HashSet) getUcl2Classes().remove(cl);
- if (classes != null)
- {
- Iterator it = classes.iterator();
- while (it.hasNext())
- {
- Object clazz = it.next();
- synchronized (advisors)
- {
- advisors.remove(clazz);
- Class advisedClass = (Class)clazz;
- try
- {
- //The static advisor field should be the only remaining hard reference to the advisor
- Field f = advisedClass.getDeclaredField(Instrumentor.HELPER_FIELD_NAME);
- f.setAccessible(true);
- f.set(null, null);
- }
- catch(NoSuchFieldException e)
- {
- System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
- }
- catch(IllegalAccessException e)
- {
- System.out.println("[warn] Error unsetting advisor for " + advisedClass.getName() + " " + e);
- }
- }
- }
- }
-
+ AOPClassPoolRepository.getInstance().unregisterClassLoader(cl);
+ //top-level only
getScopedClassLoaderDomains().remove(cl);
}
- }
public ArrayList getExclude()
{
@@ -855,6 +767,26 @@
return false;
}
+ public static boolean getPrune()
+ {
+ return AOPClassPoolRepository.getInstance().isPrune();
+ }
+
+ public static void setPrune(boolean prune)
+ {
+ AOPClassPoolRepository.getInstance().setPrune(prune);
+ }
+
+ public static void setClassPoolFactory(ScopedClassPoolFactory factory)
+ {
+ AOPClassPoolRepository.getInstance().setClassPoolFactory(factory);
+ }
+
+ public static ScopedClassPoolFactory getClassPoolFactory()
+ {
+ return AOPClassPoolRepository.getInstance().getClassPoolFactory();
+ }
+
public boolean isNonAdvisableClassName(String classname)
{
if (ignoreClass(classname)) return true;
@@ -1970,46 +1902,6 @@
return copied;
}
- interface UnregisterClassLoaderAction
- {
- void unregister(AspectManager manager, ClassLoader loader);
-
- UnregisterClassLoaderAction PRIVILEGED = new UnregisterClassLoaderAction()
- {
- public void unregister(final AspectManager manager, final ClassLoader loader)
- {
- try
- {
- AccessController.doPrivileged(new PrivilegedExceptionAction()
- {
- public Object run()
- {
- manager.doUnregisterClassLoader(loader);
- return null;
- }
- });
- }
- catch (PrivilegedActionException e)
- {
- Exception ex = e.getException();
- if (ex instanceof RuntimeException)
- {
- throw (RuntimeException)ex;
- }
- throw new RuntimeException(ex);
- }
- }
- };
-
- UnregisterClassLoaderAction NON_PRIVILEGED = new UnregisterClassLoaderAction()
- {
- public void unregister(AspectManager manager, ClassLoader loader)
- {
- manager.doUnregisterClassLoader(loader);
- }
- };
- }
-
/*
public void dumpSubDomainsAndAdvisors(int indent)
{
1.14 +1 -14 jboss-aop/src/main/org/jboss/aop/Domain.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Domain.java
===================================================================
RCS file: /cvsroot/jboss/jboss-aop/src/main/org/jboss/aop/Domain.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- Domain.java 14 May 2006 13:04:24 -0000 1.13
+++ Domain.java 13 Jul 2006 18:31:08 -0000 1.14
@@ -46,7 +46,7 @@
* Comment
*
* @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision: 1.13 $
+ * @version $Revision: 1.14 $
*/
public class Domain extends AspectManager
{
@@ -678,19 +678,6 @@
//Methods that should delegate to the top AspectManager
/** Managed by the top-level aspect manager */
- public Map getRegisteredCLs()
- {
- //ClassLoaders etc. are only managed by the top-level AspectManager
- return parent.getRegisteredCLs();
- }
-
- /** Managed by the top-level aspect manager */
- protected Map getUcl2Classes()
- {
- return parent.getUcl2Classes();
- }
-
- /** Managed by the top-level aspect manager */
protected Map getScopedClassLoaderDomains()
{
return parent.getScopedClassLoaderDomains();
1.7 +30 -20 jboss-aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: SuperClassesFirstWeavingStrategy.java
===================================================================
RCS file: /cvsroot/jboss/jboss-aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- SuperClassesFirstWeavingStrategy.java 10 Jul 2006 19:09:29 -0000 1.6
+++ SuperClassesFirstWeavingStrategy.java 13 Jul 2006 18:31:08 -0000 1.7
@@ -23,6 +23,7 @@
import java.util.Map;
+import org.jboss.aop.classpool.AOPClassPool;
import org.jboss.aop.instrument.Instrumentor;
import org.jboss.aop.instrument.InstrumentorFactory;
@@ -58,6 +59,7 @@
{
return null;
}
+
AOPClassPool pool = (AOPClassPool) manager.registerClassLoader(loader);
CtClassTransformationInfo info = obtainCtClassInfo(pool, className, classfileBuffer);
@@ -70,7 +72,7 @@
info.getClazz().debugWriteFile();
}
byte[] rtn = info.getClazz().toBytecode();
- if (AspectManager.prune) info.getClazz().prune();
+ if (AspectManager.getPrune()) info.getClazz().prune();
return rtn;
}
else
@@ -120,6 +122,10 @@
pool.insertClassPath(cp);
return new CtClassTransformationInfo(pool.getLocally(className), className);
}
+ catch(Error e)
+ {
+ return null;
+ }
}
private CtClass instrumentClass(AspectManager manager, ClassLoader loader, AOPClassPool pool, CtClassTransformationInfo info, boolean isLoadedClass) throws NotFoundException, Exception
@@ -180,6 +186,9 @@
//info.getClazz().defrost();
}
+ boolean transformed = info.getClazz().isModified();
+ if (!transformed)
+ {
ClassAdvisor advisor =
AdvisorFactory.getClassAdvisor(info.getClazz(), manager);
Instrumentor instrumentor = InstrumentorFactory.getInstrumentor(
@@ -198,7 +207,8 @@
manager.attachMetaData(advisor, info.getClazz(), true);
manager.applyInterfaceIntroductions(advisor, info.getClazz());
- boolean transformed = instrumentor.transform(info.getClazz(), advisor);
+ transformed = instrumentor.transform(info.getClazz(), advisor);
+ }
if (transformed)
{
if (!isLoadedClass )
More information about the jboss-cvs-commits
mailing list