[jboss-cvs] JBossAS SVN: r72950 - projects/aop/trunk/aop/src/main/org/jboss/aop/instrument.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu May 1 13:44:22 EDT 2008


Author: flavia.rainone at jboss.com
Date: 2008-05-01 13:44:22 -0400 (Thu, 01 May 2008)
New Revision: 72950

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-568] Removed some stuff from GeneratedClassInfo cache, by adding cflow expressions to the public constructor signature.

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	2008-05-01 17:08:08 UTC (rev 72949)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2008-05-01 17:44:22 UTC (rev 72950)
@@ -298,7 +298,7 @@
             generatedClass = generateJoinpointClass(pool, info, classloader, pd);
             generatedClasses.put(classloader, generatedClass);
          }
-         Object obj = instantiateClass(generatedClass, info, classloader);
+         Object obj = generatedClass.createJoinPointInstance(classloader, info);
          
          joinpointField.set(info.getAdvisor(), obj);
          if (info.getAdvisor() instanceof InstanceAdvisor)
@@ -325,6 +325,7 @@
 //            System.out.println(" - - - - - - - - - - - - - ");
 //            System.out.println(icptr.getName());
 //         }
+         e.printStackTrace();
          throw new RuntimeException("Error generating joinpoint class for joinpoint " + info, e);
       }
    }
@@ -334,38 +335,6 @@
       return TransformerCommon.toClass(ctclass, classLoader, pd);
    }
    
-   private Object instantiateClass(GeneratedClassInfo generatedClass, JoinPointInfo info, ClassLoader classloader) throws Exception
-   {
-      Class<?> clazz = generatedClass.getGenerated(classloader);
-      Constructor<?> ctor = clazz.getConstructor(new Class[] {info.getClass()});
-      Object obj;
-      try
-      {
-         obj = ctor.newInstance(new Object[] {info});
-      }
-      catch (Exception e)
-      {
-         StringBuffer sb = new StringBuffer();
-//         Class advisedClass = info.getClazz();
-//         if (advisedClass != null)
-//         {
-//            sb.append("Target: " + advisedClass.getName() + " " + advisedClass.getClassLoader() + "\n");
-//         }
-         throw new RuntimeException(debugClass(sb, clazz).toString(), e);
-      }
-      AroundCFlow[] aroundCFlows = generatedClass.getAroundCFlows();
-      if (aroundCFlows != null)
-      {
-         for (int i = 0 ; i < aroundCFlows.length ; i++)
-         {
-            Field field = clazz.getDeclaredField(aroundCFlows[i].getFieldName());
-            field.setAccessible(true);
-            field.set(obj, aroundCFlows[i].getCflowExpression());
-         }
-      }
-      return obj;
-   }
-    
    private StringBuffer debugClass(StringBuffer sb, Class<?> clazz)
    {
       sb.append("\n\t\t" + Modifier.toString(clazz.getModifiers()) + " " + clazz.getName() + " " + clazz.getClassLoader()); 
@@ -1055,7 +1024,7 @@
          createDefaultConstructor(superCtors[defaultIndex], clazz);
       }
       
-      createPublicConstructor(superCtors[publicIndex], clazz, setups);
+      createPublicConstructor(pool, superCtors[publicIndex], clazz, setups);
       if (protectedIndex2 == -1)
       {
          createProtectedConstructors(pool, superCtors[protectedIndex1], null, clazz, setups);
@@ -1080,12 +1049,61 @@
     * This is the constructor that will be called by the GeneratedClassAdvisor, make sure it
     * initialises all the non-per-instance aspects
     */
-   private void createPublicConstructor(CtConstructor superCtor, CtClass clazz, AdviceSetups setups)throws CannotCompileException, NotFoundException
+   private void createPublicConstructor(ClassPool pool, CtConstructor superCtor, CtClass clazz, AdviceSetups setups)throws CannotCompileException, NotFoundException
    {
       StringBuffer body = new StringBuffer();
       try
       {
-         body.append("{super($$);");
+         AdviceSetup[] aroundSetups = setups.getByType(AdviceType.AROUND);
+         int size = 0;
+         int firstIndex = superCtor.getParameterTypes().length;
+         if (aroundSetups != null)
+         {
+            for (int i = 0; i < aroundSetups.length; i++)
+            {
+               if (aroundSetups[i].isNewCFlow())
+               {
+                  size++;
+                  body.append("cflow").append(aroundSetups[i].useCFlowFrom());
+                  body.append(" = $").append(++firstIndex).append(";");
+               }
+            }
+         }
+         
+         CtClass[] paramTypes = null;
+         if (size > 0)
+         {
+            // set paramTypes
+            paramTypes = new CtClass[firstIndex];
+            CtClass[] superCtorParamTypes = superCtor.getParameterTypes();
+            System.arraycopy(superCtorParamTypes, 0, paramTypes, 0, superCtorParamTypes.length);
+            CtClass astCFlowExpression = pool.get(ASTCFlowExpression.class.getName());
+            for (int i = superCtorParamTypes.length; i < firstIndex; i++)
+            {
+               paramTypes[i] = astCFlowExpression;
+            }
+            
+            // reset buffer
+            String cflowInitialization = body.toString();
+            body.setLength(0);
+            body.append("{super(");
+            if (superCtorParamTypes.length > 0)
+            {
+               body.append("$1");
+               for (int i = 1; i < superCtorParamTypes.length; i++)
+               {
+                  body.append(",$" + (i + 1));
+               }
+            }
+            body.append(");");
+            body.append(cflowInitialization);
+         }
+         else
+         {
+            body.append("{super($$);");
+            paramTypes = superCtor.getParameterTypes();
+         }
+
   
          //Initialise all the aspects not scoped per_instance or per_joinpoint
          AdviceSetup[] allSetups = setups.getAllSetups();
@@ -1096,10 +1114,10 @@
                body.append(allSetups[i].getAspectFieldName() + " = " + allSetups[i].getAspectInitialiserName() + "();");
             }
          }
-         
+                  
          body.append("}");
 
-         CtConstructor ctor = CtNewConstructor.make(superCtor.getParameterTypes(), superCtor.getExceptionTypes(), body.toString(), clazz);
+         CtConstructor ctor = CtNewConstructor.make(paramTypes, superCtor.getExceptionTypes(), body.toString(), clazz);
          ctor.setModifiers(superCtor.getModifiers());
          clazz.addConstructor(ctor);
       }
@@ -1509,33 +1527,12 @@
       }
    }
    
-   private static class AroundCFlow
-   {
-      private String fieldName;
-      private ASTCFlowExpression cflowExpression;
-      
-      public AroundCFlow(String fieldName, ASTCFlowExpression cflowEXpression)
-      {
-         this.fieldName = fieldName;
-         this.cflowExpression = cflowEXpression;
-      }
-      
-      public String getFieldName()
-      {
-         return this.fieldName;
-      }
-      
-      public ASTCFlowExpression getCflowExpression()
-      {
-         return cflowExpression;
-      }
-   }
-   
    private class GeneratedClassInfo
    {
       WeakReference<Class<?>> generated;
       String generatedName;
-      AroundCFlow[] aroundCFlows;
+      Object[] ctorParams;
+      Constructor<?> publicConstructor;
       
       GeneratedClassInfo(Class<?> generated, AdviceSetups setups)
       {
@@ -1553,23 +1550,29 @@
                }
             }
          }
+         ctorParams = new Object[size + 1];
          if (size > 0)
          {
-            aroundCFlows = new AroundCFlow[size];
-            int j = 0;
+            int j = 1;
             for (int i = 0; i < aroundSetups.length; i++)
             {
                if (aroundSetups[i].isNewCFlow())
                {
-                  aroundCFlows[j++] = new AroundCFlow(
-                        "cflow" + aroundSetups[i].useCFlowFrom(),
-                        aroundSetups[i].getCFlow());
+                  ctorParams[j++] = aroundSetups[i].getCFlow();
                }
             }
          }
+         for (Constructor<?> currentConstructor: generated.getDeclaredConstructors())
+         {
+            if (currentConstructor.getParameterTypes().length > 0 &&
+                Modifier.isPublic(currentConstructor.getModifiers()))
+            {
+               this.publicConstructor = currentConstructor;
+            }
+         }
       }
       
-      Class<?> getGenerated(ClassLoader classloader)
+      private Class<?> getGenerated(ClassLoader classloader)
       {
          Class<?> generatedClass = generated.get();
          if (generatedClass == null)
@@ -1587,9 +1590,24 @@
          return generatedClass;
       }
       
-      AroundCFlow[] getAroundCFlows()
+      Object createJoinPointInstance(ClassLoader classloader, JoinPointInfo info)
       {
-         return aroundCFlows;
+         try
+         {
+            ctorParams[0] = info;
+            return publicConstructor.newInstance(ctorParams);
+         }
+         catch (Exception e)
+         {
+            StringBuffer sb = new StringBuffer();
+//            Class advisedClass = info.getClazz();
+//            if (advisedClass != null)
+//            {
+//               sb.append("Target: " + advisedClass.getName() + " " + advisedClass.getClassLoader() + "\n");
+//            }
+            throw new RuntimeException(
+            debugClass(sb, publicConstructor.getDeclaringClass()).toString(), e);
+         }
       }
    }
    




More information about the jboss-cvs-commits mailing list