[jboss-cvs] JBossAS SVN: r97900 - in projects/kernel/trunk/kernel/src: main/java/org/jboss/beans/metadata/plugins and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Dec 16 11:18:34 EST 2009


Author: kabir.khan at jboss.com
Date: 2009-12-16 11:18:34 -0500 (Wed, 16 Dec 2009)
New Revision: 97900

Added:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierContent.java
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanAnnotation.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanString.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierPropertyInjectAnnotation.xml
   projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase#testQualifierAnnotationContent.xml
Modified:
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.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/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase.java
Log:
[JBKERNEL-63] Make it possible to choose to parse qualifiers as annotations

Added: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierContent.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierContent.java	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/api/model/QualifierContent.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -0,0 +1,39 @@
+/*
+* 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.xb.annotations.JBossXmlEnum;
+
+/**
+ * How a qualifier should be parsed
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+ at JBossXmlEnum(ignoreCase=true)
+public enum QualifierContent 
+{
+   /** The qualifier is a simple string */
+   STRING,
+   /** The qualifier is an annotation */
+   ANNOTATION
+}

Modified: 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	2009-12-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractQualifierMetaData.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -21,10 +21,18 @@
 */ 
 package org.jboss.beans.metadata.plugins;
 
+import java.lang.annotation.Annotation;
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.xml.bind.annotation.XmlAttribute;
 
+import org.jboss.annotation.factory.AnnotationCreator;
+import org.jboss.beans.metadata.api.model.QualifierContent;
+
 /**
- * Abstract Qualifier MetaData.
+ * Abstract Qualifier MetaData. Qualifiers are used to narrow down what is injected
+ * when doing contextul injection (by bean type) 
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
@@ -33,6 +41,10 @@
 {
    private static final long serialVersionUID = 1L;
    
+   private volatile QualifierContent content = QualifierContent.STRING;
+   
+   private volatile Set<Object> annotations;
+   
    public AbstractQualifierMetaData()
    {
    }
@@ -49,4 +61,74 @@
       super.setClassName(classname);
    }
 
+   /**
+    * Get how the qualifier content should be parsed. The default is STRING
+    * 
+    * @return the content
+    */
+   public QualifierContent getContent()
+   {
+      return content;
+   }
+
+   /**
+    * Set how the qualifier content should be parsed. If not set, the default is STRING
+    * 
+    * @param content the content to set
+    */
+   @XmlAttribute(name="content")
+   public void setContent(QualifierContent content)
+   {
+      this.content = content;
+   }
+
+   @Override
+   public Set<Object> getEnabled()
+   {
+      return getEnabled((ClassLoader)null);
+   }
+
+   public Set<Object> getEnabled(ClassLoader cl)
+   {
+      if (content == QualifierContent.STRING)
+         return super.getEnabled();
+      
+      if (content == QualifierContent.ANNOTATION)
+      {
+         if (annotations == null)
+         {
+            Set<Object> anns = new HashSet<Object>();
+            for (Object enabled : super.getEnabled())
+            {
+               anns.add(parseAnnotation(cl, enabled));
+            }
+            annotations = anns;
+         }
+         return annotations;
+      }
+      
+      throw new IllegalStateException("Unknown content type " + content);
+   }
+   
+   private Annotation parseAnnotation(ClassLoader cl, Object enabled)
+   {
+      if (enabled instanceof Annotation)
+         return (Annotation)enabled;
+      if (enabled instanceof String == false)
+         throw new IllegalStateException(enabled + " is neither an annotation nor a string");
+         
+      String annString = (String)enabled;
+      try
+      {
+         if (cl == null) 
+         {
+            cl = Thread.currentThread().getContextClassLoader();
+         }
+         return (Annotation)AnnotationCreator.createAnnotation(annString, cl);
+      }
+      catch (Throwable e)
+      {
+         throw new RuntimeException("Error creating annotation for " + enabled, e);
+      }
+   }
 }

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-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifiersMdrUtil.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -518,7 +518,9 @@
          if (qualifierSet == null)
             qualifierSet = getQualifiersSetInMdr(retrieval, key, true); 
          for (Object qualifier : qualifiersToAdd)
+         {
             qualifierSet.add(qualifier);
+         }
          
          return qualifierSet;
       }

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-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/deployment/xml/test/QualifierTestCase.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -26,10 +26,13 @@
 
 import junit.framework.Test;
 
+import org.jboss.annotation.factory.AnnotationCreator;
+import org.jboss.beans.metadata.api.model.QualifierContent;
 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.plugins.AbstractQualifierMetaData;
 import org.jboss.beans.metadata.spi.ConstructorMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
@@ -80,11 +83,38 @@
    {
       RelatedClassMetaData related = getRelated("QualifierBeanWithEnabled.xml");
       assertEquals(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
       Set<Object> enabled = related.getEnabled();
       assertNotNull(enabled);
       assertEquals(1, enabled.size());
       assertEquals("aop", enabled.iterator().next());
    }
+   
+   public void testBeanStringQualifier() throws Exception
+   {
+      RelatedClassMetaData related = getRelated("QualifierBeanString.xml");
+      assertEquals(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
+      Set<Object> enabled = related.getEnabled();
+      assertNotNull(enabled);
+      assertEquals(1, enabled.size());
+      assertEquals("aop", enabled.iterator().next());
+   }
+   
+   public void testBeanAnnotationQualifier() throws Exception
+   {
+      RelatedClassMetaData related = getRelated("QualifierBeanAnnotation.xml");
+      assertEquals(QualifiersMdrUtil.SUPPLIED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.ANNOTATION, ((AbstractQualifierMetaData)related).getContent());
+      Set<Object> enabled = related.getEnabled();
+      assertNotNull(enabled);
+      assertEquals(1, enabled.size());
+      assertEquals(AnnotationCreator.createAnnotation("@java.lang.Override", Override.class), enabled.iterator().next());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+   }
 
    public void testBeanQualifierWithEnableds() throws Exception
    {
@@ -157,6 +187,8 @@
    {
       RelatedClassMetaData related = getRelated("QualifierBeanWithSinglePoint.xml");
       assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
       Set<Object> enabled = related.getEnabled();
       assertNotNull(enabled);
       assertEquals(1, enabled.size());
@@ -172,6 +204,8 @@
    {
       RelatedClassMetaData related = getRelated("QualifierBeanWithPoints.xml");
       assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
       Set<Object> enabled = related.getEnabled();
       assertNotNull(enabled);
       assertEquals(1, enabled.size());
@@ -197,6 +231,8 @@
             assertInstanceOf(valueMetaData, AbstractInjectionValueMetaData.class);
             RelatedClassMetaData related = checkRelated(((AbstractInjectionValueMetaData)valueMetaData).getQualifiers());
             assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+            assertInstanceOf(related, AbstractQualifierMetaData.class);
+            assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
             Set<Object> enabled = related.getEnabled();
             assertNotNull(enabled);
             assertEquals(2, enabled.size());
@@ -205,6 +241,30 @@
       assertTrue(found);
    }
    
+   public void testInjectPropertyAnnotationQualifier() throws Exception
+   {
+      AbstractBeanMetaData bean = unmarshalBean("QualifierPropertyInjectAnnotation.xml");
+      boolean found = false;
+      for (PropertyMetaData property : bean.getProperties())
+      {  
+         found = true;
+         if (property.getName().equals("test"))
+         {
+            ValueMetaData valueMetaData = property.getValue();
+            assertInstanceOf(valueMetaData, AbstractInjectionValueMetaData.class);
+            RelatedClassMetaData related = checkRelated(((AbstractInjectionValueMetaData)valueMetaData).getQualifiers());
+            assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+            assertInstanceOf(related, AbstractQualifierMetaData.class);
+            assertEquals(QualifierContent.ANNOTATION, ((AbstractQualifierMetaData)related).getContent());
+            Set<Object> enabled = related.getEnabled();
+            assertNotNull(enabled);
+            assertEquals(1, enabled.size());
+            assertEquals(AnnotationCreator.createAnnotation("@java.lang.Override", Override.class), enabled.iterator().next());
+        }
+      }
+      assertTrue(found);
+   }
+   
    public void testInjectConstructorParameterWithEnabled() throws Exception
    {
       AbstractBeanMetaData bean = unmarshalBean("QualifierConstructorParameterInjectWithEnabled.xml");
@@ -218,6 +278,8 @@
       assertInstanceOf(valueMetaData, AbstractInjectionValueMetaData.class);
       RelatedClassMetaData related = checkRelated(((AbstractInjectionValueMetaData)valueMetaData).getQualifiers());
       assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
       Set<Object> enabled = related.getEnabled();
       assertNotNull(enabled);
       assertEquals(1, enabled.size());
@@ -236,6 +298,8 @@
       assertInstanceOf(valueMetaData, AbstractInjectionValueMetaData.class);
       RelatedClassMetaData related = checkRelated(((AbstractInjectionValueMetaData)valueMetaData).getQualifiers());
       assertEquals(QualifiersMdrUtil.REQUIRED_QUALIFIER_KEY, related.getClassName());
+      assertInstanceOf(related, AbstractQualifierMetaData.class);
+      assertEquals(QualifierContent.STRING, ((AbstractQualifierMetaData)related).getContent());
       Set<Object> enabled = related.getEnabled();
       assertNotNull(enabled);
       assertEquals(1, enabled.size());

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-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/BeanQualifiersTestCase.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -21,15 +21,23 @@
 */ 
 package org.jboss.test.kernel.qualifiers.test;
 
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Documented;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
 
 import junit.framework.Test;
 
+import org.jboss.annotation.factory.AnnotationCreator;
 import org.jboss.beans.metadata.api.model.AutowireType;
+import org.jboss.beans.metadata.api.model.QualifierContent;
 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.AbstractBeanQualifierMetaData;
+import org.jboss.beans.metadata.spi.RelatedClassMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.kernel.plugins.dependency.QualifiersMdrUtil;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -63,8 +71,11 @@
 
       BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
       bean2Builder.addQualifiers(QualifierType.SUPPLIED, "supplied1", "supplied2");
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, getAnnotation(Override.class));
       bean2Builder.addQualifiers(QualifierType.REQUIRED, "required1");
+      bean2Builder.addQualifiers(QualifierType.REQUIRED, getAnnotation(Documented.class));
       bean2Builder.addQualifiers(QualifierType.OPTIONAL, "optional1", "optional2", "optional3");
+      bean2Builder.addQualifiers(QualifierType.OPTIONAL, getAnnotation(Deprecated.class));
       KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
 
       try
@@ -83,21 +94,24 @@
 
          set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean2Context);         
          assertNotNull(set);
+         assertEquals(3, set.size());
          assertTrue(set.contains("supplied1"));
          assertTrue(set.contains("supplied2"));
-         assertEquals(2, set.size());
+         assertTrue(set.contains(getAnnotation(Override.class)));
          
          set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context, QualifierPoint.CONSTRUCTOR);         
          assertNotNull(set);
+         assertEquals(2, set.size());
          assertTrue(set.contains("required1"));
-         assertEquals(1, set.size());
+         assertTrue(set.contains(getAnnotation(Documented.class)));
          
          set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);
          assertNotNull(set);
+         assertEquals(4, set.size());
          assertTrue(set.contains("optional1"));
          assertTrue(set.contains("optional2"));
          assertTrue(set.contains("optional3"));
-         assertEquals(3, set.size());
+         assertTrue(set.contains(getAnnotation(Deprecated.class)));
       }
       finally
       {
@@ -106,12 +120,50 @@
       }
    }
    
+   public void testContextsMDRHasQualifiersUsingAnnotationContentType() throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      AbstractBeanQualifierMetaData beanQualifier = new AbstractBeanQualifierMetaData();
+      beanQualifier.setType(QualifierType.SUPPLIED);
+      beanQualifier.setContent(QualifierContent.ANNOTATION);
+      Set<Object> enableds = new HashSet<Object>();
+      enableds.add("@" + Override.class.getName());
+      beanQualifier.setEnabled(enableds);
+      Set<RelatedClassMetaData> qualifiers = new HashSet<RelatedClassMetaData>();
+      qualifiers.add(beanQualifier);
+      ((AbstractBeanMetaData)bean2Builder.getBeanMetaData()).setRelated(qualifiers);
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+
+      try
+      {
+         assertBean("bean1", Bean.class);
+         assertBean("bean2", Bean.class);
+         
+         Set<Object> set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean1Context);         
+         assertNull(set);
+       
+      
+         set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean2Context);         
+         assertNotNull(set);
+         assertEquals(1, set.size());
+         assertTrue(set.contains(getAnnotation(Override.class)));
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         undeploy(bean2Context);
+      }
+   }
+   
    public void testContextsMDRHasQualifiersFromAllLevels() throws Throwable
    {
       MemoryMetaDataLoader loader = new MemoryMetaDataLoader(ScopeKey.DEFAULT_SCOPE);
-      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.SUPPLIED, null, "supplied1");
-      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, null, "wanted1");
-      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, null, "optional1");
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.SUPPLIED, null, "supplied1", getAnnotation(Override.class));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.REQUIRED, null, "wanted1", getAnnotation(Documented.class));
+      QualifiersMdrUtil.addQualifiersToMdrRetrieval(loader, QualifierType.OPTIONAL, null, "optional1", getAnnotation(Deprecated.class));
       
       getMetaDataRepository().getMetaDataRepository().addMetaDataRetrieval(loader);
 
@@ -130,37 +182,42 @@
          assertBean("bean2", Bean.class);
          Set<Object> set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean1Context);         
          assertNotNull(set);
+         assertEquals(2, set.size());
          assertTrue(set.contains("supplied1"));
-         assertEquals(1, set.size());
+         assertTrue(set.contains(getAnnotation(Override.class)));
 
          set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
+         assertEquals(2, set.size());
          assertTrue(set.contains("wanted1"));
-         assertEquals(1, set.size());
+         assertTrue(set.contains(getAnnotation(Documented.class)));
 
          set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean1Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
+         assertEquals(2, set.size());
          assertTrue(set.contains("optional1"));
-         assertEquals(1, set.size());
+         assertTrue(set.contains(getAnnotation(Deprecated.class)));
 
          set = QualifiersMdrUtil.mergeSuppliedQualifiersFromMdr(bean2Context);         
          assertNotNull(set);
+         assertEquals(3, set.size());
          assertTrue(set.contains("supplied1"));
          assertTrue(set.contains("supplied2"));
-         assertEquals(2, set.size());
+         assertTrue(set.contains(getAnnotation(Override.class)));
          
-         
          set = QualifiersMdrUtil.mergeRequiredQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
+         assertEquals(3, set.size());
          assertTrue(set.contains("wanted1"));
          assertTrue(set.contains("wanted2"));
-         assertEquals(2, set.size());
+         assertTrue(set.contains(getAnnotation(Documented.class)));
 
          set = QualifiersMdrUtil.mergeOptionalQualifiersFromMdr(bean2Context, QualifierPoint.PROPERTY);         
          assertNotNull(set);
+         assertEquals(3, set.size());
          assertTrue(set.contains("optional1"));
          assertTrue(set.contains("optional2"));
-         assertEquals(2, set.size());
+         assertTrue(set.contains(getAnnotation(Deprecated.class)));
       }
       finally
       {
@@ -329,6 +386,35 @@
       }
    }
    
+   public void testAnnotationQualifier() throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, getAnnotation(Override.class));
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
+      targetBuilder.setAutowireType(AutowireType.BY_CLASS);
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, getAnnotation(Override.class));
+      KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
+      try
+      {
+         Bean bean1 = assertBean("bean1", Bean.class);
+         assertBean("bean2", Bean.class);
+         TargetBean target = assertBean("target", TargetBean.class);
+         assertNotNull(target.getBean());
+         assertSame(bean1, target.getBean());
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         undeploy(bean2Context);
+         undeploy(targetContext);
+      }
+   }
+   
    public void testAmbiguousQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
@@ -357,6 +443,34 @@
       }
    }
 
+   public void testAmbiguousAnnotationQualifiers() throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, getAnnotation(Override.class));
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      bean2Builder.addQualifiers(QualifierType.SUPPLIED, getAnnotation(Override.class));
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder targetBuilder = BeanMetaDataBuilder.createBuilder("target", TargetBean.class.getName());
+      targetBuilder.setAutowireType(AutowireType.BY_CLASS);
+      targetBuilder.addQualifiers(QualifierType.REQUIRED, getAnnotation(Override.class));
+      KernelControllerContext targetContext = deploy(targetBuilder.getBeanMetaData());
+      try
+      {
+         assertBean("bean1", Bean.class);
+         assertBean("bean2", Bean.class);
+         assertNoBean("target");
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         undeploy(bean2Context);
+         undeploy(targetContext);
+      }
+   }
+
    public void testRequiredQualifiersNotIncludingAllBeanQualifiers() throws Throwable
    {
       BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
@@ -831,4 +945,9 @@
          getMetaDataRepository().getMetaDataRepository().removeMetaDataRetrieval(ScopeKey.DEFAULT_SCOPE);
       }
    }
+   
+   private Annotation getAnnotation(Class<? extends Annotation> clazz) throws Exception
+   {
+      return (Annotation)AnnotationCreator.createAnnotation("@" + clazz.getName(), clazz);
+   }
 }

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-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/InjectionPointQualifiersTestCase.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -21,14 +21,26 @@
 */ 
 package org.jboss.test.kernel.qualifiers.test;
 
+import java.lang.annotation.Annotation;
 import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 import junit.framework.Test;
 
+import org.jboss.annotation.factory.AnnotationCreator;
 import org.jboss.beans.info.spi.BeanAccessMode;
+import org.jboss.beans.metadata.api.model.QualifierContent;
 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.AbstractBeanQualifierMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractQualifierMetaData;
+import org.jboss.beans.metadata.plugins.AbstractRelatedClassMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.RelatedClassMetaData;
+import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.test.kernel.junit.MicrocontainerTest;
@@ -104,6 +116,106 @@
       }
    }
    
+   public void testAnnotationObjectPropertyQualifiers() throws Throwable
+   {
+      testAnnotationObjectQualifiers(TargetPropertyBean.class);
+   }
+   
+   public void testAnnotationObjectFieldQualifiers() throws Throwable
+   {
+      testAnnotationObjectQualifiers(TargetFieldBean.class);
+   }
+   
+   public void testAnnotationObjectConstructorParameterQualifiers() throws Throwable
+   {
+      testAnnotationObjectQualifiers(TargetConstructorBean.class);
+   }
+   
+   public void testAnnotationObjectInstallMethodParameterQualifiers() throws Throwable
+   {
+      testAnnotationObjectQualifiers(TargetMethodBean.class);
+   }
+   
+   private <T extends Target> void testAnnotationObjectQualifiers(Class<T> targetClass) throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      bean1Builder.addQualifiers(QualifierType.SUPPLIED, getAnnotation(Override.class));
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+
+      KernelControllerContext targetContext = deploy(createTargetMetaData(targetClass, getAnnotation(Override.class)));
+      try
+      {
+         Bean bean1 = assertBean("bean1", Bean.class);
+         assertBean("bean2", Bean.class);
+         T target = assertBean("target", targetClass);
+         assertNotNull(target.getBean());
+         assertSame(bean1, target.getBean());
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         undeploy(bean2Context);
+         undeploy(targetContext);
+      }
+   }
+   
+   public void testAnnotationContentPropertyQualifiers() throws Throwable
+   {
+      testAnnotationContentQualifiers(TargetPropertyBean.class);
+   }
+   
+   public void testAnnotationContentFieldQualifiers() throws Throwable
+   {
+      testAnnotationContentQualifiers(TargetFieldBean.class);
+   }
+   
+   public void testAnnotationContentConstructorParameterQualifiers() throws Throwable
+   {
+      testAnnotationContentQualifiers(TargetConstructorBean.class);
+   }
+   
+   public void testAnnotationContentInstallMethodParameterQualifiers() throws Throwable
+   {
+      testAnnotationContentQualifiers(TargetMethodBean.class);
+   }
+   
+   private <T extends Target> void testAnnotationContentQualifiers(Class<T> targetClass) throws Throwable
+   {
+      BeanMetaDataBuilder bean1Builder = BeanMetaDataBuilder.createBuilder("bean1", Bean.class.getName());
+      AbstractBeanQualifierMetaData beanQualifier = new AbstractBeanQualifierMetaData();
+      beanQualifier.setType(QualifierType.SUPPLIED);
+      beanQualifier.setContent(QualifierContent.ANNOTATION);
+      Set<Object> enableds = new HashSet<Object>();
+      enableds.add("@" + Override.class.getName());
+      beanQualifier.setEnabled(enableds);
+      Set<RelatedClassMetaData> qualifiers = new HashSet<RelatedClassMetaData>();
+      qualifiers.add(beanQualifier);
+      ((AbstractBeanMetaData)bean1Builder.getBeanMetaData()).setRelated(qualifiers);
+      KernelControllerContext bean1Context = deploy(bean1Builder.getBeanMetaData());
+
+      BeanMetaDataBuilder bean2Builder = BeanMetaDataBuilder.createBuilder("bean2", Bean.class.getName());
+      KernelControllerContext bean2Context = deploy(bean2Builder.getBeanMetaData());
+
+      KernelControllerContext targetContext = deploy(createTargetMetaData(targetClass, false, QualifierContent.ANNOTATION, "@" + Override.class.getName()));
+      try
+      {
+         Bean bean1 = assertBean("bean1", Bean.class);
+         assertBean("bean2", Bean.class);
+         T target = assertBean("target", targetClass);
+         assertNotNull(target.getBean());
+         assertSame(bean1, target.getBean());
+      }
+      finally
+      {
+         undeploy(bean1Context);
+         undeploy(bean2Context);
+         undeploy(targetContext);
+      }
+   }
+   
    public void testNeedsAllPropertyQualifiers() throws Throwable
    {
       testNeedsAllQualifiers(TargetPropertyBean.class);
@@ -696,33 +808,55 @@
    {
       return createTargetMetaData(targetClass, false, qualifiers);
    }
-   
 
    private BeanMetaData createTargetMetaData(Class<?> targetClass, boolean ignoreBeanQualifiers, Object...qualifiers)
    {
+      return createTargetMetaData(targetClass, ignoreBeanQualifiers, QualifierContent.STRING, qualifiers);
+   }
 
+   private BeanMetaData createTargetMetaData(Class<?> targetClass, boolean ignoreBeanQualifiers, QualifierContent content, Object...qualifiers)
+   {
       BeanMetaDataBuilder targetBuilder = null;
+      ValueMetaData value = null; 
       if (targetClass == TargetPropertyBean.class || targetClass == TargetFieldBean.class)
       {
          targetBuilder = BeanMetaDataBuilder.createBuilder("target", targetClass.getName());
          if (targetClass == TargetFieldBean.class)
             targetBuilder.setAccessMode(BeanAccessMode.ALL);
-         targetBuilder.addPropertyMetaData("bean", targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers));
+         value = targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers);
+         targetBuilder.addPropertyMetaData("bean", value);
       }
       else if (targetClass == TargetConstructorBean.class)
       {
          targetBuilder = BeanMetaDataBuilder.createBuilder("target", targetClass.getName());
-         targetBuilder.addConstructorParameter(Bean.class.getName(), targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers));
+         value = targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers);
+         targetBuilder.addConstructorParameter(Bean.class.getName(), value);
       }
       else
       {
          targetBuilder = BeanMetaDataBuilder.createBuilder("target", targetClass.getName());
-         targetBuilder.addInstall("installBean", Bean.class.getName(), targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers));
+         value = targetBuilder.createContextualInject(ignoreBeanQualifiers, qualifiers);
+         targetBuilder.addInstall("installBean", Bean.class.getName(), value);
       }
       
+      if (content == QualifierContent.ANNOTATION)
+      {
+         AbstractInjectionValueMetaData inject = (AbstractInjectionValueMetaData)value;
+         for (RelatedClassMetaData qualifier : inject.getQualifiers())
+         {
+            assertInstanceOf(qualifier, AbstractQualifierMetaData.class);
+            ((AbstractQualifierMetaData)qualifier).setContent(QualifierContent.ANNOTATION);
+         }
+      }
+      
       return targetBuilder.getBeanMetaData();
    }
    
+   private Annotation getAnnotation(Class<? extends Annotation> clazz) throws Exception
+   {
+      return (Annotation)AnnotationCreator.createAnnotation("@" + clazz.getName(), clazz);
+   }
+
    private enum TargetType
    {
       PROPERTY, CONSTRUCTOR, METHOD;

Modified: projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase.java
===================================================================
--- projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase.java	2009-12-16 16:17:41 UTC (rev 97899)
+++ projects/kernel/trunk/kernel/src/test/java/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase.java	2009-12-16 16:18:34 UTC (rev 97900)
@@ -179,4 +179,21 @@
       assertNotNull(target.getFieldBean());
       assertEquals(bean3, target.getFieldBean());
    }
+   
+   public void testQualifierAnnotationContent()
+   {
+      assertBean("bean1", Bean.class);
+      Bean bean2 = assertBean("bean2", Bean.class);
+      assertBean("bean3", Bean.class);
+
+      TargetAllBean target = assertBean("target", TargetAllBean.class);
+      assertNotNull(target.getConstructorBean());
+      assertEquals(bean2, target.getConstructorBean());
+    
+      assertNotNull(target.getMethodBean());
+      assertEquals(bean2, target.getMethodBean());
+      
+      assertNotNull(target.getFieldBean());
+      assertEquals(bean2, target.getFieldBean());
+   }
 }

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanAnnotation.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanAnnotation.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanAnnotation.xml	2009-12-16 16:18:34 UTC (rev 97900)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <qualifier content="Annotation">@java.lang.Override</qualifier>
+</bean>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanString.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanString.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierBeanString.xml	2009-12-16 16:18:34 UTC (rev 97900)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <qualifier content="String">aop</qualifier>
+</bean>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierPropertyInjectAnnotation.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierPropertyInjectAnnotation.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/deployment/xml/test/QualifierPropertyInjectAnnotation.xml	2009-12-16 16:18:34 UTC (rev 97900)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <property name="test">
+      <inject>
+         <qualifier content="annotation">@java.lang.Override</qualifier>
+      </inject>
+   </property>
+</bean>

Added: projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase#testQualifierAnnotationContent.xml
===================================================================
--- projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase#testQualifierAnnotationContent.xml	                        (rev 0)
+++ projects/kernel/trunk/kernel/src/test/resources/org/jboss/test/kernel/qualifiers/test/QualifiersXmlTestCase#testQualifierAnnotationContent.xml	2009-12-16 16:18:34 UTC (rev 97900)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+   
+   <bean name="bean1" class="org.jboss.test.kernel.qualifiers.support.Bean">
+      <qualifier content="Annotation">@java.lang.Override</qualifier>
+      <qualifier content="Annotation">@java.lang.Deprecated</qualifier>
+   </bean>
+
+   <bean name="bean2" class="org.jboss.test.kernel.qualifiers.support.Bean">
+      <qualifier content="Annotation">@java.lang.Deprecated</qualifier>
+      <qualifier content="Annotation">@java.lang.Override</qualifier>
+      <qualifier content="Annotation">@java.lang.annotation.Documented</qualifier>
+   </bean>
+   
+   <bean name="bean3" class="org.jboss.test.kernel.qualifiers.support.Bean">
+      <qualifier content="Annotation">@java.lang.annotation.Documented</qualifier>
+   </bean>
+   
+   <bean name="target" class="org.jboss.test.kernel.qualifiers.support.TargetAllBean">
+      <qualifier content="Annotation" type="Required">@java.lang.Deprecated</qualifier>
+      <qualifier content="Annotation" type="Required">@java.lang.Override</qualifier>
+      <constructor>
+         <parameter>
+            <inject>
+               <qualifier content="Annotation" type="Required">@java.lang.annotation.Documented</qualifier>
+            </inject>
+         </parameter>
+      </constructor>
+      <property name="fieldBean">
+         <inject>
+               <qualifier content="Annotation" type="Required">@java.lang.annotation.Documented</qualifier>
+         </inject>
+      </property>
+      <install method="installBean">
+         <parameter>
+            <inject>
+               <qualifier content="Annotation" type="Required">@java.lang.annotation.Documented</qualifier>
+            </inject>
+         </parameter>
+      </install>
+   </bean>
+
+   
+</deployment>




More information about the jboss-cvs-commits mailing list