[jboss-cvs] JBossAS SVN: r71171 - in projects/microcontainer/trunk/kernel/src: main/org/jboss/beans/metadata/spi/builder and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat Mar 22 08:23:42 EDT 2008


Author: alesj
Date: 2008-03-22 08:23:42 -0400 (Sat, 22 Mar 2008)
New Revision: 71171

Added:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractCallbackMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallCallbackMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyInstallCallbackMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyUninstallCallbackMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallCallbackMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleCallbackBean.java
Modified:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractInstallMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/CreateLifecycleMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/DestroyLifecycleMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/LifecycleMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StartLifecycleMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StateMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StopLifecycleMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java
Log:
[JBMICROCONT-268]; adding callback handling to bean meta data builder.

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractCallbackMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractCallbackMetaDataBuilder.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractCallbackMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -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.beans.metadata.plugins.builder;
+
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+
+/**
+ * AbstractCallbackMetaDataBuilder.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class AbstractCallbackMetaDataBuilder extends StateMetaDataBuilder<AbstractCallbackMetaData>
+{
+   protected AbstractCallbackMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   {
+      super(beanMetaData);
+   }
+
+   protected void applyAfterSet(AbstractCallbackMetaData lifecycle)
+   {
+      // do nothing
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractInstallMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractInstallMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/AbstractInstallMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -22,7 +22,6 @@
 package org.jboss.beans.metadata.plugins.builder;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.plugins.AbstractLifecycleMetaData;
 import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 
 /**
@@ -31,24 +30,19 @@
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  */
-public abstract class AbstractInstallMetaDataBuilder extends StateMetaDataBuilder
+public abstract class AbstractInstallMetaDataBuilder extends StateMetaDataBuilder<AbstractInstallMetaData>
 {
-   /**
-    * Create a new StartLifecycleMetaDataBuilder.
-    *
-    * @param beanMetaData
-    */
-   public AbstractInstallMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   protected AbstractInstallMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
       super(beanMetaData);
    }
 
-   protected AbstractLifecycleMetaData createLifecycleMetaData()
+   protected AbstractInstallMetaData createLifecycleMetaData()
    {
       return new AbstractInstallMetaData();
    }
 
-   protected void applyAfterSet(AbstractLifecycleMetaData lifecycle)
+   protected void applyAfterSet(AbstractInstallMetaData lifecycle)
    {
       // do nothing
    }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -28,8 +28,10 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.jboss.beans.info.spi.BeanAccessMode;
 import org.jboss.beans.metadata.plugins.AbstractArrayMetaData;
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
 import org.jboss.beans.metadata.plugins.AbstractClassLoaderMetaData;
 import org.jboss.beans.metadata.plugins.AbstractCollectionMetaData;
 import org.jboss.beans.metadata.plugins.AbstractConstructorMetaData;
@@ -54,7 +56,7 @@
 import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.beans.metadata.spi.builder.ParameterMetaDataBuilder;
-import org.jboss.beans.info.spi.BeanAccessMode;
+import org.jboss.dependency.spi.Cardinality;
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
 
@@ -62,8 +64,6 @@
  * Helper class.
  * Similar to StringBuffer, methods return current instance of BeanMetaDataBuilder.
  *
- * TODO - add on demand, when building OSGi, Spring, ...
- *
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  * @author <a href="mailto:adrian at jboss.org">Adrian Brock</a>
  */
@@ -93,6 +93,18 @@
    /** The uninstall builder */
    private AbstractInstallMetaDataBuilder uninstallBuilder;
 
+   /** The incallback builder */
+   private AbstractCallbackMetaDataBuilder propIncallbackBuilder;
+
+   /** The uncallback builder */
+   private AbstractCallbackMetaDataBuilder propUncallbackBuilder;
+
+   /** The incallback builder */
+   private AbstractCallbackMetaDataBuilder incallbackBuilder;
+
+   /** The uncallback builder */
+   private AbstractCallbackMetaDataBuilder uncallbackBuilder;
+
    /**
     * Create a new BeanMetaDataBuilderImpl.
     * 
@@ -130,6 +142,11 @@
       // install
       installBuilder = new InstallMetaDataBuilder(beanMetaData);
       uninstallBuilder = new UninstallMetaDataBuilder(beanMetaData);
+      // callback
+      propIncallbackBuilder = new PropertyInstallCallbackMetaDataBuilder(beanMetaData);
+      propUncallbackBuilder = new PropertyUninstallCallbackMetaDataBuilder(beanMetaData);
+      incallbackBuilder = new InstallCallbackMetaDataBuilder(beanMetaData);
+      uncallbackBuilder = new UninstallCallbackMetaDataBuilder(beanMetaData);
    }
 
    public BeanMetaData getBeanMetaData()
@@ -453,7 +470,7 @@
 
    public ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired)
    {
-      AbstractInstallMetaData install = (AbstractInstallMetaData) installBuilder.createLifecycleMetaData(methodName);
+      AbstractInstallMetaData install = installBuilder.createLifecycleMetaData(methodName);
       install.setBean(bean);
       if (state != null)
          install.setDependentState(state);
@@ -464,7 +481,7 @@
 
    public ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired)
    {
-      AbstractInstallMetaData uninstall = (AbstractInstallMetaData) uninstallBuilder.createLifecycleMetaData(methodName);
+      AbstractInstallMetaData uninstall = uninstallBuilder.createLifecycleMetaData(methodName);
       uninstall.setBean(bean);
       if (state != null)
          uninstall.setDependentState(state);
@@ -473,28 +490,72 @@
       return new ParameterMetaDataBuilderImpl<AbstractInstallMetaData>(uninstall);
    }
 
+   public BeanMetaDataBuilder addPropertyInstallCallback(String property, String signature, ControllerState whenRequired, ControllerState dependentState, Cardinality cardinality)
+   {
+      AbstractCallbackMetaData callback = propIncallbackBuilder.createLifecycleMetaData(property);
+      callback.setSignature(signature);
+      callback.setState(whenRequired);
+      if (dependentState != null)
+         callback.setDependentState(dependentState);
+      callback.setCardinality(cardinality);
+      return this;
+   }
+
+   public BeanMetaDataBuilder addPropertyUninstallCallback(String property, String signature, ControllerState whenRequired, ControllerState dependentState, Cardinality cardinality)
+   {
+      AbstractCallbackMetaData callback = propUncallbackBuilder.createLifecycleMetaData(property);
+      callback.setSignature(signature);
+      callback.setState(whenRequired);
+      if (dependentState != null)
+         callback.setDependentState(dependentState);
+      callback.setCardinality(cardinality);
+      return this;
+   }
+
+   public BeanMetaDataBuilder addMethodInstallCallback(String method, String signature, ControllerState whenRequired, ControllerState dependentState, Cardinality cardinality)
+   {
+      AbstractCallbackMetaData callback = incallbackBuilder.createLifecycleMetaData(method);
+      callback.setSignature(signature);
+      callback.setState(whenRequired);
+      if (dependentState != null)
+         callback.setDependentState(dependentState);
+      callback.setCardinality(cardinality);
+      return this;
+   }
+
+   public BeanMetaDataBuilder addMethodUninstallCallback(String method, String signature, ControllerState whenRequired, ControllerState dependentState, Cardinality cardinality)
+   {
+      AbstractCallbackMetaData callback = uncallbackBuilder.createLifecycleMetaData(method);
+      callback.setSignature(signature);
+      callback.setState(whenRequired);
+      if (dependentState != null)
+         callback.setDependentState(dependentState);
+      callback.setCardinality(cardinality);
+      return this;
+   }
+
    public ValueMetaData createNull()
    {
       return new AbstractValueMetaData();
    }
-   
+
    public ValueMetaData createThis()
    {
       return new ThisValueMetaData();
    }
-   
+
    public ValueMetaData createValue(Object value)
    {
       return new AbstractValueMetaData(value);
    }
-   
+
    public ValueMetaData createString(String type, String value)
    {
       StringValueMetaData result = new StringValueMetaData(value);
       result.setType(type);
       return result;
    }
-   
+
    public ValueMetaData createInject(Object bean, String property, ControllerState whenRequired, ControllerState dependentState)
    {
       AbstractDependencyValueMetaData result = new AbstractDependencyValueMetaData(bean, property);
@@ -504,7 +565,7 @@
          result.setDependentState(dependentState);
       return result;
    }
-   
+
    @SuppressWarnings("unchecked")
    public Collection<ValueMetaData> createCollection(String collectionType, String elementType)
    {
@@ -515,7 +576,7 @@
          collection.setElementType(elementType);
       return (Collection) collection;
    }
-   
+
    @SuppressWarnings("unchecked")
    public List<ValueMetaData> createList(String listType, String elementType)
    {
@@ -526,7 +587,7 @@
          collection.setElementType(elementType);
       return (List) collection;
    }
-   
+
    @SuppressWarnings("unchecked")
    public Set<ValueMetaData> createSet(String setType, String elementType)
    {

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/CreateLifecycleMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/CreateLifecycleMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/CreateLifecycleMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -35,7 +35,7 @@
    /**
     * Create a new CreateLifecycleMetaDataBuilder.
     * 
-    * @param beanMetaData
+    * @param beanMetaData the bean meta data
     */
    public CreateLifecycleMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
@@ -51,5 +51,4 @@
    {
       beanMetaData.setCreate(lifecycle);
    }
-
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/DestroyLifecycleMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/DestroyLifecycleMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/DestroyLifecycleMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -35,7 +35,7 @@
    /**
     * Create a new DestroyLifecycleMetaDataBuilder.
     * 
-    * @param beanMetaData
+    * @param beanMetaData the bean meta data
     */
    public DestroyLifecycleMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
@@ -51,5 +51,4 @@
    {
       beanMetaData.setDestroy(lifecycle);
    }
-
 }
\ No newline at end of file

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallCallbackMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallCallbackMetaDataBuilder.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallCallbackMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -0,0 +1,59 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.beans.metadata.plugins.builder;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.jboss.beans.metadata.spi.CallbackMetaData;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.InstallCallbackMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+
+/**
+ * InstallCallbackMetaDataBuilder.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InstallCallbackMetaDataBuilder extends AbstractCallbackMetaDataBuilder
+{
+   public InstallCallbackMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   {
+      super(beanMetaData);
+   }
+
+   protected void setLifecycle(AbstractBeanMetaData beanMetaData, AbstractCallbackMetaData lifecycle)
+   {
+      List<CallbackMetaData> callbacks = beanMetaData.getInstallCallbacks();
+      if (callbacks == null)
+      {
+         callbacks = new ArrayList<CallbackMetaData>();
+         beanMetaData.setInstallCallbacks(callbacks);
+      }
+      callbacks.add(lifecycle);
+   }
+
+   protected AbstractCallbackMetaData createLifecycleMetaData()
+   {
+      return new InstallCallbackMetaData();
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/InstallMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -21,11 +21,11 @@
 */
 package org.jboss.beans.metadata.plugins.builder;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.spi.LifecycleMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 
 /**
@@ -38,7 +38,7 @@
    /**
     * Create a new StartLifecycleMetaDataBuilder.
     *
-    * @param beanMetaData
+    * @param beanMetaData the bean meta data
     * @throws IllegalArgumentException
     */
    public InstallMetaDataBuilder(AbstractBeanMetaData beanMetaData)
@@ -46,7 +46,7 @@
       super(beanMetaData);
    }
 
-   protected void setLifecycle(AbstractBeanMetaData beanMetaData, LifecycleMetaData lifecycle)
+   protected void setLifecycle(AbstractBeanMetaData beanMetaData, AbstractInstallMetaData lifecycle)
    {
       List<InstallMetaData> installs = beanMetaData.getInstalls();
       if (installs == null)
@@ -54,7 +54,6 @@
          installs = new ArrayList<InstallMetaData>();
          beanMetaData.setInstalls(installs);
       }
-      installs.add((InstallMetaData) lifecycle);
+      installs.add(lifecycle);
    }
-
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/LifecycleMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/LifecycleMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/LifecycleMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -35,27 +35,30 @@
  *
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public abstract class LifecycleMetaDataBuilder extends StateMetaDataBuilder
+public abstract class LifecycleMetaDataBuilder extends StateMetaDataBuilder<LifecycleMetaData>
 {
    protected ParameterMetaDataBuilderImpl<AbstractLifecycleMetaData> builder;
 
-   public LifecycleMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   protected LifecycleMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
       super(beanMetaData);
    }
 
    abstract LifecycleMetaData getLifecycle(AbstractBeanMetaData beanMetaData);
 
-   protected AbstractLifecycleMetaData createLifecycleMetaData()
+   protected LifecycleMetaData createLifecycleMetaData()
    {
       return new AbstractLifecycleMetaData();
    }
 
-   protected void applyAfterSet(AbstractLifecycleMetaData lifecycle)
+   protected void applyAfterSet(LifecycleMetaData lifecycle)
    {
-      builder = new ParameterMetaDataBuilderImpl<AbstractLifecycleMetaData>(lifecycle);
+      builder = new ParameterMetaDataBuilderImpl<AbstractLifecycleMetaData>((AbstractLifecycleMetaData)lifecycle);
    }
 
+   /**
+    * Check lifecycle.
+    */
    protected void checkLlifecycle()
    {
       LifecycleMetaData lifecycle = getLifecycle(beanMetaData);
@@ -65,16 +68,29 @@
       }
    }
 
+   /**
+    * Add parameter.
+    *
+    * @param type the type
+    * @param value the value
+    * @return parameter builder
+    */
    public ParameterMetaDataBuilder addParameterMetaData(String type, Object value)
    {
       checkLlifecycle();
       return builder.addParameterMetaData(type, value);
    }
 
+   /**
+    * Add parameter.
+    *
+    * @param type the type
+    * @param value the value
+    * @return parameter builder
+    */
    public ParameterMetaDataBuilder addParameterMetaData(String type, ValueMetaData value)
    {
       checkLlifecycle();
       return builder.addParameterMetaData(type, value);
    }
-
 }

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyInstallCallbackMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyInstallCallbackMetaDataBuilder.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyInstallCallbackMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -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.beans.metadata.plugins.builder;
+
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+
+/**
+ * PropertyInstallCallbackMetaDataBuilder.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class PropertyInstallCallbackMetaDataBuilder extends InstallCallbackMetaDataBuilder
+{
+   public PropertyInstallCallbackMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   {
+      super(beanMetaData);
+   }
+
+   protected void setMethodInfo(AbstractCallbackMetaData lifecycle, String methodInfo)
+   {
+      lifecycle.setProperty(methodInfo);
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyUninstallCallbackMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyUninstallCallbackMetaDataBuilder.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/PropertyUninstallCallbackMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -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.beans.metadata.plugins.builder;
+
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+
+/**
+ * PropertyInstallCallbackMetaDataBuilder.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class PropertyUninstallCallbackMetaDataBuilder extends UninstallCallbackMetaDataBuilder
+{
+   public PropertyUninstallCallbackMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   {
+      super(beanMetaData);
+   }
+
+   protected void setMethodInfo(AbstractCallbackMetaData lifecycle, String methodInfo)
+   {
+      lifecycle.setProperty(methodInfo);
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StartLifecycleMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StartLifecycleMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StartLifecycleMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -35,7 +35,7 @@
    /**
     * Create a new StartLifecycleMetaDataBuilder.
     * 
-    * @param beanMetaData
+    * @param beanMetaData the bean meta data
     */
    public StartLifecycleMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
@@ -51,5 +51,4 @@
    {
       beanMetaData.setStart(lifecycle);
    }
-
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StateMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StateMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StateMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -22,7 +22,6 @@
 package org.jboss.beans.metadata.plugins.builder;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.plugins.AbstractLifecycleMetaData;
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 
@@ -31,10 +30,12 @@
  * @see BeanMetaDataBuilder
  * @see org.jboss.beans.metadata.plugins.builder.ParameterMetaDataBuilderImpl
  *
+ * @param <T> exact type
  * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
  */
-public abstract class StateMetaDataBuilder
+public abstract class StateMetaDataBuilder<T extends LifecycleMetaData>
 {
+   /** The bean meta data */
    protected AbstractBeanMetaData beanMetaData;
 
    public StateMetaDataBuilder(AbstractBeanMetaData beanMetaData)
@@ -42,22 +43,54 @@
       this.beanMetaData = beanMetaData;
    }
 
-   protected abstract void setLifecycle(AbstractBeanMetaData beanMetaData, LifecycleMetaData lifecycle);
+   /**
+    * Set lifecycle metadata to bean metadata.
+    *
+    * @param beanMetaData the bean metadata
+    * @param lifecycle the lifecycle
+    */
+   protected abstract void setLifecycle(AbstractBeanMetaData beanMetaData, T lifecycle);
 
-   protected abstract AbstractLifecycleMetaData createLifecycleMetaData();
+   /**
+    * Create lifecycle meta data.
+    *
+    * @return lifecycle metadata instance
+    */
+   protected abstract T createLifecycleMetaData();
 
-   protected abstract void applyAfterSet(AbstractLifecycleMetaData lifecycle);
+   /**
+    * Invoke after set.
+    *
+    * @param lifecycle the lifecycle
+    */
+   protected abstract void applyAfterSet(T lifecycle);
 
-   public LifecycleMetaData createLifecycleMetaData(String methodName)
+   /**
+    * Create lifecycle meta data.
+    *
+    * @param methodInfo the method info
+    * @return lifecycle meta data
+    */
+   public T createLifecycleMetaData(String methodInfo)
    {
-      AbstractLifecycleMetaData lifecycle = createLifecycleMetaData();
-      if (methodName != null)
+      T lifecycle = createLifecycleMetaData();
+      if (methodInfo != null)
       {
-         lifecycle.setMethodName(methodName);
+         setMethodInfo(lifecycle, methodInfo);
       }
       setLifecycle(beanMetaData, lifecycle);
       applyAfterSet(lifecycle);
       return lifecycle;
    }
 
+   /**
+    * Set the methid info.
+    *
+    * @param lifecycle the lifecycle
+    * @param methodInfo the method info
+    */
+   protected void setMethodInfo(T lifecycle, String methodInfo)
+   {
+      lifecycle.setMethodName(methodInfo);
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StopLifecycleMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StopLifecycleMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/StopLifecycleMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -22,6 +22,7 @@
 package org.jboss.beans.metadata.plugins.builder;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.AbstractLifecycleMetaData;
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
 
 /**

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallCallbackMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallCallbackMetaDataBuilder.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallCallbackMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -0,0 +1,59 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.beans.metadata.plugins.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.plugins.UninstallCallbackMetaData;
+import org.jboss.beans.metadata.plugins.AbstractCallbackMetaData;
+import org.jboss.beans.metadata.spi.CallbackMetaData;
+
+/**
+ * UninstallCallbackMetaDataBuilder.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class UninstallCallbackMetaDataBuilder extends AbstractCallbackMetaDataBuilder
+{
+   public UninstallCallbackMetaDataBuilder(AbstractBeanMetaData beanMetaData)
+   {
+      super(beanMetaData);
+   }
+
+   protected void setLifecycle(AbstractBeanMetaData beanMetaData, AbstractCallbackMetaData lifecycle)
+   {
+      List<CallbackMetaData> callbacks = beanMetaData.getUninstallCallbacks();
+      if (callbacks == null)
+      {
+         callbacks = new ArrayList<CallbackMetaData>();
+         beanMetaData.setUninstallCallbacks(callbacks);
+      }
+      callbacks.add(lifecycle);
+   }
+
+   protected AbstractCallbackMetaData createLifecycleMetaData()
+   {
+      return new UninstallCallbackMetaData();
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/UninstallMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -21,11 +21,11 @@
 */
 package org.jboss.beans.metadata.plugins.builder;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
-import org.jboss.beans.metadata.spi.LifecycleMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 
 /**
@@ -38,14 +38,14 @@
    /**
     * Create a new StartLifecycleMetaDataBuilder.
     *
-    * @param beanMetaData
+    * @param beanMetaData the bean meta data
     */
    public UninstallMetaDataBuilder(AbstractBeanMetaData beanMetaData)
    {
       super(beanMetaData);
    }
 
-   protected void setLifecycle(AbstractBeanMetaData beanMetaData, LifecycleMetaData lifecycle)
+   protected void setLifecycle(AbstractBeanMetaData beanMetaData, AbstractInstallMetaData lifecycle)
    {
       List<InstallMetaData> uninstalls = beanMetaData.getUninstalls();
       if (uninstalls == null)
@@ -53,7 +53,6 @@
          uninstalls = new ArrayList<InstallMetaData>();
          beanMetaData.setUninstalls(uninstalls);
       }
-      uninstalls.add((InstallMetaData) lifecycle);
+      uninstalls.add(lifecycle);
    }
-
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -34,6 +34,7 @@
 import org.jboss.beans.info.spi.BeanAccessMode;
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.Cardinality;
 
 /**
  * BeanMetaDataBuilder contract.
@@ -1108,6 +1109,266 @@
    public abstract ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired);
 
    /**
+    * Add property install callback.
+    *
+    * @param property the property name
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyInstallCallback(String property)
+   {
+      return addPropertyInstallCallback(property, null, null);
+   }
+
+   /**
+    * Add property install callback.
+    *
+    * @param property the property name
+    * @param whenRequired the when required state
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyInstallCallback(String property, ControllerState whenRequired)
+   {
+      return addPropertyInstallCallback(property, whenRequired, null);
+   }
+         
+   /**
+    * Add property install callback.
+    *
+    * @param property the property name
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyInstallCallback(String property, Cardinality cardinality)
+   {
+      return addPropertyInstallCallback(property, null, cardinality);
+   }
+
+   /**
+    * Add property install callback.
+    *
+    * @param property the property name
+    * @param whenRequired the when required state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyInstallCallback(String property, ControllerState whenRequired, Cardinality cardinality)
+   {
+      return addPropertyInstallCallback(property, null, whenRequired, null, cardinality);
+   }
+
+   /**
+    * Add property install callback.
+    *
+    * @param property the property name
+    * @param signature the property signature
+    * @param whenRequired the when required state
+    * @param dependentState the dependant state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addPropertyInstallCallback(
+         String property,
+         String signature,
+         ControllerState whenRequired,
+         ControllerState dependentState,
+         Cardinality cardinality);
+
+   /**
+    * Add property uninstall callback.
+    *
+    * @param property the property name
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyUninstallCallback(String property)
+   {
+      return addPropertyUninstallCallback(property, null, null);
+   }
+
+   /**
+    * Add property uninstall callback.
+    *
+    * @param property the property name
+    * @param whenRequired the when required state
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyUninstallCallback(String property, ControllerState whenRequired)
+   {
+      return addPropertyUninstallCallback(property, whenRequired, null);
+   }
+
+   /**
+    * Add property uninstall callback.
+    *
+    * @param property the property name
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyUninstallCallback(String property, Cardinality cardinality)
+   {
+      return addPropertyUninstallCallback(property, null, cardinality);
+   }
+
+   /**
+    * Add property uninstall callback.
+    *
+    * @param property the property name
+    * @param whenRequired the when required state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addPropertyUninstallCallback(String property, ControllerState whenRequired, Cardinality cardinality)
+   {
+      return addPropertyUninstallCallback(property, null, whenRequired, null, cardinality);
+   }
+
+   /**
+    * Add property uninstall callback.
+    *
+    * @param property the property name
+    * @param signature the property signature
+    * @param whenRequired the when required state
+    * @param dependentState the dependant state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addPropertyUninstallCallback(
+         String property,
+         String signature,
+         ControllerState whenRequired,
+         ControllerState dependentState,
+         Cardinality cardinality);
+
+   /**
+    * Add method install callback.
+    *
+    * @param method the method name
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodInstallCallback(String method)
+   {
+      return addMethodInstallCallback(method, null, null);
+   }
+
+   /**
+    * Add method install callback.
+    *
+    * @param method the method name
+    * @param whenRequired the when required state
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodInstallCallback(String method, ControllerState whenRequired)
+   {
+      return addMethodInstallCallback(method, whenRequired, null);
+   }
+
+   /**
+    * Add method install callback.
+    *
+    * @param method the method name
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodInstallCallback(String method, Cardinality cardinality)
+   {
+      return addMethodInstallCallback(method, null, cardinality);
+   }
+
+   /**
+    * Add method install callback.
+    *
+    * @param method the method name
+    * @param whenRequired the when required state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodInstallCallback(String method, ControllerState whenRequired, Cardinality cardinality)
+   {
+      return addMethodInstallCallback(method, null, whenRequired, null, cardinality);
+   }
+
+   /**
+    * Add method install callback.
+    *
+    * @param method the method name
+    * @param signature the method signature
+    * @param whenRequired the when required state
+    * @param dependentState the dependant state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addMethodInstallCallback(
+         String method,
+         String signature,
+         ControllerState whenRequired,
+         ControllerState dependentState,
+         Cardinality cardinality);
+
+   /**
+    * Add method uninstall callback.
+    *
+    * @param method the method name
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodUninstallCallback(String method)
+   {
+      return addMethodUninstallCallback(method, null, null);
+   }
+
+   /**
+    * Add method uninstall callback.
+    *
+    * @param method the method name
+    * @param whenRequired the when required state
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodUninstallCallback(String method, ControllerState whenRequired)
+   {
+      return addMethodUninstallCallback(method, whenRequired, null);
+   }
+
+   /**
+    * Add method uninstall callback.
+    *
+    * @param method the method name
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodUninstallCallback(String method, Cardinality cardinality)
+   {
+      return addMethodUninstallCallback(method, null, cardinality);
+   }
+
+   /**
+    * Add method uninstall callback.
+    *
+    * @param method the method name
+    * @param whenRequired the when required state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addMethodUninstallCallback(String method, ControllerState whenRequired, Cardinality cardinality)
+   {
+      return addMethodUninstallCallback(method, null, whenRequired, null, cardinality);
+   }
+
+   /**
+    * Add method uninstall callback.
+    *
+    * @param method the method name
+    * @param signature the method signature
+    * @param whenRequired the when required state
+    * @param dependentState the dependant state
+    * @param cardinality the cardinality
+    * @return the builder
+    */
+   public abstract BeanMetaDataBuilder addMethodUninstallCallback(
+         String method,
+         String signature,
+         ControllerState whenRequired,
+         ControllerState dependentState,
+         Cardinality cardinality);
+
+   /**
     * Create a null value
     * 
     * @return the null value

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleCallbackBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleCallbackBean.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/support/SimpleCallbackBean.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -0,0 +1,53 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.config.support;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
+ */
+public class SimpleCallbackBean
+{
+   private Set<Transformer<?>> transformers = new HashSet<Transformer<?>>();
+
+   public Set<Transformer<?>> getTransformers()
+   {
+      return transformers;
+   }
+
+   public void setTransformers(Set<Transformer<?>> transformers)
+   {
+      this.transformers = transformers;
+   }
+
+   public void addTransformer(Transformer<?> transformer)
+   {
+      transformers.add(transformer);
+   }
+
+   public void removeTransformer(Transformer<?> transformer)
+   {
+      transformers.remove(transformer);
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java	2008-03-21 22:39:57 UTC (rev 71170)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/config/test/BeanMetaDataBuilderTestCase.java	2008-03-22 12:23:42 UTC (rev 71171)
@@ -30,8 +30,11 @@
 
 import junit.framework.Test;
 import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
+import org.jboss.beans.metadata.plugins.InstallCallbackMetaData;
+import org.jboss.beans.metadata.plugins.UninstallCallbackMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.beans.metadata.spi.CallbackMetaData;
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.plugins.deployment.AbstractKernelDeployer;
@@ -39,7 +42,13 @@
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.test.kernel.config.support.SimpleBean;
+import org.jboss.test.kernel.config.support.SimpleCallbackBean;
 import org.jboss.test.kernel.config.support.SimpleLifecycleBean;
+import org.jboss.test.kernel.config.support.TrimTransformer;
+import org.jboss.test.kernel.config.support.Transformer;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.Cardinality;
+
 /**
  * Builder TestCase.
  *
@@ -154,13 +163,17 @@
       AbstractKernelDeployer deployer = new AbstractKernelDeployer(kernel);
 
       deployer.deploy(deployment);
-
-      Object db = controller.getInstalledContext("DemandBean").getTarget();
-      assertNotNull(db);
-      Object sb = controller.getInstalledContext("SupplyBean").getTarget();
-      assertNotNull(sb);
-
-      deployer.undeploy(deployment);
+      try
+      {
+         Object db = controller.getInstalledContext("DemandBean").getTarget();
+         assertNotNull(db);
+         Object sb = controller.getInstalledContext("SupplyBean").getTarget();
+         assertNotNull(sb);
+      }
+      finally
+      {
+         deployer.undeploy(deployment);
+      }
    }
 
    @SuppressWarnings("deprecation")
@@ -181,13 +194,17 @@
       AbstractKernelDeployer deployer = new AbstractKernelDeployer(kernel);
 
       deployer.deploy(deployment);
-
-      Object db = controller.getInstalledContext("DependOnBean").getTarget();
-      assertNotNull(db);
-      Object rb = controller.getInstalledContext("DependencyResolver").getTarget();
-      assertNotNull(rb);
-
-      deployer.undeploy(deployment);
+      try
+      {
+         Object db = controller.getInstalledContext("DependOnBean").getTarget();
+         assertNotNull(db);
+         Object rb = controller.getInstalledContext("DependencyResolver").getTarget();
+         assertNotNull(rb);
+      }
+      finally
+      {
+         deployer.undeploy(deployment);
+      }
    }
 
    @SuppressWarnings("deprecation")
@@ -228,36 +245,42 @@
       AbstractKernelDeployer deployer = new AbstractKernelDeployer(kernel);
 
       deployer.deploy(deployment);
-      
-      Object o = controller.getInstalledContext("CollectionBean").getTarget();
-      assertNotNull(o);
-      assertInstanceOf(o, SimpleBean.class);
-      SimpleBean bean = (SimpleBean)o;
-      
-      Object[] arr = bean.getArray();
-      assertEquals(2, arr.length);
-      assertEquals(5, arr[0]);
-      assertEquals(10, arr[1]);
-      
-      List<?> lst = bean.getList();
-      assertEquals(2, lst.size());
-      assertEquals("One", lst.get(0));
-      assertEquals("Two", lst.get(1));
-      
-      Set<?> st = bean.getSet();
-      assertEquals(2, lst.size());
-      assertTrue(st.contains("En"));
-      assertTrue(st.contains("To"));
-      
-      Collection<?> coll = bean.getCollection();
-      assertEquals(2, lst.size());
-      assertTrue(coll.contains("Eins"));
-      assertTrue(coll.contains("Zwei"));
-      
-      Map<?, ?> mp = bean.getMap();
-      assertEquals(2, mp.size());
-      assertEquals("Uno", mp.get("One"));
-      assertEquals("Dos", mp.get("Two"));
+      try
+      {
+         Object o = controller.getInstalledContext("CollectionBean").getTarget();
+         assertNotNull(o);
+         assertInstanceOf(o, SimpleBean.class);
+         SimpleBean bean = (SimpleBean)o;
+
+         Object[] arr = bean.getArray();
+         assertEquals(2, arr.length);
+         assertEquals(5, arr[0]);
+         assertEquals(10, arr[1]);
+
+         List<?> lst = bean.getList();
+         assertEquals(2, lst.size());
+         assertEquals("One", lst.get(0));
+         assertEquals("Two", lst.get(1));
+
+         Set<?> st = bean.getSet();
+         assertEquals(2, lst.size());
+         assertTrue(st.contains("En"));
+         assertTrue(st.contains("To"));
+
+         Collection<?> coll = bean.getCollection();
+         assertEquals(2, lst.size());
+         assertTrue(coll.contains("Eins"));
+         assertTrue(coll.contains("Zwei"));
+
+         Map<?, ?> mp = bean.getMap();
+         assertEquals(2, mp.size());
+         assertEquals("Uno", mp.get("One"));
+         assertEquals("Dos", mp.get("Two"));
+      }
+      finally
+      {
+         deployer.undeploy(deployment);
+      }
    }
    
    @SuppressWarnings("deprecation")
@@ -300,30 +323,424 @@
       AbstractKernelDeployer deployer = new AbstractKernelDeployer(kernel);
 
       deployer.deploy(deployment);
-      
-      Object o = controller.getInstalledContext("ReplaceBean").getTarget();
-      assertNotNull(o);
-      assertInstanceOf(o, SimpleBean.class);
-      SimpleBean bean = (SimpleBean)o;
-      
-      Integer integer = bean.getAnInt();
-      assertEquals(new Integer(5), integer);
-      
-      String string = bean.getAString();
-      assertEquals("Two", string);
-      
-      Object obj = bean.getAnObject();
-      assertEquals("Four", obj);
-      
-      Object[] arr = bean.getArray();
-      assertEquals(2, arr.length);
-      assertEquals(5, arr[0]);
-      assertEquals(10, arr[1]);
-      
-      Map<?, ?> mp = bean.getMap();
-      assertEquals(2, mp.size());
-      assertEquals("Uno", mp.get("One"));
-      assertEquals("Dos", mp.get("Two"));
+      try
+      {
+         Object o = controller.getInstalledContext("ReplaceBean").getTarget();
+         assertNotNull(o);
+         assertInstanceOf(o, SimpleBean.class);
+         SimpleBean bean = (SimpleBean)o;
+
+         Integer integer = bean.getAnInt();
+         assertEquals(new Integer(5), integer);
+
+         String string = bean.getAString();
+         assertEquals("Two", string);
+
+         Object obj = bean.getAnObject();
+         assertEquals("Four", obj);
+
+         Object[] arr = bean.getArray();
+         assertEquals(2, arr.length);
+         assertEquals(5, arr[0]);
+         assertEquals(10, arr[1]);
+
+         Map<?, ?> mp = bean.getMap();
+         assertEquals(2, mp.size());
+         assertEquals("Uno", mp.get("One"));
+         assertEquals("Dos", mp.get("Two"));
+      }
+      finally
+      {
+         deployer.undeploy(deployment);
+      }
    }
 
+   public void testCallbacks() throws Throwable
+   {
+      BeanMetaDataBuilder builder;
+      BeanMetaData beanMetaData;
+      List<CallbackMetaData> callbacks;
+      CallbackMetaData callback;
+      KernelControllerContext cc;
+      Object target;
+      Transformer<?> transformer;
+      SimpleCallbackBean bean;
+
+      Kernel kernel = bootstrap();
+      KernelController controller = kernel.getController();
+      try
+      {
+         beanMetaData = BeanMetaDataBuilder.createBuilder("t", TrimTransformer.class.getName()).getBeanMetaData();
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         transformer = assertInstanceOf(target, Transformer.class);
+
+         // ct1
+
+         builder = BeanMetaDataBuilder.createBuilder("ct1", SimpleCallbackBean.class.getName());
+         builder.addPropertyInstallCallback("transformers");
+         builder.addPropertyUninstallCallback("transformers");
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct2
+
+         builder = BeanMetaDataBuilder.createBuilder("ct2", SimpleCallbackBean.class.getName());
+         builder.addPropertyInstallCallback("transformers", Cardinality.ONE_TO_MANY);
+         builder.addPropertyUninstallCallback("transformers", Cardinality.ONE_TO_MANY);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertEquals(Cardinality.ONE_TO_MANY, callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertEquals(Cardinality.ONE_TO_MANY, callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct3
+
+         builder = BeanMetaDataBuilder.createBuilder("ct3", SimpleCallbackBean.class.getName());
+         builder.addPropertyInstallCallback("transformers", ControllerState.CREATE);
+         builder.addPropertyUninstallCallback("transformers", ControllerState.CREATE);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct4
+
+         builder = BeanMetaDataBuilder.createBuilder("ct4", SimpleCallbackBean.class.getName());
+         builder.addPropertyInstallCallback("transformers", Set.class.getName(), ControllerState.CREATE, ControllerState.START, Cardinality.ZERO_TO_ONE);
+         builder.addPropertyUninstallCallback("transformers", Set.class.getName(), ControllerState.CREATE, ControllerState.START, Cardinality.ZERO_TO_ONE);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.START, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertEquals(Set.class.getName(), callback.getSignature());
+         assertEquals(Cardinality.ZERO_TO_ONE, callback.getCardinality());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("transformers", callback.getProperty());
+         assertEquals(ControllerState.START, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertEquals(Set.class.getName(), callback.getSignature());
+         assertEquals(Cardinality.ZERO_TO_ONE, callback.getCardinality());
+         assertNull(callback.getMethodName());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct1
+
+         builder = BeanMetaDataBuilder.createBuilder("mct1", SimpleCallbackBean.class.getName());
+         builder.addMethodInstallCallback("addTransformer");
+         builder.addMethodUninstallCallback("removeTransformer");
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("addTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("removeTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct2
+
+         builder = BeanMetaDataBuilder.createBuilder("mct2", SimpleCallbackBean.class.getName());
+         builder.addMethodInstallCallback("addTransformer", Cardinality.ONE_TO_MANY);
+         builder.addMethodUninstallCallback("removeTransformer", Cardinality.ONE_TO_MANY);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("addTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertEquals(Cardinality.ONE_TO_MANY, callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("removeTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertNull(callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertEquals(Cardinality.ONE_TO_MANY, callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct3
+
+         builder = BeanMetaDataBuilder.createBuilder("mct3", SimpleCallbackBean.class.getName());
+         builder.addMethodInstallCallback("addTransformer", ControllerState.CREATE);
+         builder.addMethodUninstallCallback("removeTransformer", ControllerState.CREATE);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("addTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("removeTransformer", callback.getMethodName());
+         assertEquals(ControllerState.INSTALLED, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertNull(callback.getSignature());
+         assertNull(callback.getProperty());
+         assertNull(callback.getCardinality());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+
+         // ct4
+
+         builder = BeanMetaDataBuilder.createBuilder("mct4", SimpleCallbackBean.class.getName());
+         builder.addMethodInstallCallback("addTransformer", Transformer.class.getName(), ControllerState.CREATE, ControllerState.START, Cardinality.ZERO_TO_ONE);
+         builder.addMethodUninstallCallback("removeTransformer", Transformer.class.getName(), ControllerState.CREATE, ControllerState.START, Cardinality.ZERO_TO_ONE);
+         beanMetaData = builder.getBeanMetaData();
+
+         callbacks = beanMetaData.getInstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, InstallCallbackMetaData.class, false);
+         assertEquals("addTransformer", callback.getMethodName());
+         assertEquals(ControllerState.START, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertEquals(Transformer.class.getName(), callback.getSignature());
+         assertEquals(Cardinality.ZERO_TO_ONE, callback.getCardinality());
+         assertNull(callback.getProperty());
+         assertNull(callback.getParameters());
+
+         callbacks = beanMetaData.getUninstallCallbacks();
+         assertNotNull(callbacks);
+         assertEquals(1, callbacks.size());
+         callback = callbacks.get(0);
+         assertNotNull(callback);
+         assertInstanceOf(callback, UninstallCallbackMetaData.class, false);
+         assertEquals("removeTransformer", callback.getMethodName());
+         assertEquals(ControllerState.START, callback.getDependentState());
+         assertEquals(ControllerState.CREATE, callback.getState());
+         assertEquals(Transformer.class.getName(), callback.getSignature());
+         assertEquals(Cardinality.ZERO_TO_ONE, callback.getCardinality());
+         assertNull(callback.getProperty());
+         assertNull(callback.getParameters());
+
+         cc = controller.install(beanMetaData);
+         assertNotNull(cc);
+         assertEquals(ControllerState.INSTALLED, cc.getState());
+         target = cc.getTarget();
+         assertNotNull(target);
+         bean = assertInstanceOf(target, SimpleCallbackBean.class);
+         assertNotNull(bean.getTransformers());
+         assertEquals(1, bean.getTransformers().size());
+         assertSame(transformer, bean.getTransformers().iterator().next());
+      }
+      finally
+      {
+         controller.shutdown();
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list