[jboss-cvs] JBossAS SVN: r62366 - 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
Mon Apr 16 11:25:38 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-04-16 11:25:38 -0400 (Mon, 16 Apr 2007)
New Revision: 62366

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
   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] When creating an instance advisor the first time, simply copy the JoinPointInfos from the parent advisor. Make sure that infos for callers are copied across as well.
Move more of the code out of the generated advisors into the GeneratedClassAdvisor base class.

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2007-04-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -591,7 +591,7 @@
       }
    }
 
-   private void createInterceptorChains() throws Exception
+   protected void createInterceptorChains() throws Exception
    {
       if (AspectManager.verbose) System.out.println("[debug] Creating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
       MethodInterceptors newMethodInfos = initializeMethodChain();

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-04-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -42,6 +42,7 @@
 import org.jboss.aop.instrument.JoinPointGenerator;
 import org.jboss.aop.instrument.MethodByConJoinPointGenerator;
 import org.jboss.aop.instrument.MethodByMethodJoinPointGenerator;
+import org.jboss.aop.instrument.MethodExecutionTransformer;
 import org.jboss.aop.instrument.MethodJoinPointGenerator;
 import org.jboss.aop.joinpoint.FieldJoinpoint;
 import org.jboss.aop.joinpoint.Joinpoint;
@@ -112,24 +113,99 @@
 
    protected void initialise(Class clazz, AspectManager manager)
    {
-      super.setManager(manager);
+      advisorStrategy.initialise(clazz, manager);
+   }
 
-      //Make sure that we copy across per class and per joinpoint aspects from the old advisor if it exists
-      //Generated advisors get created when the class is first accessed (not loaded), meaning that there could be an exisiting advisor
-      //used for mathcing already when setting up the microcontainer.
-      Advisor existing = AspectManager.instance().getAnyAdvisorIfAdvised(clazz);
-      if (existing != null)
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseCallers()
+   {
+   }
+
+   /**
+    * Generated instance advisor sub class will override
+    */
+   protected void initialiseInfosForInstance()
+   {
+      
+
+   }
+   
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected MethodInfo copyInfoFromClassAdvisor(MethodInfo info)
+   {
+      MethodInfo copy = (MethodInfo)info.copy();
+      copy.setAdvisor(this);
+      addMethodInfo(copy);
+      return copy;
+   }
+   
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected FieldInfo copyInfoFromClassAdvisor(FieldInfo info)
+   {
+      FieldInfo copy = (FieldInfo)info.copy();
+      copy.setAdvisor(this);
+      if (copy.isRead())
       {
-         this.aspects = existing.aspects;
-         if (existing instanceof GeneratedClassAdvisor)
-         {
-            this.perClassJoinpointAspectDefinitions = ((GeneratedClassAdvisor)existing).perClassJoinpointAspectDefinitions;
-         }
+         addFieldReadInfo(copy);
       }
-      
-      manager.initialiseClassAdvisor(clazz, this);
+      else
+      {
+         addFieldWriteInfo(copy);
+      }
+      return copy;
    }
+
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected ConByConInfo copyInfoFromClassAdvisor(ConByConInfo info)
+   {
+      ConByConInfo copy = (ConByConInfo)info.copy();
+      copy.setAdvisor(this);
+//      addMethodInfo(copy);
+      return copy;
+   }
+
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected MethodByConInfo copyInfoFromClassAdvisor(MethodByConInfo info)
+   {
+      MethodByConInfo copy = (MethodByConInfo)info.copy();
+      copy.setAdvisor(this);
+//      addMethodInfo(copy);
+      return copy;
+   }
+
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected ConByMethodInfo copyInfoFromClassAdvisor(ConByMethodInfo info)
+   {
+      ConByMethodInfo copy = (ConByMethodInfo)info.copy();
+      copy.setAdvisor(this);
+//      addMethodInfo(copy);
+      return copy;
+   }
    
+   /**
+    * To be called by initialiseInfosForInstance() in the generated instance advisors
+    */
+   protected MethodByMethodInfo copyInfoFromClassAdvisor(MethodByMethodInfo info)
+   {
+      MethodByMethodInfo copy = (MethodByMethodInfo)info.copy();
+      copy.setAdvisor(this);
+//      addMethodInfo(copy);
+      return copy;
+   }
+   
+   
    @Override
    protected void rebuildInterceptors()
    {
@@ -213,25 +289,25 @@
    @Override
    protected void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
    {
-      GeneratedClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
-      if (classAdvisor == null)
-      {
-         //We are either the class advisor or an instanceadvisor with own data so we need to do all the work
-         super.resolveConstructorPointcut(newConstructorInfos, binding);
-      }
+      advisorStrategy.resolveConstructorPointcut(newConstructorInfos, binding);
    }
 
    @Override
    protected void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
    {
-      GeneratedClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
-      if (classAdvisor == null)
-      {
-         //We are either the class advisor or an instanceadvisor with own data so we need to do all the work
-         super.resolveConstructionPointcut(newConstructionInfos, binding);
-      }
+      advisorStrategy.resolveConstructionPointcut(newConstructionInfos, binding);
    }
    
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseMethods()
+   {
+   }
+   
+   /**
+    * Called by initialiseMethods() in generated advisor sub classes
+    */
    protected void addMethodInfo(MethodInfo mi)
    {
       MethodInfo old = methodInfos.getMethodInfo(mi.getHash());
@@ -240,8 +316,8 @@
          overriddenMethods.add(old);
       }
       methodInfos.put(mi.getHash(), mi);
-      //If we do dynamic invokes the method will need to be accessible via reflection if private/protected
-      SecurityActions.setAccessible(mi.getAdvisedMethod());
+      
+      advisorStrategy.makeAccessibleMethod(mi);
    }
 
    @Override
@@ -275,6 +351,16 @@
    }
 
 
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseConstructors()
+   {
+   }
+
+   /**
+    * Called by initialiseConstructors() in generated advisor sub classes
+    */
    protected void addConstructorInfo(ConstructorInfo ci)
    {
       constructorInfos.add(ci);
@@ -282,6 +368,12 @@
       SecurityActions.setAccessible(ci.getConstructor());
    }
 
+   
+   protected void createInterceptorChains() throws Exception
+   {
+      advisorStrategy.createInterceptorChains();
+   }
+   
    @Override
    protected ArrayList initializeConstructorChain()
    {
@@ -295,6 +387,16 @@
       return constructorInfos;
    }
 
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseConstructions()
+   {
+   }
+
+   /**
+    * Called by initialiseConstructions() in generated advisor sub classes
+    */
    protected void addConstructionInfo(ConstructionInfo ci)
    {
       constructionInfos.add(ci);
@@ -313,11 +415,21 @@
       return constructionInfos;
    }
 
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseFieldReads()
+   {
+   }
+
+   /**
+    * Called by initialiseFieldReads() in generated advisor sub classes
+    */
    protected void addFieldReadInfo(FieldInfo fi)
    {
       fieldReadInfos.add(fi);
       //If we do dynamic invokes the field will need to be accessible via reflection
-      SecurityActions.setAccessible(fi.getAdvisedField());
+      advisorStrategy.makeAccessibleField(fi);
    }
 
    @Override
@@ -326,11 +438,21 @@
       return mergeFieldInfos(fieldReadInfos, true);
    }
 
+   /**
+    * Generated class advisor sub class will override
+    */
+   protected void initialiseFieldWrites()
+   {
+   }
+
+   /**
+    * Called by initialiseFieldWrites() in generated advisor sub classes
+    */
    protected void addFieldWriteInfo(FieldInfo fi)
    {
       fieldWriteInfos.add(fi);
       //If we do dynamic invokes the field will need to be accessible via reflection
-      SecurityActions.setAccessible(fi.getAdvisedField());
+      advisorStrategy.makeAccessibleField(fi);
    }
 
    @Override
@@ -910,7 +1032,9 @@
     */
    private interface AdvisorStrategy
    {
+      void initialise(Class clazz, AspectManager manager);
       void checkVersion();
+      void createInterceptorChains() throws Exception;
       MethodJoinPointGenerator getJoinPointGenerator(MethodInfo info);
       FieldJoinPointGenerator getJoinPointGenerator(FieldInfo info);
       ConstructorJoinPointGenerator getJoinPointGenerator(ConstructorInfo info);
@@ -932,16 +1056,52 @@
       void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding);
       void finalizeConstructorChain(ArrayList newConstructorInfos);
       void finalizeConstructionChain(ArrayList newConstructionInfos);
+      void makeAccessibleField(FieldInfo fi);
+      void makeAccessibleMethod(MethodInfo mi);
    }
    
    private class ClassAdvisorStrategy implements AdvisorStrategy
    {
       GeneratedClassAdvisor parent;
+
+      public void initialise(Class clazz, AspectManager manager)
+      {
+         initialiseMethods();
+         initialiseConstructors();
+         initialiseConstructions();
+         initialiseFieldReads();
+         initialiseFieldWrites();
+         
+         GeneratedClassAdvisor.super.setManager(manager);
+
+         //Make sure that we copy across per class and per joinpoint aspects from the old advisor if it exists
+         //Generated advisors get created when the class is first accessed (not loaded), meaning that there could be an exisiting advisor
+         //used for mathcing already when setting up the microcontainer.
+         Advisor existing = AspectManager.instance().getAnyAdvisorIfAdvised(clazz);
+         if (existing != null)
+         {
+            GeneratedClassAdvisor.this.aspects = existing.aspects;
+            if (existing instanceof GeneratedClassAdvisor)
+            {
+               GeneratedClassAdvisor.this.perClassJoinpointAspectDefinitions = ((GeneratedClassAdvisor)existing).perClassJoinpointAspectDefinitions;
+            }
+         }
+         
+         manager.initialiseClassAdvisor(clazz, GeneratedClassAdvisor.this);
+         
+         initialiseCallers();
+      }
+
       public void checkVersion()
       {
          //The version is only has any significance for instance advisors
       }
 
+      public void createInterceptorChains() throws Exception
+      {
+         GeneratedClassAdvisor.super.createInterceptorChains();
+      }
+      
       public MethodJoinPointGenerator getJoinPointGenerator(MethodInfo info)
       {
          MethodJoinPointGenerator generator = (MethodJoinPointGenerator)joinPoinGenerators.get(info.getJoinpoint());
@@ -1120,12 +1280,12 @@
 
       public void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
       {
-         GeneratedClassAdvisor.this.resolveConstructorPointcut(newConstructorInfos, binding);
+         GeneratedClassAdvisor.super.resolveConstructorPointcut(newConstructorInfos, binding);
       }
 
       public void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
       {
-         GeneratedClassAdvisor.this.resolveConstructionPointcut(newConstructionInfos, binding);
+         GeneratedClassAdvisor.super.resolveConstructionPointcut(newConstructionInfos, binding);
       }
 
       public void finalizeConstructorChain(ArrayList newConstructorInfos)
@@ -1147,6 +1307,18 @@
             finalizeChainAndRebindJoinPoint(oldConstructionInfos, info, generator);
          }
       }
+
+      public void makeAccessibleField(FieldInfo fi)
+      {
+         //If we do dynamic invokes the field will need to be accessible via reflection
+         SecurityActions.setAccessible(fi.getAdvisedField());
+      }
+      
+      public void makeAccessibleMethod(MethodInfo mi)
+      {
+         //If we do dynamic invokes the method will need to be accessible via reflection if private/protected
+         SecurityActions.setAccessible(mi.getAdvisedMethod());
+      }
    }
    
    private class InstanceAdvisorStrategy implements AdvisorStrategy 
@@ -1160,6 +1332,15 @@
          GeneratedClassAdvisor.this.version = parent.version;         
       }
       
+      public void initialise(Class clazz, AspectManager manager)
+      {
+         initialiseInfosForInstance();
+         
+         GeneratedClassAdvisor.super.setManager(manager);
+
+         manager.initialiseClassAdvisor(clazz, GeneratedClassAdvisor.this);
+      }
+
       public void checkVersion()
       {
          if (needsRebuild || parent.version != GeneratedClassAdvisor.this.version)
@@ -1169,6 +1350,19 @@
          }
       }
       
+      public void createInterceptorChains() throws Exception
+      {
+         if (GeneratedClassAdvisor.super.initialized)
+         {
+            GeneratedClassAdvisor.super.createInterceptorChains();
+         }
+         else
+         {
+            //Instance advisor copies the chains from the class advisor during its initialise stage 
+            GeneratedClassAdvisor.super.initialized = true;
+         }
+      }
+
       public MethodJoinPointGenerator getJoinPointGenerator(MethodInfo info)
       {
          //We are an instance advisor, get the generator from the class advisor
@@ -1313,5 +1507,15 @@
       {
          //Since the instance already exists it makes no sense to have bindings for constructors
       }
+
+      public void makeAccessibleField(FieldInfo fi)
+      {
+         //Do nothing, field was already made accessible in class advisor
+      }
+
+      public void makeAccessibleMethod(MethodInfo mi)
+      {
+         //Do nothing, field was already made accessible in class advisor
+      }
    }
 }

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-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -62,7 +62,7 @@
          this.interceptors = new Interceptor[other.interceptors.length];
          System.arraycopy(other.interceptors, 0, this.interceptors, 0, other.interceptors.length);
       }
-      if (other.interceptorChain != null)this.interceptorChain = (ArrayList)interceptorChain.clone();
+      if (other.interceptorChain != null)this.interceptorChain.addAll(interceptorChain);
    }
 
    protected void clear()

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-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -510,6 +510,5 @@
       {
          return invocation.invokeNext();
       }
-      
    }
 }

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-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -33,10 +33,12 @@
 
 import org.jboss.aop.AspectManager;
 import org.jboss.aop.ClassAdvisor;
+import org.jboss.aop.ConByConInfo;
 import org.jboss.aop.ConByMethodInfo;
 import org.jboss.aop.FieldInfo;
 import org.jboss.aop.GeneratedClassAdvisor;
 import org.jboss.aop.JoinPointInfo;
+import org.jboss.aop.MethodByConInfo;
 import org.jboss.aop.MethodByMethodInfo;
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.classpool.AOPClassPool;
@@ -56,12 +58,12 @@
    public static final String GET_CURRENT_ADVISOR = GET_CURRENT_ADVISOR_NAME + "()";
 
    //field names in advisor
-//   private static final String ADVISED_CLASS = "advisedClass";
    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";
@@ -71,6 +73,7 @@
    private static final String INITIALISE_CONSTRUCTIONS = "initialiseConstructions";
    private static final String INITIALISE_CONSTRUCTORS = "initialiseConstructors";
    private static final String INITIALISE_METHODS = "initialiseMethods";
+   private static final String INITIALISE_INFOS_FOR_INSTANCE = "initialiseInfosForInstance";
    public static final String GET_CLASS_ADVISOR = "_getClassAdvisor";
    private static final String DO_REBUILD_FOR_INSTANCE = "doRebuildForInstance";
 
@@ -305,7 +308,7 @@
       genInstanceAdvisor.addInterface(untransformable);
 
       //Add reference to parent advisor
-      CtField classAdvisor = new CtField(genadvisor, "classAdvisor", genInstanceAdvisor);
+      CtField classAdvisor = new CtField(genadvisor, CLASS_ADVISOR, genInstanceAdvisor);
       genInstanceAdvisor.addField(classAdvisor);
 
       CtMethod advicesUpdated = CtNewMethod.make(
@@ -347,6 +350,17 @@
       CtConstructor ctor = CtNewConstructor.make(new CtClass[]{forName("java.lang.Object"), genadvisor}, new CtClass[0], body, genInstanceAdvisor);
       genInstanceAdvisor.addConstructor(ctor);
 
+      //Create methods for quicker initialising of the infos when the instance advisor is created
+      CtMethod initialiseInfosForInstance = CtNewMethod.make(
+            Modifier.PROTECTED,
+            CtClass.voidType,
+            INITIALISE_INFOS_FOR_INSTANCE,
+            EMPTY_SIG,
+            EMPTY_EXCEPTIONS,
+            null,
+            genInstanceAdvisor);
+      genInstanceAdvisor.addMethod(initialiseInfosForInstance);
+
       return genInstanceAdvisor;
    }
 
@@ -357,13 +371,7 @@
          "   String domainName = org.jboss.aop.Domain.getDomainName(" + DECLARING_CLASS + ", $2);" + 
          "   " + DOMAIN + "= new org.jboss.aop.GeneratedAdvisorDomain($1, domainName, " + DECLARING_CLASS + ", false); " +
          "   ((org.jboss.aop.Domain)" + DOMAIN + ").setInheritsBindings(true); " +
-         "   " + INITIALISE_METHODS + "();" +
-         "   " + INITIALISE_CONSTRUCTORS + "();" +
-         "   " + INITIALISE_CONSTRUCTIONS + "();" +
-         "   " + INITIALISE_FIELD_READS + "();" +
-         "   " + INITIALISE_FIELD_WRITES + "();" +
          "   super.initialise(" + DECLARING_CLASS + ", " + DOMAIN + ");" +
-         "   " + INITIALISE_CALLERS + "();" +
          "}";
 
          CtMethod initialise = CtNewMethod.make(
@@ -612,6 +620,20 @@
             String updatedJoinpointAdvicesName = addAdvicesUpdatedForJoinpointField(infoName);
             advicesUpdatedCode.append(updatedJoinpointAdvicesName + " = true;");
             addWrapperDelegatorMethodToInstanceAdvisor(names, updatedJoinpointAdvicesName);
+            
+            //Add code to the initialiseInfosForInstance to copy the infos from the super class
+            String infoClassName = fields[i].getType().getName();
+            if (
+                  infoClassName.equals(FieldInfo.class.getName()) || 
+                  infoClassName.equals(MethodInfo.class.getName()) ||
+                  infoClassName.equals(ConByConInfo.class.getName()) ||
+                  infoClassName.equals(MethodByConInfo.class.getName()) ||
+                  infoClassName.equals(ConByMethodInfo.class.getName()) ||
+                  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);
+            }
          }
 
          if (isBaseClass(superClass))
@@ -672,9 +694,9 @@
       }
    }
 
-   boolean initialisedMethods = false;
    protected void initaliseMethodInfo(String infoName, long hash, long unadvisedHash)throws NotFoundException
    {
+      //Add code to initialise info to class advisor
       String code =
          infoName + " = new " + MethodExecutionTransformer.METHOD_INFO_CLASS_NAME + "(" +
                "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
@@ -682,11 +704,12 @@
                unadvisedHash + "L, this);" +
          GeneratedClassAdvisor.ADD_METHOD_INFO + "(" + infoName + ");";
 
-      addCodeToInitialiseMethod(code, INITIALISE_METHODS);
+      addCodeToInitialiseMethod(genadvisor, code, INITIALISE_METHODS);
    }
 
    protected void initialiseFieldReadInfoField(String infoName, int index, String fieldName, long wrapperHash) throws NotFoundException
    {
+      //Add code to initialise info to class advisor
       String code =
          infoName + " = new " + FieldAccessTransformer.FIELD_INFO_CLASS_NAME + "(" +
             "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
@@ -695,11 +718,12 @@
             wrapperHash + "L, this, true);" +
          GeneratedClassAdvisor.ADD_FIELD_READ_INFO + "(" + infoName + ");";
 
-      addCodeToInitialiseMethod(code, INITIALISE_FIELD_READS);
+      addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_READS);
    }
 
    protected void initialiseFieldWriteInfoField(String infoName, int index, String fieldName, long wrapperHash) throws NotFoundException
    {
+      //Add code to initialise info to class advisor
       String code =
          infoName + " = new " + FieldAccessTransformer.FIELD_INFO_CLASS_NAME + "(" +
             "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
@@ -708,11 +732,12 @@
             wrapperHash + "L, this, false);" +
          GeneratedClassAdvisor.ADD_FIELD_WRITE_INFO + "(" + infoName + ");";
 
-      addCodeToInitialiseMethod(code, INITIALISE_FIELD_WRITES);
+      addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_WRITES);
    }
 
    protected void initialiseConstructorInfoField(String infoName, int index, long constructorHash, long wrapperHash) throws NotFoundException
    {
+      //Add code to initialise info to class advisor
       String code =
          infoName + " = new " + ConstructorExecutionTransformer.CONSTRUCTOR_INFO_CLASS_NAME + "(" +
             "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
@@ -721,11 +746,12 @@
             constructorHash + "L, this);" +
          GeneratedClassAdvisor.ADD_CONSTRUCTOR_INFO + "(" + infoName + ");";
 
-      addCodeToInitialiseMethod(code, INITIALISE_CONSTRUCTORS);
+      addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTORS);
    }
 
    protected void initialiseConstructionInfoField(String infoName, int index, long constructorHash) throws NotFoundException
    {
+      //Add code to initialise info to class advisor
       String code =
          infoName + " = new " + ConstructionTransformer.CONSTRUCTION_INFO_CLASS_NAME + "(" +
             "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
@@ -733,19 +759,19 @@
             constructorHash + "L, this);" +
          GeneratedClassAdvisor.ADD_CONSTRUCTION_INFO + "(" + infoName + ");";
 
-      addCodeToInitialiseMethod(code, INITIALISE_CONSTRUCTIONS);
-
+      addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTIONS);
    }
 
    protected void initialiseCallerInfoField(String infoName, String init)throws CannotCompileException, NotFoundException
    {
-      addCodeToInitialiseMethod(infoName + " = " + init + ";", INITIALISE_CALLERS);
+      //Add code to initialise info to class advisor
+      addCodeToInitialiseMethod(genadvisor, infoName + " = " + init + ";", INITIALISE_CALLERS);
    }
 
 
-   private void addCodeToInitialiseMethod(String code, String methodName) throws NotFoundException
+   private void addCodeToInitialiseMethod(CtClass clazz, String code, String methodName) throws NotFoundException
    {
-      CtMethod method = genadvisor.getDeclaredMethod(methodName);
+      CtMethod method = clazz.getDeclaredMethod(methodName);
       try
       {
          method.insertAfter(code);
@@ -839,7 +865,35 @@
 
             return new GeneratedAdvisorNameExtractor(infoName, wrapper, joinPointField);
          }
+         else if (infoField.getType().getName().equals(ConByConInfo.class.getName()))
+         {
+            if (!infoName.startsWith("aop$constructorCall_con_"))
+            {
+               throw new RuntimeException("Bad ConByConInfo name: '" + infoName + "'");
+            }
 
+            CtMethod wrapper = genadvisor.getDeclaredMethod(infoName);
+
+            String joinPointName = ConByConJoinPointGenerator.JOINPOINT_FIELD_PREFIX + infoName.substring("aop$constructorCall_con_".length());
+            CtField joinPointField = genadvisor.getDeclaredField(joinPointName);
+
+            return new GeneratedAdvisorNameExtractor(infoName, wrapper, joinPointField);
+         }
+         else if (infoField.getType().getName().equals(MethodByConInfo.class.getName()))
+         {
+            if (!infoName.startsWith("aop$methodCall_con"))
+            {
+               throw new RuntimeException("Bad MethodByConInfo name: '" + infoName + "'");
+            }
+
+            CtMethod wrapper = genadvisor.getDeclaredMethod(infoName);
+
+            String joinPointName = MethodByConJoinPointGenerator.JOINPOINT_FIELD_PREFIX + infoName.substring("aop$methodCall_con_".length());
+            CtField joinPointField = genadvisor.getDeclaredField(joinPointName);
+
+            return new GeneratedAdvisorNameExtractor(infoName, wrapper, joinPointField);
+         }
+
          return null;
       }
 

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-16 14:07:56 UTC (rev 62365)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-04-16 15:25:38 UTC (rev 62366)
@@ -2077,4 +2077,4 @@
       }
    }
    
-}
\ No newline at end of file
+}




More information about the jboss-cvs-commits mailing list