[jboss-cvs] JBossAS SVN: r59376 - in projects/microcontainer/trunk: aop-mc-int/src/main/org/jboss/aop/microcontainer/integration kernel/src/main/org/jboss/beans/metadata/plugins/factory kernel/src/main/org/jboss/kernel/plugins/dependency

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jan 5 12:35:01 EST 2007


Author: kabir.khan at jboss.com
Date: 2007-01-05 12:34:51 -0500 (Fri, 05 Jan 2007)
New Revision: 59376

Modified:
   projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java
   projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
Log:
Fixes to get aop/mc integration working following new metadata crossover

Modified: projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java	2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPConstructorJoinpoint.java	2007-01-05 17:34:51 UTC (rev 59376)
@@ -21,7 +21,9 @@
 */
 package org.jboss.aop.microcontainer.integration;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
+import java.util.List;
 
 import org.jboss.aop.Advisor;
 import org.jboss.aop.AspectManager;
@@ -32,9 +34,20 @@
 import org.jboss.aop.proxy.container.ContainerCache;
 import org.jboss.aop.proxy.container.GeneratedAOPProxyFactory;
 import org.jboss.joinpoint.plugins.BasicConstructorJoinPoint;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
+import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
 import org.jboss.metadata.spi.MetaData;
+import org.jboss.metadata.spi.context.MetaDataContext;
+import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
+import org.jboss.metadata.spi.scope.CommonLevels;
+import org.jboss.metadata.spi.scope.ScopeKey;
+import org.jboss.metadata.spi.signature.MethodSignature;
 import org.jboss.metadata.spi.stack.MetaDataStack;
+import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.ConstructorInfo;
+import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.TypeInfo;
 
 /**
@@ -46,10 +59,13 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public class AOPConstructorJoinpoint extends BasicConstructorJoinPoint
+public class AOPConstructorJoinpoint extends BasicConstructorJoinPoint implements KernelControllerContextAware
 {
+   private final static String[] EMPTY_PARAM_ARRAY = new String[0];
+   
    AOPProxyFactory proxyFactory = new GeneratedAOPProxyFactory();
    
+   KernelControllerContext context;
    /**
     * Create a new AOPConstructorJoinpoint.
     *
@@ -60,6 +76,17 @@
       super(constructorInfo);
    }
 
+   public void setKernelControllerContext(KernelControllerContext context) throws Exception
+   {
+      this.context = context;
+   }
+
+   public void unsetKernelControllerContext(KernelControllerContext context) throws Exception
+   {
+      this.context = null;
+   }
+
+
    public Object dispatch() throws Throwable
    {
       Class clazz = constructorInfo.getDeclaringClass().getType();
@@ -72,15 +99,15 @@
       MetaDataStack.mask();
       try
       {
-         MetaData md = getNonEmptyMetaData(metaData);
-         ContainerCache cache = ContainerCache.initialise(manager, clazz, md);
+         boolean hasInstanceMetaData = hasInstanceOrJoinpointMetaData(metaData);
+         ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, hasInstanceMetaData);
          AOPProxyFactoryParameters params = new AOPProxyFactoryParameters();
          Object target = createTarget(cache, params);
-
          params.setProxiedClass(target.getClass());
-         params.setMetaData(md);
+         params.setMetaData(metaData);
          params.setTarget(target);
          params.setContainerCache(cache);
+         params.setMetaDataHasInstanceLevelData(hasInstanceMetaData);
          
          return proxyFactory.createAdvisedProxy(params);
       }
@@ -90,21 +117,99 @@
       }
    }
 
-   private MetaData getNonEmptyMetaData(MetaData metaData)
+   private boolean hasInstanceOrJoinpointMetaData(MetaData metaData)
    {
       if (metaData == null)
       {
-         return null;
+         return false;
       }
+
+      MetaDataRetrieval retrieval = null;
+      if (context != null)
+      {
+         //TODO We might need the context injected somehow by the GenericBeanFactory, since that is used for creating the aspect instances...
+         Kernel kernel = context.getKernel();
+         KernelMetaDataRepository repository = kernel.getMetaDataRepository();
+         retrieval = repository.getMetaDataRetrieval(context);
+         
+         if (retrieval instanceof MetaDataContext)
+         {
+            ScopeKey instanceKey = new ScopeKey(CommonLevels.INSTANCE, (String)context.getName());
+            
+            List<MetaDataRetrieval> retrievals =((MetaDataContext)retrieval).getLocalRetrievals();
+            for (MetaDataRetrieval ret : retrievals)
+            {
+               ScopeKey key = ret.getScope();
+               if (instanceKey.equals(key))
+               {
+                  Annotation[] anns = ret.retrieveAnnotations().getValue();
+                  if (anns != MetaData.NO_ANNOTATIONS)
+                  {
+                     return true;
+                  }
+               }
+            }
+         }
+         
+         //Check for method annotations
+         if (hasMethodMetaData(metaData))
+         {
+            return true;
+         }
+      }      
       
-      if (metaData.getAnnotations() != MetaData.NO_ANNOTATIONS)
+      return false; 
+   }
+   
+   private boolean hasMethodMetaData(MetaData metaData)
+   {
+      //Check for method annotations
+      ClassInfo info = constructorInfo.getDeclaringClass();
+      while (info != null)
       {
-         return metaData;
+         MethodInfo[] methods = info.getDeclaredMethods();
+         if (methods != null)
+         {
+            for (MethodInfo mi : methods)
+            {
+               if (methodHasAnnotations(metaData, mi))
+               {
+                  return true;
+               }
+            }
+         }
+         info = info.getSuperclass();
       }
       
-      return null; 
+      return false;
    }
    
+   private boolean methodHasAnnotations(MetaData metaData, MethodInfo mi)
+   {
+      TypeInfo[] types = mi.getParameterTypes();
+      String[] typeStrings = null;
+      
+      if (types.length == 0)
+      {
+         typeStrings = EMPTY_PARAM_ARRAY;
+      }
+      else
+      {
+         typeStrings = new String[types.length];
+         for (int j = 0 ; j < types.length ; j++)
+         {
+            typeStrings[j] = types[j].getName();
+         }
+      }
+      MethodSignature sig = new MethodSignature(mi.getName(), typeStrings);
+      MetaData methodMD = metaData.getComponentMetaData(sig);
+      if (methodMD != null)
+      {
+         return methodMD.getAnnotations() != MetaData.NO_ANNOTATIONS;
+      }
+      return false;
+   }
+   
    private Object createTarget(ContainerCache cache, AOPProxyFactoryParameters params) throws Throwable
    {
       Advisor advisor = cache.getAdvisor();

Modified: projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java
===================================================================
--- projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java	2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/aop-mc-int/src/main/org/jboss/aop/microcontainer/integration/AOPDependencyBuilderDelegate.java	2007-01-05 17:34:51 UTC (rev 59376)
@@ -91,7 +91,7 @@
             Advisor advisor;
             synchronized (ContainerCache.mapLock)
             {
-               ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData);
+               ContainerCache cache = ContainerCache.initialise(manager, clazz, metaData, true);
                advisor = cache.getAdvisor();
             }
             

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java	2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/factory/GenericBeanFactory.java	2007-01-05 17:34:51 UTC (rev 59376)
@@ -31,12 +31,15 @@
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.joinpoint.spi.Joinpoint;
 import org.jboss.joinpoint.spi.JoinpointException;
 import org.jboss.joinpoint.spi.MethodJoinpoint;
 import org.jboss.joinpoint.spi.TargettedJoinpoint;
 import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
 
 /**
  * Collection metadata.

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2007-01-05 16:47:58 UTC (rev 59375)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2007-01-05 17:34:51 UTC (rev 59376)
@@ -85,6 +85,9 @@
          {
             if( cl != null && access == null )
                Thread.currentThread().setContextClassLoader(cl);
+            if (joinpoint instanceof KernelControllerContextAware)
+               ((KernelControllerContextAware)joinpoint).setKernelControllerContext(context);
+
             if (access == null)
             {
                return joinpoint.dispatch();
@@ -106,6 +109,8 @@
          {
             if( cl != null && access == null )
                Thread.currentThread().setContextClassLoader(tcl);
+            if (joinpoint instanceof KernelControllerContextAware) 
+               ((KernelControllerContextAware)joinpoint).unsetKernelControllerContext(null);
          }
       }
       finally




More information about the jboss-cvs-commits mailing list