[jboss-cvs] JBossAS SVN: r64447 - in projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel: plugins/dependency and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Aug 3 07:16:54 EDT 2007


Author: alesj
Date: 2007-08-03 07:16:54 -0400 (Fri, 03 Aug 2007)
New Revision: 64447

Modified:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAdaptersAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AliasesAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BeanAnnotationAdapter.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/CallbackAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ClassFactoryAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorValueAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DemandsAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DependsAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FactoryMethodAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallationParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/LifecycleParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAware.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/SupplysAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/KernelControllerContext.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
Log:
Added applyMetaData() to KernelControllerContext.
Direct introduction of MetaDataVisitor into AnnotationPlugin.
Reusing existing AbstractMetaDataVisitor from AbstractKernelControllerContext + flag on already applied annotations.

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAdaptersAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAdaptersAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAdaptersAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -45,5 +45,4 @@
          throw new IllegalArgumentException("Annotation adapters are empty!");
       this.adapters.addAll(Arrays.asList(adapters));
    }
-
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -27,17 +27,12 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.Stack;
 
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
-import org.jboss.dependency.spi.CallbackItem;
-import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.metadata.spi.retrieval.AnnotationItem;
 import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
@@ -102,156 +97,35 @@
       return false;
    }
 
-   protected void internalApplyAnnotation(T info, MetaDataRetrieval retrieval, C annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, MetaDataRetrieval retrieval, C annotation, KernelControllerContext context) throws Throwable
    {
-      internalApplyAnnotation(info, annotation, context);
+      return internalApplyAnnotation(info, annotation, context);
    }
 
-   protected void internalApplyAnnotation(T info, C annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, C annotation, KernelControllerContext context) throws Throwable
    {
-      internalApplyAnnotation(info, annotation, context.getBeanMetaData());
+      return internalApplyAnnotation(info, annotation, context.getBeanMetaData());
    }
 
-   protected void internalApplyAnnotation(T info, C annotation, BeanMetaData beanMetaData) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, C annotation, BeanMetaData beanMetaData) throws Throwable
    {
+      return Collections.emptyList();
    }
 
-   public final void applyAnnotation(T info, MetaDataRetrieval retrieval, KernelControllerContext context) throws Throwable
+   public final void applyAnnotation(T info, MetaDataRetrieval retrieval, MetaDataVisitor visitor) throws Throwable
    {
-      // todo - match multiple annotations?
       AnnotationItem<C> item = retrieval.retrieveAnnotation(getAnnotation());
-      if (item == null || isMetaDataAlreadyPresent(info, item.getAnnotation(), context))
+      if (item == null || isMetaDataAlreadyPresent(info, item.getAnnotation(), visitor.getControllerContext()))
          return;
-      internalApplyAnnotation(info, retrieval, item.getAnnotation(), context);
-   }
-
-   protected void executeVisit(KernelControllerContext context, MetaDataVisitorNode node)
-   {
-      MetaDataVisitor visitor = getMetaDataVisitor(context);
-      node.initialVisit(visitor);
-      node.describeVisit(visitor);
-   }
-
-   protected MetaDataVisitor getMetaDataVisitor(KernelControllerContext context)
-   {
-      return new PluginMetaDataVisitor(context);
-   }
-
-   protected class PluginMetaDataVisitor implements MetaDataVisitor
-   {
-      private ControllerState contextState = ControllerState.INSTANTIATED;
-      private KernelControllerContext context;
-      private Stack<MetaDataVisitorNode> visitorNodeStack;
-
-      public PluginMetaDataVisitor(KernelControllerContext context)
+      List<? extends MetaDataVisitorNode> nodes = internalApplyAnnotation(info, retrieval, item.getAnnotation(), visitor.getControllerContext());
+      if (nodes != null && nodes.isEmpty() == false)
       {
-         this.context = context;
-         this.visitorNodeStack = new Stack<MetaDataVisitorNode>();
-         // add bean meta data
-         this.visitorNodeStack.add(context.getBeanMetaData());
-      }
-
-      public KernelControllerContext getControllerContext()
-      {
-         return context;
-      }
-
-      public ControllerState getContextState()
-      {
-         return contextState;
-      }
-
-      public void setContextState(ControllerState contextState)
-      {
-         this.contextState = contextState;
-      }
-
-      public void addDependency(DependencyItem dependency)
-      {
-         context.getDependencyInfo().addIDependOn(dependency);
-      }
-
-      public void addInstallCallback(CallbackItem callback)
-      {
-         context.getDependencyInfo().addInstallItem(callback);
-      }
-
-      public void addUninstallCallback(CallbackItem callback)
-      {
-         context.getDependencyInfo().addUninstallItem(callback);
-      }
-
-      public void initialVisit(MetaDataVisitorNode node)
-      {
-         visitorNodeStack.push(node);
-         try
+         for(MetaDataVisitorNode node : nodes)
          {
-            boolean trace = log.isTraceEnabled();
-            if (trace)
-               log.trace("Initial visit node " + node);
-
-            // Visit the children of this node
-            Iterator children = node.getChildren();
-            if (children != null)
-            {
-               ControllerState restoreState = contextState;
-               while (children.hasNext())
-               {
-                  MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
-                  try
-                  {
-                     child.initialVisit(this);
-                  }
-                  finally
-                  {
-                     contextState = restoreState;
-                  }
-               }
-            }
+            node.initialVisit(visitor);
+            node.describeVisit(visitor);
          }
-         finally
-         {
-            visitorNodeStack.pop();
-         }
       }
-
-      public void describeVisit(MetaDataVisitorNode node)
-      {
-         visitorNodeStack.push(node);
-         try
-         {
-            boolean trace = log.isTraceEnabled();
-            if (trace)
-               log.trace("Describe visit node " + node);
-
-            // Visit the children of this node
-            Iterator children = node.getChildren();
-            if (children != null)
-            {
-               ControllerState restoreState = contextState;
-               while (children.hasNext())
-               {
-                  MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
-                  try
-                  {
-                     child.describeVisit(this);
-                  }
-                  finally
-                  {
-                     contextState = restoreState;
-                  }
-               }
-            }
-         }
-         finally
-         {
-            visitorNodeStack.pop();
-         }
-      }
-
-      public Stack<MetaDataVisitorNode> visitorNodeStack()
-      {
-         return visitorNodeStack;
-      }
    }
+
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractParameterAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractParameterAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -24,6 +24,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
@@ -64,12 +65,12 @@
 
    protected abstract ParameterInfo[] getParameters(T info);
 
-   protected void handleParameterlessInfo(T info, C annotation, KernelControllerContext context)
+   protected List<? extends MetaDataVisitorNode> handleParameterlessInfo(T info, C annotation, KernelControllerContext context)
    {
-      handleParameterlessInfo(info, annotation, context.getBeanMetaData());
+      return handleParameterlessInfo(info, annotation, context.getBeanMetaData());
    }
 
-   protected abstract void handleParameterlessInfo(T info, C annotation, BeanMetaData beanMetaData);
+   protected abstract List<? extends MetaDataVisitorNode> handleParameterlessInfo(T info, C annotation, BeanMetaData beanMetaData);
 
    protected P createParametrizedMetaData(T info, C annotation, KernelControllerContext context)
    {
@@ -99,13 +100,12 @@
    protected abstract void setParameterizedMetaData(P parameterizedMetaData, BeanMetaData beanMetaData);
 
    @SuppressWarnings("unchecked")
-   protected void internalApplyAnnotation(T info, MetaDataRetrieval retrieval, C annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, MetaDataRetrieval retrieval, C annotation, KernelControllerContext context) throws Throwable
    {
       ParameterInfo[] parameters = getParameters(info);
       if (parameters == null || parameters.length == 0)
       {
-         handleParameterlessInfo(info, annotation, context);
-         return;
+         return handleParameterlessInfo(info, annotation, context);
       }
 
       TypeInfo[] typeInfos = new TypeInfo[parameters.length];
@@ -149,7 +149,7 @@
       parameterizedMetaData.setParameters(pmds);
       if (parameterizedMetaData instanceof MetaDataVisitorNode == false)
          throw new IllegalArgumentException("ParameterizedMetaData not MetaDataVisitor: " + parameterizedMetaData);
-      executeVisit(context, (MetaDataVisitorNode)parameterizedMetaData);
+      return Collections.singletonList((MetaDataVisitorNode)parameterizedMetaData);
    }
 
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AliasesAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AliasesAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AliasesAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -22,9 +22,11 @@
 package org.jboss.kernel.plugins.annotations;
 
 import java.util.Set;
+import java.util.List;
 
 import org.jboss.beans.metadata.plugins.annotations.Aliases;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.dependency.spi.Controller;
@@ -40,7 +42,7 @@
       super(Aliases.class);
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, Aliases annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, Aliases annotation, KernelControllerContext context) throws Throwable
    {
       BeanMetaData beanMetaData = context.getBeanMetaData();
       Set<Object> aliases = beanMetaData.getAliases();
@@ -57,5 +59,7 @@
             controller.addAlias(alias, beanMetaData.getName());
          }
       }
+      // no metadata added
+      return null;
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -25,7 +25,7 @@
 import java.lang.annotation.ElementType;
 import java.util.Set;
 
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
 import org.jboss.reflect.spi.AnnotatedInfo;
 
@@ -40,5 +40,5 @@
 
    Set<ElementType> getSupportedTypes();
 
-   void applyAnnotation(T info, MetaDataRetrieval retrieval, KernelControllerContext context) throws Throwable;
+   void applyAnnotation(T info, MetaDataRetrieval retrieval, MetaDataVisitor visitor) throws Throwable;
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -30,6 +30,7 @@
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.info.spi.PropertyInfo;
+import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -153,8 +154,9 @@
       }
    }
 
-   public void applyAnnotations(KernelControllerContext context) throws Throwable
+   public void applyAnnotations(MetaDataVisitor visitor) throws Throwable
    {
+      KernelControllerContext context = visitor.getControllerContext();
       Kernel kernel = context.getKernel();
       KernelMetaDataRepository repository = kernel.getMetaDataRepository();
       MetaDataRetrieval retrieval = repository.getMetaDataRetrieval(context);
@@ -165,7 +167,7 @@
       // class
       ClassInfo classInfo = info.getClassInfo();
       for(AnnotationPlugin plugin : classAnnotationPlugins)
-         plugin.applyAnnotation(classInfo, retrieval, context);
+         plugin.applyAnnotation(classInfo, retrieval, visitor);
 
       // constructors
       Set<ConstructorInfo> constructors = info.getConstructors();
@@ -178,7 +180,7 @@
             if (cmdr != null)
             {
                for(AnnotationPlugin plugin : constructorAnnotationPlugins)
-                  plugin.applyAnnotation(ci, cmdr, context);
+                  plugin.applyAnnotation(ci, cmdr, visitor);
             }
          }
       }
@@ -197,7 +199,7 @@
                if (cmdr != null)
                {
                   for(AnnotationPlugin plugin : propertyAnnotationPlugins)
-                     plugin.applyAnnotation(pi, cmdr, context);
+                     plugin.applyAnnotation(pi, cmdr, visitor);
                }
             }
          }
@@ -214,7 +216,7 @@
             if (cmdr != null)
             {
                for(AnnotationPlugin plugin : methodAnnotationPlugins)
-                  plugin.applyAnnotation(mi, cmdr, context);
+                  plugin.applyAnnotation(mi, cmdr, visitor);
             }
          }
       }
@@ -232,7 +234,7 @@
                if (cmdr != null)
                {
                   for(AnnotationPlugin plugin : methodAnnotationPlugins)
-                     plugin.applyAnnotation(smi, cmdr, context);
+                     plugin.applyAnnotation(smi, cmdr, visitor);
                }
             }
          }
@@ -249,7 +251,7 @@
             if (cmdr != null)
             {
                for(AnnotationPlugin plugin : fieldAnnotationPlugins)
-                  plugin.applyAnnotation(fi, cmdr, context);
+                  plugin.applyAnnotation(fi, cmdr, visitor);
             }
          }
       }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BeanAnnotationAdapter.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BeanAnnotationAdapter.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BeanAnnotationAdapter.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -21,7 +21,7 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.beans.metadata.spi.MetaDataVisitor;
 
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
@@ -31,8 +31,8 @@
    /**
     * Apply the annotations.
     *
-    * @param context the context
+    * @param visitor the visitor
     * @throws Throwable for any error
     */
-   void applyAnnotations(KernelControllerContext context) throws Throwable;
+   void applyAnnotations(MetaDataVisitor visitor) throws Throwable;
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/CallbackAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/CallbackAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/CallbackAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -23,12 +23,14 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
 import org.jboss.beans.metadata.spi.CallbackMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.dependency.spi.CallbackItem;
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -70,13 +72,13 @@
 
    protected abstract Set<CallbackItem> getCallbacks(DependencyInfo dependency);
 
-   protected void internalApplyAnnotation(T info, C annotation, KernelControllerContext context)
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, C annotation, KernelControllerContext context)
    {
       AbstractBeanMetaData beanMetaData = (AbstractBeanMetaData)context.getBeanMetaData();
       List<CallbackMetaData> callbacks = getCallbacks(beanMetaData);
       AbstractCallbackMetaData callback = createCallback(info, annotation);
       callbacks.add(callback);
-      executeVisit(context, callback);
+      return Collections.singletonList(callback);
    }
 
    protected abstract AbstractCallbackMetaData createCallback(T info, C annotation);

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ClassFactoryAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ClassFactoryAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ClassFactoryAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -23,6 +23,7 @@
 
 import java.lang.annotation.ElementType;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
@@ -31,6 +32,7 @@
 import org.jboss.beans.metadata.plugins.annotations.Factory;
 import org.jboss.beans.metadata.plugins.annotations.Value;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
@@ -55,7 +57,7 @@
       return beanMetaData.getConstructor() != null;
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, Factory annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, Factory annotation, KernelControllerContext context) throws Throwable
    {
       AbstractBeanMetaData bean = (AbstractBeanMetaData)context.getBeanMetaData();
       AbstractConstructorMetaData constructor = new AbstractConstructorMetaData();
@@ -81,6 +83,6 @@
          constructor.setParameters(parameters);
       }
       bean.setConstructor(constructor);
-      executeVisit(context, constructor);
+      return Collections.singletonList(constructor);
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorParameterAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorParameterAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -22,11 +22,13 @@
 package org.jboss.kernel.plugins.annotations;
 
 import java.lang.annotation.ElementType;
+import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractConstructorMetaData;
 import org.jboss.beans.metadata.plugins.annotations.Constructor;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.ConstructorInfo;
 import org.jboss.reflect.spi.ParameterInfo;
 
@@ -55,9 +57,10 @@
       return info.getParameters();
    }
 
-   protected void handleParameterlessInfo(ConstructorInfo info, Constructor annotation, BeanMetaData beanMetaData)
+   protected List<MetaDataVisitorNode> handleParameterlessInfo(ConstructorInfo info, Constructor annotation, BeanMetaData beanMetaData)
    {
       // do nothing, default will be used
+      return null;
    }
 
    protected AbstractConstructorMetaData createParametrizedMetaData(ConstructorInfo info)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorValueAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorValueAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ConstructorValueAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -22,12 +22,15 @@
 package org.jboss.kernel.plugins.annotations;
 
 import java.lang.annotation.Annotation;
+import java.util.Collections;
+import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractConstructorMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
 
 /**
  * @param <C> annotation type
@@ -45,7 +48,7 @@
       return beanMetaData.getConstructor() != null;
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, C annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, C annotation, KernelControllerContext context) throws Throwable
    {
       AbstractBeanMetaData beanMetaData = (AbstractBeanMetaData)context.getBeanMetaData();
       AbstractConstructorMetaData constructor = new AbstractConstructorMetaData();
@@ -54,6 +57,6 @@
       // reset, if present
       beanMetaData.setBean(null);
       context.setBeanInfo(null);
-      executeVisit(context, constructor);
+      return Collections.singletonList(constructor);
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DemandsAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DemandsAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DemandsAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -21,19 +21,21 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
-import java.util.HashSet;
 
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractDemandMetaData;
+import org.jboss.beans.metadata.plugins.annotations.Demand;
 import org.jboss.beans.metadata.plugins.annotations.Demands;
-import org.jboss.beans.metadata.plugins.annotations.Demand;
-import org.jboss.beans.metadata.plugins.AbstractDemandMetaData;
-import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.DemandMetaData;
-import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.beans.metadata.spi.MetaDataVisitor;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
-import org.jboss.dependency.spi.ControllerState;
 
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
@@ -45,7 +47,7 @@
       super(Demands.class);
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, Demands annotation, KernelControllerContext context)
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, Demands annotation, KernelControllerContext context)
    {
       BeanMetaData beanMetaData = context.getBeanMetaData();
       Set<DemandMetaData> demands = beanMetaData.getDemands();
@@ -54,14 +56,14 @@
          demands = new HashSet<DemandMetaData>();
          ((AbstractBeanMetaData)beanMetaData).setDemands(demands);
       }
-      MetaDataVisitor visitor = getMetaDataVisitor(context);
+      List<MetaDataVisitorNode> nodes = new ArrayList<MetaDataVisitorNode>();
       for(Demand demand : annotation.value())
       {
          AbstractDemandMetaData admd = new AbstractDemandMetaData(demand.value());
          admd.setWhenRequired(new ControllerState(demand.whenRequired()));
          demands.add(admd);
-         admd.initialVisit(visitor);
-         admd.describeVisit(visitor);
+         nodes.add(admd);
       }
+      return nodes;
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DependsAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DependsAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/DependsAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -21,17 +21,19 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
-import java.util.HashSet;
 
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractDependencyMetaData;
-import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.annotations.Depends;
+import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.DependencyMetaData;
-import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.beans.metadata.spi.MetaDataVisitor;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
 
 /**
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
@@ -43,7 +45,7 @@
       super(Depends.class);
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, Depends annotation, KernelControllerContext context)
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, Depends annotation, KernelControllerContext context)
    {
       BeanMetaData beanMetaData = context.getBeanMetaData();
       Set<DependencyMetaData> dependencies = beanMetaData.getDepends();
@@ -52,13 +54,13 @@
          dependencies = new HashSet<DependencyMetaData>();
          ((AbstractBeanMetaData)beanMetaData).setDepends(dependencies);
       }
-      MetaDataVisitor visitor = getMetaDataVisitor(context);
+      List<MetaDataVisitorNode> nodes = new ArrayList<MetaDataVisitorNode>();
       for(String depends : annotation.value())
       {
          AbstractDependencyMetaData dependency = new AbstractDependencyMetaData(depends);
          dependencies.add(dependency);
-         dependency.initialVisit(visitor);
-         dependency.describeVisit(visitor);
+         nodes.add(dependency);
       }
+      return nodes;
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -31,6 +31,7 @@
 import org.jboss.beans.metadata.plugins.annotations.Value;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.dependency.spi.ControllerState;
@@ -85,7 +86,7 @@
       return installMetaData;
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, C annotation, KernelControllerContext context) throws Throwable
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, C annotation, KernelControllerContext context) throws Throwable
    {
       BeanMetaData beanMetaData = context.getBeanMetaData();
       List<InstallMetaData> existing = getExistingInstallMetaData(beanMetaData);
@@ -95,6 +96,7 @@
       List<InstallMetaData> installs = getInstallMetaData(annotation);
       if (installs != null && installs.isEmpty() == false)
       {
+         List<MetaDataVisitorNode> nodes = new ArrayList<MetaDataVisitorNode>();
          for(InstallMetaData install : installs)
          {
             boolean doAdd = true;
@@ -109,10 +111,12 @@
             if (doAdd)
             {
                existing.add(install);
-               executeVisit(context, install);
+               nodes.add(install);
             }
          }
+         return nodes;
       }
+      return null;
    }
 
    protected static boolean isDifferent(InstallMetaData first, InstallMetaData second)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FactoryMethodAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FactoryMethodAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FactoryMethodAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -22,11 +22,14 @@
 package org.jboss.kernel.plugins.annotations;
 
 import java.lang.annotation.ElementType;
+import java.util.List;
+import java.util.Collections;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractConstructorMetaData;
 import org.jboss.beans.metadata.plugins.annotations.FactoryMethod;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.ParameterInfo;
 
@@ -55,9 +58,11 @@
       return info.getParameters();
    }
 
-   protected void handleParameterlessInfo(MethodInfo info, FactoryMethod annotation, BeanMetaData beanMetaData)
+   protected List<? extends MetaDataVisitorNode> handleParameterlessInfo(MethodInfo info, FactoryMethod annotation, BeanMetaData beanMetaData)
    {
-      setParameterizedMetaData(createParametrizedMetaData(info, annotation, beanMetaData), beanMetaData);
+      AbstractConstructorMetaData constructorMetaData = createParametrizedMetaData(info, annotation, beanMetaData);
+      setParameterizedMetaData(constructorMetaData, beanMetaData);
+      return Collections.singletonList(constructorMetaData);
    }
 
    protected AbstractConstructorMetaData createParametrizedMetaData(MethodInfo info, FactoryMethod annotation, BeanMetaData beanMetaData)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallationParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallationParameterAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallationParameterAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -24,11 +24,13 @@
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.util.List;
+import java.util.Collections;
 
 import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.ParameterInfo;
 
@@ -81,8 +83,10 @@
       return info.getParameters();
    }
 
-   protected void handleParameterlessInfo(MethodInfo info, C annotation, BeanMetaData beanMetaData)
+   protected List<? extends MetaDataVisitorNode> handleParameterlessInfo(MethodInfo info, C annotation, BeanMetaData beanMetaData)
    {
-      setParameterizedMetaData(createParametrizedMetaData(info, annotation), beanMetaData);
+      AbstractInstallMetaData parametrizedMetaData = createParametrizedMetaData(info, annotation);
+      setParameterizedMetaData(parametrizedMetaData, beanMetaData);
+      return Collections.singletonList(parametrizedMetaData);
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/LifecycleParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/LifecycleParameterAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/LifecycleParameterAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -23,10 +23,13 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
+import java.util.List;
+import java.util.Collections;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractLifecycleMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.MethodInfo;
 import org.jboss.reflect.spi.ParameterInfo;
 
@@ -69,10 +72,12 @@
       return info.getParameters();
    }
 
-   protected void handleParameterlessInfo(MethodInfo info, C annotation, BeanMetaData beanMetaData)
+   protected List<? extends MetaDataVisitorNode> handleParameterlessInfo(MethodInfo info, C annotation, BeanMetaData beanMetaData)
    {
       AbstractBeanMetaData abmd = (AbstractBeanMetaData)beanMetaData;
-      setLifecycleMetaData(abmd, createLifecycleMetaData(info.getName(), annotation));
+      AbstractLifecycleMetaData lifecycle = createLifecycleMetaData(info.getName(), annotation);
+      setLifecycleMetaData(abmd, lifecycle);
+      return Collections.singletonList(lifecycle);
    }
 
    protected AbstractLifecycleMetaData createParametrizedMetaData(MethodInfo info, C annotation)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -23,13 +23,16 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.jboss.beans.info.spi.PropertyInfo;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractPropertyMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -65,12 +68,12 @@
       return false;
    }
 
-   protected void internalApplyAnnotation(PropertyInfo info, C annotation, KernelControllerContext context)
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(PropertyInfo info, C annotation, KernelControllerContext context)
    {
       Set<PropertyMetaData> properties = getProperties(context);
       PropertyMetaData property = getPropertyMetaData(info, annotation, context);
       properties.add(property);
-      executeVisit(context, property);
+      return Collections.singletonList(property);
    }
 
    protected PropertyMetaData getPropertyMetaData(PropertyInfo info, C annotation, KernelControllerContext context)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAware.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAware.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAware.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -22,7 +22,7 @@
 package org.jboss.kernel.plugins.annotations;
 
 import org.jboss.beans.info.spi.PropertyInfo;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.metadata.spi.retrieval.MetaDataRetrieval;
 
 /**
@@ -32,5 +32,5 @@
  */
 public interface PropertyAware
 {
-   void applyAnnotation(PropertyInfo info, MetaDataRetrieval retrieval, KernelControllerContext context) throws Throwable;
+   void applyAnnotation(PropertyInfo info, MetaDataRetrieval retrieval, MetaDataVisitor visitor) throws Throwable;
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/SupplysAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/SupplysAnnotationPlugin.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/SupplysAnnotationPlugin.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -23,12 +23,15 @@
 
 import java.util.Set;
 import java.util.HashSet;
+import java.util.List;
+import java.util.ArrayList;
 
 import org.jboss.beans.metadata.plugins.AbstractSupplyMetaData;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.annotations.Supplys;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.SupplyMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.reflect.spi.ClassInfo;
 
 /**
@@ -41,7 +44,7 @@
       super(Supplys.class);
    }
 
-   protected void internalApplyAnnotation(ClassInfo info, Supplys annotation, BeanMetaData beanMetaData)
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(ClassInfo info, Supplys annotation, BeanMetaData beanMetaData)
    {
       Set<SupplyMetaData> supplies = beanMetaData.getSupplies();
       if (supplies == null)
@@ -49,9 +52,13 @@
          supplies = new HashSet<SupplyMetaData>();
          ((AbstractBeanMetaData)beanMetaData).setSupplies(supplies);
       }
+      List<MetaDataVisitorNode> nodes = new ArrayList<MetaDataVisitorNode>();
       for(String supply : annotation.value())
       {
-         supplies.add(new AbstractSupplyMetaData(supply));
+         AbstractSupplyMetaData asmd = new AbstractSupplyMetaData(supply);
+         supplies.add(asmd);
+         nodes.add(asmd);
       }
+      return nodes;
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -42,6 +42,7 @@
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.plugins.config.Configurator;
+import org.jboss.kernel.plugins.annotations.BeanAnnotationAdapterFactory;
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
@@ -79,6 +80,9 @@
    /** Did we do a describeVisit */
    protected boolean isDescribeProcessed;
 
+   /** Did we do the annotations check */
+   protected boolean areAnnotationsProcessed;
+
    /** The scope */
    protected ScopeKey scope;
 
@@ -273,8 +277,19 @@
       return Configurator.getClassLoader(getBeanMetaData());
    }
 
-   protected abstract class AbstractMetaDataVistor implements MetaDataVisitor, PrivilegedAction<Object>
+   public void applyMetaData() throws Throwable
    {
+      if (areAnnotationsProcessed == false)
+      {
+         // handle custom annotations
+         MetaDataVisitor annotationsVisitor = new AnnotationMetaDataVisitor(metaData);
+         BeanAnnotationAdapterFactory.getBeanAnnotationAdapter().applyAnnotations(annotationsVisitor);
+         areAnnotationsProcessed = true;
+      }
+   }
+
+   protected abstract class AbstractMetaDataVistor implements MetaDataVisitor
+   {
       /**
        * The current context for when the dependencies are required
        */
@@ -324,10 +339,54 @@
 
       protected void internalInitialVisit(MetaDataVisitorNode node)
       {
+         boolean trace = log.isTraceEnabled();
+         if (trace)
+            log.trace("Initial visit node " + node);
+
+         // Visit the children of this node
+         Iterator children = node.getChildren();
+         if (children != null)
+         {
+            ControllerState restoreState = contextState;
+            while (children.hasNext())
+            {
+               MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
+               try
+               {
+                  child.initialVisit(this);
+               }
+               finally
+               {
+                  contextState = restoreState;
+               }
+            }
+         }
       }
 
       protected void internalDescribeVisit(MetaDataVisitorNode node)
       {
+         boolean trace = log.isTraceEnabled();
+         if (trace)
+            log.trace("Describe visit node " + node);
+
+         // Visit the children of this node
+         Iterator children = node.getChildren();
+         if (children != null)
+         {
+            ControllerState restoreState = contextState;
+            while (children.hasNext())
+            {
+               MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
+               try
+               {
+                  child.describeVisit(this);
+               }
+               finally
+               {
+                  contextState = restoreState;
+               }
+            }
+         }
       }
 
       public KernelControllerContext getControllerContext()
@@ -370,7 +429,7 @@
    /**
     * A visitor for the metadata that looks for dependencies.
     */
-   protected class PreprocessMetaDataVisitor extends AbstractMetaDataVistor
+   protected class PreprocessMetaDataVisitor extends AbstractMetaDataVistor implements PrivilegedAction<Object>
    {
       /**
        * Create a new MetaDataVisitor.
@@ -391,44 +450,12 @@
          visitorNodeStack = null;
          return null;
       }
-
-      /**
-       * Visit a node
-       *
-       * @param node the node
-       */
-      protected void internalInitialVisit(MetaDataVisitorNode node)
-      {
-         boolean trace = log.isTraceEnabled();
-         if (trace)
-            log.trace("Initial visit node " + node);
-
-         // Visit the children of this node
-         Iterator children = node.getChildren();
-         if (children != null)
-         {
-            ControllerState restoreState = contextState;
-            while (children.hasNext())
-            {
-               MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
-               try
-               {
-                  child.initialVisit(this);
-               }
-               finally
-               {
-                  contextState = restoreState;
-               }
-            }
-         }
-      }
-
    }
 
    /**
     * A visitor for the metadata that looks for dependencies.
     */
-   protected class DescribedMetaDataVisitor extends AbstractMetaDataVistor
+   protected class DescribedMetaDataVisitor extends AbstractMetaDataVistor implements PrivilegedAction<Object>
    {
       /**
        * Create a new MetaDataVisitor.
@@ -449,36 +476,42 @@
          visitorNodeStack = null;
          return null;
       }
+   }
 
-      /**
-       * Visit a node
-       *
-       * @param node the node
-       */
-      protected void internalDescribeVisit(MetaDataVisitorNode node)
+   /**
+    * A visitor for the annotation meta data.
+    */
+   protected class AnnotationMetaDataVisitor extends AbstractMetaDataVistor
+   {
+      public AnnotationMetaDataVisitor(BeanMetaData bmd)
       {
-         boolean trace = log.isTraceEnabled();
-         if (trace)
-            log.trace("Describe visit node " + node);
+         super(bmd);
+      }
 
-         // Visit the children of this node
-         Iterator children = node.getChildren();
-         if (children != null)
+      public void initialVisit(MetaDataVisitorNode node)
+      {
+         visitorNodeStack.push(bmd);
+         try
          {
-            ControllerState restoreState = contextState;
-            while (children.hasNext())
-            {
-               MetaDataVisitorNode child = (MetaDataVisitorNode) children.next();
-               try
-               {
-                  child.describeVisit(this);
-               }
-               finally
-               {
-                  contextState = restoreState;
-               }
-            }
+            super.initialVisit(node);
          }
+         finally
+         {
+            visitorNodeStack.pop();
+         }
       }
+
+      public void describeVisit(MetaDataVisitorNode node)
+      {
+         visitorNodeStack.push(bmd);
+         try
+         {
+            super.describeVisit(node);
+         }
+         finally
+         {
+            visitorNodeStack.pop();
+         }
+      }
    }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -28,7 +28,6 @@
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
-import org.jboss.kernel.plugins.annotations.BeanAnnotationAdapterFactory;
 import org.jboss.metadata.spi.MetaData;
 
 /**
@@ -58,8 +57,7 @@
                dependencyItem.addDependency(context);
             }
          }
-         // handle custom annotations
-         BeanAnnotationAdapterFactory.getBeanAnnotationAdapter().applyAnnotations(context);
+         context.applyMetaData();
       }
    }
 

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/KernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/KernelControllerContext.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/KernelControllerContext.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -113,4 +113,12 @@
     * @return true if context can be used for autowiring
     */
    boolean isAutowireCandidate();
+
+   /**
+    * Do apply meta data.
+    * Hide details of applying annotations.
+    *
+    * @throws Throwable for any error
+    */
+   void applyMetaData() throws Throwable;
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2007-08-03 10:03:17 UTC (rev 64446)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2007-08-03 11:16:54 UTC (rev 64447)
@@ -126,4 +126,9 @@
    {
       delegate.set(name, value);
    }
+
+   public void applyMetaData() throws Throwable
+   {
+      delegate.applyMetaData();
+   }
 }




More information about the jboss-cvs-commits mailing list