[jboss-cvs] JBossAS SVN: r74378 - in projects/aop/trunk/aop/src: main/org/jboss/aop/advice and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jun 11 05:25:29 EDT 2008


Author: stalep
Date: 2008-06-11 05:25:29 -0400 (Wed, 11 Jun 2008)
New Revision: 74378

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/MethodMatchInfo.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/advice/ScopedInterceptorFactory.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/PointcutMethodMatch.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/Interceptor1.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/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -70,6 +70,7 @@
 import org.jboss.aop.metadata.MethodMetaData;
 import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.aop.pointcut.PointcutMethodMatch;
+import org.jboss.aop.util.BindingClassifier;
 import org.jboss.aop.util.JoinPointComparator;
 import org.jboss.aop.util.UnmodifiableEmptyCollections;
 import org.jboss.metadata.spi.MetaData;
@@ -724,7 +725,7 @@
    public synchronized void removeAdviceBinding(AdviceBinding binding)
    {
       adviceBindings.remove(binding);
-      rebuildInterceptors();
+      rebuildInterceptorsForRemovedBinding(binding);
       doesHaveAspects = adviceBindings.size() > 0;
    }
 
@@ -769,6 +770,8 @@
    protected abstract void rebuildInterceptors();
 
    protected abstract void rebuildInterceptorsForAddedBinding(AdviceBinding binding);
+   
+   protected  abstract void rebuildInterceptorsForRemovedBinding(AdviceBinding removedBinding);
 
    /**
     * If the info was updated in response to a rebuildInterceptorsForAddedBinding call it will have the
@@ -979,7 +982,28 @@
          }
       }
    }
+   
+   protected void updateMethodPointcutAfterRemove(AdviceBinding binding)
+   {
+      long[] keys = methodInfos.keys();
+      for(int i =0; i < keys.length; i++)
+      {
+         Method method = (Method) advisedMethods.get(keys[i]);
+         PointcutMethodMatch match = binding.getPointcut().matchesExecution(this, method);
 
+         if (match != null && match.isMatch())
+         {
+            if (AspectManager.verbose)
+            {
+               System.err.println("[debug] removing matched binding: "+method.toString());
+            }
+            MethodMatchInfo info = methodInfos.getMatchInfo(keys[i]);
+            info.removeMatchedBinding(binding, match);
+            info.getInfo().clear();
+         }
+      }
+   }
+
    protected void lockWriteChain(MethodInterceptors methodInterceptors)
    {
       Object[] methodMatchInfos = methodInterceptors.infos.getValues();

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 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -50,6 +50,7 @@
 import org.jboss.aop.joinpoint.ConstructorCalledByMethodInvocation;
 import org.jboss.aop.joinpoint.ConstructorCalledByMethodJoinpoint;
 import org.jboss.aop.joinpoint.ConstructorInvocation;
+import org.jboss.aop.joinpoint.ConstructorJoinpoint;
 import org.jboss.aop.joinpoint.FieldJoinpoint;
 import org.jboss.aop.joinpoint.FieldReadInvocation;
 import org.jboss.aop.joinpoint.FieldWriteInvocation;
@@ -715,7 +716,69 @@
          resolveConstructionPointcut(binding);
       }
    }
+   
+   @Override
+   protected  void rebuildInterceptorsForRemovedBinding(AdviceBinding removedBinding)
+   {
+     
+      if (BindingClassifier.isExecution(removedBinding))
+      {
+         //TODO: this method is more optimal, but needs further testing...
+//         updateMethodPointcutAfterRemove(removedBinding);
+         resetChain(methodInfos);
+         for(AdviceBinding ab : manager.getBindings().values())
+         {
+            if(BindingClassifier.isMethodExecution(ab))
+               resolveMethodPointcut(ab);
+         }
+      }
+      if (BindingClassifier.isGet(removedBinding) || BindingClassifier.isSet(removedBinding))
+      {
+         resetChain(fieldReadInfos);
+         resetChain(fieldWriteInfos);
+         for(AdviceBinding ab : manager.getBindings().values())
+         {
+            if(BindingClassifier.isGet(ab))
+               resolveFieldPointcut(fieldReadInfos, ab, false);
+            if(BindingClassifier.isSet(ab))
+               resolveFieldPointcut(fieldWriteInfos, ab, true);
+         }
+      }
+      if (BindingClassifier.isConstructorExecution(removedBinding) ||
+            BindingClassifier.isConstructorCall(removedBinding))
+      {
+         resetChain(constructorInfos);
+         for(AdviceBinding ab : manager.getBindings().values())
+         {
+            if(BindingClassifier.isConstructorExecution(ab))
+               resolveConstructorPointcut(ab);
+         }
+      }
+      if (BindingClassifier.isConstruction(removedBinding))
+      {
+         resetChain(constructionInfos);
+         for(AdviceBinding ab : manager.getBindings().values())
+         {
+            if(BindingClassifier.isConstruction(ab))
+               resolveConstructionPointcut(ab);
+         }
+      }
 
+      finalizeChains();
+
+      
+      //TODO: optimize this
+      try
+      {
+         rebuildCallerInterceptors();
+      }
+      catch(Exception e)
+      {
+
+      }
+
+   }
+
    private MethodByConInfo initializeConstructorCallerInterceptorsMap(Class<?> callingClass, int callingIndex, String calledClass, long calledMethodHash, Method calledMethod) throws Exception
    {
       HashMap<String, TLongObjectHashMap> calledClassesMap = methodCalledByConInterceptors[callingIndex];

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -149,6 +149,12 @@
       populateInterceptorsFromInfos();
       doesHaveAspects = adviceBindings.size() > 0;
    }
+   
+   @Override
+   protected void rebuildInterceptorsForRemovedBinding(AdviceBinding binding)
+   {
+      rebuildInterceptors();
+   }
 
    @Override
    public void addClassMetaData(ClassMetaDataBinding data)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -242,6 +242,13 @@
       advisorStrategy.rebuildInterceptorsForAddedBinding(binding);
    }
    
+   @Override
+   protected void rebuildInterceptorsForRemovedBinding(AdviceBinding binding)
+   {
+      version++;
+      advisorStrategy.rebuildInterceptorsForRemovedBinding(binding);
+   }
+   
    /**
     * Callback for instance advisors to rebuild their interceptors when their
     * version number is out of sync
@@ -1230,6 +1237,7 @@
       Map<AspectDefinition, Set<Joinpoint>> getPerInstanceJoinpointAspectDefinitions();
       void rebuildInterceptors();
       void rebuildInterceptorsForAddedBinding(AdviceBinding binding);
+      void rebuildInterceptorsForRemovedBinding(AdviceBinding binding);
       void resolveConstructorPointcut(AdviceBinding binding);
       void resolveConstructionPointcut(AdviceBinding binding);
       void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos);
@@ -1527,6 +1535,12 @@
          version++;
          GeneratedClassAdvisor.super.rebuildInterceptorsForAddedBinding(binding);
       }
+      
+      public void rebuildInterceptorsForRemovedBinding(AdviceBinding binding)
+      {
+         version++;
+         GeneratedClassAdvisor.super.rebuildInterceptorsForRemovedBinding(binding);
+      }
 
       public void resolveConstructorPointcut(AdviceBinding binding)
       {
@@ -1790,6 +1804,38 @@
             }
          }
       }
+      
+      public void rebuildInterceptorsForRemovedBinding(AdviceBinding binding)
+      {
+         if (getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices() != null && GeneratedClassAdvisor.this.version != parent.version)
+         {
+            adviceBindings.clear();
+            needsRebuild = true;
+         }
+         else
+         {
+            // check if it is initialized
+            if (!GeneratedClassAdvisor.this.initialized)
+            {
+               try
+               {
+                  GeneratedClassAdvisor.this.createInterceptorChains();
+               }
+               catch (Exception ex)
+               {
+                  if (ex instanceof RuntimeException)
+                  {
+                     throw (RuntimeException) ex;
+                  }
+                  throw new RuntimeException(ex);
+               }
+            }
+            else
+            {
+               GeneratedClassAdvisor.super.rebuildInterceptorsForRemovedBinding(binding);
+            }
+         }
+      }
 
 
       public void resolveConstructorPointcut(AdviceBinding binding)

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/MethodMatchInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/MethodMatchInfo.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/MethodMatchInfo.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -62,6 +62,16 @@
       bindings.add(binding);
       pointcutMethodMatches.add(pointcutMethodMatch);
    }
+   
+   public void removeMatchedBinding(AdviceBinding binding, PointcutMethodMatch pointcutMethodMatch)
+   {
+      if(binding != null && pointcutMethodMatch != null 
+            && bindings != null && pointcutMethodMatches != null)
+      {
+         bindings.remove(binding);
+         pointcutMethodMatches.remove(pointcutMethodMatch);
+      }
+   }
 
    public MethodInfo getInfo()
    {

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/ScopedInterceptorFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/ScopedInterceptorFactory.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/ScopedInterceptorFactory.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -132,7 +132,7 @@
       if (this == obj) return true;
       if (!(obj instanceof ScopedInterceptorFactory)) return false;
       
-      AspectDefinition otherAspect = ((GenericInterceptorFactory)obj).getAspect();
+      AspectDefinition otherAspect = ((ScopedInterceptorFactory)obj).getAspect();
       
       if (!this.aspect.getName().equals(otherAspect.getName())) return false;
       if (!this.aspect.getFactory().getName().equals(otherAspect.getFactory().getName()))return false;

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/PointcutMethodMatch.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/PointcutMethodMatch.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/PointcutMethodMatch.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -60,4 +60,23 @@
    {
       return isInstanceOf;
    }
+   
+   @Override
+   public boolean equals(Object o)
+   {
+      if(o != null && o instanceof PointcutMethodMatch &&
+            this.getMatchLevel() == ((PointcutMethodMatch) o).getMatchLevel() &&
+            this.getMatchedClass().getName().equals(((PointcutMethodMatch) o).getMatchedClass().getName()) &&
+            this.isInstanceOf() == ((PointcutMethodMatch) o).isInstanceOf())
+         return true;
+      else
+         return false;
+   }
+
+   @Override
+   public int hashCode()
+   {
+      return matchedClass.getName().hashCode();
+   }
+
 }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/MarshalledProxyAdvisor.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -78,12 +78,19 @@
       //Noop, all interceptors are added via addMethodInfo
    }
    
+   @Override
    protected void rebuildInterceptorsForAddedBinding(AdviceBinding binding)
    {
       //Noop, all interceptors are added via addMethodInfo
    }
-
+   
    @Override
+   protected  void rebuildInterceptorsForRemovedBinding(AdviceBinding removedBinding)
+   {
+      //Noop, all interceptors are added via addMethodInfo
+   }
+   
+   @Override
    public void removeClassMetaData(ClassMetaDataBinding data)
    {
       throw new RuntimeException("Not yet implemented");

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/Interceptor1.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/Interceptor1.java	2008-06-11 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/Interceptor1.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -32,6 +32,7 @@
 public class Interceptor1 implements Interceptor
 {
    public static boolean intercepted;
+   public static int numberOfInterceptions = 0;
    
    public String getName()
    {
@@ -41,7 +42,14 @@
    public Object invoke(Invocation invocation) throws Throwable
    {
       intercepted = true;
+      numberOfInterceptions++;
       return invocation.invokeNext();
    }
+   
+   public static void clear()
+   {
+      numberOfInterceptions = 0;
+   }
 
+
 }

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 09:22:35 UTC (rev 74377)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/dynamic/SimpleDynamicTester.java	2008-06-11 09:25:29 UTC (rev 74378)
@@ -1,24 +1,24 @@
 /*
-  * JBoss, Home of Professional Open Source
-  * Copyright 2005, JBoss Inc., and individual contributors as indicated
-  * by the @authors tag. See the copyright.txt in the distribution for a
-  * full listing of individual contributors.
-  *
-  * This is free software; you can redistribute it and/or modify it
-  * under the terms of the GNU Lesser General Public License as
-  * published by the Free Software Foundation; either version 2.1 of
-  * the License, or (at your option) any later version.
-  *
-  * This software is distributed in the hope that it will be useful,
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  * Lesser General Public License for more details.
-  *
-  * You should have received a copy of the GNU Lesser General Public
-  * License along with this software; if not, write to the Free
-  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-  */
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
 package org.jboss.test.aop.dynamic;
 
 
@@ -33,6 +33,7 @@
 import org.jboss.aop.proxy.container.AOPProxyFactoryParameters;
 import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
 import org.jboss.test.aop.AOPTestWithSetup;
+import org.jboss.test.aop.rebuildcallerchain.RebuildCallerChainInterceptor;
 
 /**
  * Comment
@@ -58,7 +59,7 @@
    {
       super(name);
    }
-   
+
    public void testDynamic() throws Exception
    {
       reset();
@@ -66,26 +67,26 @@
       POJO tmp = new POJO();
       assertInstanceOf(tmp, Advised.class);
       assertInterceptors(false, false);
-      
+
       addBinding("one", "all(org.jboss.test.aop.dynamic.POJO)", Interceptor1.class);
       callPOJO(true, false);
-      
+
       addBinding("two", "all(org.jboss.test.aop.dynamic.POJO)", Interceptor2.class);
       callPOJO(true, true);
-      
+
       AspectManager.instance().removeBinding("one");
       callPOJO(false, true);
-      
+
       addBinding("one", "all(org.jboss.test.aop.dynamic.POJO)", Interceptor1.class);
       callPOJO(true, true);
-      
+
       AspectManager.instance().removeBinding("two");
       callPOJO(true, false);
-      
+
       AspectManager.instance().removeBinding("one");
       callPOJO(false, false);
    }
-   
+
    public void testDynamicPerInstance() throws Exception
    {
       reset();
@@ -93,26 +94,26 @@
       POJOPerInstance tmp = new POJOPerInstance();
       assertInstanceOf(tmp, Advised.class);
       assertInterceptors(false, false);
-      
+
       addBinding("one", "all(org.jboss.test.aop.dynamic.POJOPerInstance)", PerInstanceInterceptor1.class);
       callPOJOPerInstance(true, false);
-      
+
       addBinding("two", "all(org.jboss.test.aop.dynamic.POJOPerInstance)", PerInstanceInterceptor2.class);
       callPOJOPerInstance(true, true);
 
       AspectManager.instance().removeBinding("one");
       callPOJOPerInstance(false, true);
-      
+
       addBinding("one", "all(org.jboss.test.aop.dynamic.POJOPerInstance)", PerInstanceInterceptor1.class);
       callPOJOPerInstance(true, true);
-      
+
       AspectManager.instance().removeBinding("two");
       callPOJOPerInstance(true, false);
-      
+
       AspectManager.instance().removeBinding("one");
       callPOJOPerInstance(false, false);
    }
-   
+
    public void testClassProxyContainer() throws Exception
    {
       AspectManager manager = AspectManager.instance();
@@ -122,14 +123,14 @@
       POJOProxy pojo = new POJOProxy();
       AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
       params.setTarget(pojo);
-         
+
       GeneratedAOPProxyFactory factory = new GeneratedAOPProxyFactory();
       POJOProxy proxy = (POJOProxy)factory.createAdvisedProxy(params);
 
       reset();
       proxy.method();
       assertInterceptors(true, false);
-      
+
       addBinding("two", "all(org.jboss.test.aop.dynamic.POJOProxy)", Interceptor2.class);
       reset();
       proxy.method();
@@ -139,17 +140,17 @@
       reset();
       proxy.method();
       assertInterceptors(false, true);
-      
+
       addBinding("one", "all(org.jboss.test.aop.dynamic.POJOProxy)", Interceptor1.class);
       reset();
       proxy.method();
       assertInterceptors(true, true);
-      
+
       manager.removeBinding("two");
       reset();
       proxy.method();
       assertInterceptors(true, false);
-      
+
       manager.removeBinding("one");
       reset();
       proxy.method();
@@ -161,51 +162,51 @@
       reset();
       POJO pojo = new POJO();
       assertInterceptors(int1, int2);
-      
+
       reset();
       pojo.field = 1;
       assertInterceptors(int1, int2);
-      
+
       reset();
       assertEquals(1, pojo.field);
       assertInterceptors(int1, int2);
-      
+
       reset();
       pojo.method();
       assertInterceptors(int1, int2);
    }
-   
+
    private void callPOJOPerInstance(boolean int1, boolean int2)
    {
       reset();
       POJOPerInstance pojo = new POJOPerInstance();
       assertPerInstanceInterceptors(false, false);
-      
+
       reset();
       pojo.method();
       assertPerInstanceInterceptors(int1, int2);
-      
+
       reset();
       pojo.field = 1;
       assertPerInstanceInterceptors(int1, int2);
-      
+
       reset();
       assertEquals(1, pojo.field);
       assertPerInstanceInterceptors(int1, int2);
    }
-   
+
    private void assertInterceptors(boolean int1, boolean int2)
    {
       assertEquals(int1, Interceptor1.intercepted);
       assertEquals(int2, Interceptor2.intercepted);
    }
-   
+
    private void assertPerInstanceInterceptors(boolean int1, boolean int2)
    {
       assertEquals(int1, PerInstanceInterceptor1.intercepted);
       assertEquals(int2, PerInstanceInterceptor2.intercepted);
    }
-   
+
    private void reset()
    {
       Interceptor1.intercepted = false;
@@ -213,7 +214,7 @@
       PerInstanceInterceptor1.intercepted = false;
       PerInstanceInterceptor2.intercepted = false;
    }
-   
+
    private void addBinding(String name, String pointcut, Class<?> interceptor) throws ParseException
    {
       AspectManager manager = AspectManager.instance();
@@ -223,4 +224,91 @@
       binding.addInterceptorFactory(factory);
       manager.addBinding(binding);
    }
+
+   public void testDynamicMethod() throws ParseException
+   {
+      AdviceBinding binding = new AdviceBinding( 
+            "execution(public void org.jboss.test.aop.dynamic.POJO->method())", null); 
+      binding.setName("dynMethod");
+      binding.addInterceptor(Interceptor1.class); 
+      AspectManager.instance().addBinding(binding); 
+
+      AdviceBinding binding2 = new AdviceBinding( 
+            "execution(public void org.jboss.test.aop.dynamic.POJO->method())", null); 
+      binding2.setName("dynMethod2");
+      binding2.addInterceptor(Interceptor2.class); 
+      AspectManager.instance().addBinding(binding2); 
+
+
+      Interceptor1.intercepted = false;
+
+      POJO p = new POJO();
+      p.method();
+      assertTrue("POJO.method was not intercepted", Interceptor1.intercepted);
+
+      Interceptor1.intercepted = false;
+      AspectManager.instance().removeBinding("dynMethod");
+
+      p.method();
+      assertTrue("POJO.method was not intercepted", Interceptor2.intercepted);
+      Interceptor2.intercepted = false;
+      AspectManager.instance().removeBinding("dynMethod2");
+
+      p.method();
+      assertFalse("POJO.method was intercepted", Interceptor2.intercepted);
+
+   }
+
+   public void testDynamicField() throws ParseException
+   {
+      AdviceBinding binding = new AdviceBinding( 
+            "set(* org.jboss.test.aop.dynamic.POJO->field)", null); 
+      binding.setName("set1");
+      binding.addInterceptor(Interceptor1.class); 
+      AspectManager.instance().addBinding(binding); 
+
+      AdviceBinding binding2 = new AdviceBinding( 
+            "get(* org.jboss.test.aop.dynamic.POJO->field)", null); 
+      binding2.setName("get1");
+      binding2.addInterceptor(Interceptor2.class); 
+      AspectManager.instance().addBinding(binding2);
+
+      AdviceBinding binding3 = new AdviceBinding( 
+            "field(* org.jboss.test.aop.dynamic.POJO->field)", null); 
+      binding3.setName("field1");
+      binding3.addInterceptor(Interceptor1.class); 
+      AspectManager.instance().addBinding(binding3);
+
+      Interceptor1.clear();
+      Interceptor1.intercepted = false;
+      POJO p = new POJO();
+      p.field = 7;
+      assertTrue("POJO.field was not intercepted", Interceptor1.intercepted);
+      System.out.println("NumberOfInterceptions is: "+Interceptor1.numberOfInterceptions);
+
+      Interceptor2.intercepted = false;
+      int i = p.field;
+      assertTrue("POJO.field was not intercepted", Interceptor2.intercepted);
+      System.out.println("NumberOfInterceptions is: "+Interceptor1.numberOfInterceptions);
+
+      Interceptor1.intercepted = false;
+      AspectManager.instance().removeBinding("set1");
+
+      p.field = 4;
+      System.out.println("NumberOfInterceptions is: "+Interceptor1.numberOfInterceptions);
+      assertEquals("POJO.field should have been intercepted 4 times", 4, Interceptor1.numberOfInterceptions);
+      //      assertFalse("POJO.field was intercepted, shouldnt be.", Interceptor1.intercepted);
+
+
+      Interceptor2.intercepted = false;
+      AspectManager.instance().removeBinding("get1");
+      AspectManager.instance().removeBinding("field1");
+
+      i = p.field;
+      p.field = 5;
+      assertEquals("POJO.field should have been intercepted 4 times", 4, Interceptor1.numberOfInterceptions);
+      assertFalse("POJO.field was intercepted, shouldnt be.", Interceptor2.intercepted);
+
+   }
+
 }




More information about the jboss-cvs-commits mailing list