[jboss-cvs] JBossAS SVN: r69987 - in projects/microcontainer/trunk/kernel/src: main/org/jboss/beans/metadata/plugins and 13 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Feb 20 18:53:26 EST 2008


Author: alesj
Date: 2008-02-20 18:53:25 -0500 (Wed, 20 Feb 2008)
New Revision: 69987

Added:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java
   projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallDependencyXMLTestCase2.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyXMLTestCase1.xml
   projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/InstallWithWhenRequired.xml
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallWhenRequiredErrorTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/AnnotatedSimpleBeanInstallsAware.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/ExternalInstallWithStateSimpleBeanImpl.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanInstallsAware.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/StateAwareBean.java
Modified:
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ExternalInstall.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/FromContext.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/InstallMethod.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/UninstallMethod.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/FromContext.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/spi/builder/BeanMetaDataBuilder.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallMethodParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallMethodParameterAnnotationPlugin.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractConfigureAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/CreateDestroyLifecycleAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstantiateAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/LifecycleAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/StartStopLifecycleAction.java
   projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/InstallHandler.java
   projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd
   projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/FromContextXMLTestCase0.xml
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/ControllerTestSuite.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallErrorTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanRepository.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/AbstractKernelDependencyTest.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextAnnotationTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyAnnotationTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyAnnotationTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/NameAwareBean.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallJaxbTestCase.java
   projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallTestCase.java
Log:
JBMICROCONT-242; enable installs/uninstalls for any state

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ExternalInstall.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ExternalInstall.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/ExternalInstall.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -58,6 +58,13 @@
    String dependantState() default "";
 
    /**
+    * Get the when required state.
+    *
+    * @return the when required state
+    */
+   String whenRequired() default "";
+
+   /**
     * Get parameters.
     *
     * @return the parameters

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/FromContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/FromContext.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/FromContext.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -35,6 +35,7 @@
    METADATA("metadata"),
    BEANINFO("beaninfo"),
    SCOPE("scope"),
+   STATE("state"),
    ID("id"),
    CONTEXT("context");
 

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/InstallMethod.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/InstallMethod.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/InstallMethod.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -41,4 +41,11 @@
     * @return the dependant state
     */
    String dependantState() default "";
+
+   /**
+    * Get when required state.
+    *
+    * @return the when required state
+    */
+   String whenRequired() default "";
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/UninstallMethod.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/UninstallMethod.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/api/annotations/UninstallMethod.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -41,4 +41,11 @@
     * @return the dependant state
     */
    String dependantState() default "";
+
+   /**
+    * Get when required state.
+    *
+    * @return the when required state
+    */
+   String whenRequired() default "";
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -197,7 +197,8 @@
    public Object getUnderlyingValue()
    {
       Object original = super.getUnderlyingValue();
-      return (fromContext != null && original == null) ? context.getName() : original;
+      // might be used for internal compare, in that case context will still be null
+      return (fromContext != null && original == null) ? (context != null ? context.getName() : null) : original;
    }
 
    public void initialVisit(MetaDataVisitor visitor)

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/AbstractLifecycleMetaData.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -88,9 +88,11 @@
       return state;
    }
 
+   @XmlAttribute(name="whenRequired")
    public void setState(ControllerState state)
    {
       this.state = state;
+      flushJBossObjectCache();
    }
 
    public String getMethodName()
@@ -190,6 +192,7 @@
    {
       if (methodName != null)
          buffer.append("method=").append(methodName);
+      buffer.append(" whenRequired=").append(state);
       buffer.append(" parameters=");
       JBossObject.list(buffer, parameters);
       buffer.append(" ");

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/FromContext.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/FromContext.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/FromContext.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -32,6 +32,7 @@
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.info.spi.helpers.UnmodifiableBeanInfo;
 import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.helpers.UnmodifiableControllerContext;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.dependency.helpers.UnmodifiableKernelControllerContext;
@@ -75,6 +76,9 @@
    /** scope */
    public static final FromContext<? extends ControllerContext> SCOPE = new ScopeFromContext("scope");
 
+   /** state */
+   public static final FromContext<? extends ControllerContext> STATE = new StateFromContext("state");
+
    /** id */
    public static final FromContext<? extends ControllerContext> ID = new IdFromContext("id");
 
@@ -114,6 +118,8 @@
          return BEANINFO;
       else if (SCOPE.getFromString().equalsIgnoreCase(fromString))
          return SCOPE;
+      else if (STATE.getFromString().equalsIgnoreCase(fromString))
+         return STATE;
       else if (ID.getFromString().equalsIgnoreCase(fromString))
          return ID;
       else if (CONTEXT.getFromString().equalsIgnoreCase(fromString))
@@ -277,6 +283,21 @@
       }
    }
 
+   private static class StateFromContext extends FromContext<ControllerContext>
+   {
+      private static final long serialVersionUID = 1L;
+
+      public StateFromContext(String fromString)
+      {
+         super(fromString);
+      }
+
+      public ControllerState internalExecute(ControllerContext context)
+      {
+         return context.getState();
+      }
+   }
+
    private static class IdFromContext extends FromContext<ControllerContext>
    {
       private static final long serialVersionUID = 1L;

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-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/plugins/builder/BeanMetaDataBuilderImpl.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -388,21 +388,25 @@
       return this;
    }
 
-   public ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state)
+   public ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired)
    {
       AbstractInstallMetaData install = (AbstractInstallMetaData) installBuilder.createLifecycleMetaData(methodName);
       install.setBean(bean);
       if (state != null)
          install.setDependentState(state);
+      if (whenRequired != null)
+         install.setState(whenRequired);
       return new ParameterMetaDataBuilderImpl<AbstractInstallMetaData>(install);
    }
 
-   public ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state)
+   public ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired)
    {
       AbstractInstallMetaData uninstall = (AbstractInstallMetaData) uninstallBuilder.createLifecycleMetaData(methodName);
       uninstall.setBean(bean);
       if (state != null)
          uninstall.setDependentState(state);
+      if (whenRequired != null)
+         uninstall.setState(whenRequired);
       return new ParameterMetaDataBuilderImpl<AbstractInstallMetaData>(uninstall);
    }
 

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-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/beans/metadata/spi/builder/BeanMetaDataBuilder.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -596,12 +596,26 @@
     * 
     * @param methodName the method name
     * @param bean the bean name
-    * @param state the state when to install
+    * @param state the state of the bean
     * @return the builder
     */
    public BeanMetaDataBuilder addInstallWithThis(String methodName, String bean, ControllerState state)
    {
-      ParameterMetaDataBuilder parameters = addInstallWithParameters(methodName, bean, state);
+      return addInstallWithThis(methodName, bean, state, null);
+   }
+
+   /**
+    * Add an install with a this parameter
+    *
+    * @param methodName the method name
+    * @param bean the bean name
+    * @param state the state of the bean
+    * @param whenRequired the state when to install
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addInstallWithThis(String methodName, String bean, ControllerState state, ControllerState whenRequired)
+   {
+      ParameterMetaDataBuilder parameters = addInstallWithParameters(methodName, bean, state, whenRequired);
       parameters.addParameterMetaData(null, createThis());
       return this;
    }
@@ -746,12 +760,26 @@
     * 
     * @param methodName the method name
     * @param bean the bean name
-    * @param state the state when to install
+    * @param state the state of the bean
     * @return the parameter builder
     */
-   public abstract ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state);
+   public ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state)
+   {
+      return addInstallWithParameters(methodName, bean, state, null);
+   }
 
    /**
+    * Add an install
+    *
+    * @param methodName the method name
+    * @param bean the bean name
+    * @param state the state of the bean
+    * @param whenRequired the state when to install
+    * @return the parameter builder
+    */
+   public abstract ParameterMetaDataBuilder addInstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired);
+
+   /**
     * Add an uninstall
     * 
     * @param methodName the method name
@@ -862,7 +890,21 @@
     */
    public BeanMetaDataBuilder addUninstallWithThis(String methodName, String bean, ControllerState state)
    {
-      ParameterMetaDataBuilder parameters = addUninstallWithParameters(methodName, bean, state);
+      return addUninstallWithThis(methodName, bean, state, null);
+   }
+
+   /**
+    * Add an uninstall with a this parameter
+    *
+    * @param methodName the method name
+    * @param bean the bean name
+    * @param state the state of the bean
+    * @param whenRequired the state when to uninstall
+    * @return the builder
+    */
+   public BeanMetaDataBuilder addUninstallWithThis(String methodName, String bean, ControllerState state, ControllerState whenRequired)
+   {
+      ParameterMetaDataBuilder parameters = addUninstallWithParameters(methodName, bean, state, whenRequired);
       parameters.addParameterMetaData(null, createThis());
       return this;
    }
@@ -1007,12 +1049,26 @@
     * 
     * @param methodName the method name
     * @param bean the bean name
-    * @param state the state when to install
+    * @param state the state of the bean
     * @return the parameter builder
     */
-   public abstract ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state);
+   public ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state)
+   {
+      return addUninstallWithParameters(methodName, bean, state, null);
+   }
    
    /**
+    * Add an uninstall
+    *
+    * @param methodName the method name
+    * @param bean the bean name
+    * @param state the state of the bean
+    * @param whenRequired the state when to uninstall
+    * @return the parameter builder
+    */
+   public abstract ParameterMetaDataBuilder addUninstallWithParameters(String methodName, String bean, ControllerState state, ControllerState whenRequired);
+
+   /**
     * Create a null value
     * 
     * @return the null value

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/ExternalInstallationAnnotationPlugin.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -94,6 +94,8 @@
       AbstractInstallMetaData installMetaData = new AbstractInstallMetaData();
       installMetaData.setBean(install.bean());
       installMetaData.setMethodName(install.method());
+      if (isAttributePresent(install.whenRequired()))
+         installMetaData.setState(new ControllerState(install.whenRequired()));
       if (isAttributePresent(install.dependantState()))
          installMetaData.setDependentState(new ControllerState(install.dependantState()));
       for (Value value : install.parameters())
@@ -160,6 +162,12 @@
       if (notEqual(first.getMethodName(), second.getMethodName()))
          return true;
 
+      if (notEqual(first.getState(), second.getState()))
+         return true;
+
+      if (notEqual(first.getDependentState(), second.getDependentState()))
+         return true;
+
       List<ParameterMetaData> fstParameters = first.getParameters();
       List<ParameterMetaData> sndParameters = second.getParameters();
       int fstSize = fstParameters != null ? fstParameters.size() : 0;

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallMethodParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallMethodParameterAnnotationPlugin.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/InstallMethodParameterAnnotationPlugin.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -54,6 +54,8 @@
    {
       AbstractInstallMetaData install = new AbstractInstallMetaData();
       install.setMethodName(info.getName());
+      if (isAttributePresent(annotation.whenRequired()))
+         install.setState(new ControllerState(annotation.whenRequired()));
       if (isAttributePresent(annotation.dependantState()))
          install.setDependentState(new ControllerState(annotation.dependantState()));
       return install;

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallMethodParameterAnnotationPlugin.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallMethodParameterAnnotationPlugin.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/annotations/UninstallMethodParameterAnnotationPlugin.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -54,6 +54,8 @@
    {
       AbstractInstallMetaData uninstall = new AbstractInstallMetaData();
       uninstall.setMethodName(info.getName());
+      if (isAttributePresent(annotation.whenRequired()))
+         uninstall.setState(new ControllerState(annotation.whenRequired()));
       if (isAttributePresent(annotation.dependantState()))
          uninstall.setDependentState(new ControllerState(annotation.dependantState()));
       return uninstall;

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractConfigureAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractConfigureAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/AbstractConfigureAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -29,13 +29,14 @@
 import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.StartKernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * AbstractConfigureAction.
  *
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  */
-public abstract class AbstractConfigureAction extends KernelControllerContextAction
+public abstract class AbstractConfigureAction extends InstallsAwareAction
 {
    protected Class<? extends KernelControllerContextAware> getActionAwareInterface()
    {
@@ -48,6 +49,7 @@
 
    /**
     * Execute KCCA install.
+    * 
     * @param context the controller context
     * @throws Throwable for any erroor
     */
@@ -97,4 +99,9 @@
                !InstantiateKernelControllerContextAware.class.isAssignableFrom(clazz) &&
                !StartKernelControllerContextAware.class.isAssignableFrom(clazz));
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.CONFIGURED;
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/CreateDestroyLifecycleAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/CreateDestroyLifecycleAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/CreateDestroyLifecycleAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -25,6 +25,7 @@
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
 import org.jboss.kernel.spi.dependency.CreateKernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * CreateDestroyLifecycleAction.
@@ -59,4 +60,9 @@
    {
       return "destroy";
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.CREATE;
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/DescribeAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -31,6 +31,7 @@
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.metadata.KernelMetaDataRepository;
 import org.jboss.metadata.spi.MetaData;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * DescribeAction.
@@ -38,7 +39,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public class DescribeAction extends KernelControllerContextAction
+public class DescribeAction extends InstallsAwareAction
 {
    @SuppressWarnings("unchecked")
    protected void installActionInternal(KernelControllerContext context) throws Throwable
@@ -97,4 +98,9 @@
       BeanAnnotationAdapterFactory factory = BeanAnnotationAdapterFactory.getInstance();
       return factory.getBeanAnnotationAdapter();
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.DESCRIBED;
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -21,14 +21,9 @@
 */
 package org.jboss.kernel.plugins.dependency;
 
-import java.util.List;
-
 import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.beans.metadata.spi.InstallMetaData;
-import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.Kernel;
-import org.jboss.kernel.plugins.dispatch.InvokeDispatchHelper;
 import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.kernel.spi.dependency.InstallKernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.KernelController;
@@ -42,7 +37,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public class InstallAction extends KernelControllerContextAction
+public class InstallAction extends InstallsAwareAction
 {
    protected void installActionInternal(KernelControllerContext context) throws Throwable
    {
@@ -57,54 +52,6 @@
       try
       {
          controller.addSupplies(context);
-         try
-         {
-            List<InstallMetaData> installs = metaData.getInstalls();
-            if (installs != null)
-            {
-               for (InstallMetaData install : installs)
-               {
-                  ControllerContext target = context;
-                  if (install.getBean() != null)
-                     target = controller.getContext(install.getBean(), install.getDependentState());
-                  if (target instanceof InvokeDispatchContext)
-                  {
-                     ClassLoader previous = SecurityActions.setContextClassLoader(context);
-                     try
-                     {
-                        InvokeDispatchHelper.invoke(
-                              configurator,
-                              target.getTarget(),
-                              (InvokeDispatchContext)target,
-                              install.getMethodName(),
-                              install.getParameters()
-                        );
-                     }
-                     finally
-                     {
-                        SecurityActions.resetContextClassLoader(previous);
-                     }
-                  }
-                  else
-                  {
-                     throw new IllegalArgumentException("Cannot install, context " + target + " does not implement InvokeDispatchContext");
-                  }
-               }
-            }
-         }
-         catch (Throwable t)
-         {
-            doUninstalls(context);
-            try
-            {
-               controller.removeSupplies(context);
-            }
-            catch (Throwable x)
-            {
-               log.warn("Ignoring error reversing supplies, throwing original error " + name, x);
-            }
-            throw t;
-         }
       }
       catch (Throwable t)
       {
@@ -127,7 +74,6 @@
 
    protected void uninstallActionInternal(KernelControllerContext context)
    {
-      doUninstalls(context);
       KernelController controller = (KernelController) context.getController();
       Kernel kernel = controller.getKernel();
       KernelRegistry registry = kernel.getRegistry();
@@ -152,58 +98,8 @@
       }
    }
 
-   protected void doUninstalls(KernelControllerContext context)
+   protected ControllerState getState()
    {
-      KernelController controller = (KernelController) context.getController();
-      Kernel kernel = controller.getKernel();
-      KernelConfigurator configurator = kernel.getConfigurator();
-      BeanMetaData metaData = context.getBeanMetaData();
-
-      List<InstallMetaData> uninstalls = metaData.getUninstalls();
-      if (uninstalls != null)
-      {
-         for (int i = uninstalls.size()-1; i >= 0; --i)
-         {
-            InstallMetaData uninstall = uninstalls.get(i);
-            ControllerContext target = context;
-            if (uninstall.getBean() != null)
-            {
-               target = controller.getContext(uninstall.getBean(), uninstall.getDependentState());
-               if (target == null)
-               {
-                  log.warn("Ignoring uninstall action on target in incorrect state " + uninstall.getBean());
-                  continue;
-               }
-            }
-            if (target instanceof InvokeDispatchContext)
-            {
-               ClassLoader previous = null;
-               try
-               {
-                  previous = SecurityActions.setContextClassLoader(context);
-                  InvokeDispatchHelper.invoke(
-                        configurator,
-                        target.getTarget(), 
-                        (InvokeDispatchContext)target,
-                        uninstall.getMethodName(),
-                        uninstall.getParameters()
-                  );
-               }
-               catch (Throwable t)
-               {
-                  log.warn("Ignoring uninstall action on target " + uninstall, t);
-               }
-               finally
-               {
-                  if (previous != null)
-                     SecurityActions.resetContextClassLoader(previous);
-               }
-            }
-            else
-            {
-               log.warn("Cannot uninstall, context " + target + " does not implement InvokeDispatchContext for " + uninstall.getBean());
-            }
-         }
-      }
+      return ControllerState.INSTALLED;
    }
 }
\ No newline at end of file

Added: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstallsAwareAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,221 @@
+/*
+* 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.dependency;
+
+import java.util.List;
+
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.InstallMetaData;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.plugins.dispatch.InvokeDispatchHelper;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+
+/**
+ * Installs/Uninstalls aware action.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class InstallsAwareAction extends KernelControllerContextAction
+{
+   /**
+    * Get the action's state.
+    *
+    * @return get the action's state
+    */
+   protected abstract ControllerState getState();
+
+   @Override
+   public void installAction(KernelControllerContext context) throws Throwable
+   {
+      installActionInternal(context);
+      doInstalls(context);
+      setKernelControllerContext(context);
+   }
+
+   /**
+    * Execute the installs.
+    *
+    * @param context the context
+    * @throws Throwable for any error
+    */
+   protected void doInstalls(KernelControllerContext context) throws Throwable
+   {
+      KernelController controller = (KernelController)context.getController();
+      Kernel kernel = controller.getKernel();
+      KernelConfigurator configurator = kernel.getConfigurator();
+      BeanMetaData metaData = context.getBeanMetaData();
+
+      List<InstallMetaData> installs = metaData.getInstalls();
+      if (installs != null && installs.isEmpty() == false)
+      {
+         int index = 0;
+         try
+         {
+            int size = installs.size();
+            for (; index < size; index++)
+            {
+               InstallMetaData install = installs.get(index);
+               if (getState().equals(install.getState()))
+               {
+                  ControllerContext target = context;
+                  if (install.getBean() != null)
+                     target = controller.getContext(install.getBean(), install.getDependentState());
+                  if (target instanceof InvokeDispatchContext)
+                  {
+                     ClassLoader previous = SecurityActions.setContextClassLoader(context);
+                     try
+                     {
+                        InvokeDispatchHelper.invoke(
+                              configurator,
+                              target.getTarget(),
+                              (InvokeDispatchContext)target,
+                              install.getMethodName(),
+                              install.getParameters()
+                        );
+                     }
+                     finally
+                     {
+                        SecurityActions.resetContextClassLoader(previous);
+                     }
+                  }
+                  else
+                  {
+                     throw new IllegalArgumentException("Cannot install, context " + target + " does not implement InvokeDispatchContext");
+                  }
+               }
+            }
+         }
+         catch (Throwable t)
+         {
+            doUninstalls(context);
+            undoInstallAction(context);
+            throw t;
+         }
+      }
+   }
+
+   /**
+    * Undo the steps from install action
+    * in the case of failed installs.
+    * Usually this is what uninstallActionInternal does.
+    *
+    * @param context the context
+    */
+   protected void undoInstallAction(KernelControllerContext context)
+   {
+      uninstallActionInternal(context);
+   }
+
+   @Override
+   public void uninstallAction(KernelControllerContext context)
+   {
+      unsetKernelControllerContext(context);
+      doUninstalls(context);
+      uninstallActionInternal(context);
+   }
+
+   /**
+    * Execute uninstalls
+    *
+    * @param context the context
+    */
+   protected void doUninstalls(KernelControllerContext context)
+   {
+      BeanMetaData beanMetaData = context.getBeanMetaData();
+      List<InstallMetaData> uninstalls = beanMetaData.getUninstalls();
+      int size = uninstalls != null ? uninstalls.size() : 0;
+      doUninstalls(context, size - 1);
+   }
+
+   /**
+    * Execute uninstalls from the index.
+    *
+    * Leaving this method here in case
+    * someone wants to use 'symetric' approach
+    * to uninstalling installs.
+    *
+    * @param context the context
+    * @param index   the current index
+    */
+   protected void doUninstalls(KernelControllerContext context, int index)
+   {
+      KernelController controller = (KernelController) context.getController();
+      Kernel kernel = controller.getKernel();
+      KernelConfigurator configurator = kernel.getConfigurator();
+      BeanMetaData metaData = context.getBeanMetaData();
+
+      List<InstallMetaData> uninstalls = metaData.getUninstalls();
+      if (uninstalls != null && uninstalls.isEmpty() == false)
+      {
+         for (int i = index; i >= 0; --i)
+         {
+            InstallMetaData uninstall = uninstalls.get(i);
+            if (getState().equals(uninstall.getState()))
+            {
+               ControllerContext target = context;
+               if (uninstall.getBean() != null)
+               {
+                  target = controller.getContext(uninstall.getBean(), uninstall.getDependentState());
+                  if (target == null)
+                  {
+                     log.warn("Ignoring uninstall action on target in incorrect state " + uninstall.getBean());
+                     continue;
+                  }
+               }
+               if (target instanceof InvokeDispatchContext)
+               {
+                  ClassLoader previous = null;
+                  try
+                  {
+                     previous = SecurityActions.setContextClassLoader(context);
+                     InvokeDispatchHelper.invoke(
+                           configurator,
+                           target.getTarget(),
+                           (InvokeDispatchContext)target,
+                           uninstall.getMethodName(),
+                           uninstall.getParameters()
+                     );
+                  }
+                  catch (Throwable t)
+                  {
+                     log.warn("Ignoring uninstall action on target " + uninstall, t);
+                  }
+                  finally
+                  {
+                     if (previous != null)
+                        SecurityActions.resetContextClassLoader(previous);
+                  }
+               }
+               else
+               {
+                  log.warn("Cannot uninstall, context " + target + " does not implement InvokeDispatchContext for " + uninstall.getBean());
+               }
+            }
+         }
+      }
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstantiateAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstantiateAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/InstantiateAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -23,14 +23,15 @@
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.joinpoint.spi.Joinpoint;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.config.KernelConfigurator;
-import org.jboss.kernel.spi.dependency.InstantiateKernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
+import org.jboss.kernel.spi.dependency.InstantiateKernelControllerContextAware;
 
 /**
  * InstantiateAction.
@@ -38,7 +39,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public class InstantiateAction extends KernelControllerContextAction
+public class InstantiateAction extends InstallsAwareAction
 {
    protected void installActionInternal(KernelControllerContext context) throws Throwable
    {
@@ -74,11 +75,6 @@
       }
    }
 
-   protected Class<? extends KernelControllerContextAware> getActionAwareInterface()
-   {
-      return InstantiateKernelControllerContextAware.class;
-   }
-
    protected void uninstallActionInternal(KernelControllerContext context)
    {
       try
@@ -105,4 +101,14 @@
          context.setTarget(null);
       }
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.INSTANTIATED;
+   }
+
+   protected Class<? extends KernelControllerContextAware> getActionAwareInterface()
+   {
+      return InstantiateKernelControllerContextAware.class;
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/KernelControllerContextAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -135,7 +135,13 @@
       setKernelControllerContext(context);
    }
 
-   private void setKernelControllerContext(KernelControllerContext context) throws Throwable
+   /**
+    * Set the context.
+    *
+    * @param context the context
+    * @throws Throwable for any error
+    */
+   protected void setKernelControllerContext(KernelControllerContext context) throws Throwable
    {
       Object target = context.getTarget();
       if (target != null)
@@ -151,10 +157,21 @@
       }
    }
 
+   /**
+    * Execute install action.
+    *
+    * @param context the context
+    * @throws Throwable for any error
+    */
    protected void installActionInternal(KernelControllerContext context) throws Throwable
    {
    }
 
+   /**
+    * Get the action aware interface.
+    *
+    * @return the action aware interface
+    */
    protected Class<? extends KernelControllerContextAware> getActionAwareInterface()
    {
       return null;
@@ -166,11 +183,21 @@
       uninstallActionInternal(context);
    }
 
+   /**
+    * Execute uninstall action.
+    *
+    * @param context the context
+    */
    protected void uninstallActionInternal(KernelControllerContext context)
    {
    }
 
-   private void unsetKernelControllerContext(KernelControllerContext context)
+   /**
+    * Unset the context.
+    *
+    * @param context the context
+    */
+   protected void unsetKernelControllerContext(KernelControllerContext context)
    {
       Object target = context.getTarget();
 

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/LifecycleAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/LifecycleAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/LifecycleAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -42,7 +42,7 @@
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  * @version $Revision$
  */
-public abstract class LifecycleAction extends KernelControllerContextAction
+public abstract class LifecycleAction extends InstallsAwareAction
 {
    /**
     * Create a new AbstractLifecycleAction.

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/PreInstallAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -28,6 +28,7 @@
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.kernel.spi.dependency.KernelController;
@@ -49,7 +50,7 @@
  *
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  */
-public class PreInstallAction extends KernelControllerContextAction
+public class PreInstallAction extends InstallsAwareAction
 {
    protected void installActionInternal(KernelControllerContext context) throws Throwable
    {
@@ -239,4 +240,9 @@
          log.warn("Unexpected error removing metadata: ", ignored);
       }
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.PRE_INSTALL;
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/StartStopLifecycleAction.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/StartStopLifecycleAction.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/dependency/StartStopLifecycleAction.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -25,6 +25,7 @@
 import org.jboss.beans.metadata.spi.LifecycleMetaData;
 import org.jboss.kernel.spi.dependency.KernelControllerContextAware;
 import org.jboss.kernel.spi.dependency.StartKernelControllerContextAware;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * StartStopLifecycleAction.
@@ -59,4 +60,9 @@
    {
       return "stop";
    }
+
+   protected ControllerState getState()
+   {
+      return ControllerState.START;
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/InstallHandler.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/InstallHandler.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/main/org/jboss/kernel/plugins/deployment/xml/InstallHandler.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -58,6 +58,8 @@
             install.setMethodName(attrs.getValue(i));
          else if ("state".equals(localName))
             install.setDependentState(new ControllerState(attrs.getValue(i)));
+         else if ("whenRequired".equals(localName))
+            install.setState(new ControllerState(attrs.getValue(i)));
       }
    }
 

Modified: projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/resources/main/schema/bean-deployer_2_0.xsd	2008-02-20 23:53:25 UTC (rev 69987)
@@ -339,6 +339,7 @@
       <xsd:attribute name="bean" type="xsd:string" use="optional"/>
       <xsd:attribute name="method" type="xsd:token" use="required"/>
       <xsd:attribute name="state" type="controllerStateType" use="optional"/>
+      <xsd:attribute name="whenRequired" type="controllerStateType" use="optional"/>
    </xsd:complexType>
 
    <xsd:complexType name="callbackType">

Modified: projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/FromContextXMLTestCase0.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/FromContextXMLTestCase0.xml	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/FromContextXMLTestCase0.xml	2008-02-20 23:53:25 UTC (rev 69987)
@@ -41,4 +41,8 @@
       <property name="context"><inject bean="set_name_bean" fromContext="context"/></property>
    </bean>
 
+   <bean name="state" class="org.jboss.test.kernel.deployment.support.NameAwareBean">
+      <property name="state"><inject fromContext="state"/></property>
+   </bean>
+
 </deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallDependencyXMLTestCase2.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallDependencyXMLTestCase2.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallDependencyXMLTestCase2.xml	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="Name3" class="org.jboss.test.kernel.dependency.support.SimpleBeanImpl">
+      <install bean="Name1" method="addState" whenRequired="PreInstall">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="PreInstall">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install bean="Name1" method="addState" whenRequired="Described">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="Described">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install bean="Name1" method="addState" whenRequired="Instantiated">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="Instantiated">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install bean="Name1" method="addState" whenRequired="Configured">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="Configured">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install bean="Name1" method="addState" whenRequired="Create">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="Create">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install bean="Name1" method="addState" whenRequired="Start">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall bean="Name1" method="removeState" whenRequired="Start">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyXMLTestCase1.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyXMLTestCase1.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyXMLTestCase1.xml	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+   <bean name="Name2" class="org.jboss.test.kernel.dependency.support.SimpleBeanInstallsAware">
+      <install method="addInstantiated" whenRequired="Instantiated">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall method="removeInstantiated" whenRequired="Instantiated">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install method="addConfigured" whenRequired="Configured">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall method="removeConfigured" whenRequired="Configured">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install method="addCreate" whenRequired="Create">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall method="removeCreate" whenRequired="Create">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+      <install method="addStart" whenRequired="Start">
+         <parameter><inject fromContext="state"/></parameter>
+      </install>
+      <uninstall method="removeStart" whenRequired="Start">
+         <parameter><inject fromContext="state"/></parameter>
+      </uninstall>
+   </bean>
+</deployment>

Added: projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/InstallWithWhenRequired.xml
===================================================================
--- projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/InstallWithWhenRequired.xml	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/resources/tests/org/jboss/test/kernel/deployment/xml/test/InstallWithWhenRequired.xml	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<bean xmlns="urn:jboss:bean-deployer:2.0" class="Dummy">
+   <install method="Dummy" whenRequired="Configured"/>
+</bean>

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/ControllerTestSuite.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/ControllerTestSuite.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/ControllerTestSuite.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -47,7 +47,8 @@
       suite.addTest(RedeployAfterErrorTestCase.suite());
       suite.addTest(ContextClassLoaderTestCase.suite());
       suite.addTest(InstallErrorTestCase.suite());
-      
+      suite.addTest(InstallWhenRequiredErrorTestCase.suite());
+
       return suite;
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallErrorTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallErrorTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallErrorTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -30,7 +30,7 @@
 import org.jboss.test.kernel.controller.support.TestBeanRepository;
 
 /**
- * ContextClassLoaderFactoryTestCase.
+ * InstallErrorTestCase 
  * 
  * TODO test others, e.g. ControllerContextAware
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
@@ -38,8 +38,6 @@
  */
 public class InstallErrorTestCase extends AbstractControllerTest
 {
-   ClassLoader cl = null;
-   
    public static Test suite()
    {
       return suite(InstallErrorTestCase.class);

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallWhenRequiredErrorTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallWhenRequiredErrorTestCase.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/controller/test/InstallWhenRequiredErrorTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,185 @@
+/*
+* 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.controller.test;
+
+import junit.framework.Test;
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.deployment.KernelDeployment;
+import org.jboss.test.kernel.controller.support.TestBean;
+import org.jboss.test.kernel.controller.support.TestBeanRepository;
+
+/**
+ * Install when required test case.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class InstallWhenRequiredErrorTestCase extends AbstractControllerTest
+{
+   public static Test suite()
+   {
+      return suite(InstallWhenRequiredErrorTestCase.class);
+   }
+
+   public InstallWhenRequiredErrorTestCase(String name) throws Throwable
+   {
+      super(name);
+   }
+
+   protected ControllerState[] getStates()
+   {
+      return new ControllerState[]{
+            ControllerState.CONFIGURED,
+            ControllerState.CREATE,
+            ControllerState.START,
+      };
+   }
+
+   protected BeanMetaData createBeanMetaData(ControllerState state)
+   {
+      BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Bean", TestBean.class.getName());
+      builder.addInstallWithThis("add", "Repository1", null, state);
+      builder.addInstallWithThis("add", "Repository2", null, state);
+      builder.addUninstallWithThis("remove", "Repository1", null, state);
+      builder.addUninstallWithThis("remove", "Repository2", null, state);
+      return builder.getBeanMetaData();
+   }
+
+   public void testErrorInInstallWithSupplies() throws Throwable
+   {
+      ControllerState[] states = getStates();
+      for (ControllerState state : states)
+         runErrorInInstallWithSupplies(state);
+   }
+
+   public void runErrorInInstallWithSupplies(ControllerState state) throws Throwable
+   {
+      KernelDeployment repository = deploy("InstallErrorTestCase_Repositories.xml");
+      try
+      {
+         BeanMetaData metaData = createBeanMetaData(state);
+         KernelControllerContext deployment = deploy(metaData);
+         try
+         {
+            ControllerContext context = getControllerContext("Bean", null);
+            assertEquals(ControllerState.ERROR, context.getState());
+            checkThrowable(Error.class, context.getError());
+            try
+            {
+               getControllerContext("TestSupply", null);
+               fail("Should not be here!");
+            }
+            catch (Throwable throwable)
+            {
+               checkThrowable(IllegalStateException.class, throwable);
+            }
+         }
+         finally
+         {
+            undeploy(deployment);
+         }
+      }
+      finally
+      {
+         undeploy(repository);
+      }
+   }
+
+   public void testErrorInInstallRedeploy() throws Throwable
+   {
+      ControllerState[] states = getStates();
+      for (ControllerState state : states)
+         runErrorInInstallRedeploy(state);
+   }
+
+   public void runErrorInInstallRedeploy(ControllerState state) throws Throwable
+   {
+      KernelDeployment repository = deploy("InstallErrorTestCase_Repositories.xml");
+      try
+      {
+         BeanMetaData metaData = createBeanMetaData(state);
+         KernelControllerContext kcc = deploy(metaData);
+         try
+         {
+            ControllerContext context = getControllerContext("Bean", null);
+            assertEquals(ControllerState.ERROR, context.getState());
+            checkThrowable(Error.class, context.getError());
+         }
+         finally
+         {
+            undeploy(kcc);
+         }
+
+         KernelDeployment deployment = deploy("InstallErrorTestCase_BeanNoInstall.xml");
+         try
+         {
+            assertNotNull(getControllerContext("Bean"));
+         }
+         finally
+         {
+            undeploy(deployment);
+         }
+      }
+      finally
+      {
+         undeploy(repository);
+      }
+   }
+
+   public void testErrorInInstall() throws Throwable
+   {
+      ControllerState[] states = getStates();
+      for (ControllerState state : states)
+         runErrorInInstall(state);         
+   }
+
+   public void runErrorInInstall(ControllerState state) throws Throwable
+   {
+      KernelDeployment repository = deploy("InstallErrorTestCase_Repositories.xml");
+      try
+      {
+         TestBeanRepository repository1 = (TestBeanRepository)getBean("Repository1");
+         TestBeanRepository repository2 = (TestBeanRepository)getBean("Repository2");
+         BeanMetaData metaData = createBeanMetaData(state);
+         KernelControllerContext deployment = deploy(metaData);
+         try
+         {
+            ControllerContext context = getControllerContext("Bean", null);
+            assertEquals(ControllerState.ERROR, context.getState());
+            checkThrowable(Error.class, context.getError());
+            assertEmpty(repository1.getBeans());
+            assertEmpty(repository2.getBeans());
+         }
+         finally
+         {
+            undeploy(deployment);
+         }
+      }
+      finally
+      {
+         undeploy(repository);
+      }
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/AnnotatedSimpleBeanInstallsAware.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/AnnotatedSimpleBeanInstallsAware.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/AnnotatedSimpleBeanInstallsAware.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,84 @@
+/*
+* 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.dependency.support;
+
+import org.jboss.beans.metadata.api.annotations.FromContext;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.api.annotations.InstallMethod;
+import org.jboss.beans.metadata.api.annotations.UninstallMethod;
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * SimpleBeanInstallAware
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ */
+public class AnnotatedSimpleBeanInstallsAware extends SimpleBeanInstallsAware
+{
+   @InstallMethod(whenRequired = "Instantiated")
+   public void addInstantiated(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.add(state);
+   }
+
+   @InstallMethod(whenRequired = "Configured")
+   public void addConfigured(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.add(state);
+   }
+
+   @InstallMethod(whenRequired = "Create")
+   public void addCreate(@Inject(fromContext= FromContext.STATE) ControllerState state)
+   {
+      states.add(state);
+   }
+
+   @InstallMethod(whenRequired = "Start")
+   public void addStart(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.add(state);
+   }
+
+   @UninstallMethod(whenRequired = "Instantiated")
+   public void removeInstantiated(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   @UninstallMethod(whenRequired = "Configured")
+   public void removeConfigured(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   @UninstallMethod(whenRequired = "Create")
+   public void removeCreate(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   @UninstallMethod(whenRequired = "Start")
+   public void removeStart(@Inject(fromContext=FromContext.STATE) ControllerState state)
+   {
+      states.remove(state);
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/ExternalInstallWithStateSimpleBeanImpl.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/ExternalInstallWithStateSimpleBeanImpl.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/ExternalInstallWithStateSimpleBeanImpl.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,102 @@
+/*
+* 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.dependency.support;
+
+import java.io.Serializable;
+
+import org.jboss.beans.metadata.api.annotations.ExternalInstall;
+import org.jboss.beans.metadata.api.annotations.ExternalInstalls;
+import org.jboss.beans.metadata.api.annotations.ExternalUninstalls;
+import org.jboss.beans.metadata.api.annotations.FromContext;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.api.annotations.Value;
+
+/**
+ * A simple bean
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+ at ExternalInstalls
+(
+   {
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "PreInstall"),
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Described"),
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Instantiated"),
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Configured"),
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Create"),
+      @ExternalInstall(bean = "Name1", method = "addState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Start")
+   }
+)
+ at ExternalUninstalls
+(
+      {
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "PreInstall"),
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Described"),
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Instantiated"),
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Configured"),
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Create"),
+         @ExternalInstall(bean = "Name1", method = "removeState", parameters = {@Value(inject = @Inject(fromContext = FromContext.STATE))}, whenRequired = "Start")
+      }
+)
+public class ExternalInstallWithStateSimpleBeanImpl implements Serializable, SimpleBean
+{
+   // Constants -----------------------------------------------------
+
+   private static final long serialVersionUID = 3258132440433243443L;
+
+   // Attributes ----------------------------------------------------
+
+   private String constructorString;
+
+   private String string;
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   public ExternalInstallWithStateSimpleBeanImpl()
+   {
+      constructorString = "()";
+   }
+
+   public ExternalInstallWithStateSimpleBeanImpl(String string)
+   {
+      constructorString = string;
+   }
+
+   // Public --------------------------------------------------------
+
+   public String getConstructorString()
+   {
+      return constructorString;
+   }
+
+   public String getString()
+   {
+      return string;
+   }
+
+   public void setString(String string)
+   {
+      this.string = string;
+   }
+}

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanInstallsAware.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanInstallsAware.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanInstallsAware.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,82 @@
+/*
+* 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.dependency.support;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * SimpleBeanInstallAware
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ */
+public class SimpleBeanInstallsAware
+{
+   protected Set<ControllerState> states = new HashSet<ControllerState>();
+
+   public Set<ControllerState> getStates()
+   {
+      return states;
+   }
+
+   public void addInstantiated(ControllerState state)
+   {
+      states.add(state);
+   }
+
+   public void addConfigured(ControllerState state)
+   {
+      states.add(state);
+   }
+
+   public void addCreate(ControllerState state)
+   {
+      states.add(state);
+   }
+
+   public void addStart(ControllerState state)
+   {
+      states.add(state);
+   }
+
+   public void removeInstantiated(ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   public void removeConfigured(ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   public void removeCreate(ControllerState state)
+   {
+      states.remove(state);
+   }
+
+   public void removeStart(ControllerState state)
+   {
+      states.remove(state);
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanRepository.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanRepository.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/support/SimpleBeanRepository.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -23,11 +23,16 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
 
+import org.jboss.dependency.spi.ControllerState;
+
 public class SimpleBeanRepository
 {
    List<SimpleBean> beans = new ArrayList<SimpleBean>();
-   
+   Set<ControllerState> states = new HashSet<ControllerState>();
+
    public List<SimpleBean> getBeans()
    {
       return beans;
@@ -47,4 +52,19 @@
    {
       beans.remove(bean);
    }
+
+   public Set<ControllerState> getStates()
+   {
+      return states;
+   }
+
+   public boolean addState(ControllerState state)
+   {
+      return states.add(state);
+   }
+
+   public boolean removeState(ControllerState state)
+   {
+      return states.remove(state);
+   }
 }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/AbstractKernelDependencyTest.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/AbstractKernelDependencyTest.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/AbstractKernelDependencyTest.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -109,7 +109,7 @@
    protected ControllerContext assertInstall(int number, String name, ControllerState expected) throws Throwable
    {
       ControllerContext context = install(number, name);
-      assertNotNull(context);
+      assertNotNull("Missing context with name: " + name, context);
       assertEquals(expected, context.getState());
       return context;
    }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextAnnotationTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextAnnotationTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextAnnotationTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -39,6 +39,7 @@
 import org.jboss.test.kernel.deployment.support.ScopeAwareBean;
 import org.jboss.test.kernel.deployment.support.ContextAwareBean;
 import org.jboss.test.kernel.deployment.support.OtherAwareBean;
+import org.jboss.test.kernel.deployment.support.StateAwareBean;
 import org.jboss.dependency.spi.ControllerContext;
 
 /**
@@ -88,8 +89,8 @@
 
       BeanMetaDataBuilder b8 = BeanMetaDataBuilderFactory.createBuilder("other", OtherAwareBean.class.getName());
       BeanMetaDataBuilder b9 = BeanMetaDataBuilderFactory.createBuilder("context", ContextAwareBean.class.getName());
+      BeanMetaDataBuilder b10 = BeanMetaDataBuilderFactory.createBuilder("state", StateAwareBean.class.getName());
 
-
       setBeanMetaDatas(new BeanMetaData[]
             {
                b1.getBeanMetaData(),
@@ -101,6 +102,7 @@
                b7.getBeanMetaData(),
                b8.getBeanMetaData(),
                b9.getBeanMetaData(),
+               b10.getBeanMetaData(),
             }
       );
    }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/FromContextTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -35,6 +35,7 @@
 import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
 import org.jboss.beans.metadata.spi.factory.BeanFactory;
 import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.test.kernel.deployment.support.NameAwareBean;
 
 /**
@@ -119,6 +120,10 @@
       NameAwareBean context = (NameAwareBean)getBean(8, "context");
       assertNotNull(context);
       assertNotNull(context.getContext());
+
+      NameAwareBean state = (NameAwareBean)getBean(9, "state");
+      assertNotNull(state);
+      assertEquals(ControllerState.INSTANTIATED, state.getState());
    }
 
    protected void checkAliases(Set<Object> aliases) throws Throwable
@@ -181,6 +186,10 @@
       v9.setFromContext(FromContext.CONTEXT);
       b9.addPropertyMetaData("context", v9);
 
+      BeanMetaDataBuilder b10 = BeanMetaDataBuilderFactory.createBuilder("state", NameAwareBean.class.getName());
+      AbstractInjectionValueMetaData v10 = new AbstractInjectionValueMetaData();
+      v10.setFromContext(FromContext.STATE);
+      b10.addPropertyMetaData("state", v10);
 
       setBeanMetaDatas(new BeanMetaData[]
             {
@@ -193,6 +202,7 @@
                b7.getBeanMetaData(),
                b8.getBeanMetaData(),
                b9.getBeanMetaData(),
+               b10.getBeanMetaData(),
             }
       );
    }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyAnnotationTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyAnnotationTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyAnnotationTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -26,6 +26,7 @@
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.test.kernel.dependency.support.SimpleBeanRepository;
 import org.jboss.test.kernel.dependency.support.ExternalInstallSimpleBeanImpl;
+import org.jboss.test.kernel.dependency.support.ExternalInstallWithStateSimpleBeanImpl;
 
 /**
  * Install Dependency Test Case.
@@ -44,10 +45,22 @@
       super(name);
    }
 
+   // we don't expect PreInstall
+   protected int getExpectedInstallSize()
+   {
+      return 5;
+   }
+
+   protected int getExpectedUninstallSize()
+   {
+      return 0;
+   }
+
    protected void setupBeanMetaDatas() throws Throwable
    {
       AbstractBeanMetaData metaData1 = new AbstractBeanMetaData("Name1", SimpleBeanRepository.class.getName());
       AbstractBeanMetaData metaData2 = new AbstractBeanMetaData("Name2", ExternalInstallSimpleBeanImpl.class.getName());
-      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2 });
+      AbstractBeanMetaData metaData3 = new AbstractBeanMetaData("Name3", ExternalInstallWithStateSimpleBeanImpl.class.getName());
+      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2, metaData3 });
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallDependencyTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -22,6 +22,9 @@
 package org.jboss.test.kernel.dependency.test;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
 
 import junit.framework.Test;
 
@@ -29,6 +32,8 @@
 import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
 import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
 import org.jboss.beans.metadata.plugins.ThisValueMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
+import org.jboss.beans.metadata.plugins.FromContext;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
 import org.jboss.beans.metadata.spi.ParameterMetaData;
@@ -147,6 +152,40 @@
       assertEquals(expected, bean1.getBeans());
    }
 
+   public void testWhenRequiredInstalls() throws Throwable
+   {
+      setupBeanMetaDatas();
+
+      ControllerContext context1 = assertInstall(0, "Name1");
+      ControllerContext context2 = assertInstall(2, "Name3");
+
+      SimpleBeanRepository bean1 = (SimpleBeanRepository) context1.getTarget();
+      assertNotNull(bean1);
+      Set<ControllerState> states = bean1.getStates();
+      assertNotNull(states);
+      assertEquals(getExpectedInstallSize(), states.size());
+
+      assertUninstall(context2.getName().toString());
+
+      int uninstallSize = getExpectedUninstallSize();
+      assertEquals(uninstallSize, states.size());
+      if (uninstallSize > 0)
+      {
+         ControllerState state = states.iterator().next();
+         assertEquals(ControllerState.NOT_INSTALLED, state);
+      }
+   }
+
+   protected int getExpectedInstallSize()
+   {
+      return 6;
+   }
+
+   protected int getExpectedUninstallSize()
+   {
+      return 1;
+   }
+
    protected void setupBeanMetaDatas() throws Throwable
    {
       AbstractBeanMetaData metaData1 = new AbstractBeanMetaData("Name1", SimpleBeanRepository.class.getName());
@@ -173,6 +212,50 @@
       uninstalls.add(uninstall);
       metaData2.setUninstalls(uninstalls);
 
-      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2 });
+      AbstractBeanMetaData metaData3 = new AbstractBeanMetaData("Name3", SimpleBeanImpl.class.getName());
+
+      ArrayList<InstallMetaData> stateInstalls = new ArrayList<InstallMetaData>();
+      addInstallMetaData(ControllerState.PRE_INSTALL, stateInstalls);
+      addInstallMetaData(ControllerState.DESCRIBED, stateInstalls);
+      addInstallMetaData(ControllerState.INSTANTIATED, stateInstalls);
+      addInstallMetaData(ControllerState.CONFIGURED, stateInstalls);
+      addInstallMetaData(ControllerState.CREATE, stateInstalls);
+      addInstallMetaData(ControllerState.START, stateInstalls);
+
+      ArrayList<InstallMetaData> stateUninstalls = new ArrayList<InstallMetaData>();
+      addUninstallMetaData(ControllerState.PRE_INSTALL, stateUninstalls);
+      addUninstallMetaData(ControllerState.DESCRIBED, stateUninstalls);
+      addUninstallMetaData(ControllerState.INSTANTIATED, stateUninstalls);
+      addUninstallMetaData(ControllerState.CONFIGURED, stateUninstalls);
+      addUninstallMetaData(ControllerState.CREATE, stateUninstalls);
+      addUninstallMetaData(ControllerState.START, stateUninstalls);
+
+      metaData3.setInstalls(stateInstalls);
+      metaData3.setUninstalls(stateUninstalls);
+
+      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2, metaData3 });
    }
+
+   protected void addInstallMetaData(ControllerState state, List<InstallMetaData> states)
+   {
+      addInstallMetaData(state, states, "add");
+   }
+
+   protected void addUninstallMetaData(ControllerState state, List<InstallMetaData> states)
+   {
+      addInstallMetaData(state, states, "remove");         
+   }
+
+   protected void addInstallMetaData(ControllerState state, List<InstallMetaData> states, String prefix)
+   {
+      AbstractInstallMetaData install = new AbstractInstallMetaData();
+      install.setBean("Name1");
+      install.setMethodName(prefix + "State");
+      AbstractInjectionValueMetaData injection = new AbstractInjectionValueMetaData();
+      injection.setFromContext(FromContext.STATE);
+      ParameterMetaData parameter = new AbstractParameterMetaData(injection);
+      install.setParameters(Collections.singletonList(parameter));
+      install.setState(state);
+      states.add(install);
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyAnnotationTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyAnnotationTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyAnnotationTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -25,6 +25,7 @@
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.test.kernel.dependency.support.AnnotatedSimpleBeanInstallSelf;
+import org.jboss.test.kernel.dependency.support.AnnotatedSimpleBeanInstallsAware;
 
 /**
  * Install Dependency Test Case.
@@ -46,6 +47,7 @@
    protected void setupBeanMetaDatas() throws Throwable
    {
       AbstractBeanMetaData metaData1 = new AbstractBeanMetaData("Name1", AnnotatedSimpleBeanInstallSelf.class.getName());
-      setBeanMetaDatas(new BeanMetaData[] { metaData1 });
+      AbstractBeanMetaData metaData2 = new AbstractBeanMetaData("Name2", AnnotatedSimpleBeanInstallsAware.class.getName());
+      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2 });
    }
 }

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/dependency/test/InstallSelfDependencyTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -22,15 +22,24 @@
 package org.jboss.test.kernel.dependency.test;
 
 import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.Set;
 
 import junit.framework.Test;
 
 import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
 import org.jboss.beans.metadata.plugins.AbstractInstallMetaData;
+import org.jboss.beans.metadata.plugins.AbstractParameterMetaData;
+import org.jboss.beans.metadata.plugins.AbstractInjectionValueMetaData;
+import org.jboss.beans.metadata.plugins.FromContext;
 import org.jboss.beans.metadata.spi.BeanMetaData;
 import org.jboss.beans.metadata.spi.InstallMetaData;
+import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 import org.jboss.test.kernel.dependency.support.SimpleBeanInstallSelf;
+import org.jboss.test.kernel.dependency.support.SimpleBeanInstallsAware;
 
 /**
  * Install Dependency Test Case.
@@ -86,6 +95,25 @@
       assertTrue(bean.getInstalled());
    }
 
+   public void testWhenRequiredInstalls() throws Throwable
+   {
+      setupBeanMetaDatas();
+
+      ControllerContext context2 = assertInstall(1, "Name2");
+
+      SimpleBeanInstallsAware bean = (SimpleBeanInstallsAware) context2.getTarget();
+      assertNotNull(bean);
+      Set<ControllerState> states = bean.getStates();
+      assertNotNull(states);
+      assertEquals(4, states.size());
+
+      assertUninstall(context2.getName().toString());
+
+      assertEquals(1, states.size());
+      ControllerState state = states.iterator().next();
+      assertEquals(ControllerState.DESCRIBED, state);
+   }
+
    protected void setupBeanMetaDatas() throws Throwable
    {
       AbstractBeanMetaData metaData1 = new AbstractBeanMetaData("Name1", SimpleBeanInstallSelf.class.getName());
@@ -102,6 +130,34 @@
       uninstalls.add(uninstall);
       metaData1.setUninstalls(uninstalls);
 
-      setBeanMetaDatas(new BeanMetaData[] { metaData1 });
+      AbstractBeanMetaData metaData2 = new AbstractBeanMetaData("Name2", SimpleBeanInstallsAware.class.getName());
+
+      ArrayList<InstallMetaData> installs2 = new ArrayList<InstallMetaData>();
+      addInstalls(ControllerState.INSTANTIATED, installs2, true);
+      addInstalls(ControllerState.CONFIGURED, installs2, true);
+      addInstalls(ControllerState.CREATE, installs2, true);
+      addInstalls(ControllerState.START, installs2, true);
+      metaData2.setInstalls(installs2);
+
+      ArrayList<InstallMetaData> uninstalls2 = new ArrayList<InstallMetaData>();
+      addInstalls(ControllerState.INSTANTIATED, uninstalls2, false);
+      addInstalls(ControllerState.CONFIGURED, uninstalls2, false);
+      addInstalls(ControllerState.CREATE, uninstalls2, false);
+      addInstalls(ControllerState.START, uninstalls2, false);
+      metaData2.setUninstalls(uninstalls2);
+
+      setBeanMetaDatas(new BeanMetaData[] { metaData1, metaData2 });
    }
+
+   protected void addInstalls(ControllerState state, List<InstallMetaData> installs, boolean add)
+   {
+      AbstractInstallMetaData install = new AbstractInstallMetaData();
+      install.setState(state);
+      install.setMethodName((add ? "add" : "remove") + state.getStateString());
+      AbstractInjectionValueMetaData injection = new AbstractInjectionValueMetaData();
+      injection.setFromContext(FromContext.STATE);
+      ParameterMetaData paramater = new AbstractParameterMetaData(injection);
+      install.setParameters(Collections.singletonList(paramater));
+      installs.add(install);
+   }
 }
\ No newline at end of file

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/NameAwareBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/NameAwareBean.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/NameAwareBean.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -27,6 +27,7 @@
 import org.jboss.metadata.spi.scope.ScopeKey;
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
 
 /**
  * A simple bean with name
@@ -42,6 +43,7 @@
    private ScopeKey scopeKey;
    private Object dynamic;
    private ControllerContext context;
+   private ControllerState state;
 
    public String getName()
    {
@@ -117,4 +119,14 @@
    {
       this.context = context;
    }
+
+   public ControllerState getState()
+   {
+      return state;
+   }
+
+   public void setState(ControllerState state)
+   {
+      this.state = state;
+   }
 }

Added: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/StateAwareBean.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/StateAwareBean.java	                        (rev 0)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/support/StateAwareBean.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.kernel.deployment.support;
+
+import org.jboss.beans.metadata.api.annotations.FromContext;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * A simple bean with awareness
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class StateAwareBean extends NameAwareBean
+{
+   @Inject(fromContext = FromContext.STATE)
+   public void setState(ControllerState state)
+   {
+      super.setState(state);
+   }
+}

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallJaxbTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallJaxbTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallJaxbTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -57,6 +57,7 @@
       InstallMetaData install = getInstall();
       assertEquals("Bean", install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
@@ -67,16 +68,29 @@
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.CONFIGURED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
    }
 
+   public void testInstallWithWhenRequired() throws Exception
+   {
+      InstallMetaData install = getInstall();
+      assertNull(install.getBean());
+      assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.CONFIGURED, install.getState());
+      assertEquals("Dummy", install.getMethodName());
+      assertNull(install.getAnnotations());
+      assertNull(install.getParameters());
+   }
+
    public void testInstallWithMethod() throws Exception
    {
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Method", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
@@ -87,6 +101,7 @@
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       HashSet<String> expected = new HashSet<String>();
       expected.add(Annotation1.class.getName());
@@ -99,6 +114,7 @@
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       HashSet<String> expected = new HashSet<String>();
       expected.add(Annotation1.class.getName());
@@ -113,6 +129,7 @@
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       ArrayList<String> expected = new ArrayList<String>();
@@ -125,6 +142,7 @@
       InstallMetaData install = getInstall();
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       ArrayList<String> expected = new ArrayList<String>();

Modified: projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallTestCase.java
===================================================================
--- projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallTestCase.java	2008-02-20 21:48:48 UTC (rev 69986)
+++ projects/microcontainer/trunk/kernel/src/tests/org/jboss/test/kernel/deployment/xml/test/InstallTestCase.java	2008-02-20 23:53:25 UTC (rev 69987)
@@ -55,6 +55,7 @@
       InstallMetaData install = getInstall("InstallWithBean.xml");
       assertEquals("Bean", install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
@@ -65,16 +66,29 @@
       InstallMetaData install = getInstall("InstallWithState.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.CONFIGURED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
    }
 
+   public void testInstallWithWhenRequired() throws Exception
+   {
+      InstallMetaData install = getInstall("InstallWithWhenRequired.xml");
+      assertNull(install.getBean());
+      assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.CONFIGURED, install.getState());
+      assertEquals("Dummy", install.getMethodName());
+      assertNull(install.getAnnotations());
+      assertNull(install.getParameters());
+   }
+
    public void testInstallWithMethod() throws Exception
    {
       InstallMetaData install = getInstall("InstallWithMethod.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Method", install.getMethodName());
       assertNull(install.getAnnotations());
       assertNull(install.getParameters());
@@ -85,6 +99,7 @@
       InstallMetaData install = getInstall("InstallWithAnnotation.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       HashSet<String> expected = new HashSet<String>();
       expected.add("org.jboss.test.kernel.deployment.xml.support.Annotation1");
@@ -97,6 +112,7 @@
       InstallMetaData install = getInstall("InstallWithAnnotations.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       HashSet<String> expected = new HashSet<String>();
       expected.add("org.jboss.test.kernel.deployment.xml.support.Annotation1");
@@ -111,6 +127,7 @@
       InstallMetaData install = getInstall("InstallWithParameter.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       ArrayList<String> expected = new ArrayList<String>();
@@ -123,6 +140,7 @@
       InstallMetaData install = getInstall("InstallWithParameters.xml");
       assertNull(install.getBean());
       assertEquals(ControllerState.INSTALLED, install.getDependentState());
+      assertEquals(ControllerState.INSTALLED, install.getState());
       assertEquals("Dummy", install.getMethodName());
       assertNull(install.getAnnotations());
       ArrayList<String> expected = new ArrayList<String>();




More information about the jboss-cvs-commits mailing list