[jboss-cvs] JBossAS SVN: r67174 - in projects/aop/trunk/aop/src/main/org/jboss/aop: instrument and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Nov 16 10:06:23 EST 2007


Author: kabir.khan at jboss.com
Date: 2007-11-16 10:06:22 -0500 (Fri, 16 Nov 2007)
New Revision: 67174

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
Log:
[JBAOP-485] Override Instrumentor.isBaseClass() in GeneratedAdvisorInstrumentor
See JIRA issue for the slightly complicated scenario this fixes

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java	2007-11-16 14:59:22 UTC (rev 67173)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/SuperClassesFirstWeavingStrategy.java	2007-11-16 15:06:22 UTC (rev 67174)
@@ -50,8 +50,10 @@
 
    public byte[] translate(AspectManager manager, String className, ClassLoader loader, byte[] classfileBuffer) throws Exception
 	{
+//      System.out.println("-- Loading class " + className);
 		if (isReEntry())
 		{
+//		   System.out.println("XXXX REENTRY!!!!!!!!!!!!!");
 			return null;
 		}
 		setReEntry();
@@ -204,6 +206,7 @@
             manager.attachMetaData(advisor, info.getClazz(), true);
             manager.applyInterfaceIntroductions(advisor, info.getClazz());
 				transformed = instrumentor.transform(info.getClazz(), advisor);
+//				System.out.println("-- woven " + info.getClazz().getName() + " " + transformed);
          }
 			if (transformed)
 			{
@@ -213,6 +216,13 @@
 				}
 				return info.getClazz();
 			}
+			
+			if (isLoadedClass)
+			{
+			   pool.setClassLoadedButNotWoven(info.getClassName());
+//			   System.out.println("NOT WOVEN " + info.getClassName());
+			}
+			
 			return null;
 		}
 		catch(Exception e)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-11-16 14:59:22 UTC (rev 67173)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-11-16 15:06:22 UTC (rev 67174)
@@ -41,6 +41,7 @@
 import org.jboss.aop.MethodByConInfo;
 import org.jboss.aop.MethodByMethodInfo;
 import org.jboss.aop.MethodInfo;
+import org.jboss.aop.WeavingStrategySupport;
 import org.jboss.aop.classpool.AOPClassPool;
 
 /**
@@ -573,16 +574,47 @@
          "   } " +
          "   return " + INSTANCE_ADVISOR +";" +
          "}";
-      CtMethod getInstanceAdvisor = CtNewMethod.make(
-            forName("org.jboss.aop.InstanceAdvisor"),
-            "_getInstanceAdvisor",
-            new CtClass[0],
-            new CtClass[0],
-            body,
-            clazz);
-      clazz.addMethod(getInstanceAdvisor);
+      try
+      {
+         CtMethod getInstanceAdvisor = CtNewMethod.make(
+               forName("org.jboss.aop.InstanceAdvisor"),
+               "_getInstanceAdvisor",
+               new CtClass[0],
+               new CtClass[0],
+               body,
+               clazz);
+         clazz.addMethod(getInstanceAdvisor);
+      }
+      catch (Exception e)
+      {
+         // AutoGenerated
+         throw new RuntimeException(e);
+      }
    }
 
+   @Override
+   protected boolean isBaseClass(CtClass clazz) throws NotFoundException
+   {
+      CtClass supa = clazz.getSuperclass(); 
+      if (supa == null || supa.getName().equals("java.lang.Object"))
+      {
+         return true;
+      }
+
+      //The superClass may 
+      // 1) already have been loaded at some stage where there were no binidings,
+      // 2) later some bindings were added which would affect the superclass
+      // 3) a new child class is loaded and since the SuperClassesWeavingStrategy will attempt to 
+      // weave not modified superclasses, the CtClass will contain the right baseclass stuff, although
+      // the already loaded class does not.
+      if (classPool.isClassLoadedButNotWoven(supa.getName()))
+      {
+         return true;
+      }
+
+      return !isAdvised(supa);
+   }
+   
    public static String updatedAdvicesName(String infoName)
    {
       return infoName + "_updated";




More information about the jboss-cvs-commits mailing list