[jboss-cvs] JBossAS SVN: r70991 - in projects/microcontainer/trunk/kernel/src: main/org/jboss/kernel/plugins/annotations and 4 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Mar 19 07:42:36 EDT 2008


Author: alesj
Date: 2008-03-19 07:42:35 -0400 (Wed, 19 Mar 2008)
New Revision: 70991

Added:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectFieldAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectableMemberAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallFieldCallbackAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallFieldCallbackAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryFieldAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/CallbacksTester.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/InjectTester.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/ValueFactoryTester.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AfterInstallVerifier.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/BasicFieldAnnotationSupportTestCase.java
Modified:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Inject.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Install.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Uninstall.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ValueFactory.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FieldAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueUtil.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockFieldTester.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockInjectPlugin.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AbstractRunAnnotationsTest.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/AnnotationFieldTestSuite.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/inheritance/AbstractAnnotationInheritanceTest.java
Log:
Field annotation IoC support.

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Inject.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Inject.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Inject.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -38,7 +38,7 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
- at Target({ElementType.METHOD, ElementType.PARAMETER})
+ at Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
 public @interface Inject
 {
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Install.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Install.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Install.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -32,7 +32,7 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
- at Target({ElementType.METHOD})
+ at Target({ElementType.METHOD, ElementType.FIELD})
 public @interface Install
 {
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Uninstall.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Uninstall.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/Uninstall.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -32,7 +32,7 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
- at Target({ElementType.METHOD})
+ at Target({ElementType.METHOD, ElementType.FIELD})
 public @interface Uninstall
 {
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ValueFactory.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ValueFactory.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ValueFactory.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -32,7 +32,7 @@
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
- at Target({ElementType.METHOD, ElementType.PARAMETER})
+ at Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
 public @interface ValueFactory
 {
    /**

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/AbstractAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -71,8 +71,6 @@
             {
                types.add(type);
             }
-            else
-               log.warn("Unsupported type " + type + " on annotation " + annotation);
          }
       }
       isCleanupOnly = annotation.isAnnotationPresent(CleanupOnly.class);

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/BasicBeanAnnotationAdapter.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -93,5 +93,9 @@
       addAnnotationPlugin(new InstallMethodParameterAnnotationPlugin(adapters));
       addAnnotationPlugin(new UninstallMethodParameterAnnotationPlugin(adapters));
       // field
+      addAnnotationPlugin(new InjectFieldAnnotationPlugin());
+      addAnnotationPlugin(new ValueFactoryFieldAnnotationPlugin());
+      addAnnotationPlugin(new InstallFieldCallbackAnnotationPlugin());
+      addAnnotationPlugin(new UninstallFieldCallbackAnnotationPlugin());
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FieldAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FieldAnnotationPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/FieldAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -32,7 +32,7 @@
  * @param <C> annotation type
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public abstract class FieldAnnotationPlugin<C extends Annotation> extends AbstractAnnotationPlugin<FieldInfo, C>
+public abstract class FieldAnnotationPlugin<C extends Annotation> extends InjectableMemberAnnotationPlugin<FieldInfo, C>
 {
    protected FieldAnnotationPlugin(Class<C> annotation)
    {
@@ -43,4 +43,9 @@
    {
       return ElementType.FIELD == type;
    }
+
+   protected String getName(FieldInfo info)
+   {
+      return info.getName();
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectAnnotationPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -22,10 +22,7 @@
 package org.jboss.kernel.plugins.annotations;
 
 import org.jboss.beans.metadata.api.annotations.Inject;
-import org.jboss.beans.metadata.api.model.FromContext;
-import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.dependency.spi.ControllerState;
 
 /**
  * Inject value annotation plugin.
@@ -43,18 +40,6 @@
 
    public ValueMetaData createValueMetaData(Inject annotation)
    {
-      AbstractInjectionValueMetaData injection = new AbstractInjectionValueMetaData();
-      if (isAttributePresent(annotation.bean()))
-         injection.setValue(annotation.bean());
-      if (isAttributePresent(annotation.property()))
-         injection.setProperty(annotation.property());
-      injection.setDependentState(new ControllerState(annotation.dependentState()));
-      if (isAttributePresent(annotation.whenRequired()))
-         injection.setWhenRequiredState(new ControllerState(annotation.whenRequired()));
-      injection.setInjectionOption(annotation.option());
-      injection.setInjectionType(annotation.type());
-      if (FromContext.NOOP.equals(annotation.fromContext()) == false)
-         injection.setFromContext(annotation.fromContext());
-      return injection;
+      return ValueUtil.createValueMetaData(annotation);
    }
 }

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectFieldAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectFieldAnnotationPlugin.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectFieldAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,43 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.annotations;
+
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+
+/**
+ * Value factory field annotation plugin.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InjectFieldAnnotationPlugin extends FieldAnnotationPlugin<Inject>
+{
+   public InjectFieldAnnotationPlugin()
+   {
+      super(Inject.class);
+   }
+
+   public ValueMetaData createValueMetaData(Inject annotation)
+   {
+      return ValueUtil.createValueMetaData(annotation);
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectableMemberAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectableMemberAnnotationPlugin.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InjectableMemberAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,141 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.annotations;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractPropertyMetaData;
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.beans.metadata.spi.PropertyMetaData;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.reflect.spi.AnnotatedInfo;
+
+/**
+ * Injectable member annotation plugin.
+ *
+ * @param <C> annotation type
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class InjectableMemberAnnotationPlugin<T extends AnnotatedInfo, C extends Annotation> extends AbstractAnnotationPlugin<T, C>   
+{
+   protected InjectableMemberAnnotationPlugin(Class<C> annotation)
+   {
+      super(annotation);
+   }
+
+   protected boolean isElementTypeSupported(ElementType type)
+   {
+      return ElementType.METHOD == type || ElementType.PARAMETER == type;
+   }
+
+   /**
+    * Get the annotated info name.
+    *
+    * @param info the info
+    * @return info's name
+    */
+   protected abstract String getName(T info);
+
+   protected boolean isMetaDataAlreadyPresent(T info, C annotation, BeanMetaData beanMetaData)
+   {
+      Set<PropertyMetaData> properties = beanMetaData.getProperties();
+      if (properties != null && properties.isEmpty() == false)
+      {
+         for(PropertyMetaData pmd : properties)
+         {
+            if (pmd.getName().equals(getName(info)))
+               return true;
+         }
+      }
+      return false;
+   }
+
+   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, C annotation, BeanMetaData beanMetaData) throws Throwable
+   {
+      Set<PropertyMetaData> properties = getProperties(beanMetaData);
+      PropertyMetaData property = getPropertyMetaData(info, annotation, beanMetaData);
+      properties.add(property);
+      return Collections.singletonList(property);
+   }
+
+   /**
+    * Get PropertyMetaData instance.
+    *
+    * @param info the info
+    * @param annotation the annotation
+    * @param beanMetaData the bean metadata
+    * @return get new PropertyMetaData instance
+    */
+   protected PropertyMetaData getPropertyMetaData(T info, C annotation, BeanMetaData beanMetaData)
+   {
+      return getPropertyMetaData(info, annotation);
+   }
+
+   /**
+    * Get PropertyMetaData instance.
+    *
+    * @param info the info
+    * @param annotation the annotation
+    * @return get new PropertyMetaData instance
+    */
+   protected PropertyMetaData getPropertyMetaData(T info, C annotation)
+   {
+      ValueMetaData value = createValueMetaData(annotation);
+      if (value == null)
+         throw new IllegalArgumentException("Should not return null value, " + this);
+
+      return new AbstractPropertyMetaData(getName(info), value);
+   }
+
+   /**
+    * Get the PropertyMetaData set.
+    *
+    * @param beanMetaData the bean meta data
+    * @return set of existing PropertyMetaData
+    */
+   protected Set<PropertyMetaData> getProperties(BeanMetaData beanMetaData)
+   {
+      Set<PropertyMetaData> properties = beanMetaData.getProperties();
+      if (properties == null)
+      {
+         properties = new HashSet<PropertyMetaData>();
+         AbstractBeanMetaData bean = (AbstractBeanMetaData)beanMetaData;
+         bean.setProperties(properties);
+      }
+      return properties;
+   }
+
+   /**
+    * Create value meta data.
+    *
+    * @param annotation the annotation
+    * @return value meta data
+    */
+   public abstract ValueMetaData createValueMetaData(C annotation);
+}

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallFieldCallbackAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallFieldCallbackAnnotationPlugin.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallFieldCallbackAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,93 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.annotations;
+
+import java.lang.annotation.ElementType;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.jboss.beans.metadata.api.annotations.Install;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+import org.jboss.beans.metadata.plugins.InstallCallbackMetaData;
+import org.jboss.beans.metadata.spi.CallbackMetaData;
+import org.jboss.dependency.spi.CallbackItem;
+import org.jboss.dependency.spi.Cardinality;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.reflect.spi.FieldInfo;
+
+/**
+ * Install field callback annotation plugin.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InstallFieldCallbackAnnotationPlugin extends CallbackAnnotationPlugin<FieldInfo, Install>
+{
+   protected InstallFieldCallbackAnnotationPlugin()
+   {
+      super(Install.class);
+   }
+
+   protected boolean isElementTypeSupported(ElementType type)
+   {
+      return ElementType.FIELD == type;
+   }
+
+   protected boolean isEqual(FieldInfo info, CallbackItem<?> ci)
+   {
+      return info.getName().equals(ci.getAttributeName());
+   }
+
+   protected void applyInfo(AbstractCallbackMetaData callback, FieldInfo info)
+   {
+      callback.setProperty(info.getName());
+   }
+
+   protected Set<CallbackItem<?>> getCallbacks(DependencyInfo dependency)
+   {
+      return dependency.getInstallItems();
+   }
+
+   protected AbstractCallbackMetaData createCallback(FieldInfo info, Install annotation)
+   {
+      InstallCallbackMetaData callback = new InstallCallbackMetaData();
+      callback.setState(new ControllerState(annotation.whenRequired()));
+      callback.setDependentState(new ControllerState(annotation.dependentState()));
+      if (isAttributePresent(annotation.cardinality()))
+         callback.setCardinality(Cardinality.fromString(annotation.cardinality()));
+      applyInfo(callback, info);
+      return callback;
+   }
+
+   protected List<CallbackMetaData> getCallbacks(AbstractBeanMetaData beanMetaData)
+   {
+      List<CallbackMetaData> callbacks = beanMetaData.getInstallCallbacks();
+      if (callbacks == null)
+      {
+         callbacks = new ArrayList<CallbackMetaData>();
+         beanMetaData.setInstallCallbacks(callbacks);
+      }
+      return callbacks;
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/PropertyAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -23,19 +23,8 @@
 
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 
 import org.jboss.beans.info.spi.PropertyInfo;
-import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.plugins.AbstractPropertyMetaData;
-import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
-import org.jboss.beans.metadata.spi.PropertyMetaData;
-import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
 
 /**
  * Abstract property annotation plugin.
@@ -43,7 +32,7 @@
  * @param <C> annotation type
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public abstract class PropertyAnnotationPlugin<C extends Annotation> extends AbstractAnnotationPlugin<PropertyInfo, C>
+public abstract class PropertyAnnotationPlugin<C extends Annotation> extends InjectableMemberAnnotationPlugin<PropertyInfo, C>
    implements PropertyAware, Annotation2ValueMetaDataAdapter<C>
 {
    protected PropertyAnnotationPlugin(Class<C> annotation)
@@ -56,83 +45,8 @@
       return ElementType.METHOD == type || ElementType.PARAMETER == type;
    }
 
-   protected boolean isMetaDataAlreadyPresent(PropertyInfo info, C annotation, BeanMetaData beanMetaData)
+   protected String getName(PropertyInfo info)
    {
-      Set<PropertyMetaData> properties = beanMetaData.getProperties();
-      if (properties != null && properties.isEmpty() == false)
-      {
-         for(PropertyMetaData pmd : properties)
-         {
-            if (pmd.getName().equals(info.getName()))
-               return true;
-         }
-      }
-      return false;
+      return info.getName();
    }
-
-   protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(PropertyInfo info, C annotation, KernelControllerContext context)
-   {
-      Set<PropertyMetaData> properties = getProperties(context);
-      PropertyMetaData property = getPropertyMetaData(info, annotation, context);
-      properties.add(property);
-      return Collections.singletonList(property);
-   }
-
-   /**
-    * Get PropertyMetaData instance.
-    *
-    * @param info the info
-    * @param annotation the annotation
-    * @param context the context
-    * @return get new PropertyMetaData instance
-    */
-   protected PropertyMetaData getPropertyMetaData(PropertyInfo info, C annotation, KernelControllerContext context)
-   {
-      return getPropertyMetaData(info, annotation, context.getBeanMetaData());
-   }
-
-   /**
-    * Get PropertyMetaData instance.
-    *
-    * @param info the info
-    * @param annotation the annotation
-    * @param beanMetaData the bean metadata
-    * @return get new PropertyMetaData instance
-    */
-   protected PropertyMetaData getPropertyMetaData(PropertyInfo info, C annotation, BeanMetaData beanMetaData)
-   {
-      return getPropertyMetaData(info, annotation);
-   }
-
-   /**
-    * Get PropertyMetaData instance.
-    *
-    * @param info the info
-    * @param annotation the annotation
-    * @return get new PropertyMetaData instance
-    */
-   protected PropertyMetaData getPropertyMetaData(PropertyInfo info, C annotation)
-   {
-      ValueMetaData value = createValueMetaData(annotation);
-      return new AbstractPropertyMetaData(info.getName(), value);
-   }
-
-   /**
-    * Get the PropertyMetaData set.
-    *
-    * @param context the context
-    * @return set of existing PropertyMetaData
-    */
-   protected Set<PropertyMetaData> getProperties(KernelControllerContext context)
-   {
-      BeanMetaData beanMetaData = context.getBeanMetaData();
-      Set<PropertyMetaData> properties = beanMetaData.getProperties();
-      if (properties == null)
-      {
-         properties = new HashSet<PropertyMetaData>();
-         AbstractBeanMetaData bean = (AbstractBeanMetaData)beanMetaData;
-         bean.setProperties(properties);
-      }
-      return properties;
-   }
 }

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallFieldCallbackAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallFieldCallbackAnnotationPlugin.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallFieldCallbackAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,93 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.annotations;
+
+import java.lang.annotation.ElementType;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.jboss.beans.metadata.api.annotations.Uninstall;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+import org.jboss.beans.metadata.plugins.UninstallCallbackMetaData;
+import org.jboss.beans.metadata.spi.CallbackMetaData;
+import org.jboss.dependency.spi.CallbackItem;
+import org.jboss.dependency.spi.Cardinality;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.reflect.spi.FieldInfo;
+
+/**
+ * Uninstall field callback annotation plugin.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class UninstallFieldCallbackAnnotationPlugin extends CallbackAnnotationPlugin<FieldInfo, Uninstall>
+{
+   protected UninstallFieldCallbackAnnotationPlugin()
+   {
+      super(Uninstall.class);
+   }
+
+   protected boolean isElementTypeSupported(ElementType type)
+   {
+      return ElementType.FIELD == type;
+   }
+
+   protected boolean isEqual(FieldInfo info, CallbackItem<?> ci)
+   {
+      return info.getName().equals(ci.getAttributeName());
+   }
+
+   protected void applyInfo(AbstractCallbackMetaData callback, FieldInfo info)
+   {
+      callback.setProperty(info.getName());
+   }
+
+   protected Set<CallbackItem<?>> getCallbacks(DependencyInfo dependency)
+   {
+      return dependency.getUninstallItems();
+   }
+
+   protected AbstractCallbackMetaData createCallback(FieldInfo info, Uninstall annotation)
+   {
+      UninstallCallbackMetaData callback = new UninstallCallbackMetaData();
+      callback.setState(new ControllerState(annotation.whenRequired()));
+      callback.setDependentState(new ControllerState(annotation.dependentState()));
+      if (isAttributePresent(annotation.cardinality()))
+         callback.setCardinality(Cardinality.fromString(annotation.cardinality()));
+      applyInfo(callback, info);
+      return callback;
+   }
+
+   protected List<CallbackMetaData> getCallbacks(AbstractBeanMetaData beanMetaData)
+   {
+      List<CallbackMetaData> callbacks = beanMetaData.getUninstallCallbacks();
+      if (callbacks == null)
+      {
+         callbacks = new ArrayList<CallbackMetaData>();
+         beanMetaData.setUninstallCallbacks(callbacks);
+      }
+      return callbacks;
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryAnnotationPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -21,16 +21,8 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
-import org.jboss.beans.metadata.plugins.AbstractValueFactoryMetaData;
-import org.jboss.beans.metadata.api.annotations.Parameter;
 import org.jboss.beans.metadata.api.annotations.ValueFactory;
-import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.dependency.spi.ControllerState;
 
 /**
  * Value factory annotation plugin.
@@ -48,27 +40,6 @@
 
    public ValueMetaData createValueMetaData(ValueFactory annotation)
    {
-      AbstractValueFactoryMetaData factory = new AbstractValueFactoryMetaData(annotation.bean(), annotation.method());
-      if (isAttributePresent(annotation.defaultValue()))
-         factory.setDefaultValue(annotation.defaultValue());
-      List<ParameterMetaData> parameters = new ArrayList<ParameterMetaData>();
-      if (isAttributePresent(annotation.parameter()))
-         parameters.add(new AbstractParameterMetaData(String.class.getName(), annotation.parameter()));
-      if (annotation.parameters().length > 0)
-      {
-         if (parameters.size() > 0)
-            throw new IllegalArgumentException("Cannot set both parameter and parameters!");
-         for(Parameter parameter : annotation.parameters())
-         {
-            AbstractParameterMetaData apmd = new AbstractParameterMetaData(ValueUtil.createValueMetaData(parameter));
-            if (isAttributePresent(parameter.type()))
-               apmd.setType(parameter.type().getName());
-            parameters.add(apmd);
-         }
-      }
-      factory.setParameters(parameters);
-      factory.setDependentState(new ControllerState(annotation.dependantState()));
-      factory.setWhenRequiredState(new ControllerState(annotation.whenRequiredState()));
-      return factory;
+      return ValueUtil.createValueMetaData(annotation);
    }
 }

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryFieldAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryFieldAnnotationPlugin.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueFactoryFieldAnnotationPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,43 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.annotations;
+
+import org.jboss.beans.metadata.api.annotations.ValueFactory;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+
+/**
+ * Value factory field annotation plugin.
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class ValueFactoryFieldAnnotationPlugin extends FieldAnnotationPlugin<ValueFactory>
+{
+   public ValueFactoryFieldAnnotationPlugin()
+   {
+      super(ValueFactory.class);
+   }
+
+   public ValueMetaData createValueMetaData(ValueFactory annotation)
+   {
+      return ValueUtil.createValueMetaData(annotation);
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueUtil.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueUtil.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ValueUtil.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -21,6 +21,9 @@
 */
 package org.jboss.kernel.plugins.annotations;
 
+import java.util.List;
+import java.util.ArrayList;
+
 import org.jboss.beans.metadata.api.annotations.Inject;
 import org.jboss.beans.metadata.api.annotations.NullValue;
 import org.jboss.beans.metadata.api.annotations.Parameter;
@@ -29,7 +32,13 @@
 import org.jboss.beans.metadata.api.annotations.Value;
 import org.jboss.beans.metadata.api.annotations.ValueFactory;
 import org.jboss.beans.metadata.api.annotations.JavaBeanValue;
+import org.jboss.beans.metadata.api.model.FromContext;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.beans.metadata.spi.ParameterMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractValueFactoryMetaData;
+import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * Simple util class.
@@ -177,4 +186,59 @@
 
       return vmd;
    }
+
+   /**
+    * Create injection value meta data.
+    *
+    * @param annotation the annotation
+    * @return injection value meta data
+    */
+   static ValueMetaData createValueMetaData(Inject annotation)
+   {
+      AbstractInjectionValueMetaData injection = new AbstractInjectionValueMetaData();
+      if (isAttributePresent(annotation.bean()))
+         injection.setValue(annotation.bean());
+      if (isAttributePresent(annotation.property()))
+         injection.setProperty(annotation.property());
+      injection.setDependentState(new ControllerState(annotation.dependentState()));
+      if (isAttributePresent(annotation.whenRequired()))
+         injection.setWhenRequiredState(new ControllerState(annotation.whenRequired()));
+      injection.setInjectionOption(annotation.option());
+      injection.setInjectionType(annotation.type());
+      if (FromContext.NOOP.equals(annotation.fromContext()) == false)
+         injection.setFromContext(annotation.fromContext());
+      return injection;
+   }
+
+   /**
+    * Create value factory value meta data.
+    *
+    * @param annotation the annotation
+    * @return value factory meta data
+    */
+   static ValueMetaData createValueMetaData(ValueFactory annotation)
+   {
+      AbstractValueFactoryMetaData factory = new AbstractValueFactoryMetaData(annotation.bean(), annotation.method());
+      if (isAttributePresent(annotation.defaultValue()))
+         factory.setDefaultValue(annotation.defaultValue());
+      List<ParameterMetaData> parameters = new ArrayList<ParameterMetaData>();
+      if (isAttributePresent(annotation.parameter()))
+         parameters.add(new AbstractParameterMetaData(String.class.getName(), annotation.parameter()));
+      if (annotation.parameters().length > 0)
+      {
+         if (parameters.size() > 0)
+            throw new IllegalArgumentException("Cannot set both parameter and parameters!");
+         for(Parameter parameter : annotation.parameters())
+         {
+            AbstractParameterMetaData apmd = new AbstractParameterMetaData(createValueMetaData(parameter));
+            if (isAttributePresent(parameter.type()))
+               apmd.setType(parameter.type().getName());
+            parameters.add(apmd);
+         }
+      }
+      factory.setParameters(parameters);
+      factory.setDependentState(new ControllerState(annotation.dependantState()));
+      factory.setWhenRequiredState(new ControllerState(annotation.whenRequiredState()));
+      return factory;
+   }
 }

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/CallbacksTester.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/CallbacksTester.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/CallbacksTester.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,54 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.annotations.support;
+
+import java.util.Set;
+
+import org.jboss.beans.metadata.api.annotations.Install;
+import org.jboss.beans.metadata.api.annotations.Uninstall;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class CallbacksTester
+{
+   @SuppressWarnings("unused")
+   @Install
+   @Uninstall
+   private Set<TestBean> privateBeans;
+   @Install
+   @Uninstall
+   protected Set<TestBean> protectedBeans;
+   @Install
+   @Uninstall
+   public Set<TestBean> publicBeans;
+
+   public Set<TestBean> getPrivateBeans()
+   {
+      return privateBeans;
+   }
+
+   public Set<TestBean> getProtectedBeans()
+   {
+      return protectedBeans;
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/InjectTester.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/InjectTester.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/InjectTester.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,66 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.annotations.support;
+
+import org.jboss.beans.metadata.api.annotations.Inject;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InjectTester
+{
+   @SuppressWarnings("unused")
+   @Inject(bean = "pb1")
+   private TestBean privateBean;
+   @Inject(bean = "pb2")
+   protected TestBean protectedBean;
+   @Inject(bean = "pb3")
+   public TestBean publicBean;
+
+   @SuppressWarnings("unused")
+   @Inject
+   private MyDeployer privateDeployer;
+   @Inject
+   protected MyDeployer protectedDeployer;
+   @Inject
+   public MyDeployer publicDeployer;
+
+   public TestBean getPrivateBean()
+   {
+      return privateBean;
+   }
+
+   public TestBean getProtectedBean()
+   {
+      return protectedBean;
+   }
+
+   public MyDeployer getPrivateDeployer()
+   {
+      return privateDeployer;
+   }
+
+   public MyDeployer getProtectedDeployer()
+   {
+      return protectedDeployer;
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockFieldTester.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockFieldTester.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockFieldTester.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -33,7 +33,7 @@
    private String string;
 
    @MockInject
-   protected long time;
+   protected Long time;
 
    @MockInject
    public Date date;

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockInjectPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockInjectPlugin.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/MockInjectPlugin.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -27,6 +27,8 @@
 
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractValueMetaData;
 import org.jboss.kernel.plugins.annotations.FieldAnnotationPlugin;
 import org.jboss.reflect.spi.FieldInfo;
 
@@ -44,6 +46,11 @@
       super(MockInject.class);
    }
 
+   public ValueMetaData createValueMetaData(MockInject annotation)
+   {
+      return new AbstractValueMetaData();
+   }
+
    protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(FieldInfo info, MockInject annotation, BeanMetaData beanMetaData) throws Throwable
    {
       fieldNames.add(info.getName());

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/ValueFactoryTester.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/ValueFactoryTester.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/support/ValueFactoryTester.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,48 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.annotations.support;
+
+import org.jboss.beans.metadata.api.annotations.ValueFactory;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class ValueFactoryTester
+{
+   @SuppressWarnings("unused")
+   @ValueFactory(bean = "pb1", method = "getValue", parameter = "pb1")
+   private String privateBean;
+   @ValueFactory(bean = "pb2", method = "getValue", parameter = "pb2")
+   protected String protectedBean;
+   @ValueFactory(bean = "pb3", method = "getValue", parameter = "pb3")
+   public String publicBean;
+
+   public String getPrivateBean()
+   {
+      return privateBean;
+   }
+
+   public String getProtectedBean()
+   {
+      return protectedBean;
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AbstractRunAnnotationsTest.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AbstractRunAnnotationsTest.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AbstractRunAnnotationsTest.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -21,6 +21,9 @@
 */
 package org.jboss.test.kernel.annotations.test;
 
+import java.util.Map;
+import java.util.HashMap;
+
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.info.spi.BeanAccessMode;
 import org.jboss.kernel.Kernel;
@@ -39,7 +42,8 @@
 public abstract class AbstractRunAnnotationsTest extends BaseTestCase
 {
    private KernelController controller;
-
+   private Map<Class<?>, AfterInstallVerifier> verifiers = new HashMap<Class<?>, AfterInstallVerifier>();
+   
    protected AbstractRunAnnotationsTest(String name)
    {
       super(name);
@@ -66,10 +70,12 @@
       runAnnotationsOnTarget(target, BeanAccessMode.STANDARD);
    }
 
+   @SuppressWarnings("unchecked")
    protected void runAnnotationsOnTarget(Object target, BeanAccessMode mode) throws Throwable
    {
       assertNotNull("Target is null", target);
-      runAnnotations(target.getClass(), target, mode);
+      Class clazz = target.getClass();
+      runAnnotations(clazz, target, mode);
    }
 
    protected void runAnnotationsOnClass(Class<?> clazz) throws Throwable
@@ -82,12 +88,12 @@
       runAnnotations(clazz, null);
    }
 
-   protected void runAnnotations(Class<?> clazz, Object target) throws Throwable
+   protected <T> void runAnnotations(Class<T> clazz, T target) throws Throwable
    {
       runAnnotations(clazz, target, BeanAccessMode.STANDARD);
    }
 
-   protected void runAnnotations(Class<?> clazz, Object target, BeanAccessMode mode) throws Throwable
+   protected <T> void runAnnotations(Class<T> clazz, T target, BeanAccessMode mode) throws Throwable
    {
       KernelController controller = getController();
       String className = clazz.getName();
@@ -111,6 +117,16 @@
       assertEquals(ControllerState.INSTALLED, context.getState());
    }
 
+   protected <T> void addVerifier(AfterInstallVerifier<T> verifier)
+   {
+      verifiers.put(verifier.getTargetClass(), verifier);
+   }
+
+   protected void removeVerifier(Class<?> clazz)
+   {
+      verifiers.remove(clazz);
+   }
+
    /**
     * Useful for single tests.
     * Else determine the test by parameters.
@@ -118,10 +134,25 @@
     * @param clazz the class
     * @param target the target
     */
-   protected void doTestAfterInstall(Class<?> clazz, Object target)
+   @SuppressWarnings("unchecked")
+   protected <T> void doTestAfterInstall(Class<T> clazz, T target)
    {
+      AfterInstallVerifier<T> verifier = verifiers.get(clazz);
+      if (verifier != null)
+         verifier.verify(target);
+      else
+         doTestAfterInstall(target);
    }
 
+   protected void doTestAfterInstall(Object target)
+   {
+      doTestAfterInstall();
+   }
+
+   protected void doTestAfterInstall()
+   {
+   }
+
    protected KernelController createController() throws Exception
    {
       // bootstrap

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AfterInstallVerifier.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AfterInstallVerifier.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/AfterInstallVerifier.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,35 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.annotations.test;
+
+/**
+ * Abstract annotation runner test.
+ *
+ * @param <T> exact type
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public interface AfterInstallVerifier<T>
+{
+   void verify(T target);
+
+   Class<T> getTargetClass();
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/AnnotationFieldTestSuite.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/AnnotationFieldTestSuite.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/AnnotationFieldTestSuite.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -42,6 +42,7 @@
       TestSuite suite = new TestSuite("Fields Tests");
 
       suite.addTest(SimpleFieldTestCase.suite());
+      suite.addTest(BasicFieldAnnotationSupportTestCase.suite());
 
       return suite;
    }

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/BasicFieldAnnotationSupportTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/BasicFieldAnnotationSupportTestCase.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/field/BasicFieldAnnotationSupportTestCase.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -0,0 +1,181 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.annotations.test.field;
+
+import org.jboss.test.kernel.annotations.test.AbstractBeanAnnotationAdapterTest;
+import org.jboss.test.kernel.annotations.test.AfterInstallVerifier;
+import org.jboss.test.kernel.annotations.support.TestBean;
+import org.jboss.test.kernel.annotations.support.MyDeployer;
+import org.jboss.test.kernel.annotations.support.InjectTester;
+import org.jboss.test.kernel.annotations.support.ValueFactoryTester;
+import org.jboss.test.kernel.annotations.support.CallbacksTester;
+import org.jboss.kernel.plugins.annotations.BeanAnnotationAdapter;
+import org.jboss.kernel.plugins.annotations.BeanAnnotationAdapterFactory;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.info.spi.BeanAccessMode;
+import junit.framework.Test;
+
+/**
+ * Basic field annotation IoC support
+ *
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class BasicFieldAnnotationSupportTestCase extends AbstractBeanAnnotationAdapterTest
+{
+   public BasicFieldAnnotationSupportTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return suite(BasicFieldAnnotationSupportTestCase.class);
+   }
+
+   protected BeanAnnotationAdapter getBeanAnnotationAdapterClass()
+   {
+      return BeanAnnotationAdapterFactory.getInstance().getBeanAnnotationAdapter();
+   }
+
+   protected <T> void testFields(T target, AfterInstallVerifier<T> verifier, BeanAccessMode mode) throws Throwable
+   {
+      addVerifier(verifier);
+      try
+      {
+         runAnnotationsOnTarget(target, mode);
+      }
+      finally
+      {
+         removeVerifier(target.getClass());
+      }
+   }
+
+   public void testInjection() throws Throwable
+   {
+      KernelController controller = getController();
+      controller.install(new AbstractBeanMetaData("pb1", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb2", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb3", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("deployer", MyDeployer.class.getName()));
+      InjectTester tester = new InjectTester();
+      testFields(tester, new InjectTesterVerifier(), BeanAccessMode.FIELDS);
+      testFields(tester, new AllInjectTesterVerifier(), BeanAccessMode.ALL);
+   }
+
+   public void testValueFactory() throws Throwable
+   {
+      KernelController controller = getController();
+      controller.install(new AbstractBeanMetaData("pb1", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb2", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb3", TestBean.class.getName()));
+      ValueFactoryTester tester = new ValueFactoryTester();
+      testFields(tester, new VFTesterVerifier(), BeanAccessMode.FIELDS);
+      testFields(tester, new AllVFTesterVerifier(), BeanAccessMode.ALL);
+   }
+
+   public void testInstalls() throws Throwable
+   {
+      KernelController controller = getController();
+      controller.install(new AbstractBeanMetaData("pb1", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb2", TestBean.class.getName()));
+      controller.install(new AbstractBeanMetaData("pb3", TestBean.class.getName()));
+      CallbacksTester tester = new CallbacksTester();
+      testFields(tester, new CallbacksTesterVerifier(), BeanAccessMode.FIELDS);
+      testFields(tester, new AllCallbacksTesterVerifier(), BeanAccessMode.ALL);
+   }
+
+   private class InjectTesterVerifier implements AfterInstallVerifier<InjectTester>
+   {
+      public void verify(InjectTester target)
+      {
+         assertNotNull(target.publicBean);
+         assertNotNull(target.publicDeployer);
+      }
+
+      public Class<InjectTester> getTargetClass()
+      {
+         return InjectTester.class;
+      }
+   }
+
+   private class AllInjectTesterVerifier extends InjectTesterVerifier
+   {
+      public void verify(InjectTester target)
+      {
+         super.verify(target);
+         assertNotNull(target.getPrivateBean());
+         assertNotNull(target.getProtectedBean());
+         assertNotNull(target.getPrivateDeployer());
+         assertNotNull(target.getProtectedDeployer());
+      }
+   }
+
+   private class VFTesterVerifier implements AfterInstallVerifier<ValueFactoryTester>
+   {
+      public void verify(ValueFactoryTester target)
+      {
+         assertEquals("PB3", target.publicBean);
+      }
+
+      public Class<ValueFactoryTester> getTargetClass()
+      {
+         return ValueFactoryTester.class;
+      }
+   }
+
+   private class AllVFTesterVerifier extends VFTesterVerifier
+   {
+      public void verify(ValueFactoryTester target)
+      {
+         super.verify(target);
+         assertEquals("PB1", target.getPrivateBean());
+         assertEquals("PB2", target.getProtectedBean());
+      }
+   }
+
+   private class CallbacksTesterVerifier implements AfterInstallVerifier<CallbacksTester>
+   {
+      public void verify(CallbacksTester target)
+      {
+         assertNotNull(target.publicBeans);
+         assertEquals(3, target.publicBeans.size());
+      }
+
+      public Class<CallbacksTester> getTargetClass()
+      {
+         return CallbacksTester.class;
+      }
+   }
+
+   private class AllCallbacksTesterVerifier extends CallbacksTesterVerifier
+   {
+      public void verify(CallbacksTester target)
+      {
+         super.verify(target);
+         assertNotNull(target.getProtectedBeans());
+         assertEquals(3, target.getProtectedBeans().size());
+         assertNotNull(target.getPrivateBeans());
+         assertEquals(3, target.getPrivateBeans().size());
+      }
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/inheritance/AbstractAnnotationInheritanceTest.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/inheritance/AbstractAnnotationInheritanceTest.java	2008-03-19 11:18:09 UTC (rev 70990)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/annotations/test/inheritance/AbstractAnnotationInheritanceTest.java	2008-03-19 11:42:35 UTC (rev 70991)
@@ -43,19 +43,4 @@
       KernelController controller = getController();
       return controller.install(new AbstractBeanMetaData(name, clazz.getName()));
    }
-
-   protected void doTestAfterInstall(Class<?> clazz, Object target)
-   {
-      assertInstanceOf(target, clazz);
-      doTestAfterInstall(clazz.cast(target));
-   }
-
-   protected void doTestAfterInstall(Object target)
-   {
-      doTestAfterInstall();
-   }
-
-   protected void doTestAfterInstall()
-   {
-   }
 }




More information about the jboss-cvs-commits mailing list