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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Apr 19 16:59:56 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-04-19 16:59:56 -0400 (Thu, 19 Apr 2007)
New Revision: 62432

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-378] Save PermGenSpace by caching generated joinpoint classes per joinpoint by interceptor chain. If a class already exists for a joinpoint and given set of chains, that should be reused rather than generating a new class.

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2007-04-19 20:59:56 UTC (rev 62432)
@@ -24,6 +24,7 @@
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
+import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.IJoinPointInfo;
 import org.jboss.aop.joinpoint.Joinpoint;
@@ -39,6 +40,8 @@
    protected volatile Joinpoint joinpoint;
    
    protected WeakReference clazz;
+   
+   private String adviceString;
 
    protected JoinPointInfo()
    {
@@ -123,6 +126,7 @@
    }
 
    public void setInterceptorChain(ArrayList interceptorChain) {
+      adviceString = null;
       this.interceptorChain = interceptorChain;
    }
 
@@ -131,6 +135,7 @@
    }
 
    public void setInterceptors(Interceptor[] interceptors) {
+      adviceString = null;
       this.interceptors = interceptors;
    }
 
@@ -169,4 +174,31 @@
          interceptors = other.interceptors.clone();
       }
    }
+   
+   public String getAdviceString()
+   {
+      if (adviceString == null)
+      {
+         if (interceptors == null || interceptors.length == 0)
+         {
+            return "";
+         }
+         
+         StringBuffer buf = new StringBuffer();
+         for (int i = 0 ; i < interceptors.length ; i++)
+         {
+            if (i > 0)
+            {
+               buf.append(",");
+            }
+            
+            GeneratedAdvisorInterceptor icptr = (GeneratedAdvisorInterceptor)interceptors[i];
+            buf.append(icptr.getAdviceString());
+         }
+         
+         return buf.toString();
+      }
+      
+      return adviceString; 
+   }
 }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java	2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java	2007-04-19 20:59:56 UTC (rev 62432)
@@ -477,6 +477,43 @@
       throw new RuntimeException("Invocation type not handled " + invocation);
    }
    
+   String adviceString;
+   public String getAdviceString()
+   {
+      if (adviceString == null)
+      {
+         StringBuffer buf = new StringBuffer();
+         if (isAround())
+         {
+            buf.append("R");
+         }
+         else if (isBefore())
+         {
+            buf.append("B");
+         }
+         else if (isAfter())
+         {
+            buf.append("A");
+         }
+         else if (isThrowing())
+         {
+            buf.append("T");
+         }
+         else 
+         {
+            throw new RuntimeException("No such interceptor");
+         }
+         
+         buf.append("~#$%");
+         buf.append(getAspectClassName());
+         buf.append("->");
+         buf.append(getAdviceName());
+         adviceString = buf.toString();
+         
+      }
+      return adviceString;
+   }
+   
    private class GeneratedOnlyInterceptor implements Interceptor
    {
       String name;

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-04-19 20:59:56 UTC (rev 62432)
@@ -59,11 +59,9 @@
 
    //field names in advisor
    private static final String DOMAIN = "domain";
-   private static final String VERSION = "version";
    private static final String CHECK_VERSION = "checkVersion";
    private static final String ADVICES_UPDATED = "advicesUpdated";
    private static final String INSTANCE_ADVISOR_MIXIN = "instanceAdvisorMixin";
-   private static final String CLASS_ADVISOR = "classAdvisor";
 
    //method names in advisor or GeneratedClassAdvisor
    private static final String CREATE_INSTANCE_ADVISOR = "createInstanceAdvisor";
@@ -87,7 +85,6 @@
    CtClass genadvisor;
    CtClass genInstanceAdvisor;
 
-
    public GeneratedAdvisorInstrumentor(AOPClassPool pool, AspectManager manager, JoinpointClassifier joinpointClassifier, DynamicTransformationObserver observer)
    {
       super(pool, manager, joinpointClassifier, observer);
@@ -307,10 +304,6 @@
       final CtClass untransformable = getClassPool().get("org.jboss.aop.instrument.Untransformable");
       genInstanceAdvisor.addInterface(untransformable);
 
-      //Add reference to parent advisor
-      CtField classAdvisor = new CtField(genadvisor, CLASS_ADVISOR, genInstanceAdvisor);
-      genInstanceAdvisor.addField(classAdvisor);
-
       CtMethod advicesUpdated = CtNewMethod.make(
             Modifier.PROTECTED,
             CtClass.voidType,
@@ -345,7 +338,6 @@
          "{" +
          "    super($2);" +
          "   " + INSTANCE_ADVISOR_MIXIN + " = new org.jboss.aop.GeneratedInstanceAdvisorMixin($1, $2);" +
-         "   this.classAdvisor = $2;" +
          "}";
       CtConstructor ctor = CtNewConstructor.make(new CtClass[]{forName("java.lang.Object"), genadvisor}, new CtClass[0], body, genInstanceAdvisor);
       genInstanceAdvisor.addConstructor(ctor);
@@ -603,6 +595,7 @@
       boolean isSuper = false;
 
       StringBuffer advicesUpdatedCode = new StringBuffer();
+      StringBuffer initialiseInfosForInstanceCode = new StringBuffer();
 
       while (true)
       {
@@ -632,7 +625,7 @@
                   infoClassName.equals(MethodByMethodInfo.class.getName()))
             {
                String code = infoName + " = super.copyInfoFromClassAdvisor(((" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "())." + infoName + ");";
-               addCodeToInitialiseMethod(genInstanceAdvisor, code, INITIALISE_INFOS_FOR_INSTANCE);
+               initialiseInfosForInstanceCode.append(code);
             }
          }
 
@@ -645,7 +638,13 @@
          superClass = superClass.getSuperclass();
          superAdvisor = superAdvisor.getSuperclass();
       }
-
+      
+      if (initialiseInfosForInstanceCode.length() > 0)
+      {
+         initialiseInfosForInstanceCode.insert(0, genadvisor.getName() + " classAdvisor = (" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "();");
+      }
+      addCodeToInitialiseMethod(genInstanceAdvisor, initialiseInfosForInstanceCode.toString(), INITIALISE_INFOS_FOR_INSTANCE);
+      
       CtMethod advicesUpdated = genInstanceAdvisor.getDeclaredMethod(ADVICES_UPDATED);
       advicesUpdated.insertAfter(advicesUpdatedCode.toString());
    }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-04-19 20:59:56 UTC (rev 62432)
@@ -21,6 +21,7 @@
   */
 package org.jboss.aop.instrument;
 
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.security.AccessController;
@@ -58,6 +59,7 @@
 import org.jboss.aop.pointcut.ast.ClassExpression;
 import org.jboss.aop.util.JavassistUtils;
 import org.jboss.aop.util.ReflectToJavassist;
+import org.jboss.util.collection.temp.WeakValueHashMap;
 
 /**
  * Creates the Joinpoint invocation replacement classes used with Generated advisors
@@ -97,6 +99,11 @@
    private boolean initialised;
    private ThreadLocal<Set<Integer>> inconsistentTypeArgs;
    
+   /**
+    * A cache of the generated joinpoint classes indexed by the interceptor chains for the info
+    */
+   private HashMap generatedJoinPointClassCache = new HashMap();
+   
    protected JoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info,
          JoinPointParameters parameters, int argumentsSize)
    {
@@ -184,6 +191,7 @@
       {
          throw new RuntimeException("GeneratedAdvisor weaving in AOP 2.0.0.aplha5 and later is not compatible with that of previous versions");
       }
+      
       if (System.getSecurityManager() == null)
       {
          GenerateJoinPointClassAction.NON_PRIVILEGED.generateJoinPointClass(classloader, this, info);
@@ -207,13 +215,26 @@
             classloader = Thread.currentThread().getContextClassLoader();
          }
 
-         AspectManager manager = AspectManager.instance();
-         //ClassPool pool = manager.findClassPool(Thread.currentThread().getContextClassLoader());
-         ClassPool pool = manager.findClassPool(classloader);
-         GeneratedClassInfo generatedClass = generateJoinpointClass(pool, info);
+         //Attempt to get the cached information so we don't have to recreate the class every time we rebind the joinpoint
+         String infoAdviceString = info.getAdviceString();
+         GeneratedClassInfo generatedClass = (GeneratedClassInfo)generatedJoinPointClassCache.get(infoAdviceString);
+         Class clazz = null;
+         if (generatedClass != null)
+         {
+            clazz = classloader.loadClass(generatedClass.getGenerated().getName());
+         }
          
-         ProtectionDomain pd = advisorClass.getProtectionDomain();
-         Class clazz = toClass(pool, generatedClass.getGenerated(), pd);
+         if (clazz == null)
+         {
+            //We need to do all the work again
+            AspectManager manager = AspectManager.instance();
+            ClassPool pool = manager.findClassPool(classloader);
+            generatedClass = generateJoinpointClass(pool, info);
+            
+            ProtectionDomain pd = advisorClass.getProtectionDomain();
+            clazz = toClass(pool, generatedClass.getGenerated(), pd);
+            generatedJoinPointClassCache.put(infoAdviceString, generatedClass);
+         }
          Object obj = instantiateClass(clazz, generatedClass.getAroundSetups(), info);
          
          joinpointField.set(info.getAdvisor(), obj);
@@ -244,7 +265,7 @@
       catch (Exception e)
       {
          StringBuffer sb = new StringBuffer();
-         throw new RuntimeException(debugClass(sb, clazz).toString());
+         throw new RuntimeException(debugClass(sb, clazz).toString(), e);
       }
       
       for (int i = 0 ; i < aroundSetups.length ; i++)




More information about the jboss-cvs-commits mailing list