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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jun 11 07:12:48 EDT 2008


Author: stalep
Date: 2008-06-11 07:12:47 -0400 (Wed, 11 Jun 2008)
New Revision: 74381

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/SimpleDynamicTester.java
Log:
[JBAOP-578]
A simple optimization for removal of AdvisorBindings.


Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2008-06-11 10:18:32 UTC (rev 74380)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2008-06-11 11:12:47 UTC (rev 74381)
@@ -718,9 +718,26 @@
    }
    
    @Override
-   protected  void rebuildInterceptorsForRemovedBinding(AdviceBinding removedBinding)
+   protected void rebuildInterceptorsForRemovedBinding(AdviceBinding binding)
    {
-     
+      if (initialized)
+      {
+         if (System.getSecurityManager() == null)
+         {
+            RebuildInterceptorsAction.NON_PRIVILEGED.rebuildInterceptorsForRemovedBinding(this, binding);
+         }
+         else
+         {
+            RebuildInterceptorsAction.PRIVILEGED.rebuildInterceptorsForRemovedBinding(this, binding);
+         }
+      }
+   }
+   
+   
+   protected  void doRebuildInterceptorsForRemovedBinding(AdviceBinding removedBinding)
+   {
+      lockWriteChains();
+      
       if (BindingClassifier.isExecution(removedBinding))
       {
          //TODO: this method is more optimal, but needs further testing...
@@ -744,8 +761,7 @@
                resolveFieldPointcut(fieldWriteInfos, ab, true);
          }
       }
-      if (BindingClassifier.isConstructorExecution(removedBinding) ||
-            BindingClassifier.isConstructorCall(removedBinding))
+      if (BindingClassifier.isConstructorExecution(removedBinding))
       {
          resetChain(constructorInfos);
          for(AdviceBinding ab : manager.getBindings().values())
@@ -766,6 +782,7 @@
 
       finalizeChains();
 
+      unlockWriteChains();
       
       //TODO: optimize this
       try
@@ -778,7 +795,53 @@
       }
 
    }
+   
+   protected void updateFieldPointcutAfterRemove(FieldInfo[] fieldInfos, AdviceBinding binding, boolean write)
+   {
+      for (int i = 0; i < fieldInfos.length; i++)
+      {
+         Field field = fieldInfos[i].getField();
 
+         if ((!write && binding.getPointcut().matchesGet(this, field))
+         || (write && binding.getPointcut().matchesSet(this, field)))
+         {
+            if (AspectManager.verbose) System.err.println("[debug] Removing field, matched " + ((write) ? "write" : "read") + " binding: " + field);
+            fieldInfos[i].clear();
+         }
+      }
+   }
+   
+   protected void updateConstructorPointcutAfterRemove(AdviceBinding binding)
+   {
+      for (int i = 0; i < constructors.length; i++)
+      {
+         Constructor<?> constructor = constructors[i];
+         if (binding.getPointcut().matchesExecution(this, constructor))
+         {
+            if (AspectManager.verbose) System.err.println("[debug] Removing constructor, matched binding: " + constructor);
+            constructorInfos[i].clear();
+         }
+      }
+   }
+   
+   protected void updateConstructionPointcutAfterRemove(AdviceBinding binding)
+   {
+      if (constructionInfos.length > 0)
+      {
+         for (int i = 0; i < constructionInfos.length ;i++)
+         {
+            ConstructionInfo info = constructionInfos[i];
+            Constructor<?> constructor = info.getConstructor();
+            if (binding.getPointcut().matchesConstruction(this, constructor))
+            {
+               if (AspectManager.verbose) System.err.println("[debug] Removing construction, matched binding: " + constructor);
+               constructionInfos[i].clear();
+            }
+         }
+      }
+   }
+
+
    private MethodByConInfo initializeConstructorCallerInterceptorsMap(Class<?> callingClass, int callingIndex, String calledClass, long calledMethodHash, Method calledMethod) throws Exception
    {
       HashMap<String, TLongObjectHashMap> calledClassesMap = methodCalledByConInterceptors[callingIndex];
@@ -2190,6 +2253,7 @@
    {
       void rebuildInterceptors(ClassAdvisor advisor);
       void rebuildInterceptorsForAddedBinding(ClassAdvisor advisor, AdviceBinding binding);
+      void rebuildInterceptorsForRemovedBinding(ClassAdvisor advisor, AdviceBinding binding);
 
       RebuildInterceptorsAction PRIVILEGED = new RebuildInterceptorsAction()
       {
@@ -2240,6 +2304,31 @@
                throw new RuntimeException(ex);
             }
          }
+         
+         public void rebuildInterceptorsForRemovedBinding(final ClassAdvisor advisor, final AdviceBinding binding)
+         {
+            try
+            {
+               AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
+               {
+                  public Object run()
+                  {
+                     advisor.doRebuildInterceptorsForRemovedBinding(binding);
+                     return null;
+                  }
+               });
+            }
+            catch (PrivilegedActionException e)
+            {
+               Exception ex = e.getException();
+               if (ex instanceof RuntimeException)
+               {
+                  throw (RuntimeException) ex;
+               }
+               throw new RuntimeException(ex);
+            }
+         }
+         
       };
 
       RebuildInterceptorsAction NON_PRIVILEGED = new RebuildInterceptorsAction()
@@ -2253,6 +2342,12 @@
          {
             advisor.doRebuildInterceptorsForAddedBinding(binding);
          }
+         
+         public void rebuildInterceptorsForRemovedBinding(ClassAdvisor advisor, AdviceBinding binding)
+         {
+            advisor.doRebuildInterceptorsForRemovedBinding(binding);
+         }
+         
       };
    }
 

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2008-06-11 10:18:32 UTC (rev 74380)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2008-06-11 11:12:47 UTC (rev 74381)
@@ -80,6 +80,7 @@
    {
       interceptorChain.clear();
       interceptors = null;
+      interceptors = new Interceptor[0];
    }
    
    protected void resetChainKeepInterceptors()

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/SimpleDynamicTester.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/SimpleDynamicTester.java	2008-06-11 10:18:32 UTC (rev 74380)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/SimpleDynamicTester.java	2008-06-11 11:12:47 UTC (rev 74381)
@@ -251,6 +251,7 @@
 
       p.method();
       assertTrue("POJO.method was not intercepted", Interceptor2.intercepted);
+      assertFalse("POJO.method should not be intercepted by Intercepor1", Interceptor1.intercepted);
       Interceptor2.intercepted = false;
       AspectManager.instance().removeBinding("dynMethod2");
 




More information about the jboss-cvs-commits mailing list