[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