[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