[jboss-cvs] JBossAS SVN: r97247 - in projects/kernel/trunk: kernel/src/main/java/org/jboss/beans/metadata/api/model and 8 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Dec 1 11:53:21 EST 2009


Author: kabir.khan at jboss.com
Date: 2009-12-01 11:53:20 -0500 (Tue, 01 Dec 2009)
New Revision: 97247

Added:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierPoint.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierType.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/support/TargetAllBean.java
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithPoints.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithSinglePoint.xml
Removed:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/QualifierType.java
Modified:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanQualifierMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectQualifierMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifierKey.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifiersMdrUtil.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/BeanQualifiersTestCase.java
   projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/InjectionPointQualifiersTestCase.java
   projects/kernel/trunk/pom.xml
Log:
[JBKERNEL-63] Add support for narrowing down required/optional qualifiers specified on bean level to particular injection point types.
Move QualifierType to public api and add QualifierPoint there. Rework BeanMetaDataBuilder qualifier methods to take QT and QP as parameters.


Added: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierPoint.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierPoint.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierPoint.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,47 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.beans.metadata.api.model;
+
+import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.xb.annotations.JBossXmlEnum;
+
+/**
+ * When creating wanted qualifiers ({@link QualifierType#REQUIRED} and {@link QualifierType#OPTIONAL})
+ * this enum can be used to specify which injection point types the wanted qualifiers should apply to. 
+ * 
+ * @see BeanMetaDataBuilder#addQualifiers(QualifierType, java.util.List, Object...)
+ * @see QualifierType
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+ at JBossXmlEnum(ignoreCase=true)
+public enum QualifierPoint
+{
+   /** Apply the qualifier to constructors */
+   CONSTRUCTOR,
+   
+   /** Apply the qualifier to methods */
+   METHOD,
+   
+   /** Apply the qualifier to properties */
+   PROPERTY
+}

Copied: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierType.java (from rev 97042, projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/QualifierType.java)
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierType.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierType.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,47 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.beans.metadata.api.model;
+
+import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.xb.annotations.JBossXmlEnum;
+
+/**
+ * The type of qualifier used for narrowing down the set of beans used for 
+ * contextual injection.
+ * 
+ * @see QualifierPoint
+ * @see BeanMetaDataBuilder#addQualifiers(QualifierType, java.util.List, Object...)
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+ at JBossXmlEnum(ignoreCase=true)
+public enum QualifierType 
+{
+   /** Specifies the qualifiers supplied by the bean */
+   SUPPLIED,
+   
+   /** Specifies a qualifier that is wanted and must be present in candidate beans */
+   REQUIRED,
+   
+   /** Specifies a qualifier that is wanted and is optionally present in candidate bean */
+   OPTIONAL
+}

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanQualifierMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanQualifierMetaData.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractBeanQualifierMetaData.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -21,33 +21,48 @@
 */ 
 package org.jboss.beans.metadata.plugins;
 
+import java.util.List;
+
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlType;
 
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
 import org.jboss.kernel.plugins.dependency.QualifiersMdrUtil;
 
 /**
+ * Qualifier Metadata for a bean's qualifiers
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
 @XmlType(name="qualifierType")
-public class AbstractBeanQualifierMetaData extends AbstractInjectQualifierMetaData
+public class AbstractBeanQualifierMetaData extends AbstractQualifierMetaData
 {
    private static final long serialVersionUID = 1L;
    
    protected QualifierType type = QualifierType.SUPPLIED;
 
+   protected List<QualifierPoint> points;
+
    public AbstractBeanQualifierMetaData()
    {
       internalSetClassName(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY);
    }
    
+   /**
+    * Get the type
+    * @return the type
+    */
    public QualifierType getType()
    {
       return type;
    }
 
+   /**
+    * Set the type
+    * @param type the type
+    */
    @XmlAttribute(name="type")
    public void setType(QualifierType type)
    {
@@ -61,4 +76,24 @@
       else
          throw new IllegalArgumentException("NYI " + type);
    }
+   
+   /**
+    * Set the injection point types this qualifier should be applied to. Null means that it should be applied to all injection point types.
+    * @param points the points
+    */
+   @XmlAttribute(name="points")
+   public void setPoints(List<QualifierPoint> points)
+   {
+      this.points = points;
+   }
+   
+   /**
+    * Get the injection point types this qualifier should be applied to. Null means that it should be applied to all injection point types.
+    * @return the points
+    */
+   public List<QualifierPoint> getPoints()
+   {
+      return points;
+   }
+   
 }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectQualifierMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectQualifierMetaData.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectQualifierMetaData.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -21,18 +21,18 @@
 */ 
 package org.jboss.beans.metadata.plugins;
 
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlType;
 
 import org.jboss.kernel.plugins.dependency.QualifiersMdrUtil;
 
 /**
+ * Qualifier Metadata for an injection point's qualifiers
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
 @XmlType(name="qualifierType")
-public class AbstractInjectQualifierMetaData extends AbstractRelatedClassMetaData
+public class AbstractInjectQualifierMetaData extends AbstractQualifierMetaData
 {
    private static final long serialVersionUID = 1L;
    
@@ -40,16 +40,4 @@
    {
       internalSetClassName(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY);
    }
-   
-   @Override
-   @XmlAttribute(name="name")
-   public void setClassName(String classname)
-   {
-      throw new IllegalStateException("Class name can not be set for qualifiers");
-   }
-   
-   protected void internalSetClassName(String classname)
-   {
-      super.setClassName(classname);
-   }
 }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -21,7 +21,9 @@
 */
 package org.jboss.beans.metadata.plugins;
 
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import javax.xml.bind.annotation.XmlAttribute;
@@ -32,8 +34,13 @@
 import org.jboss.beans.metadata.api.model.AutowireType;
 import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.api.model.InjectOption;
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.spi.ConstructorMetaData;
+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.ParameterMetaData;
+import org.jboss.beans.metadata.spi.PropertyMetaData;
 import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.dependency.plugins.AttributeCallbackItem;
 import org.jboss.dependency.spi.ControllerContext;
@@ -356,15 +363,24 @@
                   if (node instanceof TypeProvider)
                   {
                      TypeProvider typeProvider = (TypeProvider)node;
-                     Class<?> injectionClass = typeProvider.getType(visitor, this).getType();
+                     Class<?> injectionClass = null;
+                     try
+                     {
+                        injectionClass = typeProvider.getType(visitor, this).getType();
+                     }
+                     finally
+                     {
+                        visitor.visitorNodeStack().push(node);
+                     }
                      log.debug(context.getName() + ": Contextual injection usage (class -> classloader): " + injectionClass + " -> " + SecurityActions.getClassLoader(injectionClass) + " defined by " + node);
+                     
                      // set when required
                      ControllerState whenRequired = whenRequiredState;
                      if (whenRequired == null)
                      {
                         whenRequired = visitor.getContextState();
                      }
-                     DependencyItem item = createDependencyItem(injectionClass, whenRequired);
+                     DependencyItem item = createDependencyItem(visitor, injectionClass, whenRequired);
                      visitor.addDependency(item);
                   }
                   else
@@ -380,10 +396,6 @@
                {
                   throw new Error(throwable);
                }
-               finally
-               {
-                  visitor.visitorNodeStack().push(node);
-               }
             }
          }
          else
@@ -394,11 +406,14 @@
       super.describeVisit(visitor);
    }
 
-   private DependencyItem createDependencyItem(Class<?> injectionClass, ControllerState whenRequired)
+   private DependencyItem createDependencyItem(MetaDataVisitor visitor, Class<?> injectionClass, ControllerState whenRequired)
    {
       boolean hasQualifiers = qualifiers != null && qualifiers.size() > 0;
+      QualifierPoint type = determineInjectionPointType(visitor);
       if (!hasQualifiers)
-         hasQualifiers = QualifiersMdrUtil.hasWantedQualifiersInParentMdrOrBeanMetaData(context);
+      {
+         hasQualifiers = QualifiersMdrUtil.hasWantedQualifiersInParentMdrOrBeanMetaData(context, type);
+      }
       
       if (!hasQualifiers)
          return new SearchClassContextDependencyItem(
@@ -410,13 +425,15 @@
       else
       {
          Set<Object> qualifierObjects = null;
+         
          if (qualifiers != null && qualifiers.size() > 0)
          {
             qualifierObjects = new HashSet<Object>(qualifiers.size());
             for (RelatedClassMetaData rcmd : qualifiers)
                qualifierObjects.addAll(rcmd.getEnabled());
          }
-         classAndQualifierMatcher = new ClassAndQualifierKey(dependentState, context, ignoreBeanQualifiers, qualifierObjects, injectionClass);
+         
+         classAndQualifierMatcher = new ClassAndQualifierKey(dependentState, context, ignoreBeanQualifiers, type, qualifierObjects, injectionClass);
          return new SearchQualifiedClassDependencyItem(context.getName(), 
                classAndQualifierMatcher,
                whenRequired, 
@@ -425,6 +442,33 @@
       }
    }
    
+   private QualifierPoint determineInjectionPointType(MetaDataVisitor visitor)
+   {
+      List<MetaDataVisitorNode> popped = new ArrayList<MetaDataVisitorNode>();
+      try
+      {
+         MetaDataVisitorNode node = visitor.visitorNodeStack().peek();
+         while (node != null && visitor.visitorNodeStack().size() > 0)
+         {
+            if (visitor.visitorNodeStack().peek() instanceof ConstructorMetaData)
+               return QualifierPoint.CONSTRUCTOR;
+            else if (visitor.visitorNodeStack().peek() instanceof LifecycleMetaData)
+               return QualifierPoint.METHOD;
+            else if (visitor.visitorNodeStack().peek() instanceof PropertyMetaData)
+               return QualifierPoint.PROPERTY;
+               
+            node = visitor.visitorNodeStack().pop();
+            popped.add(node);
+         }
+      }
+      finally
+      {
+         for (int i = popped.size() - 1 ; i >= 0 ; i--)
+            visitor.visitorNodeStack().push(popped.get(i));
+      }
+      throw new IllegalStateException("Unable to determine type of " + visitor.visitorNodeStack().peek() + " for " + context);
+   }
+   
    public void toString(JBossStringBuilder buffer)
    {
       super.toString(buffer);

Added: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,52 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.beans.metadata.plugins;
+
+import javax.xml.bind.annotation.XmlAttribute;
+
+/**
+ * Abstract Qualifier MetaData.
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class AbstractQualifierMetaData extends AbstractRelatedClassMetaData
+{
+   private static final long serialVersionUID = 1L;
+   
+   public AbstractQualifierMetaData()
+   {
+   }
+   
+   @Override
+   @XmlAttribute(name="name")
+   public void setClassName(String classname)
+   {
+      throw new IllegalStateException("Class name can not be set for qualifiers");
+   }
+   
+   protected void internalSetClassName(String classname)
+   {
+      super.setClassName(classname);
+   }
+
+}

Deleted: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/QualifierType.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/QualifierType.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/QualifierType.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -1,35 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source.
-* Copyright 2006, 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.beans.metadata.plugins;
-
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * 
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision: 1.1 $
- */
-public enum QualifierType {
-   @XmlEnumValue("Supplied") SUPPLIED,
-   @XmlEnumValue("Required") REQUIRED,
-   @XmlEnumValue("Optional") OPTIONAL
-}

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -35,6 +35,8 @@
 import org.jboss.beans.metadata.api.model.AutowireType;
 import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.api.model.InjectOption;
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
 import org.jboss.beans.metadata.plugins.AbstractAnnotationMetaData;
 import org.jboss.beans.metadata.plugins.AbstractArrayMetaData;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
@@ -60,7 +62,6 @@
 import org.jboss.beans.metadata.plugins.AbstractValueFactoryMetaData;
 import org.jboss.beans.metadata.plugins.AbstractValueMetaData;
 import org.jboss.beans.metadata.plugins.DirectAnnotationMetaData;
-import org.jboss.beans.metadata.plugins.QualifierType;
 import org.jboss.beans.metadata.plugins.StringValueMetaData;
 import org.jboss.beans.metadata.plugins.ThisValueMetaData;
 import org.jboss.beans.metadata.spi.AnnotationMetaData;
@@ -1199,26 +1200,11 @@
       return (Map) map;
    }
 
-   @Override
-   public BeanMetaDataBuilder addSuppliedQualifiers(Object... qualifiers)
+   public BeanMetaDataBuilder addQualifiers(QualifierType type, List<QualifierPoint> points, Object...qualifiers)
    {
-      return createQualifiers(QualifierType.SUPPLIED, qualifiers);
-   }
-
-   @Override
-   public BeanMetaDataBuilder addRequiredQualifiers(Object... qualifiers)
-   {
-      return createQualifiers(QualifierType.REQUIRED, qualifiers);
-   }
-   
-   @Override
-   public BeanMetaDataBuilder addOptionalQualifiers(Object... qualifiers)
-   {
-      return createQualifiers(QualifierType.OPTIONAL, qualifiers);
-   }
-   
-   protected BeanMetaDataBuilder createQualifiers(QualifierType type, Object...qualifiers)
-   {
+      if (type == QualifierType.SUPPLIED && points != null)
+         throw new IllegalArgumentException("Can not specify SUPPLIED and a list of qualifier points");
+      
       Set<RelatedClassMetaData> relatedClassMetaDatas = beanMetaData.getRelated();
       if (relatedClassMetaDatas == null)
       {
@@ -1228,6 +1214,7 @@
       AbstractBeanQualifierMetaData metaData = new AbstractBeanQualifierMetaData();
       metaData.setType(type);
       metaData.setEnabled(new HashSet<Object>(Arrays.asList(qualifiers)));
+      metaData.setPoints(points);
       relatedClassMetaDatas.add(metaData);
       
       return this;

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -32,6 +32,8 @@
 import org.jboss.beans.metadata.api.model.AutowireType;
 import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.api.model.InjectOption;
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
 import org.jboss.beans.metadata.spi.BeanMetaData;
@@ -1872,46 +1874,38 @@
     * @return new related class meta data
     */
    public abstract RelatedClassMetaData createRelated(String className, Object... enabled);
-   
-   /**
-    * Create qualifiers supplied by the bean. Beans using contextual injection by class
-    * that have qualifiers either at the injection point or required/optional qualifiers at bean
-    * level will use these qualifiers to narrow down the set of beans of the required type
-    * for injection. Note that these qualifiers are stored in the set of related classes so
-    * take care not to call {@link #setRelated(Set)} after calling this method.  
-    *
-    * @see BeanMetaData#getRelated()
-    * @see #createWantedQualifier(Object...)
-    * @param qualifiers the qualifiers we want this bean to supply
-    * @return this builder
-    */
-   public abstract BeanMetaDataBuilder addSuppliedQualifiers(Object...qualifiers);
 
    /**
-    * Create the default set of qualifiers we want this bean to use when doing contextual
-    * injection. The qualifiers are used to narrow down the set of beans of the required 
-    * type for injection. Note that these qualifiers are stored in the set of related classes 
-    * so take care not to call {@link #setRelated(Set)} after calling this method. 
+    * Create qualifiers for the bean to narrow down the set of candidate contexts of the required when doing contextual injection.
+    * Note that these qualifiers are stored in the set of related classes so take care not to call {@link #setRelated(Set)}
+    * after calling this method. If used with {@link QualifierType#REQUIRED} or {@link QualifierType#OPTIONAL} the qualifier will
+    * apply to all injection points.
     * 
     * @see BeanMetaData#getRelated()
-    * @see #createSuppliedQualifier(Object...)
-    * @param qualifiers the default qualifiers we want this bean to require
+    * @see #addQualifiers(QualifierType, List, Object...)
+    * @param type the type of qualifier to add
+    * @param qualifiers the qualifiers we want to apply to this bean
     * @return this builder
     */
-   public abstract BeanMetaDataBuilder addRequiredQualifiers(Object...qualifiers);
+   public BeanMetaDataBuilder addQualifiers(QualifierType type, Object...qualifiers)
+   {
+      return addQualifiers(type, null, qualifiers);
+   }
 
    /**
-    * Create the default set of optional qualifiers we want this bean to use when doing contextual
-    * injection. The qualifiers are used to narrow down the set of beans of the required 
-    * type for injection. Note that these qualifiers are stored in the set of related classes 
-    * so take care not to call {@link #setRelated(Set)} after calling this method. 
+    * Create qualifiers for the bean to narrow down the set of candidate contexts of the required when doing contextual injection.
+    * Note that these qualifiers are stored in the set of related classes so take care not to call {@link #setRelated(Set)}
+    * after calling this method.
     * 
     * @see BeanMetaData#getRelated()
-    * @see #createSuppliedQualifier(Object...)
-    * @param qualifiers the default qualifiers we want this bean to require
+    * @param type the type of qualifier to add
+    * @param points the list of injection point types this qualifier applies to. Should be null if {@link QualifierType#SUPPLIED}
+    * was passed in for the 'type' parameter. If null and used with {@link QualifierType#REQUIRED} or {@link QualifierType#OPTIONAL}
+    * it will be applied to all the bean's injection points.
+    * @param qualifiers the qualifiers we want to apply to this bean
     * @return this builder
     */
-   public abstract BeanMetaDataBuilder addOptionalQualifiers(Object...qualifiers);
+   public abstract BeanMetaDataBuilder addQualifiers(QualifierType type, List<QualifierPoint> points, Object...qualifiers);
 
    /**
     * Create a null value

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifierKey.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifierKey.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifierKey.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.jboss.beans.metadata.api.model.QualifierPoint;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.spi.dependency.KernelController;
@@ -35,6 +36,8 @@
 import org.jboss.util.JBossStringBuilder;
 
 /**
+ * If an injection point uses contextual injection and also has qualifiers attached, 
+ * this will be used when trying to find a matching context in the controller
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
@@ -53,19 +56,38 @@
    /** The qualifiers defined on the injection point */
    protected final Set<Object> injectionPointQualifiers;
    
+   /** If injection point qualifiers are specified, set this to true to ignore any qualifiers from bean level */
    protected final boolean ignoreBeanQualifiers; 
    
-   public ClassAndQualifierKey(ControllerState dependentState, KernelControllerContext context, boolean ignoreBeanQualifiers, Set<Object> injectionPointQualifiers, Class<?> type)
+   /** The injection point type that this lookup will be done for */
+   protected final QualifierPoint injectionPointType;
+   
+   /**
+    * Constructor
+    * 
+    * @param dependentState the state the dependency must be in
+    * @param context the controller context owning this dependency
+    * @param ignoreBeanQualifiers if injection point qualifiers are specified, set this to true to ignore any qualifiers from bean level
+    * @param injectionPointType the injection point type that this lookup will be done for
+    * @param injectionPointQualifiers the qualifiers applying only to this injection point
+    * @param type the type of class we are looking for
+    * 
+    */
+   public ClassAndQualifierKey(ControllerState dependentState, KernelControllerContext context, boolean ignoreBeanQualifiers, QualifierPoint injectionPointType, Set<Object> injectionPointQualifiers, Class<?> type)
    {
       this.dependentState = dependentState == null ? ControllerState.INSTALLED : dependentState;
       this.context = context;
       this.injectionPointQualifiers = injectionPointQualifiers != null && injectionPointQualifiers.size() > 0 ? injectionPointQualifiers : null;
       this.type = type;
       this.ignoreBeanQualifiers = ignoreBeanQualifiers;
+      this.injectionPointType = injectionPointType;
    }
    
    /**
-    * Look for a context in the controller.
+    * Look for a context in the controller that most closely matches the type
+    * and qualifiers contained in this key
+    * 
+    * @param controller the controller
     */
    public KernelControllerContext search(KernelController controller)
    {
@@ -81,7 +103,7 @@
             requiredQualifiers = injectionPointQualifiers;
          else
          {
-            requiredQualifiers = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context);
+            requiredQualifiers = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context, injectionPointType);
             if (requiredQualifiers == null)
                requiredQualifiers = new HashSet<Object>();
             requiredQualifiers.addAll(injectionPointQualifiers);
@@ -89,10 +111,10 @@
       }
       else
       {
-         requiredQualifiers = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context);
+         requiredQualifiers = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context, injectionPointType);
       }
       
-      Set<Object> optionalQualifiers = ignoreBeanQualifiers ? null : QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(context);
+      Set<Object> optionalQualifiers = ignoreBeanQualifiers ? null : QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(context, injectionPointType);
       if ((requiredQualifiers == null || requiredQualifiers.size() == 0) && (optionalQualifiers == null || optionalQualifiers.size() == 0))
          return getFirstContext(contexts);
          
@@ -186,7 +208,7 @@
       buffer.append("class=");
       buffer.append(type);
       buffer.append(" qualifiers=");
-      buffer.append(QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context));
+      buffer.append(QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(context, injectionPointType));
    }
 
    @Override

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifiersMdrUtil.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifiersMdrUtil.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifiersMdrUtil.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -24,6 +24,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
+import org.jboss.beans.metadata.plugins.AbstractBeanQualifierMetaData;
 import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -39,13 +42,26 @@
 import org.jboss.util.collection.ConcurrentSet;
 
 /**
+ * Utility class to access the MDR for qualifiers.<p>
  * 
+ * Supplied qualifiers are stored under the key {@link #SUPPLIED_QUALIFIER_KEY}.</p>
+ * 
+ * Wanted qualifiers are split into optional (key prefix: {@link #OPTIONAL_QUALIFIER_KEY}) 
+ * or required (key prefix: {@link #REQUIRED_QUALIFIER_KEY}). They can apply to a sub-set of the following injection points. Property 
+ * (key suffix {@link #PROPERTY_SUFFIX}), method (key suffix: {@link #METHOD_SUFFIX}), constructor (key suffix: {@link #CONSTRUCTOR_SUFFIX}).
+ * The full MDR key is the <i><b>key prefix</b> + <b>key suffix</b></i>. If there is no injection point specified the qualifiers will be applied
+ * to property, method and constructor.  
+ * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
 public class QualifiersMdrUtil
 {
    private final static Logger log = Logger.getLogger(QualifiersMdrUtil.class);
+   
+   private final static MDRStrategy SUPPLIED_MDR = new SuppliedMDRStrategy();
+   
+   private final static MDRStrategy WANTED_MDR = new WantedMDRStrategy();
 
    /** The key under which we will store a contexts supplied qualifier metadata */
    public final static String SUPPLIED_QUALIFIER_KEY = QualifiersMdrUtil.class.getSimpleName() + "#SUPPLIED_QUALIFIERS";
@@ -55,16 +71,23 @@
    
    /** The key under which we will store a contexts required qualifier metadata */
    public final static String OPTIONAL_QUALIFIER_KEY = QualifiersMdrUtil.class.getSimpleName() + "#OPTIONAL_QUALIFIERS";
-
-
+   
+   public final static String CONSTRUCTOR_SUFFIX = "#CONSTRUCTOR";
+   
+   public final static String PROPERTY_SUFFIX = "#PROPERTY";
+   
+   public final static String METHOD_SUFFIX = "#METHOD";
+   
    /**
     * Get the wanted qualifiers defined from the bean's metadata or in the Mdr.
-    * This method is used when creating dependency items, which is before the Mdr
+    * This method is used when creating injection values, which is before the Mdr
     * has been set up for a context.
     * 
-    * @return a set of related class metadata, where RelatedClassMetaData.getEnabled() contains the qualifiers
+    * @param context the context we want to check
+    * @param point the injection point we want to narrow down qualifiers for
+    * @return true if the bean metadata or the Mdr contains qualifiers
     */
-   public static boolean hasWantedQualifiersInParentMdrOrBeanMetaData(KernelControllerContext context)
+   public static boolean hasWantedQualifiersInParentMdrOrBeanMetaData(KernelControllerContext context, QualifierPoint point)
    {
       Set<RelatedClassMetaData> related = context.getBeanMetaData().getRelated();
       if (related == null)
@@ -93,8 +116,10 @@
          MetaData metaData = repository.getMetaData(key);
          if (metaData != null)
          {
-            if (metaData.getMetaData(REQUIRED_QUALIFIER_KEY) != null)
+            if (metaData.getMetaData(WANTED_MDR.getKey(REQUIRED_QUALIFIER_KEY, point)) != null)
                return true;
+            if (metaData.getMetaData(WANTED_MDR.getKey(OPTIONAL_QUALIFIER_KEY, point)) != null)
+               return true;
          }
          key = key.getParent();
       }
@@ -102,6 +127,7 @@
       return false;
    }
    
+   
    /**
     * Adds the qualifiers for a context's bean metadata to the context's MDR metadata. 
     * 
@@ -109,40 +135,64 @@
     */
    public static void addQualifiersToMdr(KernelControllerContext context)
    {
-      Set<RelatedClassMetaData> qualifiers = context.getBeanMetaData().getRelated();
-      
-      if (qualifiers != null && qualifiers.size() > 0)
+      try
       {
-         MetaDataRetrieval retrieval = context.getKernel().getMetaDataRepository().getMetaDataRepository().getMetaDataRetrieval(context.getScopeInfo().getMutableScope());
-         if (retrieval instanceof MutableMetaData == false)
+         Set<RelatedClassMetaData> qualifiers = context.getBeanMetaData().getRelated();
+         
+         if (qualifiers != null && qualifiers.size() > 0)
          {
-            log.warn("Can not add qualifier to non mutable metadata" + context +  ":" + retrieval);
-            return;
+            MetaDataRetrieval retrieval = context.getKernel().getMetaDataRepository().getMetaDataRepository().getMetaDataRetrieval(context.getScopeInfo().getMutableScope());
+            if (retrieval instanceof MutableMetaData == false)
+            {
+               log.warn("Can not add qualifier to non mutable metadata" + context +  ":" + retrieval);
+               return;
+            }
+   
+            Set<RelatedClassMetaData> suppliedMetaData = new HashSet<RelatedClassMetaData>();
+            Set<RelatedClassMetaData> requiredMetaData = new HashSet<RelatedClassMetaData>();
+            Set<RelatedClassMetaData> optionalMetaData = new HashSet<RelatedClassMetaData>();
+   
+            splitRelatedClassMetaData(qualifiers, suppliedMetaData, requiredMetaData, optionalMetaData);
+            
+            for (RelatedClassMetaData rcmd : qualifiers)
+            {
+               if (JBossObject.equals(SUPPLIED_QUALIFIER_KEY, rcmd.getClassName()))
+                  SUPPLIED_MDR.addQualifiersToSetInMdr(suppliedMetaData, rcmd.getClassName(), retrieval);
+               else if (JBossObject.equals(REQUIRED_QUALIFIER_KEY, rcmd.getClassName()))
+                  WANTED_MDR.addQualifiersToSetInMdr(requiredMetaData, rcmd.getClassName(), retrieval);
+               else if (JBossObject.equals(OPTIONAL_QUALIFIER_KEY, rcmd.getClassName()))
+                  WANTED_MDR.addQualifiersToSetInMdr(optionalMetaData, rcmd.getClassName(), retrieval);
+            }
          }
-
-         Set<Object> suppliedSet = null;
-         Set<Object> requiredSet = null;
-         Set<Object> optionalSet = null;
-         for (RelatedClassMetaData rcmd : qualifiers)
-         {
-            if (JBossObject.equals(SUPPLIED_QUALIFIER_KEY, rcmd.getClassName()))
-               suppliedSet = addQualifiersToSet(suppliedSet, SUPPLIED_QUALIFIER_KEY, retrieval, rcmd);
-            else if (JBossObject.equals(REQUIRED_QUALIFIER_KEY, rcmd.getClassName()))
-               requiredSet = addQualifiersToSet(requiredSet, REQUIRED_QUALIFIER_KEY, retrieval, rcmd);
-            else if (JBossObject.equals(OPTIONAL_QUALIFIER_KEY, rcmd.getClassName()))
-               optionalSet = addQualifiersToSet(optionalSet, OPTIONAL_QUALIFIER_KEY, retrieval, rcmd);
-         }
       }
+      catch(Exception e)
+      {
+         e.printStackTrace();
+      }
    }
-   
-   private static Set<Object> addQualifiersToSet(Set<Object> qualifiers, String key, MetaDataRetrieval retrieval, RelatedClassMetaData rcmd)
+
+   /**
+    * Add qualifiers to a MDR metadata retrieval
+    * 
+    * @param retrieval the retrieval to add the data to. If it is not an instance of MutableMetaDataRetrieval no qualifiers will be added, but no error will be thrown
+    * @param type the type of qualifier to add
+    * @param point the injection point type to add this qualifier to. If it is null, it is added for constructors, fields and properties
+    * @param qualifiers the qualfiers to add to the retrieval
+    */
+   public static void addQualifiersToMdrRetrieval(MetaDataRetrieval retrieval, QualifierType type, QualifierPoint point, Set<Object> qualifiers)
    {
-      if (qualifiers == null)
-         qualifiers = getQualifiersSet(retrieval, key, true); 
-      for (Object qualifier : rcmd.getEnabled())
-         qualifiers.add(qualifier);
-      
-      return qualifiers;
+      switch (type)
+      {
+         case SUPPLIED:
+            SUPPLIED_MDR.addQualifiersToMdrRetrieval(retrieval, type, point, qualifiers);
+            break;
+         case REQUIRED:
+         case OPTIONAL:
+            WANTED_MDR.addQualifiersToMdrRetrieval(retrieval, type, point, qualifiers);
+            break;
+         default:
+            throw new IllegalArgumentException("Unhandled type " + type);
+      }
    }
    
    /**
@@ -163,31 +213,21 @@
             return;
          }
          
-         Set<Object> suppliedSet = getQualifiersSet(retrieval, SUPPLIED_QUALIFIER_KEY, false);
-         Set<Object> requiredSet = getQualifiersSet(retrieval, REQUIRED_QUALIFIER_KEY, false);
-         Set<Object> optionalSet = getQualifiersSet(retrieval, OPTIONAL_QUALIFIER_KEY, false);
+         Set<RelatedClassMetaData> suppliedMetaData = new HashSet<RelatedClassMetaData>();
+         Set<RelatedClassMetaData> requiredMetaData = new HashSet<RelatedClassMetaData>();
+         Set<RelatedClassMetaData> optionalMetaData = new HashSet<RelatedClassMetaData>();
+
+         splitRelatedClassMetaData(qualifiers, suppliedMetaData, requiredMetaData, optionalMetaData);
+
          for (RelatedClassMetaData rcmd : qualifiers)
          {
-            Set<Object> targetSet = null;
-            if (rcmd.getClassName().equals(SUPPLIED_QUALIFIER_KEY) && suppliedSet != null)
-               targetSet = suppliedSet;
-            else if (rcmd.getClassName().equals(REQUIRED_QUALIFIER_KEY) && requiredSet != null)
-               targetSet = requiredSet;
-            else if (rcmd.getClassName().equals(OPTIONAL_QUALIFIER_KEY) && optionalSet != null)
-               targetSet = optionalSet;
-            
-            if (targetSet != null)
-            {
-               for (Object qualifier : rcmd.getEnabled())
-                  targetSet.remove(qualifier);
-            }
+            if (JBossObject.equals(SUPPLIED_QUALIFIER_KEY, rcmd.getClassName()))
+               SUPPLIED_MDR.removeQualifiersFromSetInMdr(suppliedMetaData, rcmd.getClassName(), retrieval);
+            else if (JBossObject.equals(REQUIRED_QUALIFIER_KEY, rcmd.getClassName()))
+                  WANTED_MDR.removeQualifiersFromSetInMdr(requiredMetaData, rcmd.getClassName(), retrieval);
+            else if (JBossObject.equals(OPTIONAL_QUALIFIER_KEY, rcmd.getClassName()))
+               WANTED_MDR.removeQualifiersFromSetInMdr(optionalMetaData, rcmd.getClassName(), retrieval);
          }
-         if (suppliedSet != null && suppliedSet.size() == 0)
-            ((MutableMetaData)retrieval).removeMetaData(SUPPLIED_QUALIFIER_KEY, Set.class);
-         if (requiredSet != null && requiredSet.size() == 0)
-            ((MutableMetaData)retrieval).removeMetaData(REQUIRED_QUALIFIER_KEY, Set.class);
-         if (optionalSet != null && optionalSet.size() == 0)
-            ((MutableMetaData)retrieval).removeMetaData(OPTIONAL_QUALIFIER_KEY, Set.class);
       }
    }
    
@@ -200,7 +240,7 @@
     */
    public static Set<Object> mergeSuppliedQualifiersFromMdr(ControllerContext context)
    {
-      return mergeQualifiersFromMdr(context, SUPPLIED_QUALIFIER_KEY);
+      return SUPPLIED_MDR.mergeQualifiersFromMdr(context, QualifierType.SUPPLIED, null);
    }
    
    /**
@@ -210,9 +250,9 @@
     * @param context the context 
     * @return the found qualifiers
     */
-   public static Set<Object> mergeRequiredQualifiersFromMdr(ControllerContext context)
+   public static Set<Object> mergeRequiredQualifiersFromMdr(ControllerContext context, QualifierPoint point)
    {
-      return mergeQualifiersFromMdr(context, REQUIRED_QUALIFIER_KEY);
+      return WANTED_MDR.mergeQualifiersFromMdr(context, QualifierType.REQUIRED, point);
    }
    
    /**
@@ -222,64 +262,331 @@
     * @param context the context 
     * @return the found qualifiers
     */
-   public static Set<Object> mergeOptionalQualifiersFromMdr(ControllerContext context)
+   public static Set<Object> mergeOptionalQualifiersFromMdr(ControllerContext context, QualifierPoint point)
    {
-      return mergeQualifiersFromMdr(context, OPTIONAL_QUALIFIER_KEY);
+      return WANTED_MDR.mergeQualifiersFromMdr(context, QualifierType.OPTIONAL, point);
    }
+
+   /**
+    * Get an MDR key for the supplied type and the type of injection point
+    * 
+    * @param type the type
+    * @param point the point
+    * @return the key
+    */
+   public static String getKey(QualifierType type, QualifierPoint point)
+   {
+      switch (type)
+      {
+         case OPTIONAL :
+         case REQUIRED :
+            return WANTED_MDR.getKey(type, point);
+         case SUPPLIED :
+            return SUPPLIED_MDR.getKey(type, point);
+         default:
+            throw new IllegalArgumentException("Unhandled type " + type);
+      }
+   }
    
-   private static Set<Object> mergeQualifiersFromMdr(ControllerContext context, String key)
+   private static void splitRelatedClassMetaData(Set<RelatedClassMetaData> related, Set<RelatedClassMetaData> suppliedMetaData, Set<RelatedClassMetaData> requiredMetaData, Set<RelatedClassMetaData> optionalMetaData)
    {
-      if (context instanceof KernelControllerContext == false)
-         return null;
+      for (RelatedClassMetaData rcmd : related)
+      {
+         if (JBossObject.equals(SUPPLIED_QUALIFIER_KEY, rcmd.getClassName()))
+            suppliedMetaData.add(rcmd);
+         else if (JBossObject.equals(REQUIRED_QUALIFIER_KEY, rcmd.getClassName()))
+            requiredMetaData.add(rcmd);
+         else if (JBossObject.equals(OPTIONAL_QUALIFIER_KEY, rcmd.getClassName()))
+            optionalMetaData.add(rcmd);
+      }
+   }        
+   
+   private static abstract class MDRStrategy
+   {
+      abstract void addQualifiersToSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval);
+
+      abstract void addQualifiersToMdrRetrieval(MetaDataRetrieval retrieval, QualifierType type, QualifierPoint point, Set<Object> qualifiers);
+
+      abstract void removeQualifiersFromSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval);
       
-      MutableMetaDataRepository repository = ((KernelControllerContext)context).getKernel().getMetaDataRepository().getMetaDataRepository();
-      ScopeKey scope = context.getScopeInfo().getScope();
+      abstract Set<Object> mergeQualifiersFromMdr(ControllerContext context, QualifierType type, QualifierPoint point);
+      
+      abstract String getKey(String className, QualifierPoint point);
 
-      Set<Object> set = null;
-      while (scope != null)
+      abstract String getKey(QualifierType type, QualifierPoint point);
+
+      Set<Object> addQualifiersToSetInMdr(Set<Object> qualifierSet, MetaDataRetrieval retrieval, Set<Object> qualifiersToAdd, String key)
       {
-         MetaData metaData = repository.getMetaData(scope);
-         if (metaData != null)
+         if (qualifierSet == null)
+            qualifierSet = getQualifiersSetInMdr(retrieval, key, true); 
+         for (Object qualifier : qualifiersToAdd)
+            qualifierSet.add(qualifier);
+         
+         return qualifierSet;
+      }
+      
+      Set<Object> mergeQualifiersFromMdr(ControllerContext context, String key)
+      {
+         if (context instanceof KernelControllerContext == false)
+            return null;
+         
+         MutableMetaDataRepository repository = ((KernelControllerContext)context).getKernel().getMetaDataRepository().getMetaDataRepository();
+         ScopeKey scope = context.getScopeInfo().getScope();
+
+         Set<Object> set = null;
+         while (scope != null)
          {
-            Set<Object> entry = metaData.getMetaData(key, Set.class);
-            if (entry != null)
+            MetaData metaData = repository.getMetaData(scope);
+            if (metaData != null)
             {
-               if (set == null)
-                  set = entry;
-               else
+               Set<Object> entry = metaData.getMetaData(key, Set.class);
+               if (entry != null)
                {
-                  set = new HashSet<Object>(set);
-                  set.addAll(entry);
+                  if (set == null)
+                     set = entry;
+                  else
+                  {
+                     set = new HashSet<Object>(set);
+                     set.addAll(entry);
+                  }
                }
+            }         
+            scope = scope.getParent();
+         }
+         return set;
+      }
+
+      void removeEmptyQualifiersSetFromMdr(Set<Object> set, String keyRoot, MetaDataRetrieval retrieval, QualifierPoint point)
+      {
+         if (set != null && set.size() == 0)
+            ((MutableMetaData)retrieval).removeMetaData(getKey(keyRoot, point), Set.class);
+      }
+      
+      String typeToKeyRoot(QualifierType type)
+      {
+         switch (type)
+         {
+            case OPTIONAL:
+               return OPTIONAL_QUALIFIER_KEY;
+            case REQUIRED:
+               return REQUIRED_QUALIFIER_KEY;
+            case SUPPLIED:
+               return SUPPLIED_QUALIFIER_KEY;
+            default:
+               throw new IllegalArgumentException("Unhandled type " + type);
+         }
+      }
+      
+      Set<Object> getQualifiersSetInMdr(MetaDataRetrieval retrieval, String key, boolean create)
+      {
+         MetaDataItem<?> item = retrieval.retrieveMetaData(key);
+         //TODO - The following is not threadsafe
+         Set<Object> set = null;
+         if (item == null)
+         {
+            if (create)
+            {
+               set = new ConcurrentSet<Object>();
+               ((MutableMetaData)retrieval).addMetaData(key, set, Set.class);
             }
+            else
+            {
+               return null;
+            }
+         }
+         else
+         {
+            set = (Set<Object>)item.getValue();
+         }
+         return set;
+      }
+   }
+   
+   private static class SuppliedMDRStrategy extends MDRStrategy
+   {
+      @Override
+      void addQualifiersToSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval)
+      {
+         if (keyRoot.equals(SUPPLIED_QUALIFIER_KEY) == false)
+            throw new IllegalArgumentException("Wrong key " + keyRoot);
+         Set<Object> set = null;
+         for (RelatedClassMetaData rcmd : relateds)
+         {
+            set = addQualifiersToSetInMdr(set, retrieval, rcmd.getEnabled(), keyRoot);
          }         
-         scope = scope.getParent();
       }
-      return set;
+
+      @Override
+      void addQualifiersToMdrRetrieval(MetaDataRetrieval retrieval, QualifierType type, QualifierPoint point, Set<Object> qualifiers)
+      {
+         if (type != QualifierType.SUPPLIED)
+            throw new IllegalArgumentException("Wrong type " + type);
+         if (point != null)
+            throw new IllegalArgumentException("Injection poing passed in for supplied qualifier");
+
+         addQualifiersToSetInMdr(null, retrieval, qualifiers, SUPPLIED_QUALIFIER_KEY);
+      }
+      
+      @Override
+      void removeQualifiersFromSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval)
+      {
+         if (relateds == null || relateds.size() == 0)
+            return;
+         
+         if (keyRoot.equals(keyRoot) == false)
+            throw new IllegalArgumentException("Wrong key " + keyRoot);
+         
+         Set<Object> set = getQualifiersSetInMdr(retrieval, keyRoot, false);
+         if (set != null)
+         {
+            for (RelatedClassMetaData rcmd : relateds)
+            {
+               if (rcmd.getEnabled() != null && rcmd.getEnabled().size() > 0)
+               {
+                  set.removeAll(rcmd.getEnabled());
+               }
+            }
+         }
+         removeEmptyQualifiersSetFromMdr(set, keyRoot, retrieval, null);
+      }
+      
+      @Override
+      Set<Object> mergeQualifiersFromMdr(ControllerContext context, QualifierType type, QualifierPoint point)
+      {
+         return super.mergeQualifiersFromMdr(context, typeToKeyRoot(type));
+      }
+
+      @Override
+      public String getKey(QualifierType type, QualifierPoint point)
+      {
+         return typeToKeyRoot(type);
+      }
+
+      @Override
+      String getKey(String className, QualifierPoint point)
+      {
+         return className;
+      }
    }
-
-   private static Set<Object> getQualifiersSet(MetaDataRetrieval retrieval, String key, boolean create)
+   
+   private static class WantedMDRStrategy extends MDRStrategy
    {
-      MetaDataItem<?> item = retrieval.retrieveMetaData(key);
-      //TODO - The following is not threadsafe
-      Set<Object> set = null;
-      if (item == null)
+      @Override
+      void addQualifiersToSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval)
       {
-         if (create)
+         Set<Object> constructorSet = null;
+         Set<Object> methodSet = null;
+         Set<Object> propertySet = null;
+         for (RelatedClassMetaData rcmd : relateds)
          {
-            set = new ConcurrentSet<Object>();
-            ((MutableMetaData)retrieval).addMetaData(key, set, Set.class);
+            if (rcmd instanceof AbstractBeanQualifierMetaData)
+            {
+               AbstractBeanQualifierMetaData aqmd = (AbstractBeanQualifierMetaData)rcmd;
+               if (aqmd.getPoints() != null && aqmd.getPoints().size() > 0)
+               {
+                  constructorSet = addQualifiersToSetInMdrIfHasCorrectType(constructorSet, retrieval, aqmd, QualifierPoint.CONSTRUCTOR);
+                  methodSet = addQualifiersToSetInMdrIfHasCorrectType(methodSet, retrieval, aqmd, QualifierPoint.METHOD);
+                  propertySet = addQualifiersToSetInMdrIfHasCorrectType(propertySet, retrieval, aqmd, QualifierPoint.PROPERTY);
+                  continue;
+               }
+            }
+
+            constructorSet = addQualifiersToSetInMdr(constructorSet, retrieval, rcmd, QualifierPoint.CONSTRUCTOR);
+            methodSet = addQualifiersToSetInMdr(methodSet, retrieval, rcmd, QualifierPoint.METHOD);
+            propertySet = addQualifiersToSetInMdr(propertySet, retrieval, rcmd, QualifierPoint.PROPERTY);
          }
+      }
+
+      private Set<Object> addQualifiersToSetInMdrIfHasCorrectType(Set<Object> qualifierSet, MetaDataRetrieval retrieval, AbstractBeanQualifierMetaData aqmd, QualifierPoint point)
+      {
+         
+         if (aqmd.getPoints().contains(point))
+            return addQualifiersToSetInMdr(qualifierSet, retrieval, aqmd, point);
+         return qualifierSet;
+      }
+
+      private Set<Object> addQualifiersToSetInMdr(Set<Object> qualifierSet, MetaDataRetrieval retrieval, RelatedClassMetaData rcmd, QualifierPoint point)
+      {
+         return addQualifiersToSetInMdr(qualifierSet, retrieval, rcmd.getEnabled(), getKey(rcmd.getClassName(), point));
+      }
+      
+      @Override
+      void addQualifiersToMdrRetrieval(MetaDataRetrieval retrieval, QualifierType type, QualifierPoint point, Set<Object> qualifiers)
+      {
+         if (point == null)
+         {
+            addQualifiersToSetInMdr(null, retrieval, qualifiers, getKey(type, QualifierPoint.CONSTRUCTOR));
+            addQualifiersToSetInMdr(null, retrieval, qualifiers, getKey(type, QualifierPoint.METHOD));
+            addQualifiersToSetInMdr(null, retrieval, qualifiers, getKey(type, QualifierPoint.PROPERTY ));
+         }
          else
          {
-            return null;
+            addQualifiersToSetInMdr(null, retrieval, qualifiers, getKey(type, point));
          }
       }
-      else
+
+      @Override
+      void removeQualifiersFromSetInMdr(Set<RelatedClassMetaData> relateds, String keyRoot, MetaDataRetrieval retrieval)
       {
-         set = (Set<Object>)item.getValue();
+         if (relateds == null || relateds.size() == 0)
+            return;
+         
+         Set<Object> constructorSet = getQualifiersSetInMdr(retrieval, getKey(keyRoot, QualifierPoint.CONSTRUCTOR), false);
+         Set<Object> methodSet = getQualifiersSetInMdr(retrieval, getKey(keyRoot, QualifierPoint.METHOD), false);
+         Set<Object> propertySet = getQualifiersSetInMdr(retrieval, getKey(keyRoot, QualifierPoint.PROPERTY), false);
+         for (RelatedClassMetaData rcmd : relateds)
+         {
+            if (rcmd.getEnabled() != null && rcmd.getEnabled().size() > 0)
+            {
+               if (rcmd instanceof AbstractBeanQualifierMetaData)
+               {
+                  AbstractBeanQualifierMetaData aqmd = (AbstractBeanQualifierMetaData)rcmd;
+                  if (aqmd.getPoints() != null && aqmd.getPoints().size() > 0)
+                  {
+                     if (aqmd.getPoints().contains(QualifierPoint.CONSTRUCTOR) && constructorSet != null)
+                        constructorSet.removeAll(aqmd.getEnabled());
+                     else if (aqmd.getPoints().contains(QualifierPoint.METHOD) && methodSet != null)
+                        methodSet.removeAll(aqmd.getEnabled());
+                     else if (aqmd.getPoints().contains(QualifierPoint.PROPERTY) && propertySet != null)
+                        propertySet.removeAll(aqmd.getEnabled());
+                  }
+               }
+            }
+         }
+         removeEmptyQualifiersSetFromMdr(constructorSet, keyRoot, retrieval, QualifierPoint.CONSTRUCTOR);
+         removeEmptyQualifiersSetFromMdr(methodSet, keyRoot, retrieval, QualifierPoint.METHOD);
+         removeEmptyQualifiersSetFromMdr(propertySet, keyRoot, retrieval, QualifierPoint.PROPERTY);
       }
-      return set;
+
+      @Override
+      Set<Object> mergeQualifiersFromMdr(ControllerContext context, QualifierType type, QualifierPoint point)
+      {
+         return super.mergeQualifiersFromMdr(context, getKey(typeToKeyRoot(type), point));
+      }
+
+      @Override
+      public String getKey(QualifierType type, QualifierPoint point)
+      {
+         return getKey(typeToKeyRoot(type), point);
+      }
+      
+      String getKey(String className, QualifierPoint point)
+      {
+         if (point == null)
+            throw new IllegalArgumentException("Null point for required/optional qualifier");
+       
+         switch (point)
+         {
+            case CONSTRUCTOR :
+               return className + CONSTRUCTOR_SUFFIX;
+            case METHOD :
+               return className + METHOD_SUFFIX;
+            case PROPERTY :
+               return className + PROPERTY_SUFFIX;
+            default :
+               throw new IllegalArgumentException("Unknown point " + point);
+         }
+    }
+
    }
-   
 }

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -25,7 +25,10 @@
 import java.util.Set;
 
 import junit.framework.Test;
+
+import org.jboss.beans.metadata.api.model.QualifierPoint;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractBeanQualifierMetaData;
 import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
 import org.jboss.beans.metadata.spi.ConstructorMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
@@ -149,7 +152,38 @@
       {
       }
    }
+
+   public void testBeanQualifierWithSinglePoint() throws Exception
+   {
+      RelatedClassMetaData related = getRelated("QualifierBeanWithSinglePoint.xml");
+      assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      Set<Object> enabled = related.getEnabled();
+      assertNotNull(enabled);
+      assertEquals(1, enabled.size());
+      assertEquals("123", enabled.iterator().next());
+      
+      assertInstanceOf(related, AbstractBeanQualifierMetaData.class);
+      assertNotNull(((AbstractBeanQualifierMetaData)related).getPoints());
+      assertEquals(1, ((AbstractBeanQualifierMetaData)related).getPoints().size());
+      assertTrue(((AbstractBeanQualifierMetaData)related).getPoints().contains(QualifierPoint.METHOD));
+   }
    
+   public void testBeanQualifierWithPoints() throws Exception
+   {
+      RelatedClassMetaData related = getRelated("QualifierBeanWithPoints.xml");
+      assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      Set<Object> enabled = related.getEnabled();
+      assertNotNull(enabled);
+      assertEquals(1, enabled.size());
+      assertEquals("123", enabled.iterator().next());
+
+      assertInstanceOf(related, AbstractBeanQualifierMetaData.class);
+      assertNotNull(((AbstractBeanQualifierMetaData)related).getPoints());
+      assertEquals(2, ((AbstractBeanQualifierMetaData)related).getPoints().size());
+      assertTrue(((AbstractBeanQualifierMetaData)related).getPoints().contains(QualifierPoint.CONSTRUCTOR));
+      assertTrue(((AbstractBeanQualifierMetaData)related).getPoints().contains(QualifierPoint.PROPERTY));
+}
+   
    public void testInjectPropertyQualifierWithEnableds() throws Exception
    {
       AbstractBeanMetaData bean = unmarshalBean("QualifierPropertyInjectWithEnableds.xml");

Added: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/support/TargetAllBean.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/support/TargetAllBean.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/support/TargetAllBean.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,66 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, 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.qualifiers.support;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class TargetAllBean
+{
+   private Bean constructorBean;
+   
+   private Bean fieldBean;
+   
+   private Bean methodBean;
+
+   public TargetAllBean(Bean bean)
+   {
+      constructorBean = bean;
+   }
+   
+   public Bean getConstructorBean()
+   {
+      return constructorBean;
+   }
+
+   public Bean getFieldBean()
+   {
+      return fieldBean;
+   }
+
+   public void setFieldBean(Bean fieldBean)
+   {
+      this.fieldBean = fieldBean;
+   }
+
+   public Bean getMethodBean()
+   {
+      return methodBean;
+   }
+
+   public void installBean(Bean methodBean)
+   {
+      this.methodBean = methodBean;
+   }
+}

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/BeanQualifiersTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/BeanQualifiersTestCase.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/BeanQualifiersTestCase.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -21,12 +21,16 @@
 */ 
 package org.jboss.test.kernel.qualifiers.test;
 
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 import junit.framework.Test;
 
 import org.jboss.beans.metadata.api.model.AutowireType;
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.kernel.plugins.dependency.QualifiersMdrUtil;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -59,9 +63,9 @@
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("supplied1", "supplied2");
-      bean2Builder.addRequiredQualifiers("required1");
-      bean2Builder.addOptionalQualifiers("optional1", "optional2", "optional3");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "supplied1", "supplied2");
+      bean2Builder.addQualifiers(QualifierType.REQUIRED, "required1");
+      bean2Builder.addQualifiers(QualifierType.OPTIONAL, "optional1", "optional2", "optional3");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       try
@@ -72,10 +76,10 @@
          Set<Object> set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean1Context);         
          assertNull(set);
        
-         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context);         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
          assertNull(set);
          
-         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context);
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.METHOD);
          assertNull(set);
 
          set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean2Context);         
@@ -84,12 +88,12 @@
          assertTrue(set.contains("supplied2"));
          assertEquals(2, set.size());
          
-         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context);         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context, QualifierPoint.CONSTRUCTOR);         
          assertNotNull(set);
          assertTrue(set.contains("required1"));
          assertEquals(1, set.size());
          
-         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context);
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);
          assertNotNull(set);
          assertTrue(set.contains("optional1"));
          assertTrue(set.contains("optional2"));
@@ -106,18 +110,19 @@
    public void testContextsMDRHasQualifiersFromAllLevels() throws Throwable
    {
       MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
-      loader.addMetaData(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, Collections.singleton("supplied1"), Set.class);
-      loader.addMetaData(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, Collections.singleton("wanted1"), Set.class);
-      loader.addMetaData(QualifiersMdrUtil.OPTIONAL_QUALIFIER_KEY, Collections.singleton("optional1"), Set.class);
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.SUPPLIED, null, new HashSet<Object>(Collections.singleton("supplied1")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, null, new HashSet<Object>(Collections.singleton("wanted1")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, null, new HashSet<Object>(Collections.singleton("optional1")));
+      
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("supplied2");
-      bean2Builder.addRequiredQualifiers("wanted2");
-      bean2Builder.addOptionalQualifiers("optional2");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "supplied2");
+      bean2Builder.addQualifiers(QualifierType.REQUIRED, "wanted2");
+      bean2Builder.addQualifiers(QualifierType.OPTIONAL, "optional2");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       try
@@ -129,12 +134,12 @@
          assertTrue(set.contains("supplied1"));
          assertEquals(1, set.size());
 
-         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context);         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
          assertTrue(set.contains("wanted1"));
          assertEquals(1, set.size());
 
-         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context);         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
          assertTrue(set.contains("optional1"));
          assertEquals(1, set.size());
@@ -146,13 +151,13 @@
          assertEquals(2, set.size());
          
          
-         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context);         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
          assertTrue(set.contains("wanted1"));
          assertTrue(set.contains("wanted2"));
          assertEquals(2, set.size());
 
-         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context);         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
          assertTrue(set.contains("optional1"));
          assertTrue(set.contains("optional2"));
@@ -166,10 +171,140 @@
       }
    }
    
+   public void testMdrQualifierPoints() throws Exception
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.CONSTRUCTOR}), "rc");
+      bean1Builder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.METHOD}), "rm");
+      bean1Builder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY}), "rp");
+      bean1Builder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY, QualifierPoint.METHOD, QualifierPoint.CONSTRUCTOR}), "rcmp");
+      bean1Builder.addQualifiers(QualifierType.REQUIRED, "ra");
+      
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.CONSTRUCTOR}), "oc");
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.METHOD}), "om");
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY}), "op");
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY, QualifierPoint.METHOD, QualifierPoint.CONSTRUCTOR}), "ocmp");
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, "oa");
+      
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+      try
+      {
+         assertBean("bean1", Bean.class);
+         Set<Object> set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.CONSTRUCTOR);         
+         assertNotNull(set);
+         assertTrue(set.contains("rc"));
+         assertTrue(set.contains("rcmp"));
+         assertTrue(set.contains("ra"));
+         assertEquals(3, set.size());
+
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.METHOD);         
+         assertNotNull(set);
+         assertTrue(set.contains("rm"));
+         assertTrue(set.contains("rcmp"));
+         assertTrue(set.contains("ra"));
+         assertEquals(3, set.size());
+         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
+         assertNotNull(set);
+         assertTrue(set.contains("rp"));
+         assertTrue(set.contains("rcmp"));
+         assertTrue(set.contains("ra"));
+         assertEquals(3, set.size());
+         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.CONSTRUCTOR);         
+         assertNotNull(set);
+         assertTrue(set.contains("oc"));
+         assertTrue(set.contains("ocmp"));
+         assertTrue(set.contains("oa"));
+         assertEquals(3, set.size());
+
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.METHOD);         
+         assertNotNull(set);
+         assertTrue(set.contains("om"));
+         assertTrue(set.contains("ocmp"));
+         assertTrue(set.contains("oa"));
+         assertEquals(3, set.size());
+         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
+         assertNotNull(set);
+         assertTrue(set.contains("op"));
+         assertTrue(set.contains("ocmp"));
+         assertTrue(set.contains("oa"));
+         assertEquals(3, set.size());
+      }
+      finally
+      {
+         undeploy(bean1Context);
+      }
+   }
+   
+   public void testMdrQualifierPointsFromHigherLevel() throws Exception
+   {
+      MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, QualifierPoint.CONSTRUCTOR, new HashSet<Object>(Collections.singleton("rc")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, QualifierPoint.METHOD, new HashSet<Object>(Collections.singleton("rm")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, QualifierPoint.PROPERTY, new HashSet<Object>(Collections.singleton("rp")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, null, new HashSet<Object>(Collections.singleton("ra")));
+
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, QualifierPoint.CONSTRUCTOR, new HashSet<Object>(Collections.singleton("oc")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, QualifierPoint.METHOD, new HashSet<Object>(Collections.singleton("om")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, QualifierPoint.PROPERTY, new HashSet<Object>(Collections.singleton("op")));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, null, new HashSet<Object>(Collections.singleton("oa")));
+      
+      getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
+      
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+      try
+      {
+         assertBean("bean1", Bean.class);
+         Set<Object> set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.CONSTRUCTOR);         
+         assertNotNull(set);
+         assertTrue(set.contains("rc"));
+         assertTrue(set.contains("ra"));
+         assertEquals(2, set.size());
+
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.METHOD);         
+         assertNotNull(set);
+         assertTrue(set.contains("rm"));
+         assertTrue(set.contains("ra"));
+         assertEquals(2, set.size());
+         
+         set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
+         assertNotNull(set);
+         assertTrue(set.contains("rp"));
+         assertTrue(set.contains("ra"));
+         assertEquals(2, set.size());
+         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.CONSTRUCTOR);         
+         assertNotNull(set);
+         assertTrue(set.contains("oc"));
+         assertTrue(set.contains("oa"));
+         assertEquals(2, set.size());
+
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.METHOD);         
+         assertNotNull(set);
+         assertTrue(set.contains("om"));
+         assertTrue(set.contains("oa"));
+         assertEquals(2, set.size());
+         
+         set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
+         assertNotNull(set);
+         assertTrue(set.contains("op"));
+         assertTrue(set.contains("oa"));
+         assertEquals(2, set.size());
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         getMetaDataRepository().getMetaDataRepository().removeMetaDataRetrieval(ScopeKey.DEFAULT_SCOPE);
+      }
+   }
+   
    public void testSimpleQualifier() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
@@ -177,7 +312,7 @@
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -198,16 +333,16 @@
    public void testAmbiguousQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -226,16 +361,16 @@
    public void testRequiredQualifiersNotIncludingAllBeanQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test", "other");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "other");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -257,12 +392,12 @@
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addOptionalQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -287,7 +422,7 @@
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addOptionalQualifiers("test", "mock");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "test", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -313,7 +448,7 @@
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addOptionalQualifiers("test", "mock");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "test", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -332,16 +467,16 @@
    public void testMoreRequiredQualifiersThanBeanQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test", "mock");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -360,16 +495,16 @@
    public void testMoreOptionalQualifiersThanBeanQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addOptionalQualifiers("test", "mock");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "test", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -390,17 +525,17 @@
    public void testRequiredQualifierNotMatchedOptionalMatched() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("mock");
-      targetBuilder.addOptionalQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "mock");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -419,17 +554,17 @@
    public void testRequiredQualifierMatchedOptionalNotMatched() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
-      targetBuilder.addOptionalQualifiers("mock");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -450,17 +585,17 @@
    public void testMoreOptionalQualifiersThanBeanQualifiersMostSelected() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test", "other", "another");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "other", "another");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test", "another");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test", "another");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
-      targetBuilder.addOptionalQualifiers("other", "another", "mock");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "other", "another", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -481,17 +616,17 @@
    public void testMoreOptionalQualifiersThanBeanQualifiersMostSelected2() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test", "other", "another");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test", "other", "another");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
-      targetBuilder.addOptionalQualifiers("other", "another", "mock");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "other", "another", "mock");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -512,16 +647,16 @@
    public void testMoreOptionalQualifiersThanBeanQualifiersAmbiguity() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      bean1Builder.addOptionalQualifiers("test", "other");
+      bean1Builder.addQualifiers(QualifierType.OPTIONAL, "test", "other");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -540,7 +675,7 @@
    public void testSuppliedQualifiersFromHigherLevel() throws Throwable
    {
       MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
-      loader.addMetaData(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, Collections.singleton("test"), Set.class);
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.SUPPLIED, null, new HashSet<Object>(Collections.singleton("test")));
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
@@ -548,7 +683,7 @@
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -568,20 +703,20 @@
    public void testSuppliedQualifiersFromHigherLevelAndInstance() throws Throwable
    {
       MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
-      loader.addMetaData(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, Collections.singleton("test"), Set.class);
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.SUPPLIED, null, new HashSet<Object>(Collections.singleton("test")));
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("other");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("else");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "else");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("test", "other");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "test", "other");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -607,7 +742,7 @@
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
@@ -635,16 +770,16 @@
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("other");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("else");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "else");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("other");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "other");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {
@@ -666,20 +801,20 @@
    public void testOptionalQualifiersFromHigherLevelResolvingInstanceAmbiguity() throws Throwable
    {
       MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
-      loader.addMetaData(QualifiersMdrUtil.OPTIONAL_QUALIFIER_KEY, Collections.singleton("test"), Set.class);
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, null, new HashSet<Object>(Collections.singleton("test")));
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("other", "test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "other", "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
       targetBuilder.setAutowireType(AutowireType.BY_CLASS);
-      targetBuilder.addRequiredQualifiers("other");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "other");
       KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
       try
       {

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/InjectionPointQualifiersTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/InjectionPointQualifiersTestCase.java	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/InjectionPointQualifiersTestCase.java	2009-12-01 16:53:20 UTC (rev 97247)
@@ -21,14 +21,19 @@
 */ 
 package org.jboss.test.kernel.qualifiers.test;
 
+import java.util.Arrays;
+
 import junit.framework.Test;
 
+import org.jboss.beans.metadata.api.model.QualifierPoint;
+import org.jboss.beans.metadata.api.model.QualifierType;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.test.kernel.junit.MicrocontainerTest;
 import org.jboss.test.kernel.qualifiers.support.Bean;
 import org.jboss.test.kernel.qualifiers.support.Target;
+import org.jboss.test.kernel.qualifiers.support.TargetAllBean;
 import org.jboss.test.kernel.qualifiers.support.TargetConstructorBean;
 import org.jboss.test.kernel.qualifiers.support.TargetMethodBean;
 import org.jboss.test.kernel.qualifiers.support.TargetPropertyBean;
@@ -68,7 +73,7 @@
    private <T extends Target> void testSimpleQualifiers(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
@@ -109,15 +114,15 @@
    private <T extends Target> void testNeedsAllQualifiers(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test1", "test2");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test2");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test1", "test3", "test2");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test3", "test2");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean3Builder = BeanMetaDataBuilder.createBuilder("bean3", Bean.class.getName());
-      bean3Builder.addSuppliedQualifiers("test2", "test3");
+      bean3Builder.addQualifiers(QualifierType.SUPPLIED, "test2", "test3");
       KernelControllerContext bean3Context = deploy(bean3Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(createTargetMetaData(type, "test1", "test2", "test3"));
@@ -157,11 +162,11 @@
    private <T extends Target> void testNoContextHasAllQualifiers(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(createTargetMetaData(type, "test", "other"));
@@ -197,11 +202,11 @@
    private <T extends Target> void testTwoContextsHaveAllRequiredQualifiers(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test1", "test2");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test2");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test1", "test2");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test2");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(createTargetMetaData(type, "test1", "test2"));
@@ -237,11 +242,11 @@
    private <T extends Target> void testTwoContextsHaveMoreThanRequiredQualifiers(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test1", "test2", "extra1");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test2", "extra1");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test1", "test2", "extra2");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test1", "test2", "extra2");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(createTargetMetaData(type, "test1", "test2"));
@@ -277,11 +282,11 @@
    private <T extends Target> void testBeanRequiredQualifiersNotIgnoredByDefault(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test", "notignored");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "notignored");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(addRequiredQualifiers(createTargetMetaData(type, "test"), "notignored"));
@@ -319,11 +324,11 @@
    private <T extends Target> void testBeanOptionalQualifiersNotIgnoredByDefault(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test", "notignored");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "notignored");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(addOptionalQualifiers(createTargetMetaData(type, "test"), "notignored"));
@@ -361,11 +366,11 @@
    private <T extends Target> void testBeanRequiredQualifiersIgnored(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("other");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "other");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(addRequiredQualifiers(createTargetMetaData(type, true, "test"), "ignored"));
@@ -403,11 +408,11 @@
    private <T extends Target> void testBeanOptionalQualifiersIgnored(Class<T> targetClass, TargetType type) throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
-      bean1Builder.addSuppliedQualifiers("test", "ignored");
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "ignored");
       KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
-      bean2Builder.addSuppliedQualifiers("test");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test");
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       KernelControllerContext targetContext = deploy(addOptionalQualifiers(createTargetMetaData(type, true, "test"), "ignored"));
@@ -426,18 +431,116 @@
          undeploy(targetContext);
       }
    }
+   
+   public void testRequiredQualifierPoints() throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "constructor");
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "method");
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder bean3Builder = BeanMetaDataBuilder.createBuilder("bean3", Bean.class.getName());
+      bean3Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "property");
+      KernelControllerContext bean3Context = deploy(bean3Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetAllBean.class.getName());
+      targetBuilder.addPropertyMetaData("fieldBean", targetBuilder.createContextualInject("test"));
+      targetBuilder.addConstructorParameter(Bean.class.getName(), targetBuilder.createContextualInject("test"));
+      targetBuilder.addInstall("installBean", Bean.class.getName(), targetBuilder.createContextualInject("test"));
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, "all");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.CONSTRUCTOR}), "constructor");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.METHOD}), "method");
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY}), "property");
+      KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
+      
+      try
+      {
+         Bean bean1 = assertBean("bean1", Bean.class);
+         Bean bean2 = assertBean("bean2", Bean.class);
+         Bean bean3 = assertBean("bean3", Bean.class);
+         
+         TargetAllBean target = assertBean("target", TargetAllBean.class);
+         assertNotNull(target.getConstructorBean());
+         assertEquals(bean1, target.getConstructorBean());
+         
+         assertNotNull(target.getMethodBean());
+         assertEquals(bean2, target.getMethodBean());
 
+         assertNotNull(target.getFieldBean());
+         assertEquals(bean3, target.getFieldBean());
+      }
+      finally
+      {
+         undeploy(targetContext);
+         undeploy(bean3Context);
+         undeploy(bean2Context);
+         undeploy(bean1Context);
+      }
+   }
+
+   public void testOptionalQualifierPoints() throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "constructor");
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "method");
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder bean3Builder = BeanMetaDataBuilder.createBuilder("bean3", Bean.class.getName());
+      bean3Builder.addQualifiers(QualifierType.SUPPLIED, "test", "all", "property");
+      KernelControllerContext bean3Context = deploy(bean3Builder.getBeanMetaData());
+      
+      BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetAllBean.class.getName());
+      targetBuilder.addPropertyMetaData("fieldBean", targetBuilder.createContextualInject("test"));
+      targetBuilder.addConstructorParameter(Bean.class.getName(), targetBuilder.createContextualInject("test"));
+      targetBuilder.addInstall("installBean", Bean.class.getName(), targetBuilder.createContextualInject("test"));
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, "all");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.CONSTRUCTOR}), "constructor");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.METHOD}), "method");
+      targetBuilder.addQualifiers(QualifierType.OPTIONAL, Arrays.asList(new QualifierPoint[] {QualifierPoint.PROPERTY}), "property");
+      KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
+      
+      try
+      {
+         Bean bean1 = assertBean("bean1", Bean.class);
+         Bean bean2 = assertBean("bean2", Bean.class);
+         Bean bean3 = assertBean("bean3", Bean.class);
+         
+         TargetAllBean target = assertBean("target", TargetAllBean.class);
+         assertNotNull(target.getConstructorBean());
+         assertEquals(bean1, target.getConstructorBean());
+         
+         assertNotNull(target.getMethodBean());
+         assertEquals(bean2, target.getMethodBean());
+
+         assertNotNull(target.getFieldBean());
+         assertEquals(bean3, target.getFieldBean());
+      }
+      finally
+      {
+         undeploy(targetContext);
+         undeploy(bean3Context);
+         undeploy(bean2Context);
+         undeploy(bean1Context);
+      }
+   }
+
    private BeanMetaData addRequiredQualifiers(BeanMetaData bmd, Object...qualifiers)
    {
       BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(bmd);
-      builder.addRequiredQualifiers(qualifiers);
+      builder.addQualifiers(QualifierType.REQUIRED, qualifiers);
       return builder.getBeanMetaData();
    }
 
    private BeanMetaData addOptionalQualifiers(BeanMetaData bmd, Object...qualifiers)
    {
       BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(bmd);
-      builder.addOptionalQualifiers(qualifiers);
+      builder.addQualifiers(QualifierType.OPTIONAL, qualifiers);
       return builder.getBeanMetaData();
    }
 

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithPoints.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithPoints.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithPoints.xml	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <qualifier type="Required" points="Property Constructor">123</qualifier>
+</bean>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithSinglePoint.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithSinglePoint.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanWithSinglePoint.xml	2009-12-01 16:53:20 UTC (rev 97247)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <qualifier type="Required" points="Method">123</qualifier>
+</bean>

Modified: projects/kernel/trunk/pom.xml
===================================================================
--- projects/kernel/trunk/pom.xml	2009-12-01 16:31:43 UTC (rev 97246)
+++ projects/kernel/trunk/pom.xml	2009-12-01 16:53:20 UTC (rev 97247)
@@ -37,7 +37,7 @@
     <version.jboss.common.core>2.2.16.GA</version.jboss.common.core>
     <version.jboss.logging.spi>2.1.0.GA</version.jboss.logging.spi>
     <version.jboss.logging.log4j>2.0.5.GA</version.jboss.logging.log4j>
-    <version.jbossxb>2.0.2.Beta3</version.jbossxb>
+    <version.jbossxb>2.0.2-SNAPSHOT</version.jbossxb>
     <version.jboss.man>2.1.1.GA</version.jboss.man>
     <version.jboss.vfs>2.1.3.SP1</version.jboss.vfs>
     <version.javassist>3.11.0.GA</version.javassist>




More information about the jboss-cvs-commits mailing list