[jboss-cvs] JBossAS SVN: r84514 - in projects/microcontainer/branches/Branch_2_0: aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata and 21 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Feb 20 07:40:46 EST 2009


Author: alesj
Date: 2009-02-20 07:40:45 -0500 (Fri, 20 Feb 2009)
New Revision: 84514

Added:
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/LazySearchInfo.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeyLookupStrategy.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/SearchDependencyItem.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/SearchInfoValueAdapter.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/SearchClassContextDependencyItem.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/support/SimpleAnnotationImpl.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/support/FirstBean2.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.xml
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/DemandWithTargetState.xml
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/InjectionWithSearch.xml
Modified:
   projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/aspects/jndi/JndiIntroduction.java
   projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java
   projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/package-info.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeySearchInfo.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/Search.java
   projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/spi/graph/SearchInfo.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Inject.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Search.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractConstructorMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractSearchValueMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/package-info.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/DemandMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/GenericBeanFactoryMetaData.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/annotations/ValueUtil.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextDependencyItem.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/AbstractKernelDeployer.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/package-info.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/main/resources/schema/jboss-beans-common_2_0.xsd
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/DeploymentTestSuite.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandJaxbTestCase.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandTestCase.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionJaxbTestCase.java
   projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionTestCase.java
Log:
Merge changes.

Modified: projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/aspects/jndi/JndiIntroduction.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/aspects/jndi/JndiIntroduction.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/aspects/jndi/JndiIntroduction.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -21,8 +21,8 @@
  */
 package org.jboss.aop.microcontainer.aspects.jndi;
 
+import java.io.Serializable;
 import java.util.Properties;
-
 import javax.naming.InitialContext;
 
 import org.jboss.aop.advice.Interceptor;
@@ -42,8 +42,10 @@
  * @version $Revision: 46386 $
  * @deprecated Should use JndiLifecycleCallback instead
  */
-public class JndiIntroduction implements Interceptor
+public class JndiIntroduction implements Interceptor, Serializable
 {
+   private static final long serialVersionUID = 1;
+   
    private static final Logger log = Logger.getLogger(JndiIntroduction.class);
    private Properties env;
 

Modified: projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/AspectBeanMetaDataFactory.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -214,6 +214,11 @@
    
    private void getDependencies(ArrayList<ValueMetaData> dependencies, MetaDataVisitorNode node)
    {
+      if (node instanceof AbstractDependencyValueMetaData)
+      {
+         dependencies.add((AbstractDependencyValueMetaData)node);
+      }
+
       Iterator<? extends MetaDataVisitorNode> children = node.getChildren();
       
       if (children != null)
@@ -221,10 +226,6 @@
          while (children.hasNext())
          {
             MetaDataVisitorNode child = children.next();
-            if (child instanceof AbstractDependencyValueMetaData)
-            {
-               dependencies.add((AbstractDependencyValueMetaData)child);
-            }
             getDependencies(dependencies, child);
          }
       }

Modified: projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/package-info.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/package-info.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/aop-mc-int/src/main/java/org/jboss/aop/microcontainer/beans/metadata/package-info.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -22,14 +22,17 @@
 @JBossXmlAdaptedTypes
 ({
    @JBossXmlAdaptedType(type=Cardinality.class, valueAdapter=CardinalityValueAdapter.class),
-   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class)
+   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class),
+   @JBossXmlAdaptedType(type=SearchInfo.class, valueAdapter=SearchInfoValueAdapter.class)
 })
 package org.jboss.aop.microcontainer.beans.metadata;
 
 import org.jboss.beans.metadata.plugins.CardinalityValueAdapter;
 import org.jboss.beans.metadata.plugins.ControllerStateValueAdapter;
+import org.jboss.beans.metadata.plugins.SearchInfoValueAdapter;
 import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.SearchInfo;
 import org.jboss.xb.annotations.JBossXmlAdaptedType;
 import org.jboss.xb.annotations.JBossXmlAdaptedTypes;
 

Modified: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyItem.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -35,12 +35,13 @@
  * A DependencyItem.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision$
  */
 public class AbstractDependencyItem extends JBossObject implements DependencyItem
 {
    /** The log */
-   private static final Logger log = Logger.getLogger(AbstractDependencyItem.class);
+   protected static final Logger log = Logger.getLogger(AbstractDependencyItem.class);
    
    /** What I depend on */
    private Object iDependOn;

Copied: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/LazySearchInfo.java (from rev 84513, projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/plugins/graph/LazySearchInfo.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/LazySearchInfo.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/LazySearchInfo.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,90 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dependency.plugins.graph;
+
+import java.util.Collections;
+import java.util.Map;
+import java.io.Serializable;
+
+import org.jboss.dependency.spi.graph.LookupStrategy;
+import org.jboss.dependency.spi.graph.SearchInfo;
+import org.jboss.reflect.plugins.introspection.ReflectionUtils;
+
+/**
+ * Lazy search info.
+ * The type is the class.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class LazySearchInfo implements SearchInfo, Serializable
+{
+   private static final long serialVersionUID = 1L;
+
+   private String className;
+   private transient LookupStrategy strategy;
+
+   public LazySearchInfo(String className)
+   {
+      if (className == null)
+         throw new IllegalArgumentException("Null class name");
+
+      this.className = className;
+   }
+
+   public String getType()
+   {
+      return className;
+   }
+
+   public Map<String, ?> getInfo()
+   {
+      return Collections.emptyMap();
+   }
+
+   public LookupStrategy getStrategy()
+   {
+      if (strategy == null)
+      {
+         Object result;
+         try
+         {
+            result = ReflectionUtils.newInstance(className);
+         }
+         catch (Throwable t)
+         {
+            throw new RuntimeException(t);
+         }
+
+         if (LookupStrategy.class.isInstance(result) == false)
+            throw new IllegalArgumentException("Result is not LookupStrategy instance: " + result);
+
+         strategy = LookupStrategy.class.cast(result);
+      }
+      return strategy;
+   }
+
+   @Override
+   public String toString()
+   {
+      return "LazySearchInfo: " + className;
+   }
+}

Copied: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeyLookupStrategy.java (from rev 84513, projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeyLookupStrategy.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeyLookupStrategy.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeyLookupStrategy.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,118 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.dependency.plugins.graph;
+
+import java.util.Set;
+
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.plugins.ScopedController;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.metadata.spi.scope.ScopeKey;
+
+/**
+ * ScopeKey lookup strategy.
+ * It only matches exact scope key level.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class ScopeKeyLookupStrategy extends HierarchyLookupStrategy
+{
+   private ScopeKey scopeKey;
+
+   public ScopeKeyLookupStrategy(ScopeKey scopeKey)
+   {
+      if (scopeKey == null)
+         throw new IllegalArgumentException("Null scope key");
+
+      this.scopeKey = scopeKey;
+   }
+
+   protected ControllerContext getContextInternal(AbstractController controller, Object name, ControllerState state)
+   {
+      // go all the way to the top
+      AbstractController parent = controller.getParentController();
+      while (parent != null)
+      {
+         controller = parent;
+         parent = controller.getParentController();
+      }
+
+      AbstractController match = findMatchingScopedController(controller);
+      if (match != null)
+         return getLocalContext(match, name, state);
+
+      return null;
+   }
+
+   /**
+    * Find scope key matching scoped controller.
+    *
+    * @param current the current controller
+    * @return match or null if no match
+    */
+   private AbstractController findMatchingScopedController(AbstractController current)
+   {
+      boolean related = true; // by default it's related
+
+      if (current instanceof ScopedController)
+      {
+         ScopedController scopedController = (ScopedController)current;
+         ScopeKey key = scopedController.getScopeKey();
+         // see if this is even related, so that we don't go fwd for nothing
+         if (key != null)
+         {
+            // exact match
+            if (scopeKey.equals(key))
+               return current;
+
+            related = false; // we have key, should prove that it's related
+            ScopeKey ck = scopeKey;
+            int keySize = key.getScopes().size();
+            int ckSize = ck.getScopes().size();
+            while (ck != null && keySize < ckSize)
+            {
+               if (key.isParent(ck))
+               {
+                  related = true;
+                  break;
+               }
+               ck = ck.getParent();
+               ckSize--;
+            }
+         }
+      }
+
+      if (related)
+      {
+         Set<AbstractController> children = current.getControllers();
+         for (AbstractController child : children)
+         {
+            AbstractController found = findMatchingScopedController(child);
+            if (found != null)
+               return found;
+         }
+      }
+
+      return null;
+   }
+}

Modified: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeySearchInfo.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeySearchInfo.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/ScopeKeySearchInfo.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -21,14 +21,10 @@
 */
 package org.jboss.dependency.plugins.graph;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.Map;
-import java.util.Set;
 
-import org.jboss.dependency.plugins.AbstractController;
-import org.jboss.dependency.plugins.ScopedController;
-import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.graph.LookupStrategy;
 import org.jboss.dependency.spi.graph.SearchInfo;
 import org.jboss.metadata.spi.scope.ScopeKey;
@@ -38,11 +34,14 @@
  *
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public class ScopeKeySearchInfo implements SearchInfo
+public class ScopeKeySearchInfo implements SearchInfo, Serializable
 {
+   private static final long serialVersionUID = 1L;
+
    public static final String SCOPE_KEY = "ScopeKey";
    private ScopeKey scopeKey;
    private Map<String, ?> info;
+   private transient LookupStrategy strategy;
 
    public ScopeKeySearchInfo(ScopeKey scopeKey)
    {
@@ -66,78 +65,9 @@
 
    public LookupStrategy getStrategy()
    {
-      return new ScopeKeyLookupStrategy();
-   }
+      if (strategy == null)
+         strategy = new ScopeKeyLookupStrategy(scopeKey);
 
-   private class ScopeKeyLookupStrategy extends HierarchyLookupStrategy
-   {
-      protected ControllerContext getContextInternal(AbstractController controller, Object name, ControllerState state)
-      {
-         // go all the way to the top
-         AbstractController parent = controller.getParentController();
-         while (parent != null)
-         {
-            controller = parent;
-            parent = controller.getParentController();
-         }
-
-         AbstractController match = findMatchingScopedController(controller);
-         if (match != null)
-            return getLocalContext(match, name, state);
-
-         return null;
-      }
-
-      /**
-       * Find scope key matching scoped controller.
-       *
-       * @param current the current controller
-       * @return match or null if no match
-       */
-      private AbstractController findMatchingScopedController(AbstractController current)
-      {
-         boolean related = true; // by default it's related
-
-         if (current instanceof ScopedController)
-         {
-            ScopedController scopedController = (ScopedController)current;
-            ScopeKey key = scopedController.getScopeKey();
-            // see if this is even related, so that we don't go fwd for nothing
-            if (key != null)
-            {
-               // exact match
-               if (scopeKey.equals(key))
-                  return current;
-
-               related = false; // we have key, should prove that it's related
-               ScopeKey ck = scopeKey;
-               int keySize = key.getScopes().size();
-               int ckSize = ck.getScopes().size();
-               while(ck != null && keySize < ckSize)
-               {
-                  if (key.isParent(ck))
-                  {
-                     related = true;
-                     break;
-                  }
-                  ck = ck.getParent();
-                  ckSize--;
-               }
-            }
-         }
-
-         if (related)
-         {
-            Set<AbstractController> children = current.getControllers();
-            for (AbstractController child : children)
-            {
-               AbstractController found = findMatchingScopedController(child);
-               if (found != null)
-                  return found;
-            }
-         }
-
-         return null;
-      }
+      return strategy;
    }
 }
\ No newline at end of file

Modified: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/Search.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/Search.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/Search.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -54,6 +54,28 @@
       this.delegate = delegate;
    }
 
+   /**
+    * Get SearchInfo instance.
+    *
+    * @param typeString the type string
+    * @return matching instance, lazy if none found
+    */
+   public static SearchInfo getInstance(String typeString)
+   {
+      if (typeString == null || typeString.length() == 0)
+      {
+         return DEFAULT;
+      }
+
+      for(Search search : values())
+      {
+         if (search.getType().equalsIgnoreCase(typeString) || search.name().equalsIgnoreCase(typeString))
+            return search;
+      }
+
+      return new LazySearchInfo(typeString);
+   }
+
    public String getType()
    {
       return delegate.getType();

Copied: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/SearchDependencyItem.java (from rev 84513, projects/microcontainer/trunk/dependency/src/main/java/org/jboss/dependency/plugins/graph/SearchDependencyItem.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/SearchDependencyItem.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/plugins/graph/SearchDependencyItem.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,122 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.dependency.plugins.graph;
+
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerMode;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.GraphController;
+import org.jboss.dependency.spi.graph.LookupStrategy;
+import org.jboss.dependency.spi.graph.SearchInfo;
+
+/**
+ * Search dependency item.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class SearchDependencyItem extends AbstractDependencyItem
+{
+   private SearchInfo search;
+
+   public SearchDependencyItem(Object name, Object iDependOn, ControllerState whenRequired, ControllerState dependentState, SearchInfo search)
+   {
+      super(name, iDependOn, whenRequired, dependentState);
+      this.search = search;
+   }
+
+   /**
+    * Get controller context.
+    *
+    * @param controller the controller
+    * @param name the name
+    * @param state the state
+    * @return the controller context
+    */
+   protected ControllerContext getControllerContext(Controller controller, Object name, ControllerState state)
+   {
+      LookupStrategy strategy = search.getStrategy();
+      return strategy.getContext(controller, name, state);
+   }
+
+   public boolean resolve(Controller controller)
+   {
+      if (controller instanceof GraphController)
+      {
+         boolean previous = isResolved();
+         ControllerContext context;
+
+         if (getDependentState() == null)
+         {
+            context = getControllerContext(controller, getIDependOn(), ControllerState.INSTALLED);
+         }
+         else
+         {
+            context = getControllerContext(controller, getIDependOn(), getDependentState());
+         }
+
+         if (context == null)
+         {
+            setResolved(false);
+            ControllerContext unresolvedContext = getControllerContext(controller, getIDependOn(), null);
+            if (unresolvedContext != null && ControllerMode.ON_DEMAND.equals(unresolvedContext.getMode()))
+            {
+               try
+               {
+                  controller.enableOnDemand(unresolvedContext);
+               }
+               catch (Throwable ignored)
+               {
+                  if (log.isTraceEnabled())
+                     log.trace("Unexpected error", ignored);
+               }
+            }
+         }
+         else
+         {
+            addDependsOnMe(controller, context);
+            setResolved(true);
+         }
+
+         if (previous != isResolved())
+         {
+            flushJBossObjectCache();
+            if (log.isTraceEnabled())
+            {
+               if (isResolved())
+                  log.trace("Resolved " + this);
+               else
+                  log.trace("Unresolved " + this);
+            }
+         }
+         return isResolved();
+      }
+      return super.resolve(controller);
+   }
+
+   protected void toHumanReadableString(StringBuilder builder)
+   {
+      super.toHumanReadableString(builder);
+      builder.append("search=").append(search);
+   }
+}

Modified: projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/spi/graph/SearchInfo.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/spi/graph/SearchInfo.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/dependency/src/main/java/org/jboss/dependency/spi/graph/SearchInfo.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -22,6 +22,7 @@
 package org.jboss.dependency.spi.graph;
 
 import java.util.Map;
+import javax.xml.bind.annotation.XmlTransient;
 
 /**
  * Search info.
@@ -41,6 +42,7 @@
     *
     * @return the type
     */
+   @XmlTransient
    String getType();
 
    /**
@@ -49,6 +51,7 @@
     *
     * @return the additional info
     */
+   @XmlTransient
    Map<String, ?> getInfo();
 
    /**
@@ -60,5 +63,6 @@
     *
     * @return the strategy or null depending on GraphContorller
     */
+   @XmlTransient
    LookupStrategy getStrategy();
 }

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Inject.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Inject.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Inject.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -73,6 +73,13 @@
    String dependentState() default "";
 
    /**
+    * Get search type.
+    *
+    * @return the search type
+    */
+   String search() default "";
+
+   /**
     * Get autowire type.
     * Default is by class.
     *

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Search.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Search.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/api/annotations/Search.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -33,6 +33,7 @@
  */
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
+ at Deprecated
 public @interface Search
 {
    /**

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractConstructorMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractConstructorMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractConstructorMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -265,6 +265,9 @@
             classInfo = configurator.getClassInfo(factoryClassName, cl);
          }
          // should be parameter
+         if (previous instanceof ParameterMetaData == false)
+            throw new IllegalArgumentException("Previous node is not ParameterMetaData as expected: " + previous);
+
          ParameterMetaData parameter = (ParameterMetaData) previous;
          String[] parameterTypes = Configurator.getParameterTypes(false, parameters);
          MethodInfo methodInfo = Configurator.findMethodInfo(classInfo, factoryMethod, parameterTypes, factoryClassName != null, true);

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDemandMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -47,8 +47,8 @@
 /**
  * A demand.
  * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
 @XmlType(name="demandsType")
@@ -63,6 +63,9 @@
    /** When the dependency is required */
    protected ControllerState whenRequired = ControllerState.DESCRIBED;
 
+   /** The target/dependency state */
+   protected ControllerState targetState;
+
    /** The transformer */
    protected String transformer;
 
@@ -107,6 +110,17 @@
       flushJBossObjectCache();
    }
 
+   /**
+    * Set the target/dependency state.
+    *
+    * @param targetState the target state
+    */
+   @XmlAttribute(name="targetState")
+   public void setTargetState(ControllerState targetState)
+   {
+      this.targetState = targetState;
+   }
+
    public Object getDemand()
    {
       return demand;
@@ -117,6 +131,11 @@
       return whenRequired;
    }
 
+   public ControllerState getTargetState()
+   {
+      return targetState;
+   }
+
    /**
     * Get the transformer class name.
     *
@@ -166,6 +185,8 @@
       buffer.append("demand=").append(demand);
       if (whenRequired != null)
          buffer.append(" whenRequired=").append(whenRequired.getStateString());
+      if (targetState != null)
+         buffer.append(" targetState=").append(targetState.getStateString());
    }
    
    public void toShortString(JBossStringBuilder buffer)
@@ -233,7 +254,13 @@
       public boolean resolve(Controller controller)
       {
          Object name = getDemandObject();
-         ControllerContext context = controller.getInstalledContext(name);
+
+         ControllerContext context;
+         if (targetState == null)
+            context = controller.getInstalledContext(name);
+         else
+            context = controller.getContext(name, targetState);
+
          if (context != null)
          {
             setIDependOn(context.getName());

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -21,29 +21,34 @@
 */
 package org.jboss.beans.metadata.plugins;
 
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlAnyElement;
 
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.plugins.graph.Search;
+import org.jboss.dependency.plugins.graph.SearchDependencyItem;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.dispatch.AttributeDispatchContext;
+import org.jboss.dependency.spi.graph.LookupStrategy;
+import org.jboss.dependency.spi.graph.SearchInfo;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.managed.api.annotation.ManagementProperty;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 import org.jboss.xb.annotations.JBossXmlAttribute;
-import org.jboss.managed.api.annotation.ManagementProperty;
 
 /**
  * Dependency value.
  *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author Radim Marek (obrien)
  * @version $Revision$
  */
 @XmlType(name="injectionType")
@@ -77,6 +82,12 @@
    protected ControllerState dependentState;
 
    /**
+    * The search type
+    */
+   protected SearchInfo search = Search.DEFAULT;
+
+
+   /**
     * Create a new dependency value
     */
    public AbstractDependencyValueMetaData()
@@ -138,6 +149,11 @@
       flushJBossObjectCache();
    }
 
+   /**
+    * Get when required state.
+    *
+    * @return the when required state
+    */
    public ControllerState getWhenRequiredState()
    {
       return whenRequiredState;
@@ -155,6 +171,11 @@
       flushJBossObjectCache();
    }
 
+   /**
+    * Get the required state of dependency.
+    *
+    * @return the required dependency state
+    */
    public ControllerState getDependentState()
    {
       return dependentState;
@@ -179,6 +200,37 @@
          setValue(new AbstractValueMetaData(value));
    }
 
+   /**
+    * Set search type.
+    *
+    * @param search the search type
+    */
+   @XmlAttribute(name = "search")
+   public void setSearch(SearchInfo search)
+   {
+      this.search = search;
+   }
+
+   /**
+    * Get search type.
+    *
+    * @return the search type
+    */
+   public SearchInfo getSearch()
+   {
+      return search;
+   }
+
+   /**
+    * Is search applied.
+    *
+    * @return true if search is applied
+    */
+   protected boolean isSearchApplied()
+   {
+      return (search != Search.DEFAULT);
+   }
+
    protected boolean isLookupValid(ControllerContext lookup)
    {
       return (lookup != null);
@@ -189,6 +241,12 @@
       return false;
    }
 
+   /**
+    * Add optional dependency.
+    *
+    * @param controller the controller
+    * @param lookup the lookup context
+    */
    protected void addOptionalDependency(Controller controller, ControllerContext lookup)
    {
       OptionalDependencyItem dependency = new OptionalDependencyItem(context.getName(), lookup.getName(), lookup.getState());
@@ -196,6 +254,20 @@
       lookup.getDependencyInfo().addDependsOnMe(dependency);
    }
 
+   /**
+    * Get controller context.
+    *
+    * @param name the name
+    * @param state the state
+    * @return the controller context
+    */
+   protected ControllerContext getControllerContext(Object name, ControllerState state)
+   {
+      Controller controller = context.getController();
+      LookupStrategy strategy = search.getStrategy();
+      return strategy.getContext(controller, name, state);
+   }
+
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
       ControllerState state = dependentState;
@@ -203,16 +275,21 @@
          state = ControllerState.INSTALLED;
       if (context == null)
          throw new IllegalStateException("No context for " + this);
-      Controller controller = context.getController();
-      ControllerContext lookup = controller.getContext(getUnderlyingValue(), state);
 
+      ControllerContext lookup = getControllerContext(getUnderlyingValue(), state);
+
       if (isLookupValid(lookup) == false)
          throw new Error("Should not be here - dependency failed - " + this);
 
       if (lookup == null)
+      {
          return null;
+      }
       else if (isOptional())
+      {
+         Controller controller = context.getController();
          addOptionalDependency(controller, lookup);
+      }
 
       Object result;
       if (property != null && property.length() > 0)
@@ -242,6 +319,9 @@
 
    public void initialVisit(MetaDataVisitor visitor)
    {
+      if (search == null)
+         throw new IllegalArgumentException("Null search");
+
       context = visitor.getControllerContext();
 
       ControllerState whenRequired = whenRequiredState;
@@ -259,7 +339,15 @@
          Object name = context.getName();
          Object iDependOn = getUnderlyingValue();
 
-         DependencyItem item = new AbstractDependencyItem(name, iDependOn, whenRequired, dependentState);
+         DependencyItem item;
+         if (isSearchApplied())
+         {
+            item = new SearchDependencyItem(name, iDependOn, whenRequired, dependentState, search);
+         }
+         else
+         {
+            item = new AbstractDependencyItem(name, iDependOn, whenRequired, dependentState);
+         }
          visitor.addDependency(item);
       }
       super.initialVisit(visitor);
@@ -274,6 +362,8 @@
          buffer.append(" whenRequiredState=").append(whenRequiredState.getStateString());
       if (dependentState != null)
          buffer.append(" dependentState=").append(dependentState.getStateString());
+      if (isSearchApplied())
+         buffer.append(" search=").append(search);
    }
 
    public AbstractDependencyValueMetaData clone()
@@ -284,11 +374,11 @@
    /**
     * Optional depedency item.
     */
-   protected class OptionalDependencyItem extends AbstractDependencyItem
+   protected class OptionalDependencyItem extends SearchDependencyItem
    {
       public OptionalDependencyItem(Object name, Object iDependOn, ControllerState dependentState)
       {
-         super(name, iDependOn, optionalWhenRequired, dependentState);
+         super(name, iDependOn, optionalWhenRequired, dependentState, search);
          setResolved(true);
       }
    }

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -31,11 +31,10 @@
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.dependency.plugins.AttributeCallbackItem;
-import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
-import org.jboss.kernel.plugins.dependency.ClassContextDependencyItem;
+import org.jboss.kernel.plugins.dependency.SearchClassContextDependencyItem;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 
@@ -132,6 +131,11 @@
       this.propertyMetaData = propertyMetaData;
    }
 
+   /**
+    * Add install/callback item.
+    *
+    * @param name the callback name
+    */
    protected void addInstallItem(Object name)
    {
       if (propertyMetaData == null)
@@ -165,18 +169,18 @@
          ControllerState state = dependentState;
          if (state == null)
             state = ControllerState.INSTANTIATED;
-         Controller controller = context.getController();
-         ControllerContext lookup = controller.getContext(getUnderlyingValue(), state);
+
+         ControllerContext lookup = getControllerContext(getUnderlyingValue(), state);
          if (lookup == null)
             throw new Error("Should not be here - dependency failed - " + this);
+
          return fromContext.executeLookup(lookup);
       }
 
       // by class type
       if (getUnderlyingValue() == null)
       {
-         Controller controller = context.getController();
-         ControllerContext lookup = controller.getInstalledContext(info.getType());
+         ControllerContext lookup = getControllerContext(info.getType(), ControllerState.INSTALLED);
          if (lookup == null)
          {
             if (InjectOption.STRICT.equals(injectionOption))
@@ -216,7 +220,9 @@
       {
          // check if dependent is not set when used on itself
          if (super.getUnderlyingValue() == null && dependentState == null)
-               dependentState = fromContext.getWhenValid();
+         {
+            dependentState = fromContext.getWhenValid();
+         }
 
          super.initialVisit(visitor);
          return;
@@ -284,11 +290,12 @@
                      {
                         whenRequired = visitor.getContextState();
                      }
-                     DependencyItem item = new ClassContextDependencyItem(
+                     DependencyItem item = new SearchClassContextDependencyItem(
                            context.getName(),
                            injectionClass,
                            whenRequired,
-                           dependentState);
+                           dependentState,
+                           search);
                      visitor.addDependency(item);
                   }
                   else

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -181,6 +181,9 @@
 
    public TypeInfo getType(MetaDataVisitor visitor, MetaDataVisitorNode previous) throws Throwable
    {
+      if (previous instanceof ParameterMetaData == false)
+         throw new IllegalArgumentException("Previous node is not ParameterMetaData as expected: " + previous);
+      
       ParameterMetaData parameter = (ParameterMetaData) previous;
       KernelControllerContext context = visitor.getControllerContext();
       String method = (methodName != null ? methodName : type);

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractSearchValueMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractSearchValueMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractSearchValueMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -21,30 +21,33 @@
 */
 package org.jboss.beans.metadata.plugins;
 
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
 
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.dependency.plugins.AbstractDependencyItem;
 import org.jboss.dependency.plugins.graph.Search;
+import org.jboss.dependency.plugins.graph.SearchDependencyItem;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.dispatch.AttributeDispatchContext;
 import org.jboss.dependency.spi.graph.GraphController;
+import org.jboss.dependency.spi.graph.SearchInfo;
+import org.jboss.managed.api.annotation.ManagementProperty;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
 import org.jboss.xb.annotations.JBossXmlAttribute;
-import org.jboss.managed.api.annotation.ManagementProperty;
 
 /**
- * Search value metadata - TODO - still experimental
+ * Search value metadata.
  *
+ * @deprecated use <inject search="search-type"/> 
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
+ at Deprecated
 @XmlType(name="searchType")
 public class AbstractSearchValueMetaData extends AbstractValueMetaData
 {
@@ -52,7 +55,7 @@
    private static final long serialVersionUID = 1L;
    
    private ControllerState state;
-   private org.jboss.dependency.plugins.graph.Search search;
+   private SearchInfo search;
    private String property;
 
    private ControllerContext context;
@@ -62,7 +65,7 @@
    {
    }
 
-   public AbstractSearchValueMetaData(Object value, ControllerState state, Search search, String property)
+   public AbstractSearchValueMetaData(Object value, ControllerState state, SearchInfo search, String property)
    {
       super(value);
       if (search == null)
@@ -122,7 +125,7 @@
       if (dependentState == null)
          dependentState = ControllerState.INSTALLED;
 
-      DependencyItem item = new SearchDependencyItem(name, iDependOn, whenRequired, dependentState);
+      DependencyItem item = new SearchDependencyItem(name, iDependOn, whenRequired, dependentState, search);
       visitor.addDependency(item);
 
       super.describeVisit(visitor);
@@ -176,39 +179,4 @@
       super.toShortString(buffer);
       buffer.append("search=").append(search);
    }
-
-   private class SearchDependencyItem extends AbstractDependencyItem
-   {
-      private SearchDependencyItem(Object name, Object iDependOn, ControllerState whenRequired, ControllerState dependentState)
-      {
-         super(name, iDependOn, whenRequired, dependentState);
-      }
-
-      public boolean resolve(Controller controller)
-      {
-         if (controller instanceof GraphController)
-         {
-            GraphController gc = (GraphController)controller;
-            ControllerContext context = gc.getContext(getIDependOn(), getDependentState(), search);
-            if (context != null)
-            {
-               setIDependOn(context.getName());
-               addDependsOnMe(controller, context);
-               setResolved(true);
-            }
-            else
-            {
-               setResolved(false);
-            }
-            return isResolved();
-         }
-         return false;
-      }
-
-      protected void toHumanReadableString(StringBuilder builder)
-      {
-         super.toHumanReadableString(builder);
-         builder.append("search=").append(search);
-      }
-   }
 }

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/SearchInfoValueAdapter.java (from rev 84513, projects/microcontainer/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/SearchInfoValueAdapter.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/SearchInfoValueAdapter.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/SearchInfoValueAdapter.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,39 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.beans.metadata.plugins;
+
+import org.jboss.dependency.plugins.graph.Search;
+import org.jboss.xb.binding.sunday.unmarshalling.ValueAdapter;
+
+/**
+ * SearchInfoValueAdapter.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class SearchInfoValueAdapter implements ValueAdapter
+{
+   @SuppressWarnings("unchecked")
+   public Object cast(Object o, Class c)
+   {
+      return Search.getInstance((String)o);
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -43,6 +43,8 @@
 import org.jboss.beans.metadata.plugins.AbstractDemandMetaData;
 import org.jboss.beans.metadata.plugins.AbstractDependencyMetaData;
 import org.jboss.beans.metadata.plugins.AbstractDependencyValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractFeatureMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
 import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 import org.jboss.beans.metadata.plugins.AbstractListMetaData;
 import org.jboss.beans.metadata.plugins.AbstractMapMetaData;
@@ -54,7 +56,6 @@
 import org.jboss.beans.metadata.plugins.DirectAnnotationMetaData;
 import org.jboss.beans.metadata.plugins.StringValueMetaData;
 import org.jboss.beans.metadata.plugins.ThisValueMetaData;
-import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
 import org.jboss.beans.metadata.spi.AnnotationMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
@@ -71,6 +72,7 @@
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.ErrorHandlingMode;
+import org.jboss.dependency.spi.graph.SearchInfo;
 
 /**
  * Helper class.
@@ -649,7 +651,49 @@
       return this;
    }
 
+   public BeanMetaDataBuilder addPropertyAnnotation(String name, String annotation)
+   {
+      AnnotationMetaData amd = createAnnotationMetaData(annotation);
+      return addPropertyAnnotation(name, amd);
+   }
+
+   public BeanMetaDataBuilder addPropertyAnnotation(String name, String annotation, boolean replace)
+   {
+      AnnotationMetaData amd = createAnnotationMetaData(annotation, replace);
+      return addPropertyAnnotation(name, amd);
+   }
+
+   public BeanMetaDataBuilder addPropertyAnnotation(String name, Annotation annotation)
+   {
+      AnnotationMetaData amd = createAnnotationMetaData(annotation);
+      return addPropertyAnnotation(name, amd);
+   }
+
    /**
+    * Add property annotation metadata.
+    *
+    * @param name the property name
+    * @param amd the annotation metadata
+    * @return this builder
+    */
+   protected BeanMetaDataBuilder addPropertyAnnotation(String name, AnnotationMetaData amd)
+   {
+      PropertyMetaData pmd = beanMetaData.getProperty(name);
+      Set<AnnotationMetaData> annotations = pmd.getAnnotations();
+      if (annotations == null)
+      {
+         if (pmd instanceof AbstractFeatureMetaData == false)
+            throw new IllegalArgumentException("PropertyMetaData is not AbstractFeatureMetaData instance: " + pmd);
+
+         annotations = new HashSet<AnnotationMetaData>();
+         AbstractFeatureMetaData afmd = AbstractFeatureMetaData.class.cast(pmd);
+         afmd.setAnnotations(annotations);
+      }
+      annotations.add(amd);
+      return this;
+   }
+
+   /**
     * Remove previous matching property.
     *
     * @param properties the properties
@@ -837,20 +881,23 @@
     *
     * @param demand the demand
     * @param whenRequired the when required
+    * @param targetState the target state
     * @param transformer the transformer
     * @return the demand metadata
     */
-   protected DemandMetaData createDemandMetaData(Object demand, ControllerState whenRequired, String transformer)
+   protected DemandMetaData createDemandMetaData(Object demand, ControllerState whenRequired, ControllerState targetState, String transformer)
    {
       AbstractDemandMetaData admd = new AbstractDemandMetaData(demand);
       if (whenRequired != null)
          admd.setWhenRequired(whenRequired);
+      if (targetState != null)
+         admd.setTargetState(targetState);
       if (transformer != null)
          admd.setTransformer(transformer);
       return admd;
    }
 
-   public BeanMetaDataBuilder addDemand(Object demand, ControllerState whenRequired, String transformer)
+   public BeanMetaDataBuilder addDemand(Object demand, ControllerState whenRequired, ControllerState targetState, String transformer)
    {
       Set<DemandMetaData> demands = beanMetaData.getDemands();
       if (demands == null)
@@ -858,7 +905,7 @@
          demands = new HashSet<DemandMetaData>();
          beanMetaData.setDemands(demands);
       }
-      demands.add(createDemandMetaData(demand, whenRequired, transformer));
+      demands.add(createDemandMetaData(demand, whenRequired, targetState, transformer));
       return this;
    }
 
@@ -994,13 +1041,15 @@
       return new AbstractDependencyValueMetaData(bean, property);
    }
 
-   public ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState)
+   public ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState, SearchInfo search)
    {
       AbstractDependencyValueMetaData result = createAbstractDependencyValueMetaData(bean, property);
       if (whenRequired != null)
          result.setWhenRequiredState(whenRequired);
       if (dependentState != null)
          result.setDependentState(dependentState);
+      if (search != null)
+         result.setSearch(search);
       return result;
    }
 
@@ -1014,7 +1063,7 @@
       return new AbstractInjectionValueMetaData();
    }
 
-   public ValueMetaData createContextualInject(ControllerState whenRequired, ControllerState dependentState, AutowireType autowire, InjectOption option)
+   public ValueMetaData createContextualInject(ControllerState whenRequired, ControllerState dependentState, AutowireType autowire, InjectOption option, SearchInfo search)
    {
       AbstractInjectionValueMetaData result = createAbstractInjectionValueMetaData();
       if (whenRequired != null)
@@ -1025,6 +1074,8 @@
          result.setInjectionType(autowire);
       if (option != null)
          result.setInjectionOption(option);
+      if (search != null)
+         result.setSearch(search);
       return result;
    }
 

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/package-info.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/package-info.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/plugins/policy/package-info.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -22,14 +22,17 @@
 @JBossXmlAdaptedTypes
 ({
    @JBossXmlAdaptedType(type=Cardinality.class, valueAdapter=CardinalityValueAdapter.class),
-   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class)
+   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class),
+   @JBossXmlAdaptedType(type=SearchInfo.class, valueAdapter=SearchInfoValueAdapter.class)
 })
 package org.jboss.beans.metadata.plugins.policy;
 
 import org.jboss.beans.metadata.plugins.CardinalityValueAdapter;
 import org.jboss.beans.metadata.plugins.ControllerStateValueAdapter;
+import org.jboss.beans.metadata.plugins.SearchInfoValueAdapter;
 import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.SearchInfo;
 import org.jboss.xb.annotations.JBossXmlAdaptedType;
 import org.jboss.xb.annotations.JBossXmlAdaptedTypes;
 

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/DemandMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/DemandMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/DemandMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -28,6 +28,7 @@
  * Metadata about what a bean demands.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision$
  */
 public interface DemandMetaData extends MetaDataVisitorNode, JBossInterface
@@ -45,4 +46,11 @@
     * @return when the dependency is required
     */
    ControllerState getWhenRequired();
+
+   /**
+    * Get the target state
+    *
+    * @return the target state
+    */
+   ControllerState getTargetState();
 }

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -36,12 +36,13 @@
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
 import org.jboss.beans.metadata.spi.ClassLoaderMetaData;
+import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.ErrorHandlingMode;
+import org.jboss.dependency.spi.graph.SearchInfo;
 
 /**
  * BeanMetaDataBuilder contract.
@@ -87,7 +88,9 @@
          return BeanMetaDataBuilderFactory.createBuilder((AbstractBeanMetaData)beanMetaData);
       }
       else
-         throw new IllegalArgumentException("Invalid type of bean metadata");
+      {
+         throw new IllegalArgumentException("Invalid type of bean metadata: " + beanMetaData);
+      }
    }
 
    /**
@@ -460,6 +463,34 @@
    public abstract BeanMetaDataBuilder addPropertyMetaData(String name, Collection<ValueMetaData> value);
 
    /**
+    * Add a property annotation.
+    *
+    * @param name the property name
+    * @param annotation the annotation
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addPropertyAnnotation(String name, String annotation);
+
+   /**
+    * Add a property annotation.
+    *
+    * @param name the property name
+    * @param annotation the annotation
+    * @param replace the replace flag
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addPropertyAnnotation(String name, String annotation, boolean replace);
+
+   /**
+    * Add a property annotation.
+    *
+    * @param name the property name
+    * @param annotation the annotation
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addPropertyAnnotation(String name, Annotation annotation);
+
+   /**
     * Add a property, replace it if it already exists
     * 
     * @param name the property name
@@ -691,9 +722,23 @@
     * @param transformer the transformer
     * @return the builder
     */
-   public abstract BeanMetaDataBuilder addDemand(Object demand, ControllerState whenRequired, String transformer);
+   public BeanMetaDataBuilder addDemand(Object demand, ControllerState whenRequired, String transformer)
+   {
+      return addDemand(demand, whenRequired, null, transformer);
+   }
 
    /**
+    * Add a demand
+    *
+    * @param demand the demand
+    * @param whenRequired when the demand is required
+    * @param targetState the target state
+    * @param transformer the transformer
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addDemand(Object demand, ControllerState whenRequired, ControllerState targetState, String transformer);
+
+   /**
     * Add a dependency
     * 
     * @param dependency the dependency
@@ -1611,9 +1656,24 @@
     * @param dependentState the state of the injected bean
     * @return the injection
     */
-   public abstract ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState);
+   public ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState)
+   {
+      return createInject(bean, property, whenRequired, dependentState, null);
+   }
 
    /**
+    * Create an injection
+    *
+    * @param bean the bean to inject
+    * @param property the property of the bean
+    * @param whenRequired when the injection is required
+    * @param dependentState the state of the injected bean
+    * @param search the search info
+    * @return the injection
+    */
+   public abstract ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState, SearchInfo search);
+
+   /**
     * Create contextual injection.
     *
     * @return the contextual injection
@@ -1644,9 +1704,24 @@
     * @param option the inject option
     * @return the contextual injection
     */
-   public abstract ValueMetaData createContextualInject(ControllerState whenRequired, ControllerState dependentState, AutowireType autowire, InjectOption option);
+   public ValueMetaData createContextualInject(ControllerState whenRequired, ControllerState dependentState, AutowireType autowire, InjectOption option)
+   {
+      return createContextualInject(whenRequired, dependentState, autowire, option, null);
+   }
 
    /**
+    * Create contextual injection.
+    *
+    * @param whenRequired when the injection is required
+    * @param dependentState the state of the injected bean
+    * @param autowire the autowire type
+    * @param option the inject option
+    * @param search the search info
+    * @return the contextual injection
+    */
+   public abstract ValueMetaData createContextualInject(ControllerState whenRequired, ControllerState dependentState, AutowireType autowire, InjectOption option, SearchInfo search);
+
+   /**
     * Create a new collection
     * 
     * @return the collection

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/GenericBeanFactoryMetaData.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/GenericBeanFactoryMetaData.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/GenericBeanFactoryMetaData.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -23,9 +23,7 @@
 
 import java.io.Serializable;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -60,8 +58,6 @@
 import org.jboss.beans.metadata.spi.DependencyMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
-import org.jboss.beans.metadata.spi.MetaDataVisitor;
-import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.SupplyMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
@@ -75,6 +71,7 @@
  * GenericBeanFactoryMetaData.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision: 59429 $
  */
 @XmlRootElement(name="beanfactory")
@@ -626,28 +623,4 @@
       }
       return builder.getBeanMetaData();
    }
-
-   /**
-    * PropertyMap.
-    */
-   private class PropertyMap extends HashMap<String, ValueMetaData> implements MetaDataVisitorNode
-   {
-      /** The serialVersionUID */
-      private static final long serialVersionUID = -4295725682462294630L;
-
-      public void initialVisit(MetaDataVisitor visitor)
-      {
-         visitor.initialVisit(this);
-      }
-
-      public void describeVisit(MetaDataVisitor vistor)
-      {
-         vistor.describeVisit(this);
-      }
-
-      public Iterator<? extends MetaDataVisitorNode> getChildren()
-      {
-         return values().iterator();
-      }
-   }
 }
\ No newline at end of file

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java (from rev 84513, projects/microcontainer/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/beans/metadata/spi/factory/PropertyMap.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,193 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2007, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.beans.metadata.spi.factory;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Stack;
+
+import org.jboss.beans.info.spi.BeanInfo;
+import org.jboss.beans.info.spi.PropertyInfo;
+import org.jboss.beans.metadata.plugins.TypeProvider;
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitor;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.beans.metadata.spi.RelatedClassMetaData;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.reflect.spi.TypeInfo;
+import org.jboss.util.JBossObject;
+import org.jboss.util.JBossStringBuilder;
+
+/**
+ * PropertyMap.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+class PropertyMap extends HashMap<String, ValueMetaData> implements MetaDataVisitorNode, TypeProvider
+{
+   /** The serialVersionUID */
+   private static final long serialVersionUID = -4295725682462294630L;
+
+   public void initialVisit(MetaDataVisitor visitor)
+   {
+      visitor.initialVisit(this);
+   }
+
+   public void describeVisit(MetaDataVisitor vistor)
+   {
+      vistor.describeVisit(this);
+   }
+
+   public Iterator<? extends MetaDataVisitorNode> getChildren()
+   {
+      return values().iterator();
+   }
+
+   public ValueMetaData put(String name, ValueMetaData value)
+   {
+      ValueInfo info = new ValueInfo(name, value);
+      return super.put(name, info);
+   }
+
+   public TypeInfo getType(MetaDataVisitor visitor, MetaDataVisitorNode previous) throws Throwable
+   {
+      ValueInfo valueInfo = null;
+      for (ValueMetaData value : values())
+      {
+         ValueInfo vi = ValueInfo.class.cast(value);
+         if (vi == previous)
+         {
+            valueInfo = vi;
+            break;
+         }
+      }
+      if (valueInfo == null)
+         throw new IllegalArgumentException("No matching value (" + previous + ") found: " + values());
+
+      KernelControllerContext context = visitor.getControllerContext();
+      BeanMetaData bmd = context.getBeanMetaData();
+      Set<RelatedClassMetaData> related = bmd.getRelated();
+      if (related == null || related.size() != 1)
+         throw new IllegalArgumentException("Invalid information for contextual injection: " + bmd);
+      // TODO - perhaps match which related metadata is the right one
+      RelatedClassMetaData beanClassMetaData = related.iterator().next();
+      KernelConfigurator configurator = context.getKernel().getConfigurator();
+      BeanInfo beanInfo = configurator.getBeanInfo(beanClassMetaData.getClassName(), context.getClassLoader());
+      PropertyInfo pi = beanInfo.getProperty(valueInfo.name);
+      TypeInfo typeInfo = pi.getType();
+      if (typeInfo.isCollection() || typeInfo.isMap())
+      {
+         throw new IllegalArgumentException("Cannot handle collection or map: " + valueInfo);
+      }
+      return typeInfo;
+   }
+
+   private static class ValueInfo extends JBossObject implements ValueMetaData, Serializable, TypeProvider
+   {
+      private static final long serialVersionUID = 1L;
+
+      private String name;
+      private ValueMetaData value;
+
+      private ValueInfo(String name, ValueMetaData value)
+      {
+         this.name = name;
+         this.value = value;
+      }
+
+      public TypeInfo getType(MetaDataVisitor visitor, MetaDataVisitorNode previous) throws Throwable
+      {
+         Stack<MetaDataVisitorNode> visitorNodeStack = visitor.visitorNodeStack();
+         // see AbstractInjectionValueMetaData.describeVisit
+         MetaDataVisitorNode node = visitorNodeStack.pop();
+         try
+         {
+            if (node instanceof TypeProvider)
+            {
+               TypeProvider typeProvider = (TypeProvider) node;
+               return typeProvider.getType(visitor, this);
+            }
+            else
+            {
+               throw new IllegalArgumentException(TypeProvider.ERROR_MSG);
+            }
+         }
+         finally
+         {
+            visitorNodeStack.push(node);
+         }
+      }
+
+      public Object getUnderlyingValue()
+      {
+         return value.getUnderlyingValue();
+      }
+
+      public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
+      {
+         return value.getValue(info, cl);
+      }
+
+      public void initialVisit(MetaDataVisitor vistor)
+      {
+         vistor.initialVisit(this);
+      }
+
+      public void describeVisit(MetaDataVisitor vistor)
+      {
+         vistor.describeVisit(this);
+      }
+
+      public Iterator<? extends MetaDataVisitorNode> getChildren()
+      {
+         return Collections.singleton(value).iterator();
+      }
+
+      public void toShortString(JBossStringBuilder buffer)
+      {
+         value.toShortString(buffer);
+      }
+
+      @Override
+      public int hashCode()
+      {
+         return value.hashCode();
+      }
+
+      @Override
+      public boolean equals(Object obj)
+      {
+         return value.equals(obj);
+      }
+
+      public String toShortString()
+      {
+         return value.toShortString();
+      }
+   }
+}

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/annotations/ValueUtil.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/annotations/ValueUtil.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/annotations/ValueUtil.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -21,29 +21,27 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
-import java.util.List;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.HashMap;
+import java.util.List;
 
 import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.api.annotations.JavaBeanValue;
 import org.jboss.beans.metadata.api.annotations.NullValue;
 import org.jboss.beans.metadata.api.annotations.Parameter;
+import org.jboss.beans.metadata.api.annotations.Search;
 import org.jboss.beans.metadata.api.annotations.StringValue;
 import org.jboss.beans.metadata.api.annotations.ThisValue;
 import org.jboss.beans.metadata.api.annotations.Value;
 import org.jboss.beans.metadata.api.annotations.ValueFactory;
-import org.jboss.beans.metadata.api.annotations.JavaBeanValue;
-import org.jboss.beans.metadata.api.annotations.Search;
 import org.jboss.beans.metadata.api.model.FromContext;
-import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
-import org.jboss.beans.metadata.plugins.AbstractValueFactoryMetaData;
 import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
 import org.jboss.beans.metadata.plugins.AbstractSearchValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractValueFactoryMetaData;
+import org.jboss.beans.metadata.spi.ParameterMetaData;
+import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.SearchInfo;
 
 /**
  * Simple util class.
@@ -52,18 +50,6 @@
  */
 final class ValueUtil
 {
-   /** The search types */
-   private static final Map<String, org.jboss.dependency.plugins.graph.Search> types;
-
-   static
-   {
-      types = new HashMap<String,org.jboss.dependency.plugins.graph.Search>();
-      for (org.jboss.dependency.plugins.graph.Search search : org.jboss.dependency.plugins.graph.Search.values())
-      {
-         types.put(search.getType().toUpperCase(), search);
-      }
-   }
-
    /**
     * Does value already exist.
     *
@@ -221,6 +207,8 @@
          injection.setDependentState(new ControllerState(annotation.dependentState()));
       if (isAttributePresent(annotation.whenRequired()))
          injection.setWhenRequiredState(new ControllerState(annotation.whenRequired()));
+      if (isAttributePresent(annotation.search()))
+         injection.setSearch(org.jboss.dependency.plugins.graph.Search.getInstance(annotation.search()));
       injection.setInjectionOption(annotation.option());
       injection.setInjectionType(annotation.type());
       if (FromContext.NOOP.equals(annotation.fromContext()) == false)
@@ -266,13 +254,11 @@
     * @param annotation the annotation
     * @return search meta data
     */
+   @SuppressWarnings("deprecation")
    static ValueMetaData createValueMetaData(Search annotation)
    {
       String searchType = annotation.type();
-      org.jboss.dependency.plugins.graph.Search type = types.get(searchType.toUpperCase());
-      if (type == null)
-         throw new IllegalArgumentException("No such search type: " + searchType + ", available: " + Arrays.toString(org.jboss.dependency.plugins.graph.Search.values()));
-
+      SearchInfo type = org.jboss.dependency.plugins.graph.Search.getInstance(searchType);
       ControllerState state = null;
       if (isAttributePresent(annotation.dependentState()))
          state = new ControllerState(annotation.dependentState());

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextDependencyItem.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextDependencyItem.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextDependencyItem.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -39,7 +39,7 @@
 
    public boolean resolve(Controller controller)
    {
-      ControllerContext context = controller.getInstalledContext(getIDependOn());
+      ControllerContext context = getControllerContext(controller);
       if (context != null)
       {
          setIDependOn(context.getName());
@@ -52,6 +52,25 @@
       }
       return isResolved();
    }
+
+   /**
+    * Get controller context.
+    *
+    * @param controller the controller
+    * @return controller context
+    */
+   protected ControllerContext getControllerContext(Controller controller)
+   {
+      ControllerState state = getDependentState();
+      if (state == null)
+      {
+         return controller.getInstalledContext(getIDependOn());
+      }
+      else
+      {
+         return controller.getContext(getIDependOn(), state);
+      }
+   }
 }
 
 

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/SearchClassContextDependencyItem.java (from rev 84513, projects/microcontainer/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/SearchClassContextDependencyItem.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/SearchClassContextDependencyItem.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/dependency/SearchClassContextDependencyItem.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,59 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.dependency;
+
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.LookupStrategy;
+import org.jboss.dependency.spi.graph.SearchInfo;
+
+/**
+ * A search Class context dependencyItem.
+ *
+ * @author <a href="ales.justin at gmail.com">Ales Justin</a>
+ */
+public class SearchClassContextDependencyItem extends ClassDependencyItem
+{
+   private SearchInfo search;
+
+   public SearchClassContextDependencyItem(Object name, Class<?> demandClass, ControllerState whenRequired, ControllerState dependentState, SearchInfo search)
+   {
+      super(name, demandClass, whenRequired, dependentState);
+      if (search == null)
+         throw new IllegalArgumentException("Null search.");
+
+      this.search = search;
+   }
+
+   /**
+    * Get controller context.
+    *
+    * @param controller the controller
+    * @return controller context
+    */
+   protected ControllerContext getControllerContext(Controller controller)
+   {
+      LookupStrategy strategy = search.getStrategy();
+      return strategy.getContext(controller, getIDependOn(), ControllerState.INSTALLED);
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/AbstractKernelDeployer.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/AbstractKernelDeployer.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/AbstractKernelDeployer.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -217,22 +217,21 @@
             buffer.append("Incompletely deployed:\n");
             if (errors.size() != 0)
             {
-               buffer.append("\n*** DEPLOYMENTS IN ERROR: Name -> Error\n");
+               buffer.append("\nDEPLOYMENTS IN ERROR:\n");
                for (ControllerContext ctx : errors)
                {
-                  buffer.append(ctx.getName()).append(" -> ").append(ctx.getError().toString()).append('\n');
+                  buffer.append(String.format("  Deployment \"%s\" is in error due to: %s\n", ctx.getName(), ctx.getError()));
                }
             }
             if (incomplete.size() != 0)
             {
-               buffer.append("\n*** DEPLOYMENTS MISSING DEPENDENCIES: Name -> Dependency{Required State:Actual State}\n");
+               buffer.append("\nDEPLOYMENTS MISSING DEPENDENCIES:\n");
                for (ControllerContext ctx : incomplete)
                {
                   Object name = ctx.getName();
-                  buffer.append(name).append(" -> ");
+                  buffer.append(String.format("  Deployment \"%s\" is missing the following dependencies:\n", name));
                   DependencyInfo dependsInfo = ctx.getDependencyInfo();
                   Set<DependencyItem> depends = dependsInfo.getIDependOn(null);
-                  boolean first = true;
                   for (DependencyItem item : depends)
                   {
                      ControllerState dependentState = item.getDependentState();
@@ -262,29 +261,18 @@
 
                         if (print)
                         {
-                           if (first)
-                              first = false;
-                           else
-                              buffer.append(", ");
-
-                           buffer.append(iDependOn).append('{').append(dependentState.getStateString());
-                           buffer.append(':');
-                           if (iDependOn == null)
-                           {
-                              buffer.append("** UNRESOLVED " + item.toHumanReadableString() + " **");
-                           }
-                           else
-                           {
-                              if (other == null)
-                                 buffer.append("** NOT FOUND **");
-                              else
-                                 buffer.append(otherState.getStateString());
-                           }
-                           buffer.append('}');
+                           buffer.append(String.format("    Dependency \"%s\" (should be in state \"%s\", but is actually %s)\n",
+                                   iDependOn,
+                                   dependentState.getStateString(),
+                                   iDependOn == null ?
+                                           String.format("unresolved (%s)",
+                                           item.toHumanReadableString()) :
+                                           other == null ?
+                                                   "not found" :
+                                                   String.format("in state \"%s\"", otherState.getStateString())));
                         }
                      }
                   }
-                  buffer.append('\n');
                }
             }
             throw new IllegalStateException(buffer.toString());

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/package-info.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/package-info.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/java/org/jboss/kernel/plugins/deployment/package-info.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -22,14 +22,17 @@
 @JBossXmlAdaptedTypes
 ({
    @JBossXmlAdaptedType(type=Cardinality.class, valueAdapter=CardinalityValueAdapter.class),
-   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class)
+   @JBossXmlAdaptedType(type=ControllerState.class, valueAdapter=ControllerStateValueAdapter.class),
+   @JBossXmlAdaptedType(type=SearchInfo.class, valueAdapter=SearchInfoValueAdapter.class)
 })
 package org.jboss.kernel.plugins.deployment;
 
 import org.jboss.beans.metadata.plugins.CardinalityValueAdapter;
 import org.jboss.beans.metadata.plugins.ControllerStateValueAdapter;
+import org.jboss.beans.metadata.plugins.SearchInfoValueAdapter;
 import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.graph.SearchInfo;
 import org.jboss.xb.annotations.JBossXmlAdaptedType;
 import org.jboss.xb.annotations.JBossXmlAdaptedTypes;
 

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/main/resources/schema/jboss-beans-common_2_0.xsd
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/main/resources/schema/jboss-beans-common_2_0.xsd	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/main/resources/schema/jboss-beans-common_2_0.xsd	2009-02-20 12:40:45 UTC (rev 84514)
@@ -409,6 +409,7 @@
       <xsd:attribute name="type" type="autowireTypeType" use="optional" default="ByClass"/>
       <xsd:attribute name="option" type="optionType" use="optional" default="Strict"/>
       <xsd:attribute name="fromContext" type="contextType" use="optional"/>
+      <xsd:attribute name="search" type="searchTypeType" use="optional" default="default"/>
    </xsd:complexType>
 
    <xsd:complexType name="searchType">
@@ -983,6 +984,7 @@
       <xsd:simpleContent>
          <xsd:extension base="xsd:string">
             <xsd:attribute name="state" type="controllerStateType" use="optional"/>
+            <xsd:attribute name="targetState" type="controllerStateType" use="optional"/>
             <xsd:attribute name="transformer" type="xsd:token" use="optional"/>
          </xsd:extension>
       </xsd:simpleContent>

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/support/SimpleAnnotationImpl.java (from rev 84513, projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/config/support/SimpleAnnotationImpl.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/support/SimpleAnnotationImpl.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/support/SimpleAnnotationImpl.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.config.support;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class SimpleAnnotationImpl implements SimpleAnnotation
+{
+   public String name()
+   {
+      return null;
+   }
+
+   public Class<? extends Annotation> annotationType()
+   {
+      return SimpleAnnotation.class;
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -36,15 +36,18 @@
 import org.jboss.beans.metadata.plugins.AbstractRelatedClassMetaData;
 import org.jboss.beans.metadata.plugins.InstallCallbackMetaData;
 import org.jboss.beans.metadata.plugins.UninstallCallbackMetaData;
+import org.jboss.beans.metadata.plugins.AbstractDependencyValueMetaData;
 import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
+import org.jboss.beans.metadata.spi.AnnotationMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaDataFactory;
 import org.jboss.beans.metadata.spi.CallbackMetaData;
+import org.jboss.beans.metadata.spi.LifecycleMetaData;
+import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.beans.metadata.spi.LifecycleMetaData;
-import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.dependency.plugins.graph.Search;
 import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
@@ -56,6 +59,7 @@
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.metadata.spi.MetaData;
 import org.jboss.test.kernel.config.support.SimpleAnnotation;
+import org.jboss.test.kernel.config.support.SimpleAnnotationImpl;
 import org.jboss.test.kernel.config.support.SimpleBean;
 import org.jboss.test.kernel.config.support.SimpleCallbackBean;
 import org.jboss.test.kernel.config.support.SimpleLifecycleBean;
@@ -190,6 +194,37 @@
    }
 
    @SuppressWarnings("deprecation")
+   public void testDemandWithTargetState() throws Throwable
+   {
+      BeanMetaDataBuilder demand = BeanMetaDataBuilderFactory.createBuilder("DemandBean", SimpleBean.class.getName());
+      demand.addDemand("SupplyBean", ControllerState.CREATE, ControllerState.START, null);
+      BeanMetaDataFactory demandBean = demand.getBeanMetaDataFactory();
+
+      BeanMetaDataBuilder supply = BeanMetaDataBuilderFactory.createBuilder("SupplyBean", SimpleLifecycleBean.class.getName());
+      BeanMetaDataFactory supplyBean = supply.getBeanMetaDataFactory();
+
+      AbstractKernelDeployment deployment = new AbstractKernelDeployment();
+      deployment.setBeanFactories(Arrays.asList(demandBean, supplyBean));
+
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+      AbstractKernelDeployer deployer = new AbstractKernelDeployer(kernel);
+
+      deployer.deploy(deployment);
+      try
+      {
+         Object db = controller.getInstalledContext("DemandBean").getTarget();
+         assertNotNull(db);
+         Object sb = controller.getInstalledContext("SupplyBean").getTarget();
+         assertNotNull(sb);
+      }
+      finally
+      {
+         deployer.undeploy(deployment);
+      }
+   }
+
+   @SuppressWarnings("deprecation")
    public void testDependency() throws Throwable
    {
       BeanMetaDataBuilder dependOn = BeanMetaDataBuilderFactory.createBuilder("DependOnBean", SimpleBean.class.getName());
@@ -926,4 +961,35 @@
       assertNotNull(vmd);
       assertNull(vmd.getUnderlyingValue());
    }
+
+   public void testSearch() throws Throwable
+   {
+      BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("test");
+      builder.addPropertyMetaData("ci", builder.createContextualInject(null, null, null, null, Search.WIDTH));
+      BeanMetaData bmd = builder.getBeanMetaData();
+      Set<PropertyMetaData> properties = bmd.getProperties();
+      assertNotNull(properties);
+      assertEquals(1, properties.size());
+      PropertyMetaData pmd = properties.iterator().next();
+      ValueMetaData vmd = pmd.getValue();
+      assertNotNull(vmd);
+      AbstractDependencyValueMetaData advmd = assertInstanceOf(vmd, AbstractDependencyValueMetaData.class);
+      assertEquals(Search.WIDTH, advmd.getSearch());
+   }
+
+   public void testPropertyAnnotations() throws Throwable
+   {
+      BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("test");
+      builder.addPropertyMetaData("ci", builder.createContextualInject());
+      builder.addPropertyAnnotation("ci", new SimpleAnnotationImpl());
+      BeanMetaData bmd = builder.getBeanMetaData();
+
+      Set<PropertyMetaData> properties = bmd.getProperties();
+      assertNotNull(properties);
+      assertEquals(1, properties.size());
+      PropertyMetaData pmd = properties.iterator().next();
+      Set<AnnotationMetaData> annotations = pmd.getAnnotations();
+      assertNotNull(annotations);
+      assertEquals(1, annotations.size());
+   }
 }

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/support/FirstBean2.java (from rev 84513, projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/support/FirstBean2.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/support/FirstBean2.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/support/FirstBean2.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,51 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.kernel.deployment.support;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+public class FirstBean2
+{
+   private FirstBean c;
+   private RealTM tm;
+
+   public FirstBean2(FirstBean c)
+   {
+      this.c = c;
+   }
+
+   public FirstBean getC()
+   {
+      return c;
+   }
+
+   public RealTM getTm()
+   {
+      return tm;
+   }
+
+   public void setTm(RealTM tm)
+   {
+      this.tm = tm;
+   }
+}
\ No newline at end of file

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.java (from rev 84513, projects/microcontainer/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.java)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.java	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,52 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.deployment.test;
+
+import junit.framework.Test;
+import org.jboss.beans.metadata.spi.factory.BeanFactory;
+import org.jboss.test.kernel.deployment.support.FirstBean2;
+
+/**
+ * BeanFactoryContextualInjectionTestCase.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class BeanFactoryContextualInjectionTestCase extends AbstractDeploymentTest
+{
+   public static Test suite()
+   {
+      return suite(BeanFactoryContextualInjectionTestCase.class);
+   }
+
+   public BeanFactoryContextualInjectionTestCase(String name) throws Throwable
+   {
+      super(name);
+   }
+
+   public void testContextualInjection() throws Throwable
+   {
+      BeanFactory bf = assertBean("FirstBean", BeanFactory.class);
+      FirstBean2 bean = (FirstBean2)bf.createBean();
+      assertNotNull(bean.getC());
+      assertNotNull(bean.getTm());
+   }
+}
\ No newline at end of file

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/DeploymentTestSuite.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/DeploymentTestSuite.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/test/DeploymentTestSuite.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -75,6 +75,7 @@
       suite.addTest(GetInstanceTestCase.suite());
       suite.addTest(NullifyTestCase.suite());
       suite.addTest(TransitiveBeansTestCase.suite());
+      suite.addTest(BeanFactoryContextualInjectionTestCase.suite());
       // bean container tests
       suite.addTest(BeanContainerUsageTestCase.suite());
       suite.addTest(BeanContainerUsageMDTestCase.suite());

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandJaxbTestCase.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandJaxbTestCase.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandJaxbTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -33,6 +33,7 @@
  * Demand TestCase.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision: 40800 $
  */
 public class DemandJaxbTestCase extends AbstractMCTest
@@ -62,6 +63,13 @@
       assertEquals(ControllerState.CONFIGURED, demand.getWhenRequired());
    }
 
+   public void testDemandWithTargetState() throws Exception
+   {
+      AbstractDemandMetaData demand = getDemand();
+      assertEquals("Demand", demand.getDemand());
+      assertEquals(ControllerState.CREATE, demand.getTargetState());
+   }
+
    /* TODO
    public void testDemandBadNoValue() throws Exception
    {

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandTestCase.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandTestCase.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/DemandTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -34,6 +34,7 @@
  * Demand TestCase.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision$
  */
 public class DemandTestCase extends AbstractXMLTest
@@ -63,6 +64,13 @@
       assertEquals(ControllerState.CONFIGURED, demand.getWhenRequired());
    }
 
+   public void testDemandWithTargetState() throws Exception
+   {
+      AbstractDemandMetaData demand = getDemand("DemandWithTargetState.xml");
+      assertEquals("Demand", demand.getDemand());
+      assertEquals(ControllerState.CREATE, demand.getTargetState());
+   }
+
    public void testDemandWithTransformer() throws Exception
    {
       AbstractDemandMetaData demand = getDemand("DemandWithTransformer.xml");

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionJaxbTestCase.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionJaxbTestCase.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionJaxbTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -28,6 +28,7 @@
 import org.jboss.beans.metadata.plugins.AbstractDependencyValueMetaData;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.plugins.graph.Search;
 import org.jboss.dependency.spi.ControllerState;
 
 /**
@@ -76,6 +77,13 @@
       assertEquals(ControllerState.CONFIGURED, dependency.getDependentState());
    }
 
+   public void testInjectionWithSearch() throws Exception
+   {
+      AbstractDependencyValueMetaData dependency = getInjection();
+      assertEquals("Dummy", dependency.getValue());
+      assertEquals(Search.LEAVES, dependency.getSearch());
+   }
+
    /* TODO
    public void testInjectionBadNoBean() throws Exception
    {

Modified: projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionTestCase.java
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionTestCase.java	2009-02-20 12:24:52 UTC (rev 84513)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/InjectionTestCase.java	2009-02-20 12:40:45 UTC (rev 84514)
@@ -24,13 +24,13 @@
 import java.util.Set;
 
 import junit.framework.Test;
-
+import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractDependencyValueMetaData;
-import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
 import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.plugins.graph.Search;
 import org.jboss.dependency.spi.ControllerState;
 
 /**
@@ -100,6 +100,13 @@
       assertEquals(FromContext.getInstance("name"), dependency.getFromContext());
    }
 
+   public void testInjectionWithSearch() throws Exception
+   {
+      AbstractInjectionValueMetaData dependency = getInjection("InjectionWithSearch.xml");
+      assertEquals("Dummy", dependency.getValue());
+      assertEquals(Search.LEAVES, dependency.getSearch());
+   }
+
    public static Test suite()
    {
       return suite(InjectionTestCase.class);

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.xml (from rev 84513, projects/microcontainer/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.xml)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.xml	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/test/BeanFactoryContextualInjectionTestCase.xml	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+  <beanfactory name="FirstBean" class="org.jboss.test.kernel.deployment.support.FirstBean2">
+    <constructor>
+      <parameter class="org.jboss.test.kernel.deployment.support.FirstBean"><inject/></parameter>
+    </constructor>
+    <property name="tm"><inject/></property>
+  </beanfactory>
+
+  <bean name="C" class="org.jboss.test.kernel.deployment.support.FirstBean"/>
+  <bean name="RealTM" class="org.jboss.test.kernel.deployment.support.RealTM"/>
+
+</deployment>

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/DemandWithTargetState.xml (from rev 84513, projects/microcontainer/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/DemandWithTargetState.xml)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/DemandWithTargetState.xml	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/DemandWithTargetState.xml	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <demand targetState="Create">Demand</demand>
+</bean>

Copied: projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/InjectionWithSearch.xml (from rev 84513, projects/microcontainer/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/InjectionWithSearch.xml)
===================================================================
--- projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/InjectionWithSearch.xml	                        (rev 0)
+++ projects/microcontainer/branches/Branch_2_0/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/InjectionWithSearch.xml	2009-02-20 12:40:45 UTC (rev 84514)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <property name="Dummy">
+      <inject bean="Dummy" search="Leaves"/>
+   </property>
+</bean>




More information about the jboss-cvs-commits mailing list