[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