[jboss-cvs] JBossAS SVN: r62136 - in projects/aop/trunk/aop/src: test/org/jboss/test/aop/dynamicgenadvisor and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Apr 5 11:03:05 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-04-05 11:03:05 -0400 (Thu, 05 Apr 2007)
New Revision: 62136

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamicgenadvisor/DynamicTester.java
Log:
Fix the problems with dynamic aop for generated instance advisors

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java	2007-04-05 15:01:42 UTC (rev 62135)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java	2007-04-05 15:03:05 UTC (rev 62136)
@@ -1450,13 +1450,14 @@
    {
       removeClassMetaData(meta.getName());
 
-      updateAdvisorsForAddedClassMetaData(meta);
-
+      //Add the metadata before we update the advisors. Important for the generated instance advisors 
       initClassMetaDataMap();
       synchronized (classMetaData)
       {
          classMetaData.put(meta.getName(), meta);
       }
+
+      updateAdvisorsForAddedClassMetaData(meta);
    }
 
    protected void updateAdvisorsForAddedClassMetaData(ClassMetaDataBinding meta)
@@ -1481,10 +1482,13 @@
          boolean newSubscribers = true;
          while (newSubscribers)
          {
-            for (Iterator it = subscribedSubDomains.keySet().iterator() ; it.hasNext() ; )
+            if (subscribedSubDomains.size() > 0)
             {
-               Domain domain = (Domain)it.next();
-               domain.updateAdvisorsForAddedClassMetaData(meta);
+               for (Iterator it = subscribedSubDomains.keySet().iterator() ; it.hasNext() ; )
+               {
+                  Domain domain = (Domain)it.next();
+                  domain.updateAdvisorsForAddedClassMetaData(meta);
+               }
             }
             newSubscribers = copySubDomainsFromQueue(false);
          }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-04-05 15:01:42 UTC (rev 62135)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-04-05 15:03:05 UTC (rev 62136)
@@ -134,7 +134,7 @@
    protected void rebuildInterceptors()
    {
       version++;
-      super.rebuildInterceptors();
+      advisorStrategy.rebuildInterceptors();
    }
    
    /**
@@ -865,6 +865,7 @@
       void createConstructorTables() throws Exception;
       Set getPerInstanceAspectDefinitions();
       Map getPerInstanceJoinpointAspectDefinitions();
+      void rebuildInterceptors();
    }
    
    private class ClassAdvisorStrategy implements AdvisorStrategy
@@ -1045,11 +1046,17 @@
          return GeneratedClassAdvisor.super.getPerInstanceJoinpointAspectDefinitions();
       }
       
+      public void rebuildInterceptors()
+      {
+         version++;
+         GeneratedClassAdvisor.super.rebuildInterceptors();
+      }
    }
    
    private class InstanceAdvisorStrategy implements AdvisorStrategy 
    {
       GeneratedClassAdvisor parent;
+      boolean needsRebuild = true;
       
       public InstanceAdvisorStrategy(GeneratedClassAdvisor parent)
       {
@@ -1059,9 +1066,10 @@
       
       public void checkVersion()
       {
-         if (parent.version != GeneratedClassAdvisor.this.version)
+         if (needsRebuild || parent.version != GeneratedClassAdvisor.this.version)
          {
             doRebuildForInstance();
+            needsRebuild = false;
          }
       }
       
@@ -1175,5 +1183,19 @@
       {
          return parent.getPerInstanceJoinpointAspectDefinitions();
       }
+
+      
+      public void rebuildInterceptors()
+      {
+         if (getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices() != null && GeneratedClassAdvisor.this.version != parent.version)
+         {
+            adviceBindings.clear();
+            needsRebuild = true;
+         }
+         else
+         {
+            GeneratedClassAdvisor.super.rebuildInterceptors();
+         }
+      }
    }
 }

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamicgenadvisor/DynamicTester.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamicgenadvisor/DynamicTester.java	2007-04-05 15:01:42 UTC (rev 62135)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamicgenadvisor/DynamicTester.java	2007-04-05 15:03:05 UTC (rev 62136)
@@ -196,6 +196,24 @@
       assertTrue(Interceptions.isEmpty());
    }
 
+   public void testMethodExecutionWithInstanceAdvisorAccess() throws Exception
+   {
+      System.out.println("TEST METHOD WITH INSTANCEADVISOR ACCESS");
+      AdviceBinding binding = new AdviceBinding("execution(* org.jboss.test.aop.dynamicgenadvisor.POJO->someMethod(..))", null);
+      binding.addInterceptor(MetadataInterceptor.class);
+      AspectManager.instance().addBinding(binding);
+
+      POJO pojo = new POJO();
+      MetadataInterceptor.clear();
+      pojo.someMethod(123);
+      assertTrue(MetadataInterceptor.intercepted);
+      
+      MetadataInterceptor.clear();
+      AspectManager.instance().removeBinding(binding.getName());
+      pojo.someMethod(123);
+      assertFalse(MetadataInterceptor.intercepted);
+   }
+
    public void testFields() throws Exception
    {
       System.out.println("TEST FIELDS");
@@ -774,6 +792,7 @@
       pojo.someMethod(123);
       pojo.i = 100;
       pojo.notPrepared();
+      assertTrue(MetadataInterceptor.intercepted);
       assertEquals(2, MetadataInterceptor.lastDefaultMetadata.size());
       assertEquals(2, MetadataInterceptor.lastClassMetadata.size());
       assertEquals(1, MetadataInterceptor.lastMethodMetadata.size());
@@ -885,6 +904,10 @@
       
       assertEquals("i", MetadataInterceptor.lastFieldMetadata.get(0));
       
+      MetadataInterceptor.clear();
+      pojox.someMethod(123);
+      assertTrue(MetadataInterceptor.intercepted);
+      
       AspectManager.instance().removeClassMetaData("DA");
       MetadataInterceptor.clear();
       pojo.someMethod(123);




More information about the jboss-cvs-commits mailing list