[Jboss-cvs] JBossAS SVN: r55369 - in trunk/aop/src/main/org/jboss/aop: . classpool instrument
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Aug 7 11:51:05 EDT 2006
Author: kabir.khan at jboss.com
Date: 2006-08-07 11:51:02 -0400 (Mon, 07 Aug 2006)
New Revision: 55369
Modified:
trunk/aop/src/main/org/jboss/aop/AspectManager.java
trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
trunk/aop/src/main/org/jboss/aop/instrument/TransformerCommon.java
Log:
Small fixes to avoid ClassCastExceptions when running with MC without weaving
Modified: trunk/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- trunk/aop/src/main/org/jboss/aop/AspectManager.java 2006-08-07 14:54:31 UTC (rev 55368)
+++ trunk/aop/src/main/org/jboss/aop/AspectManager.java 2006-08-07 15:51:02 UTC (rev 55369)
@@ -48,7 +48,6 @@
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;
@@ -74,8 +73,8 @@
import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
import javassist.ClassPool;
import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPool;
import javassist.scopedpool.ScopedClassPoolFactory;
-import javassist.scopedpool.ScopedClassPoolRepositoryImpl;
/**
* This singleton class manages all pointcuts and metadata.
@@ -99,17 +98,17 @@
protected final WeakHashMap advisors = new WeakHashMap();
/** A map of domains by classloader, maintaned by the top level AspectManager */
protected final WeakHashMap scopedClassLoaderDomains = new WeakHashMap();
-
+
/** A map of domains by class, maintaned by the top level AspectManager */
protected final WeakHashMap subDomainsPerClass = new WeakHashMap();
-
+
/** Each domain may have sub domains interested in changes happening in this manager/domain */
protected final WeakHashMap subscribedSubDomains = new WeakHashMap();
-
+
/** A queue for adding new subscribed subdomains to */
protected final WeakHashMap subscribedSubDomainsQueue = new WeakHashMap();
protected int subscribedDomainQueueRef;
-// protected ClassPool classpool;
+
protected final LinkedHashMap interfaceIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationIntroductions = new LinkedHashMap();
protected final LinkedHashMap annotationOverrides = new LinkedHashMap();
@@ -124,15 +123,15 @@
protected final ConcurrentReaderHashMap aspectDefinitions = new ConcurrentReaderHashMap();
protected final ConcurrentReaderHashMap perVMAspects = new ConcurrentReaderHashMap();
- /** class name prefixes to explicitly exclude unless contained in include. Maintained by top-level AspectManager */
+ /** class name prefixes to explicitly exclude unless contained in include. Maintained by top-level AspectManager */
protected final ArrayList exclude = new ArrayList();
-
- /** class name prefixes to explicitly include, this overrides whatever was set in exclude. Maintained by top-level AspectManager */
+
+ /** class name prefixes to explicitly include, this overrides whatever was set in exclude. Maintained by top-level AspectManager */
protected final ArrayList include = new ArrayList();
-
+
/** A set of wildcard enabled classnames that will be ignored no matter if they have been included. Maintained by top-level AspectManager */
protected final ArrayList ignore = new ArrayList();
-
+
/** ClassExpressions built from ignore. Maintained by top-level AspectManager */
protected ClassExpression[] ignoreExpressions = new ClassExpression[0];
@@ -167,7 +166,7 @@
protected DynamicAOPStrategy dynamicStrategy = new LoadInterceptedClassesStrategy();
// indicates that the transformation process has begun
protected boolean transformationStarted = false;
-
+
//This will be set by the AspectManagerService if running in JBoss
public static AOPScopedClassLoaderHelper scopedCLHelper;
@@ -241,9 +240,9 @@
}
ClassLoader topUcl = scopedCLHelper.getTopLevelJBossClassLoader();
return instance(topUcl);
-
+
}
-
+
public static synchronized AspectManager instance()
{
return instance(Thread.currentThread().getContextClassLoader());
@@ -251,7 +250,7 @@
public static synchronized AspectManager instance(ClassLoader loadingClassLoader)
{
- if (manager == null)
+ if (manager == null)
{
AccessController.doPrivileged(new PrivilegedAction()
{
@@ -269,7 +268,7 @@
}
manager = new AspectManager();
AOPClassPoolRepository.getInstance().setAspectManager(manager);
-
+
if (!verbose)
{
verbose = (new Boolean(System.getProperty("jboss.aop.verbose", "false"))).booleanValue();
@@ -307,32 +306,32 @@
}
manager.setIgnore(list);
}
-
+
String instrument = System.getProperty("jboss.aop.instrumentor", null);
InstrumentorFactory.initialise(instrument);
-
+
String advisorName = System.getProperty("jboss.aop.advisor", null);
AdvisorFactory.initialise(advisorName);
-
+
String debugClass = System.getProperty("jboss.aop.debug.classes", null);
if (debugClass != null)
{
debugClasses = (new Boolean(debugClass)).booleanValue();
}
-
+
String classic = System.getProperty("jboss.aop.classicorder", null);
if (classic != null)
{
classicOrder = (new Boolean(classic)).booleanValue();
}
-
+
Deployment.deploy();
return null;
}
});
}
-
+
if (scopedCLHelper != null)
{
ClassLoader scopedClassLoader = scopedCLHelper.ifScopedDeploymentGetScopedParentUclForCL(loadingClassLoader);
@@ -347,21 +346,21 @@
scopedManager = new Domain(manager, false);
if (verbose)
{
- System.out.println("Created domain " + scopedManager + " for scoped deployment on: " +
+ System.out.println("Created domain " + scopedManager + " for scoped deployment on: " +
loadingClassLoader + "; identifying scoped ucl: " + scopedClassLoader);
}
scopedManager.setInheritsBindings(true);
scopedManager.setInheritsDeclarations(true);
manager.scopedClassLoaderDomains.put(scopedClassLoader, scopedManager);
}
- }
+ }
return scopedManager;
}
- }
+ }
return manager;
}
-
+
public LinkedHashMap getPointcuts()
{
return pointcuts;
@@ -390,15 +389,15 @@
public DynamicCFlow getDynamicCFlow(String name)
{
DynamicCFlowDefinition def = (DynamicCFlowDefinition) dynamicCFlows.get(name);
-
+
if (def != null)
{
return def.create();
}
return null;
}
-
+
/* (non-Javadoc)
* @see org.jboss.aop.Manager#addDynamicCFlow(java.lang.String, org.jboss.aop.advice.DynamicCFlowDefinition)
*/
@@ -436,7 +435,7 @@
*/
public AspectManager()
{
-
+
}
/**
* Every <class-metadata> tag corresponds to
@@ -476,7 +475,7 @@
{
return advisors;
}
-
+
public Advisor getAdvisor(String name)
{
/*
@@ -497,7 +496,7 @@
{
return subDomainsPerClass;
}
-
+
public Advisor findAdvisor(Class clazz)
{
if (getSubDomainsPerClass().size() > 0)
@@ -536,7 +535,7 @@
{
return (ClassAdvisor)getAnyAdvisorIfAdvised(clazz);
}
-
+
/**
* Take into account that an advisor may be a container
*/
@@ -594,7 +593,7 @@
{
advisors.put(clazz, new WeakReference(advisor));
}
-
+
registerClass(clazz);
advisor.attachClass(clazz);
InterceptorChainObserver observer = dynamicStrategy.getInterceptorChainObserver(clazz);
@@ -631,7 +630,7 @@
synchronized (getRegisteredCLs())
{
if (!advisors.containsKey(advisor.getClazz())) return false;
- AOPClassPool pool = (AOPClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
+ ScopedClassPool pool = (ScopedClassPool) getRegisteredClassPool(advisor.getClazz().getClassLoader());
if (pool == null) return false;
if (pool.isUnloadedClassLoader())
{
@@ -659,7 +658,7 @@
{
return (ClassPool)getRegisteredCLs().get(cl);
}
-
+
public ClassPool registerClassLoader(ClassLoader ucl)
{
return AOPClassPoolRepository.getInstance().registerClassLoader(ucl);
@@ -674,14 +673,14 @@
{
return scopedClassLoaderDomains;
}
-
+
public void unregisterClassLoader(ClassLoader cl)
{
AOPClassPoolRepository.getInstance().unregisterClassLoader(cl);
//top-level only
getScopedClassLoaderDomains().remove(cl);
}
-
+
public ArrayList getExclude()
{
return exclude;
@@ -708,7 +707,7 @@
{
return ignore;
}
-
+
public ClassExpression[] getIgnoreExpressions()
{
return ignoreExpressions;
@@ -765,22 +764,22 @@
{
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;
@@ -866,7 +865,7 @@
{
if (TransformerCommon.isCompileTime() || classicOrder)
{
- weavingStrategy = new ClassicWeavingStrategy();
+ weavingStrategy = new ClassicWeavingStrategy();
}
else if(InstrumentorFactory.getInstrumentor(this,dynamicStrategy.getJoinpointClassifier())
instanceof GeneratedAdvisorInstrumentor)
@@ -875,11 +874,11 @@
}
else
{
- weavingStrategy = new ClassicWeavingStrategy();
+ weavingStrategy = new ClassicWeavingStrategy();
}
}
}
-
+
return weavingStrategy.translate(this, className, loader, classfileBuffer);
}
catch (Exception e)
@@ -936,18 +935,18 @@
}
forceResortPrecedenceDefs();
}
-
+
public void removePrecedence(String name)
{
synchronized (precedenceDefs)
{
precedenceDefs.remove(name);
}
-
+
forceResortPrecedenceDefs();
}
-
+
protected void forceResortPrecedenceDefs()
{
synchronized (precedenceDefs)
@@ -1073,7 +1072,7 @@
if (advisor != null) return advisor;
if (Advised.class.isAssignableFrom(clazz))
{
-
+
Class superClass = clazz;
try
{
@@ -1266,10 +1265,10 @@
synchronized (bindings)
{
int bindSize = binds.size();
-
+
for (int i = 0; i < bindSize; i++)
{
-
+
AdviceBinding binding = (AdviceBinding) bindings.get(binds.get(i));
if (binding == null)
{
@@ -1291,7 +1290,7 @@
if (!isAdvisorRegistered(advisor))
{
//Check sub domains in case of generated advisors
-
+
WeakReference ref = (WeakReference)getSubDomainsPerClass().get(advisor.getClazz());
Domain domain = null;
if (ref != null) domain = (Domain)ref.get();
@@ -1341,7 +1340,7 @@
this.dynamicStrategy.interceptorChainsUpdated();
}
-
+
public void updateAdvisorsForAddedBinding(AdviceBinding binding)
{
synchronized (advisors)
@@ -1355,7 +1354,7 @@
{
Advisor advisor = getAdvisorFromAdvisorsKeySetIterator(it);
if (advisor == null) continue;
-
+
if (binding.getPointcut().softMatch(advisor))
{
if (AspectManager.verbose)
@@ -1405,15 +1404,15 @@
public void addClassMetaData(ClassMetaDataBinding meta)
{
removeClassMetaData(meta.getName());
-
+
updateAdvisorsForAddedClassMetaData(meta);
-
+
synchronized (classMetaData)
{
classMetaData.put(meta.getName(), meta);
}
}
-
+
protected void updateAdvisorsForAddedClassMetaData(ClassMetaDataBinding meta)
{
synchronized (advisors)
@@ -1463,7 +1462,7 @@
}
}
}
-
+
//--- Introductions
/**
@@ -1622,7 +1621,7 @@
{
Advisor advisor = getAdvisorFromAdvisorsKeySetIterator(it);
if (advisor == null) continue;
-
+
advisor.deployAnnotationOverride(introduction);
}
}
@@ -1641,8 +1640,8 @@
}
}
}
-
-
+
+
/**
* remove an annotation pointcut
*/
@@ -1853,7 +1852,7 @@
subscribedSubDomains.remove(domain);
}
}
-
+
private Advisor getAdvisorFromAdvisorsKeySetIterator(Iterator it)
{
Class clazz = (Class) it.next();
@@ -1875,7 +1874,7 @@
/**
* When running in the microcontainer with aspects installed as beans, a ClassProxyContainer will be created per bean
- * to check if this bean needs interceptors, each container creates a sunscribed domain for matching. This subscribed
+ * to check if this bean needs interceptors, each container creates a sunscribed domain for matching. This subscribed
* domain is added to a queue, which is checked when we need to iterate over the subscribed domains.
*/
private boolean copySubDomainsFromQueue(boolean increment)
@@ -1884,18 +1883,18 @@
synchronized (subscribedSubDomains)
{
if (!increment && subscribedDomainQueueRef > 0) subscribedDomainQueueRef--;
-
+
if (subscribedDomainQueueRef == 0 && subscribedSubDomainsQueue.size() > 0){
subscribedSubDomains.putAll(subscribedSubDomainsQueue);
subscribedSubDomainsQueue.clear();
copied = true;
}
-
+
if (increment) subscribedDomainQueueRef++;
- }
+ }
return copied;
- }
-
+ }
+
/*
public void dumpSubDomainsAndAdvisors(int indent)
{
@@ -1919,7 +1918,7 @@
indent--;
indent(indent);
System.out.println("</Advisors>");
-
+
indent(indent);
System.out.println("<Sub domains>");
indent++;
@@ -1932,9 +1931,9 @@
indent(indent);
System.out.println("</Sub domains>");
indent--;
-
+
}
-
+
private void indent(int indent)
{
for (int i = 0 ; i < indent ; i++) System.out.print(" ");
Modified: trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java
===================================================================
--- trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java 2006-08-07 14:54:31 UTC (rev 55368)
+++ trunk/aop/src/main/org/jboss/aop/classpool/AOPClassPool.java 2006-08-07 15:51:02 UTC (rev 55369)
@@ -185,6 +185,14 @@
public String toString()
{
- return super.toString() + " - dcl " + getClassLoader();
+ ClassLoader cl = null;
+ try
+ {
+ cl = getClassLoader();
+ }
+ catch(IllegalStateException ignore)
+ {
+ }
+ return super.toString() + " - dcl " + cl;
}
}
Modified: trunk/aop/src/main/org/jboss/aop/instrument/TransformerCommon.java
===================================================================
--- trunk/aop/src/main/org/jboss/aop/instrument/TransformerCommon.java 2006-08-07 14:54:31 UTC (rev 55368)
+++ trunk/aop/src/main/org/jboss/aop/instrument/TransformerCommon.java 2006-08-07 15:51:02 UTC (rev 55369)
@@ -41,7 +41,7 @@
import javassist.CtField;
import javassist.NotFoundException;
-/**
+/**
* A few handy methods and common things used by the other Transformers
* @author <a href="mailto:kabirkhan at bigfoot.com">Kabir Khan</a>
* @version $Revision$
@@ -52,19 +52,19 @@
final static URL[] NO_URLS = new URL[0];
final static CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
final static String WEAK_REFERENCE = WeakReference.class.getName();
-
+
public static boolean isCompileTime()
{
return Compiler.loader != null;
}
-
+
public static void compileOrLoadClass(CtClass classForPackage, CtClass newClass)
{
compileOrLoadClass(classForPackage, newClass, isCompileTime());
}
-
- /** Compiles the class to file or adds it to the class pool
- *
+
+ /** Compiles the class to file or adds it to the class pool
+ *
* @param classForPackage The class to be used to determine the directory to place the class in
* @param invocation The class to be comiled/added to class pool
* @throws Exception
@@ -73,7 +73,7 @@
{
try
{
- ((AOPClassPool)newClass.getClassPool()).registerGeneratedClass(newClass.getName());
+ registerGeneratedClass(newClass);
// If compile time
if (compile)
{
@@ -106,7 +106,7 @@
ToClassAction.PRIVILEGED.toClass(newClass, null);
}
}
-
+
if (AspectManager.debugClasses)
{
newClass.debugWriteFile();
@@ -120,7 +120,8 @@
public static Class toClass(CtClass newClass) throws CannotCompileException
{
- ((AOPClassPool)newClass.getClassPool()).registerGeneratedClass(newClass.getName());
+ registerGeneratedClass(newClass);
+
if (System.getSecurityManager() == null)
{
return ToClassAction.NON_PRIVILEGED.toClass(newClass, null);
@@ -133,7 +134,8 @@
public static Class toClass(CtClass newClass, ClassLoader loader) throws CannotCompileException
{
- ((AOPClassPool)newClass.getClassPool()).registerGeneratedClass(newClass.getName());
+ registerGeneratedClass(newClass);
+
if (System.getSecurityManager() == null)
{
return ToClassAction.NON_PRIVILEGED.toClass(newClass, loader);
@@ -144,7 +146,7 @@
}
}
- protected static void addInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
+ protected static void addInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
int modifiers, CtClass addTo, boolean weak, CtField.Initializer init) throws NotFoundException, CannotCompileException
{
if (weak)
@@ -156,8 +158,18 @@
addStrongReferenceInfoField(instrumentor, infoClassName, infoName, modifiers, addTo, init);
}
}
+
+ private static void registerGeneratedClass(CtClass newClass)
+ {
+ //TODO Maybe we should force a ScopedClassPool created by JBoss Retro to be an AOP classpool once AOP kicks in?
+ ClassPool pool = newClass.getClassPool();
+ if (pool instanceof AOPClassPool)
+ {
+ ((AOPClassPool)pool).registerGeneratedClass(newClass.getName());
+ }
+ }
- private static void addWeakReferenceInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
+ private static void addWeakReferenceInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
int modifiers, CtClass addTo, CtField.Initializer init) throws NotFoundException, CannotCompileException
{
CtClass type = instrumentor.forName(WEAK_REFERENCE);
@@ -165,8 +177,8 @@
field.setModifiers(modifiers);
addTo.addField(field, init);
}
-
- private static void addStrongReferenceInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
+
+ private static void addStrongReferenceInfoField(Instrumentor instrumentor, String infoClassName, String infoName,
int modifiers, CtClass addTo, CtField.Initializer init) throws NotFoundException, CannotCompileException
{
CtClass type = instrumentor.forName(infoClassName);
@@ -177,7 +189,7 @@
protected static String infoFromWeakReference(String infoClassName, String localName, String infoName)
{
- return infoClassName + " " + localName + " = (" + infoClassName + ")" + infoName + ".get();";
+ return infoClassName + " " + localName + " = (" + infoClassName + ")" + infoName + ".get();";
}
/**
@@ -190,7 +202,7 @@
inner.setSuperclass(superClass);
return inner;
}
-
+
/**
* Utility method to make a new class in a pool. It makes sure that the class is registered with the pool, so others can find it.
*/
@@ -200,7 +212,7 @@
CtClass inner = outer.makeNestedClass(name, true);
return inner;
}
-
+
/**
* Utility method to make a new class in a pool. It makes sure that the class is registered with the pool, so others can find it.
*/
@@ -209,7 +221,7 @@
registerGeneratedClass(pool, name);
return pool.makeClass(name);
}
-
+
/**
* Utility method to make a new class in a pool. It makes sure that the class is registered with the pool, so others can find it.
*/
@@ -218,7 +230,7 @@
registerGeneratedClass(pool, name);
return pool.makeClass(name, superClass);
}
-
+
private static void registerGeneratedClass(ClassPool pool, String name)
{
try
@@ -227,14 +239,14 @@
}
catch(ClassCastException e)
{
-
+
}
}
private interface ToClassAction
{
Class toClass(CtClass clazz, ClassLoader loader) throws CannotCompileException;
-
+
ToClassAction PRIVILEGED = new ToClassAction()
{
public Class toClass(final CtClass clazz, final ClassLoader loader) throws CannotCompileException
More information about the jboss-cvs-commits
mailing list