[jboss-cvs] JBossAS SVN: r77243 - in projects/aop/trunk/aop/src/main/org/jboss/aop: advice and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Aug 20 09:54:39 EDT 2008
Author: kabir.khan at jboss.com
Date: 2008-08-20 09:54:39 -0400 (Wed, 20 Aug 2008)
New Revision: 77243
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java
projects/aop/trunk/aop/src/main/org/jboss/aop/advice/DynamicCFlowDefinition.java
projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlow.java
projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowMatcher.java
projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowStack.java
projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/MatcherStrategy.java
projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/SecurityActions.java
Log:
[JBAOP-625] Guess the classloader better than simply using the TCL
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -422,13 +422,13 @@
cflowStacks.remove(name);
}
- public DynamicCFlow getDynamicCFlow(String name)
+ public DynamicCFlow getDynamicCFlow(String name, ClassLoader cl)
{
DynamicCFlowDefinition def = dynamicCFlows.get(name);
if (def != null)
{
- return def.create();
+ return def.create(cl);
}
return null;
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -905,32 +905,32 @@
@Override
- public DynamicCFlow getDynamicCFlow(String name)
+ public DynamicCFlow getDynamicCFlow(String name, ClassLoader cl)
{
if (inheritsBindings)
{
if (!parentFirst)
{
- DynamicCFlow cflow = super.getDynamicCFlow(name);
+ DynamicCFlow cflow = super.getDynamicCFlow(name, cl);
if (cflow == null)
{
- cflow = parent.getDynamicCFlow(name);
+ cflow = parent.getDynamicCFlow(name, cl);
}
return cflow;
}
else
{
- DynamicCFlow cflow = parent.getDynamicCFlow(name);
+ DynamicCFlow cflow = parent.getDynamicCFlow(name, cl);
if (cflow == null)
{
- cflow = super.getDynamicCFlow(name);
+ cflow = super.getDynamicCFlow(name, cl);
}
return cflow;
}
}
else
{
- return super.getDynamicCFlow(name);
+ return super.getDynamicCFlow(name, cl);
}
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/DynamicCFlowDefinition.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/DynamicCFlowDefinition.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/DynamicCFlowDefinition.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -55,14 +55,13 @@
return className;
}
- public DynamicCFlow create()
+ public DynamicCFlow create(ClassLoader cl)
{
if (pClass == null)
{
try
{
- // FIXME ClassLoader - why should the class be visible from the context classloader?
- pClass = SecurityActions.getContextClassLoader().loadClass(className);
+ pClass = cl.loadClass(className);
}
catch (ClassNotFoundException e)
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlow.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlow.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlow.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -64,28 +64,28 @@
this.not = not;
}
- public int matches(StackTraceElement[] stack, int index)
+ public int matches(StackTraceElement[] stack, int index, ClassLoader cl)
{
int found = NOT_FOUND;
if (point instanceof ASTMethod)
{
- found = matches((ASTMethod) point, stack, index);
+ found = matches((ASTMethod) point, stack, index, cl);
}
else
{
- found = matches((ASTConstructor) point, stack, index);
+ found = matches((ASTConstructor) point, stack, index, cl);
}
if ((found == NOT_FOUND) && not) return index;
if (found > NOT_FOUND && not) return NOT_FOUND;
return found;
}
- private int matches(ASTMethod method, StackTraceElement[] stack, int index)
+ private int matches(ASTMethod method, StackTraceElement[] stack, int index, ClassLoader cl)
{
for (int i = index; i >= 0; i--)
{
ClassExpression expr = method.getClazz();
- if (!matchesClass(expr, stack[i])) continue;
+ if (!matchesClass(expr, stack[i], cl)) continue;
if (method.getMethodIdentifier().matches(stack[i].getMethodName()))
{
@@ -95,12 +95,12 @@
return -2;
}
- private int matches(ASTConstructor con, StackTraceElement[] stack, int index)
+ private int matches(ASTConstructor con, StackTraceElement[] stack, int index, ClassLoader cl)
{
for (int i = index; i >= 0; i--)
{
ClassExpression expr = con.getClazz();
- if (!matchesClass(expr, stack[i])) continue;
+ if (!matchesClass(expr, stack[i], cl)) continue;
if (stack[i].getMethodName().equals("<init>"))
{
@@ -110,7 +110,7 @@
return -2;
}
- private boolean matchesClass(ClassExpression expr, StackTraceElement element)
+ private boolean matchesClass(ClassExpression expr, StackTraceElement element, ClassLoader cl)
{
if (expr.isSimple())
{
@@ -121,17 +121,23 @@
}
else
{
- // FIXME ClassLoader - why should the class be visible from the context classloader?
- Class<?> clazz = loadClass(element.getClassName());
-
- if (Untransformable.class.isAssignableFrom(clazz))
+ try
{
- //Invocation classes should not be checked (they are not in the cache at runtime)
- return false;
+ Class<?> clazz = cl.loadClass(element.getClassName());
+
+ if (Untransformable.class.isAssignableFrom(clazz))
+ {
+ //Invocation classes should not be checked (they are not in the cache at runtime)
+ return false;
+ }
+ if (!Util.matchesClassExpr(expr, clazz))
+ {
+ return false;
+ }
}
- if (!Util.matchesClassExpr(expr, clazz))
+ catch(ClassNotFoundException e)
{
- return false;
+ throw new RuntimeException(e);
}
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowMatcher.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowMatcher.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowMatcher.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -121,9 +121,18 @@
else
manager = invocation.getAdvisor().getManager();
CFlowStack cflow = manager.getCFlowStack(node.getPointcutName());
- if (cflow != null) return new Boolean(cflow.matches(getStack()));
+
+ //Use the current advisor to guess the classloader
+ ClassLoader cl = invocation.getAdvisor().getClassLoader();
+ if (cl == null)
+ {
+ //Fall back to context classloader if null
+ cl = SecurityActions.getContextClassLoader();
+ }
+
+ if (cflow != null) return new Boolean(cflow.matches(getStack(), cl));
- DynamicCFlow dcflow = manager.getDynamicCFlow(node.getPointcutName());
+ DynamicCFlow dcflow = manager.getDynamicCFlow(node.getPointcutName(), cl);
return new Boolean(dcflow.shouldExecute(invocation));
}
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowStack.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowStack.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/CFlowStack.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -50,13 +50,13 @@
cflows.add(cflow);
}
- public boolean matches(StackTraceElement[] stack)
+ public boolean matches(StackTraceElement[] stack, ClassLoader cl)
{
int stackIndex = stack.length - 1;
for (int i = 0; i < cflows.size(); i++)
{
CFlow cflow = cflows.get(i);
- stackIndex = cflow.matches(stack, stackIndex);
+ stackIndex = cflow.matches(stack, stackIndex, cl);
if (stackIndex == org.jboss.aop.pointcut.CFlow.NOT_FOUND)
{
return false;
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/MatcherStrategy.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/MatcherStrategy.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/pointcut/MatcherStrategy.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -64,7 +64,6 @@
String sub = instanceOf.getInstanceOfAnnotation().substring(1);
try
{
- // FIXME ClassLoader - why should the class be visible from the context classloader?
ClassLoader cl = advisor.getClassLoader();
if (cl == null)
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/SecurityActions.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/SecurityActions.java 2008-08-20 13:36:15 UTC (rev 77242)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/SecurityActions.java 2008-08-20 13:54:39 UTC (rev 77243)
@@ -24,8 +24,6 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
-import org.jboss.aop.SecurityActions.GetClassLoaderAction;
-
/**
* SecurityActions.
*
More information about the jboss-cvs-commits
mailing list