[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