[jboss-svn-commits] JBoss Common SVN: r4329 - in arquillian/trunk: containers/glassfish-embedded-30/src/main/java/org/jboss/arquillian/glassfish and 30 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Apr 24 16:48:17 EDT 2010


Author: aslak
Date: 2010-04-24 16:48:13 -0400 (Sat, 24 Apr 2010)
New Revision: 4329

Added:
   arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/RequestLifeCycleController.java
   arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/SessionLifeCycleController.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/Context.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/Event.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterDeploy.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterSetup.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStart.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStop.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterUnDeploy.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeDeploy.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeSetup.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStart.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStop.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeUnDeploy.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/ContainerEvent.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/After.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterClass.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterSuite.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Before.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeClass.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeSuite.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/ClassEvent.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/EventHandler.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/SuiteEvent.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Test.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/TestEvent.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Validate.java
Removed:
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/Context.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/Event.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventHandler.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/type/
Modified:
   arquillian/trunk/build/pom.xml
   arquillian/trunk/containers/glassfish-embedded-30/src/main/java/org/jboss/arquillian/glassfish/GlassFishEmbeddedContainer.java
   arquillian/trunk/containers/jbossas-remote-51/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java
   arquillian/trunk/containers/jbossas-remote-60/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java
   arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBContainer.java
   arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
   arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSEContainer.java
   arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSETestEnricher.java
   arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedContainer.java
   arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
   arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSEContainer.java
   arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSETestEnricher.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/NorwegianTranslator.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/SentenceParser.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TextTranslator.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TranslateController.java
   arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/Translator.java
   arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
   arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
   arquillian/trunk/examples/testng/pom.xml
   arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
   arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/translate/TranslateTestCase.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/EventTestRunnerAdaptor.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/AbstractEventContext.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClassContext.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClientProfileBuilder.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContainerProfileBuilder.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContextLifecycleManager.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/StandaloneProfileBuilder.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/SuiteContext.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/TestContext.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventManager.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/MapEventManager.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocal.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ArchiveGenerator.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerCreator.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerDeployer.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerRestarter.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStarter.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStopper.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerTestExecuter.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerUndeployer.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ExecutionTimer.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestCaseEnricher.java
   arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestEventExecuter.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/EventTestRunnerAdaptorTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/context/ContextLifecycleManagerTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/event/EventManagerTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocalTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ArchiveGeneratorTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerCreatorTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerDeployerTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerRestarterTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStarterTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStopperTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerTestExecuterTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerUndeployerTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestCaseEnricherTestCase.java
   arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestEventExecuterTestCase.java
   arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/DeployableContainer.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestRunnerAdaptor.java
   arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
   arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
   arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
   arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
   arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/Arquillian.java
   arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
Log:
ARQ-113 ARQ-114 Opened up Context to the DeployableContainer and TestEnricher SPIs. They can now share state and register for callbacks to events or fire their own events. Added ContainerEvents, Before/After container lifecycle setup/start/stop/deploy/undeploy.


Modified: arquillian/trunk/build/pom.xml
===================================================================
--- arquillian/trunk/build/pom.xml	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/build/pom.xml	2010-04-24 20:48:13 UTC (rev 4329)
@@ -49,8 +49,8 @@
             <enabled>true</enabled>
          </snapshots>
       </repository>
-	  <repository>
-		 <id>jboss-deprecated</id>
+      <repository>
+	 <id>jboss-deprecated</id>
          <name>JBoss Deprecated</name>
          <url>https://repository.jboss.org/nexus/content/repositories/deprecated/</url>
          <layout>default</layout>

Modified: arquillian/trunk/containers/glassfish-embedded-30/src/main/java/org/jboss/arquillian/glassfish/GlassFishEmbeddedContainer.java
===================================================================
--- arquillian/trunk/containers/glassfish-embedded-30/src/main/java/org/jboss/arquillian/glassfish/GlassFishEmbeddedContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/glassfish-embedded-30/src/main/java/org/jboss/arquillian/glassfish/GlassFishEmbeddedContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -27,6 +27,7 @@
 import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -50,7 +51,7 @@
    {
    }
    
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
       this.configuration = configuration.getContainerConfig(GlassFishConfiguration.class);
       
@@ -66,7 +67,7 @@
       server.addContainer(ContainerBuilder.Type.all);
    }
    
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
       try 
       {
@@ -81,7 +82,7 @@
       }
    }
 
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
       try 
       {
@@ -93,7 +94,7 @@
       }
    }
 
-   public ContainerMethodExecutor deploy(Archive<?> archive) throws DeploymentException
+   public ContainerMethodExecutor deploy(Context context, Archive<?> archive) throws DeploymentException
    {
       try 
       {
@@ -128,7 +129,7 @@
       }
    }
 
-   public void undeploy(Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, Archive<?> archive) throws DeploymentException
    {
       UndeployCommandParameters params = new UndeployCommandParameters();
       params.target = target;

Modified: arquillian/trunk/containers/jbossas-remote-51/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java
===================================================================
--- arquillian/trunk/containers/jbossas-remote-51/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/jbossas-remote-51/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -32,6 +32,7 @@
 import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -68,12 +69,12 @@
    
    private JBossConfiguration configuration;
    
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
       this.configuration = configuration.getContainerConfig(JBossConfiguration.class);
    }
    
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
       try 
       {
@@ -89,7 +90,7 @@
       }
    }
    
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
       try 
       {
@@ -102,7 +103,7 @@
       }
    }
 
-   public ContainerMethodExecutor deploy(final Archive<?> archive) throws DeploymentException
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       if(archive == null) 
       {
@@ -181,7 +182,7 @@
       }
    }
 
-   public void undeploy(Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, Archive<?> archive) throws DeploymentException
    {
       if(archive == null) 
       {

Modified: arquillian/trunk/containers/jbossas-remote-60/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java
===================================================================
--- arquillian/trunk/containers/jbossas-remote-60/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/jbossas-remote-60/src/main/java/org/jboss/arquillian/jboss/JbossRemoteContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -32,6 +32,7 @@
 import org.jboss.arquillian.protocol.servlet.ServletMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -72,12 +73,12 @@
    {
    }
 
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
       this.configuration = configuration.getContainerConfig(JBossConfiguration.class);
    }
    
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
       try 
       {
@@ -93,7 +94,7 @@
       }
    }
    
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
       try 
       {
@@ -106,7 +107,7 @@
       }
    }
 
-   public ContainerMethodExecutor deploy(final Archive<?> archive) throws DeploymentException
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       if(archive == null) 
       {
@@ -185,7 +186,7 @@
       }
    }
 
-   public void undeploy(Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, Archive<?> archive) throws DeploymentException
    {
       if(archive == null) 
       {

Modified: arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBContainer.java
===================================================================
--- arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -28,6 +28,7 @@
 import org.jboss.arquillian.protocol.local.LocalMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -79,12 +80,12 @@
    // Required Implementations -----------------------------------------------------------||
    //-------------------------------------------------------------------------------------||
 
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
       this.configuration = configuration.getContainerConfig(OpenEJBConfiguration.class);
    }
    
-   public ContainerMethodExecutor deploy(final Archive<?> archive) throws DeploymentException
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       // Deploy as an archive
       final AppInfo appInfo;
@@ -110,7 +111,7 @@
       return new LocalMethodExecutor();
    }
 
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
       final ShrinkWrapConfigurationFactory config = new ShrinkWrapConfigurationFactory();
       final Assembler assembler = new Assembler();
@@ -130,12 +131,12 @@
       this.config = new ShrinkWrapConfigurationFactory();
    }
 
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
       assembler.destroy();
    }
 
-   public void undeploy(final Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       // Undeploy the archive
       try

Modified: arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java
===================================================================
--- arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/openejb/src/main/java/org/jboss/arquillian/openejb/OpenEJBTestEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,11 +18,12 @@
 
 import java.util.Properties;
 
+
 import javax.naming.Binding;
-import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingEnumeration;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 import org.jboss.arquillian.testenricher.ejb.EJBInjectionEnricher;
 
@@ -38,29 +39,29 @@
 {
 
    @Override
-   protected InitialContext createContext() throws Exception
+   protected InitialContext createContext(Context context) throws Exception
    {
       final Properties properties = new Properties();
-      properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
+      properties.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
       return new InitialContext(properties);
    }
 
    @Override
-   protected Object lookupEJB(Class<?> fieldType) throws Exception
+   protected Object lookupEJB(Context context, Class<?> fieldType) throws Exception
    {
-      InitialContext context = createContext();
-      return lookupRecursive(fieldType, context, context.listBindings("/"));
+      InitialContext initcontext = createContext(context);
+      return lookupRecursive(fieldType, initcontext, initcontext.listBindings("/"));
    }
    
-   protected Object lookupRecursive(Class<?> fieldType, Context context, NamingEnumeration<Binding> contextNames) throws Exception 
+   protected Object lookupRecursive(Class<?> fieldType, javax.naming.Context context, NamingEnumeration<Binding> contextNames) throws Exception 
    {
       while(contextNames.hasMore())
       {
          Binding contextName = contextNames.nextElement();
          Object value = contextName.getObject();
-         if(Context.class.isInstance(value)) 
+         if(javax.naming.Context.class.isInstance(value)) 
          {
-            Context subContext = (Context)value;
+            javax.naming.Context subContext = (javax.naming.Context)value;
             return lookupRecursive(fieldType, subContext, subContext.listBindings("/"));
          }
          else 

Modified: arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSEContainer.java
===================================================================
--- arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSEContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSEContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -34,6 +34,7 @@
 import org.jboss.arquillian.protocol.local.LocalMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -73,28 +74,28 @@
    /* (non-Javadoc)
     * @see org.jboss.arquillian.spi.DeployableContainer#setup(org.jboss.arquillian.spi.Configuration)
     */
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
    }
    
    /**
     * @see org.jboss.arquillian.spi.DeployableContainer#start()
     */
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
    }
 
    /**
     * @see org.jboss.arquillian.spi.DeployableContainer#stop()
     */
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
    }
 
    /**
     * @see org.jboss.arquillian.spi.DeployableContainer#deploy(org.jboss.shrinkwrap.api.Archive)
     */
-   public ContainerMethodExecutor deploy(final Archive<?> archive)
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive)
          throws DeploymentException
    {
       ClassLoader cl = new ShrinkWrapClassLoader(archive);
@@ -158,7 +159,7 @@
    /**
     * @see org.jboss.arquillian.spi.DeployableContainer#undeploy(org.jboss.shrinkwrap.api.Archive)
     */
-   public void undeploy(Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, Archive<?> archive) throws DeploymentException
    {
       ContainerInstanceHolder holder = CONTAINER_INSTANCE_HOLDER.get();
       if (holder != null) {

Modified: arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSETestEnricher.java
===================================================================
--- arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSETestEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/openwebbeans-embedded/src/main/java/org/jboss/arquillian/openwebbeans/OpenWebBeansSETestEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -19,6 +19,7 @@
 import javax.enterprise.inject.spi.BeanManager;
 import org.jboss.arquillian.openwebbeans.OpenWebBeansSEContainer.ContainerInstanceHolder;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher;
 
 /**
@@ -32,7 +33,7 @@
 public class OpenWebBeansSETestEnricher extends CDIInjectionEnricher
 {
    @Override
-   protected BeanManager lookupBeanManager()
+   protected BeanManager lookupBeanManager(Context context)
    {
       ContainerInstanceHolder holder = OpenWebBeansSEContainer.CONTAINER_INSTANCE_HOLDER.get();
       if (holder != null)

Modified: arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedContainer.java
===================================================================
--- arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -23,6 +23,7 @@
 import org.jboss.arquillian.protocol.local.LocalMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
@@ -103,12 +104,12 @@
    //-------------------------------------------------------------------------------------||
 
    
-   public void setup(Configuration configuration) 
+   public void setup(Context context, Configuration configuration) 
    {
       this.configuration = configuration.getContainerConfig(JBossReloadedConfiguration.class);
    }
    
-   public ContainerMethodExecutor deploy(final Archive<?> archive) throws DeploymentException
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       // Deploy
       try
@@ -125,7 +126,7 @@
       return new LocalMethodExecutor();
    }
 
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
       // Set up JBossXB
       AccessController.doPrivileged(new PrivilegedAction<Void>()
@@ -168,7 +169,7 @@
 
    }
 
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
       // If we've got a server
       if (server != null && server.getState().equals(LifecycleState.STARTED))
@@ -185,7 +186,7 @@
       }
    }
 
-   public void undeploy(final Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, final Archive<?> archive) throws DeploymentException
    {
       //TODO Remove this hack
       // http://community.jboss.org/thread/150796?tstart=0

Modified: arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java
===================================================================
--- arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/reloaded/src/main/java/org/jboss/arquillian/container/reloaded/ReloadedTestEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,6 +18,7 @@
 
 import java.lang.reflect.Method;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 import org.jboss.beans.info.spi.BeanAccessMode;
 import org.jboss.beans.metadata.plugins.builder.BeanMetaDataBuilderFactory;
@@ -52,9 +53,9 @@
    //-------------------------------------------------------------------------------------||
 
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(org.jboss.arquillian.spi.Context, java.lang.Object)
     */
-   public void enrich(final Object testCase)
+   public void enrich(final Context context, final Object testCase)
    {
       // Obtain the server as set from the container
       final MCServer server = ReloadedContainer.MC_SERVER.get();
@@ -76,7 +77,10 @@
       }
    }
    
-   public Object[] resolve(Method method)
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(org.jboss.arquillian.spi.Context, java.lang.reflect.Method)
+    */
+   public Object[] resolve(Context context, Method method)
    {
       return new Object[method.getParameterTypes().length];
    }

Added: arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/RequestLifeCycleController.java
===================================================================
--- arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/RequestLifeCycleController.java	                        (rev 0)
+++ arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/RequestLifeCycleController.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,94 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.weld;
+
+import java.util.UUID;
+
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.weld.context.ContextLifecycle;
+import org.jboss.weld.context.api.BeanStore;
+import org.jboss.weld.context.api.helpers.ConcurrentHashMapBeanStore;
+import org.jboss.weld.manager.api.WeldManager;
+
+/**
+ * SessionLifeCycleController
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class RequestLifeCycleController implements EventHandler<Event>
+{
+   private Class<? extends Event> endRequestEvent;
+   
+   public RequestLifeCycleController(Class<? extends Event> endRequestEvent) 
+   {
+      if(endRequestEvent == null) 
+      {
+         throw new IllegalArgumentException("EndSessionEvent must be specified");
+      }
+      this.endRequestEvent = endRequestEvent;
+   }
+
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.EventHandler#callback(org.jboss.arquillian.spi.Context, java.lang.Object)
+    */
+   public void callback(Context context, Event event) throws Exception 
+   {
+      WeldManager manager = context.get(WeldManager.class);
+      if(manager == null)
+      {
+         throw new IllegalStateException("No " + WeldManager.class.getName() + " found in context");
+      }
+      ContextLifecycle lifeCycle = manager.getServices().get(ContextLifecycle.class);
+
+      String requestId = UUID.randomUUID().toString();
+      BeanStore beanStore = new ConcurrentHashMapBeanStore();
+      
+      lifeCycle.beginRequest(requestId, beanStore);
+      
+      context.register(endRequestEvent, new DestoryRequest(requestId, beanStore));
+   }
+   
+   /**
+    * DestorySession
+    *
+    * @author <a href="mailto:aknutsen at redhat.org">Aslak Knutsen</a>
+    * @version $Revision: $
+    */
+   private static class DestoryRequest implements EventHandler<Event> {
+      
+      private String requestId;
+      private BeanStore beanStore;
+      
+      public DestoryRequest(String requestId, BeanStore beanStore)
+      {
+         this.requestId = requestId;
+         this.beanStore = beanStore;
+      }
+      
+      /* (non-Javadoc)
+       * @see org.jboss.arquillian.spi.event.EventHandler#callback(org.jboss.arquillian.spi.Context, java.lang.Object)
+       */
+      public void callback(Context context, Event event) throws Exception
+      {
+         WeldManager manager = context.get(WeldManager.class);
+         manager.getServices().get(ContextLifecycle.class).endRequest(requestId, beanStore);
+      }
+   }
+}

Added: arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/SessionLifeCycleController.java
===================================================================
--- arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/SessionLifeCycleController.java	                        (rev 0)
+++ arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/SessionLifeCycleController.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.weld;
+
+import java.util.UUID;
+
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.weld.context.ContextLifecycle;
+import org.jboss.weld.context.api.BeanStore;
+import org.jboss.weld.context.api.helpers.ConcurrentHashMapBeanStore;
+import org.jboss.weld.manager.api.WeldManager;
+
+/**
+ * SessionLifeCycleController
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class SessionLifeCycleController implements EventHandler<Event>
+{
+   private Class<? extends Event> endSessionEvent;
+   
+   public SessionLifeCycleController(Class<? extends Event> endSessionEvent) 
+   {
+      if(endSessionEvent == null) 
+      {
+         throw new IllegalArgumentException("EndSessionEvent must be specified");
+      }
+      this.endSessionEvent = endSessionEvent;
+   }
+
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.spi.EventHandler#callback(org.jboss.arquillian.spi.Context, java.lang.Object)
+    */
+   public void callback(Context context, Event event) throws Exception 
+   {
+      WeldManager manager = context.get(WeldManager.class);
+      if(manager == null)
+      {
+         throw new IllegalStateException("No " + WeldManager.class.getName() + " found in context");
+      }
+      ContextLifecycle lifeCycle = manager.getServices().get(ContextLifecycle.class);
+
+      String sessionId = UUID.randomUUID().toString();
+      BeanStore beanStore = new ConcurrentHashMapBeanStore();
+      
+      lifeCycle.restoreSession(sessionId, beanStore);
+      context.register(endSessionEvent, new DestorySession(sessionId, beanStore));
+   }
+   
+   /**
+    * DestorySession
+    *
+    * @author <a href="mailto:aknutsen at redhat.org">Aslak Knutsen</a>
+    * @version $Revision: $
+    */
+   private static class DestorySession implements EventHandler<Event> {
+      
+      private String sessionId;
+      private BeanStore beanStore;
+      
+      public DestorySession(String sessionId, BeanStore beanStore)
+      {
+         this.sessionId = sessionId;
+         this.beanStore = beanStore;
+      }
+      
+      /* (non-Javadoc)
+       * @see org.jboss.arquillian.spi.event.EventHandler#callback(org.jboss.arquillian.spi.Context, java.lang.Object)
+       */
+      public void callback(Context context, Event event) throws Exception
+      {
+         WeldManager manager = context.get(WeldManager.class);
+         manager.getServices().get(ContextLifecycle.class).endSession(sessionId, beanStore);
+      }
+   }
+}

Modified: arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSEContainer.java
===================================================================
--- arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSEContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSEContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,16 +18,19 @@
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.UUID;
 
 import org.jboss.arquillian.protocol.local.LocalMethodExecutor;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.DeploymentException;
 import org.jboss.arquillian.spi.LifecycleException;
-import org.jboss.arquillian.spi.TestMethodExecutor;
-import org.jboss.arquillian.spi.TestResult;
+import org.jboss.arquillian.spi.event.container.BeforeUnDeploy;
+import org.jboss.arquillian.spi.event.suite.After;
+import org.jboss.arquillian.spi.event.suite.AfterClass;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.BeforeClass;
 import org.jboss.arquillian.weld.shrinkwrap.ShrinkWrapClassLoader;
 import org.jboss.arquillian.weld.shrinkwrap.ShrinkwrapBeanDeploymentArchive;
 import org.jboss.shrinkwrap.api.Archive;
@@ -36,7 +39,6 @@
 import org.jboss.weld.bootstrap.api.ServiceRegistry;
 import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
 import org.jboss.weld.bootstrap.spi.Deployment;
-import org.jboss.weld.context.ContextLifecycle;
 import org.jboss.weld.context.api.helpers.ConcurrentHashMapBeanStore;
 import org.jboss.weld.manager.api.WeldManager;
 
@@ -48,24 +50,22 @@
  */
 public class WeldSEContainer implements DeployableContainer
 {
-   public final static ThreadLocal<WeldHolder> WELD_MANAGER = new ThreadLocal<WeldHolder>();
-   
    private WeldSEConfiguration configuration;
    
-   public void setup(Configuration configuration)
+   public void setup(Context context, Configuration configuration)
    {
       this.configuration = configuration.getContainerConfig(WeldSEConfiguration.class);
    }
    
-   public void start() throws LifecycleException
+   public void start(Context context) throws LifecycleException
    {
    }
 
-   public void stop() throws LifecycleException
+   public void stop(Context context) throws LifecycleException
    {
    }
 
-   public ContainerMethodExecutor deploy(final Archive<?> archive)
+   public ContainerMethodExecutor deploy(Context context, final Archive<?> archive)
          throws DeploymentException
    {
       final BeanDeploymentArchive beanArchive = archive.as(ShrinkwrapBeanDeploymentArchive.class);
@@ -102,70 +102,22 @@
 
       WeldManager manager = bootstrap.getManager(beanArchive);
       
-      // start the session lifecycle
-      manager.getServices().get(ContextLifecycle.class).restoreSession(manager.getId(), new ConcurrentHashMapBeanStore());
+      context.add(WeldBootstrap.class, bootstrap);
+      context.add(WeldManager.class, manager);
+      context.register(BeforeClass.class, new SessionLifeCycleController(BeforeUnDeploy.class));
+      context.register(Before.class, new RequestLifeCycleController(After.class));
       
-      WELD_MANAGER.set(
-            new WeldHolder(
-                  bootstrap, 
-                  manager));
-
-      // TODO: replace with a before/after invoke interceptor ?
-      return new LocalMethodExecutor() {
-         @Override
-         public TestResult invoke(TestMethodExecutor testMethodExecutor)
-         {
-            WeldManager manager = WELD_MANAGER.get().getManager();
-            String requestId = UUID.randomUUID().toString();
-            try 
-            {
-            	// start the request lifecycle
-            	manager.getServices().get(ContextLifecycle.class).beginRequest(requestId, new ConcurrentHashMapBeanStore());
-            	return super.invoke(testMethodExecutor);
-            } 
-            finally
-            {
-            	// end the request lifecycle 
-            	manager.getServices().get(ContextLifecycle.class).endRequest(requestId, new ConcurrentHashMapBeanStore());
-            }
-         }
-      };
+      return new LocalMethodExecutor();
    }
 
-   public void undeploy(Archive<?> archive) throws DeploymentException
+   public void undeploy(Context context, Archive<?> archive) throws DeploymentException
    {
-      WeldHolder holder = WELD_MANAGER.get();
-      if(holder != null) {
-         WeldManager manager = holder.getManager();
-
-         // end the session lifecycle
-         manager.getServices().get(ContextLifecycle.class).endSession(manager.getId(), null);
-         
-         holder.getBootstrap().shutdown();
-         Thread.currentThread().setContextClassLoader(Thread.currentThread().getContextClassLoader().getParent());
-      }
-      WELD_MANAGER.set(null);
-   }
-   
-   public static class WeldHolder {
-      
-      private WeldBootstrap bootstrap;
-      private WeldManager manager;
-
-      public WeldHolder(WeldBootstrap bootstrap, WeldManager manager)
+      WeldBootstrap bootstrap = context.get(WeldBootstrap.class);
+      if(bootstrap != null)
       {
-         super();
-         this.bootstrap = bootstrap;
-         this.manager = manager;
+         bootstrap.shutdown();
       }
-
-      public WeldBootstrap getBootstrap()
-      {
-         return bootstrap;
-      }
-      public WeldManager getManager()
-      {
-         return manager;
-      }
+      Thread.currentThread().setContextClassLoader(
+            Thread.currentThread().getContextClassLoader().getParent());
    }
 }
\ No newline at end of file

Modified: arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSETestEnricher.java
===================================================================
--- arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSETestEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/containers/weld-embedded/src/main/java/org/jboss/arquillian/weld/WeldSETestEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,8 +18,9 @@
 
 import javax.enterprise.inject.spi.BeanManager;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher;
-import org.jboss.arquillian.weld.WeldSEContainer.WeldHolder;
+import org.jboss.weld.manager.api.WeldManager;
 
 /**
  * WeldSETestEnricher
@@ -30,13 +31,8 @@
 public class WeldSETestEnricher extends CDIInjectionEnricher
 {
    @Override
-   protected BeanManager lookupBeanManager()
+   protected BeanManager lookupBeanManager(Context context)
    {
-      WeldHolder holder = WeldSEContainer.WELD_MANAGER.get();
-      if (holder != null)
-      {
-         return holder.getManager();
-      }
-      return null;
+      return context.get(WeldManager.class);
    }
 }

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/NorwegianTranslator.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/NorwegianTranslator.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/NorwegianTranslator.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,9 +16,9 @@
  */
 package com.acme.cdi.translate;
 
-import javax.ejb.Stateless;
+import javax.enterprise.context.RequestScoped;
 
- at Stateless
+ at RequestScoped
 public class NorwegianTranslator implements Translator {
 
 	public String translate(String sentence) {

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/SentenceParser.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/SentenceParser.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/SentenceParser.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -20,12 +20,20 @@
 import java.util.Arrays;
 import java.util.List;
 
-public class SentenceParser implements Serializable {
+import javax.enterprise.context.RequestScoped;
 
-	private static final long serialVersionUID = 1L;
+ at RequestScoped
+public class SentenceParser implements Serializable
+{
 
-	public List<String> parse(String text) 
-	{
-		return Arrays.asList(text.split(" "));
-	}
+   private static final long serialVersionUID = 1L;
+
+   public SentenceParser()
+   {
+   }
+
+   public List<String> parse(String text)
+   {
+      return Arrays.asList(text.split(" "));
+   }
 }
\ No newline at end of file

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TextTranslator.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TextTranslator.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TextTranslator.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,8 +18,10 @@
 
 import java.io.Serializable;
 
+import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
 
+ at RequestScoped
 public class TextTranslator implements Serializable {
 
 	private static final long serialVersionUID = 1L;
@@ -27,8 +29,10 @@
 	private SentenceParser sentenceParser;
 	private Translator sentenceTranslator;
 
+	public TextTranslator() {}
+	
 	@Inject
-	TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) {
+	public TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) {
 		this.sentenceParser = sentenceParser;
 		this.sentenceTranslator = sentenceTranslator;
 	}

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TranslateController.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TranslateController.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/TranslateController.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -29,12 +29,14 @@
 	private static final long serialVersionUID = 1L;
 
 	@Inject
-	TextTranslator textTranslator;
+	private TextTranslator textTranslator;
 
 	private String inputText;
 
 	private String translation;
 
+	public TranslateController() {}
+	
 	// JSF action method, perhaps
 	public void translate() {
 		translation = textTranslator.translate(inputText);

Modified: arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/Translator.java
===================================================================
--- arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/Translator.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/domain/src/main/java/com/acme/cdi/translate/Translator.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,9 +16,9 @@
  */
 package com.acme.cdi.translate;
 
-import javax.ejb.Local;
+import javax.enterprise.context.RequestScoped;
 
- at Local
+ at RequestScoped
 public interface Translator {
 
    public String translate(String sentence);

Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -48,7 +48,7 @@
 	@Test
 	public void shouldBeReplacedByAMock(@Synchronous PaymentProcessor processor) throws Exception
 	{
-		processor.process("");
-		Assert.assertTrue(MockPaymentProcessor.HAS_BEEN_CALLED);
+       processor.process("");
+	   Assert.assertTrue(MockPaymentProcessor.HAS_BEEN_CALLED);
 	}
 }

Modified: arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java
===================================================================
--- arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/junit/src/test/java/com/acme/cdi/random/RandomTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,6 +16,8 @@
  */
 package com.acme.cdi.random;
 
+import javax.inject.Inject;
+
 import org.jboss.arquillian.api.Deployment;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -46,8 +48,10 @@
 						ArchivePaths.create("beans.xml"));
 	}
 
+	@Inject @Random int randomNumber;
+	
 	@Test
-	public void shouldRun(@Random int randomNumber) throws Exception 
+	public void shouldRun() throws Exception 
 	{
 	   Assert.assertTrue(randomNumber < 101);
 	}

Modified: arquillian/trunk/examples/testng/pom.xml
===================================================================
--- arquillian/trunk/examples/testng/pom.xml	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/testng/pom.xml	2010-04-24 20:48:13 UTC (rev 4329)
@@ -75,8 +75,8 @@
                   <artifactId>maven-surefire-plugin</artifactId>
                   <configuration>
                      <includes>
+                        <include>com/acme/cdi/*</include>
                         <include>com/acme/cdi/payment/*</include>
-                        <include>com/acme/cdi/random/*</include>
                      </includes>
                   </configuration>
                </plugin>
@@ -105,8 +105,7 @@
                   <artifactId>maven-surefire-plugin</artifactId>
                   <configuration>
                      <includes>
-                        <include>com/acme/cdi/payment/*</include>
-                        <include>com/acme/cdi/random/*</include>
+                        <include>com/acme/cdi/*</include>
                      </includes>
                   </configuration>
                </plugin>

Modified: arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java
===================================================================
--- arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/payment/SynchronousPaymentProcessorTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,8 +16,6 @@
  */
 package com.acme.cdi.payment;
 
-import javax.inject.Inject;
-
 import org.jboss.arquillian.api.Deployment;
 import org.jboss.arquillian.testng.Arquillian;
 import org.jboss.shrinkwrap.api.ArchivePaths;
@@ -27,8 +25,6 @@
 import org.testng.annotations.Test;
 
 /**
- * 
- *
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
  * @version $Revision: $
  */
@@ -45,10 +41,8 @@
 						ArchivePaths.create("beans.xml"));
 	}
 	
-	@Inject @Synchronous PaymentProcessor processor;
-	
-	@Test
-	public void shouldBeReplacedByAMock() throws Exception
+	@Test(dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)  
+	public void shouldBeReplacedByAMock(@Synchronous PaymentProcessor processor) throws Exception
 	{
 		processor.process("");
 		Assert.assertTrue(MockPaymentProcessor.HAS_BEEN_CALLED);

Modified: arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/translate/TranslateTestCase.java
===================================================================
--- arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/translate/TranslateTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/examples/testng/src/test/java/com/acme/cdi/translate/TranslateTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -41,19 +41,19 @@
 	
 	@Inject TranslateController controller;
 
-	@Test(enabled = false) // https://jira.jboss.org/jira/browse/ARQ-55
+	@Test // https://jira.jboss.org/jira/browse/ARQ-55
 	public void shouldSetInputText() throws Exception 
 	{
 	   controller.setInputText("hi");
 	}
 	
-	@Test(dependsOnMethods = "shouldSetInputText", enabled = false) // https://jira.jboss.org/jira/browse/ARQ-55
+	@Test(dependsOnMethods = "shouldSetInputText") // https://jira.jboss.org/jira/browse/ARQ-55
 	public void shouldTranslate() throws Exception 
 	{
 		controller.translate();
 	}
 	
-	@Test(dependsOnMethods = "shouldTranslate", enabled = false) // https://jira.jboss.org/jira/browse/ARQ-55
+	@Test(dependsOnMethods = "shouldTranslate") // https://jira.jboss.org/jira/browse/ARQ-55
 	public void shouldVerify() throws Exception 
 	{
 		Assert.assertEquals(controller.getTranslation(), "hei");

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/EventTestRunnerAdaptor.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/EventTestRunnerAdaptor.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/EventTestRunnerAdaptor.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,18 +17,21 @@
 package org.jboss.arquillian.impl;
 
 import java.lang.reflect.Method;
+import java.util.Stack;
 
 import org.jboss.arquillian.impl.context.ContextLifecycleManager;
-import org.jboss.arquillian.impl.event.type.After;
-import org.jboss.arquillian.impl.event.type.AfterClass;
-import org.jboss.arquillian.impl.event.type.AfterSuite;
-import org.jboss.arquillian.impl.event.type.Before;
-import org.jboss.arquillian.impl.event.type.BeforeClass;
-import org.jboss.arquillian.impl.event.type.BeforeSuite;
-import org.jboss.arquillian.impl.event.type.Test;
+import org.jboss.arquillian.impl.context.TestContext;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestMethodExecutor;
 import org.jboss.arquillian.spi.TestResult;
 import org.jboss.arquillian.spi.TestRunnerAdaptor;
+import org.jboss.arquillian.spi.event.suite.After;
+import org.jboss.arquillian.spi.event.suite.AfterClass;
+import org.jboss.arquillian.spi.event.suite.AfterSuite;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.BeforeClass;
+import org.jboss.arquillian.spi.event.suite.BeforeSuite;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * EventTestRunnerAdaptor
@@ -39,6 +42,7 @@
 public class EventTestRunnerAdaptor implements TestRunnerAdaptor
 {
    private ContextLifecycleManager contextLifecycle;
+   private Stack<Context> activeContext = new Stack<Context>();
    
    public EventTestRunnerAdaptor(ContextLifecycleManager contextLifecycle)
    {
@@ -47,14 +51,22 @@
       this.contextLifecycle = contextLifecycle;
    }
 
+   public Context getActiveContext()
+   {
+      return activeContext.peek();
+   }
+   
    public void beforeSuite() throws Exception
    {
-      contextLifecycle.createRestoreSuiteContext().fire(new BeforeSuite());
+      Context suiteContext = contextLifecycle.createRestoreSuiteContext();
+      suiteContext.fire(new BeforeSuite());
+      activeContext.push(suiteContext);
    }
 
    public void afterSuite() throws Exception
    {
       contextLifecycle.createRestoreSuiteContext().fire(new AfterSuite());
+      activeContext.pop();
       contextLifecycle.destroySuiteContext();
    }
 
@@ -62,7 +74,9 @@
    {
       Validate.notNull(testClass, "TestClass must be specified");
       
-      contextLifecycle.createRestoreClassContext(testClass).fire(new BeforeClass(testClass));
+      Context classContext = contextLifecycle.createRestoreClassContext(testClass);
+      classContext.fire(new BeforeClass(testClass));
+      activeContext.push(classContext);
    }
 
    public void afterClass(Class<?> testClass) throws Exception
@@ -70,6 +84,8 @@
       Validate.notNull(testClass, "TestClass must be specified");
       
       contextLifecycle.createRestoreClassContext(testClass).fire(new AfterClass(testClass));
+      activeContext.pop();
+      contextLifecycle.destroyClassContext(testClass);
    }
 
    public void before(Object testInstance, Method testMethod) throws Exception
@@ -77,7 +93,9 @@
       Validate.notNull(testInstance, "TestInstance must be specified");
       Validate.notNull(testMethod, "TestMethod must be specified");
       
-      contextLifecycle.createRestoreTestContext(testInstance).fire(new Before(testInstance, testMethod));
+      TestContext testContext = contextLifecycle.createRestoreTestContext(testInstance);
+      testContext.fire(new Before(testInstance, testMethod));
+      activeContext.push(testContext);
    }
 
    public void after(Object testInstance, Method testMethod) throws Exception
@@ -86,6 +104,7 @@
       Validate.notNull(testMethod, "TestMethod must be specified");
 
       contextLifecycle.createRestoreTestContext(testInstance).fire(new After(testInstance, testMethod));
+      activeContext.pop();
       contextLifecycle.destroyTestContext(testInstance);
    }
    

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/AbstractEventContext.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/AbstractEventContext.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/AbstractEventContext.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -20,11 +20,12 @@
 import java.util.Map;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.event.Event;
-import org.jboss.arquillian.impl.event.EventHandler;
 import org.jboss.arquillian.impl.event.EventManager;
 import org.jboss.arquillian.impl.event.MapEventManager;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 
 
 /**
@@ -33,25 +34,25 @@
  * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public abstract class AbstractEventContext<X extends Context<X, T>, T extends Event> implements Context<X, T>
+public abstract class AbstractEventContext implements Context
 {
-   private EventManager<X, T> eventManager;
+   private EventManager eventManager;
    
    // TODO: create ObjectStore
    private Map<Class<?>, Object> objectStore;
    
    public AbstractEventContext()
    {
-      this.eventManager = new MapEventManager<X, T>();
+      this.eventManager = new MapEventManager();
       this.objectStore = new HashMap<Class<?>, Object>();
    }
 
-   public <K extends T> void register(Class<? extends K> eventType, EventHandler<X, ? super K> handler)
+   public <K extends Event> void register(Class<? extends K> eventType, EventHandler<? super K> handler)
    {
       eventManager.register(eventType, handler);
    }
    
-   protected EventManager<X, T> getEventManager() 
+   protected EventManager getEventManager() 
    {
       return eventManager;
    }
@@ -72,7 +73,7 @@
       Object instance = objectStore.get(type);
       if(instance == null) 
       {
-         Context<?, ?> parentContext = getParentContext();
+         Context parentContext = getParentContext();
          if(parentContext != null) 
          {
             instance = parentContext.get(type);
@@ -85,4 +86,14 @@
    {
       return get(ServiceLoader.class);
    }
+   
+   public void fire(Event event)
+   {
+      Context parent = getParentContext();
+      if(parent != null)
+      {
+         parent.fire(event);
+      }
+      getEventManager().fire(this, event);
+   }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClassContext.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClassContext.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClassContext.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,7 +17,7 @@
 package org.jboss.arquillian.impl.context;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
+import org.jboss.arquillian.spi.Context;
 
 /**
  * A ClassContext is alive in the following life cycles: <br/>
@@ -33,7 +33,7 @@
  * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class ClassContext extends AbstractEventContext<ClassContext, ClassEvent>
+public class ClassContext extends AbstractEventContext
 {
    private SuiteContext suiteContext;
    
@@ -58,14 +58,8 @@
       return suiteContext;
    }
    
-   public Context<?, ?> getParentContext()
+   public Context getParentContext()
    {
       return getSuiteContext();
    }
-   
-   public void fire(ClassEvent event)
-   {
-      getEventManager().fire(this, event);
-      getSuiteContext().fire(event);
-   }
 }
\ No newline at end of file

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClientProfileBuilder.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClientProfileBuilder.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ClientProfileBuilder.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,15 +18,7 @@
 
 import org.jboss.arquillian.impl.ClientDeploymentGenerator;
 import org.jboss.arquillian.impl.DeploymentGenerator;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.After;
-import org.jboss.arquillian.impl.event.type.AfterClass;
-import org.jboss.arquillian.impl.event.type.AfterSuite;
-import org.jboss.arquillian.impl.event.type.Before;
-import org.jboss.arquillian.impl.event.type.BeforeClass;
-import org.jboss.arquillian.impl.event.type.BeforeSuite;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
-import org.jboss.arquillian.impl.event.type.Test;
+import org.jboss.arquillian.impl.handler.ActivateRunModeTypeLocal;
 import org.jboss.arquillian.impl.handler.ArchiveGenerator;
 import org.jboss.arquillian.impl.handler.ContainerCreator;
 import org.jboss.arquillian.impl.handler.ContainerDeployer;
@@ -35,7 +27,15 @@
 import org.jboss.arquillian.impl.handler.ContainerTestExecuter;
 import org.jboss.arquillian.impl.handler.ContainerUndeployer;
 import org.jboss.arquillian.impl.handler.ExecutionTimer;
-import org.jboss.arquillian.impl.handler.ActivateRunModeTypeLocal;
+import org.jboss.arquillian.spi.event.suite.After;
+import org.jboss.arquillian.spi.event.suite.AfterClass;
+import org.jboss.arquillian.spi.event.suite.AfterSuite;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.BeforeClass;
+import org.jboss.arquillian.spi.event.suite.BeforeSuite;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * ClientContextCreator
@@ -52,7 +52,7 @@
       context.register(BeforeSuite.class, new ContainerStarter());
       context.register(AfterSuite.class, new ContainerStopper());
       
-      EventHandler<SuiteContext, SuiteEvent> timer = new ExecutionTimer();
+      EventHandler<SuiteEvent> timer = new ExecutionTimer();
       context.register(BeforeSuite.class, timer);
       context.register(AfterSuite.class, timer);
       context.register(BeforeClass.class, timer);

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContainerProfileBuilder.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContainerProfileBuilder.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContainerProfileBuilder.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,10 +16,10 @@
  */
 package org.jboss.arquillian.impl.context;
 
-import org.jboss.arquillian.impl.event.type.Before;
-import org.jboss.arquillian.impl.event.type.Test;
 import org.jboss.arquillian.impl.handler.TestCaseEnricher;
 import org.jboss.arquillian.impl.handler.TestEventExecuter;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * ClientContextCreator

Deleted: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/Context.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/Context.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/Context.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -1,81 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.arquillian.impl.context;
-
-import org.jboss.arquillian.impl.event.Event;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.spi.ServiceLoader;
-
-/**
- * 
- *
- * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
- * @version $Revision: $
- * @param <X>
- * @param <T>
- */
-public interface Context<X, T extends Event> 
-{
-   /**
-    * Fire a new {@link Event}.
-    * 
-    * @param event The {@link Event} instance to fire
-    */
-   void  fire(T event); 
-   
-   /**
-    * Register a {@link EventHandler} for a specific {@link Event}.
-    * 
-    * @param <K>
-    * @param eventType The Type of {@link Event} to listen to
-    * @param handler The receiver of the {@link Event}
-    */
-   <K extends T> void register(Class<? extends K> eventType, EventHandler<X, ? super K> handler);
-
-   /**
-    * Get the defined {@link ServiceLoader}
-    * 
-    * @return A instance of {@link ServiceLoader}
-    * @see #get(Class)
-    */
-   ServiceLoader getServiceLoader();
-   
-   /**
-    * Get this contexts parent context.
-    * 
-    * @return The parent context if any, null if this is the top context.
-    */
-   Context<?, ?> getParentContext();
-
-   /**
-    * Add a instance of B to the context.
-    * 
-    * @param <B>
-    * @param type The Type of the instance to add
-    * @param instance The instance to add
-    */
-   <B> void add(Class<B> type, B instance);
-   
-   /**
-    * Get a instance of B from the context.
-    * 
-    * @param <B>
-    * @param type Type to lookup
-    * @return A instance of B or null if not found
-    */
-   <B> B get(Class<B> type);
-}

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContextLifecycleManager.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContextLifecycleManager.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/ContextLifecycleManager.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -127,7 +127,7 @@
                ClassContext.class.getSimpleName());
       }
       
-      if(!classContextStore.contains(testClass)) 
+      if(!classContextStore.containsKey(testClass)) 
       {
          ClassContext classContext = new ClassContext(createRestoreSuiteContext()); 
          profileBuilder.buildClassContext(classContext, testClass);
@@ -166,7 +166,7 @@
    {
       Validate.notNull(testInstance, "TestInstance must be specified");
       
-      if(!testContextStore.contains(testInstance)) 
+      if(!testContextStore.containsKey(testInstance)) 
       {
          TestContext testContext = new TestContext(createRestoreClassContext(testInstance.getClass()));
          profileBuilder.buildTestContext(testContext, testInstance);

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/StandaloneProfileBuilder.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/StandaloneProfileBuilder.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/StandaloneProfileBuilder.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,11 +16,10 @@
  */
 package org.jboss.arquillian.impl.context;
 
-import org.jboss.arquillian.impl.event.type.Before;
-import org.jboss.arquillian.impl.event.type.Test;
 import org.jboss.arquillian.impl.handler.ContainerTestExecuter;
-import org.jboss.arquillian.impl.handler.TestEventExecuter;
 import org.jboss.arquillian.impl.handler.TestCaseEnricher;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * StandaloneProfileBuilder

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/SuiteContext.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/SuiteContext.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/SuiteContext.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,7 +17,7 @@
 package org.jboss.arquillian.impl.context;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.ServiceLoader;
 
 /**
@@ -36,7 +36,7 @@
  * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class SuiteContext extends AbstractEventContext<SuiteContext, SuiteEvent>
+public class SuiteContext extends AbstractEventContext
 {
    /**
     * Create a new SuiteContext.
@@ -51,15 +51,10 @@
       add(ServiceLoader.class, serviceLoader);
    }
    
-   public void fire(SuiteEvent event)
-   {
-      getEventManager().fire(this, event);
-   }
-   
    /**
     * @return Always null, SuiteContext is the root context.
     */
-   public Context<?, ?> getParentContext()
+   public Context getParentContext()
    {
       return null;
    }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/TestContext.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/TestContext.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/context/TestContext.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,7 +17,7 @@
 package org.jboss.arquillian.impl.context;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.event.type.TestEvent;
+import org.jboss.arquillian.spi.Context;
 
 /**
  * A TestContext is alive in the following life cycles: <br/>
@@ -31,7 +31,7 @@
  * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class TestContext extends AbstractEventContext<TestContext, TestEvent> 
+public class TestContext extends AbstractEventContext
 {
    private ClassContext classContext;
    
@@ -56,14 +56,9 @@
       return classContext;
    }
    
-   public Context<?, ?> getParentContext()
+   public Context getParentContext()
    {
       return getClassContext();
    }
 
-   public void fire(TestEvent event)
-   {
-      getEventManager().fire(this, event);
-      getClassContext().fire(event);
-   }
 }

Deleted: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/Event.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/Event.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/Event.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -1,27 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.arquillian.impl.event;
-
-/**
- * Event
- *
- * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
- * @version $Revision: $
- */
-public interface Event
-{
-}

Deleted: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventHandler.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventHandler.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventHandler.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -1,37 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jboss.arquillian.impl.event;
-
-/**
- * EventHandler
- *
- * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
- * @version $Revision: $
- * @param <X> The Context
- * @param <T> The Event 
- */
-public interface EventHandler<X, T>
-{
-   
-   /**
-    * @param context
-    * @param event
-    * @throws Exception
-    */
-   void callback(X context, T event) throws Exception;
-   
-}

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventManager.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventManager.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/EventManager.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,6 +16,10 @@
  */
 package org.jboss.arquillian.impl.event;
 
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+
 /**
  * EventManagerIF
  *
@@ -24,18 +28,18 @@
  * @param <X>
  * @param <T>
  */
-public interface EventManager<X, T extends Event>
+public interface EventManager
 {
    /**
     * @param context
     * @param event
     */
-   void fire(X context, T event);
+   void fire(Context context, Event event);
    
    /**
     * @param <K>
     * @param eventType
     * @param handler
     */
-   <K extends T> void register(Class<? extends K> eventType, EventHandler<X, ? super K> handler);
+   <K extends Event> void register(Class<? extends K> eventType, EventHandler<? super K> handler);
 }
\ No newline at end of file

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/MapEventManager.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/MapEventManager.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/event/MapEventManager.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -22,7 +22,9 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.Context;
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 
 /**
  * EventManager
@@ -31,16 +33,16 @@
  * @version $Revision: $
  */
 @SuppressWarnings("unchecked")
-public class MapEventManager<X extends Context<X, T>, T extends Event> implements EventManager<X, T>
+public class MapEventManager implements EventManager
 {
-   private Map<Class<? extends T>, List<EventHandler>> handlerRegistry;
+   private Map<Class<? extends Event>, List<EventHandler>> handlerRegistry;
    
    public MapEventManager()
    {
-      this.handlerRegistry = new ConcurrentHashMap<Class<? extends T>, List<EventHandler>>();
+      this.handlerRegistry = new ConcurrentHashMap<Class<? extends Event>, List<EventHandler>>();
    }
    
-   public void fire(X context, T event) 
+   public void fire(Context context, Event event) 
    {
       Validate.notNull(context, "Context must be specified");
       Validate.notNull(event, "Event must be specified");
@@ -50,8 +52,14 @@
       {
          try
          {
-            for(EventHandler<X, T> handler : handlers)
+            /*
+               We need to use old style of for loop to avoid ConcurrentModificationException
+               A handler could add a listener to the same event in it's callback.
+               ie: a DeployableContainer adding a SessionLifecyle handler to be added to the @BeforeClass 
+            */ 
+            for(int i = 0; i < handlers.size(); i++)
             {
+               EventHandler handler = handlers.get(i);
                handler.callback(context, event);
             }
          } 
@@ -63,7 +71,7 @@
    }
    
    // TODO: look at concurrency of add / list
-   public <K extends T> void register(Class<? extends K> eventType, EventHandler<X, ? super K> handler) 
+   public <K extends Event> void register(Class<? extends K> eventType, EventHandler<? super K> handler) 
    {
       Validate.notNull(eventType, "EventType must be specified");
       Validate.notNull(handler, "EventHandler must be specified");

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocal.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocal.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocal.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,12 +18,12 @@
 
 import org.jboss.arquillian.api.RunMode;
 import org.jboss.arquillian.api.RunModeType;
-import org.jboss.arquillian.impl.context.ClassContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.BeforeClass;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestMethodExecutor;
 import org.jboss.arquillian.spi.TestResult;
+import org.jboss.arquillian.spi.event.suite.BeforeClass;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 
 /**
  * Handler that will setup the context as defined by the {@link RunModeType#LOCAL}. <br/>
@@ -36,12 +36,12 @@
  * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class ActivateRunModeTypeLocal implements EventHandler<ClassContext, BeforeClass>
+public class ActivateRunModeTypeLocal implements EventHandler<BeforeClass>
 {
    /* (non-Javadoc)
     * @see org.jboss.arquillian.impl.event.EventHandler#callback(java.lang.Object, java.lang.Object)
     */
-   public void callback(ClassContext context, BeforeClass event)
+   public void callback(Context context, BeforeClass event)
          throws Exception
    {
       if(event.getTestClass().isAnnotationPresent(RunMode.class))

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ArchiveGenerator.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ArchiveGenerator.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ArchiveGenerator.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,9 +18,9 @@
 
 import org.jboss.arquillian.impl.DeploymentGenerator;
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.ClassContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 import org.jboss.shrinkwrap.api.Archive;
 
 /**
@@ -39,10 +39,10 @@
  * @see DeploymentGenerator
  * @see Archive 
  */
-public class ArchiveGenerator implements EventHandler<ClassContext, ClassEvent>
+public class ArchiveGenerator implements EventHandler<ClassEvent>
 {
    
-   public void callback(ClassContext context, ClassEvent event) throws Exception
+   public void callback(Context context, ClassEvent event) throws Exception
    {
       DeploymentGenerator generator = context.get(DeploymentGenerator.class);
       Validate.stateNotNull(generator, "No " + DeploymentGenerator.class.getName() + " found in context");

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerCreator.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerCreator.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerCreator.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,11 +16,13 @@
  */
 package org.jboss.arquillian.impl.handler;
 
-import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
 import org.jboss.arquillian.spi.Configuration;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.container.AfterSetup;
+import org.jboss.arquillian.spi.event.container.BeforeSetup;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 
 /**
  * A Handler for creating and setting up a {@link DeployableContainer} for use. <br/>
@@ -38,14 +40,16 @@
  * @see Configuration
  * @see DeployableContainer
  */
-public class ContainerCreator implements EventHandler<SuiteContext, SuiteEvent>
+public class ContainerCreator implements EventHandler<SuiteEvent>
 {
    
-   public void callback(SuiteContext context, SuiteEvent event) throws Exception 
+   public void callback(Context context, SuiteEvent event) throws Exception 
    {
       DeployableContainer container = context.getServiceLoader().onlyOne(DeployableContainer.class);
-      container.setup(context.get(Configuration.class));
       
+      context.fire(new BeforeSetup());
+      container.setup(context, context.get(Configuration.class));
       context.add(DeployableContainer.class, container);
+      context.fire(new AfterSetup());
    }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerDeployer.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerDeployer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerDeployer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,11 +17,13 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.ClassContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.container.AfterDeploy;
+import org.jboss.arquillian.spi.event.container.BeforeDeploy;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 import org.jboss.shrinkwrap.api.Archive;
 
 /**
@@ -42,10 +44,10 @@
  * @see ContainerMethodExecutor
  * @see Archive 
  */
-public class ContainerDeployer implements EventHandler<ClassContext, ClassEvent>
+public class ContainerDeployer implements EventHandler<ClassEvent>
 {
    
-   public void callback(ClassContext context, ClassEvent event) throws Exception
+   public void callback(Context context, ClassEvent event) throws Exception
    {
       DeployableContainer container = context.get(DeployableContainer.class);
       Validate.stateNotNull(container, "No " + DeployableContainer.class.getName() + " found in context");
@@ -53,7 +55,9 @@
       Archive<?> deployment = context.get(Archive.class);
       Validate.stateNotNull(deployment, "No " + Archive.class.getName() + " found in context");
       
-      ContainerMethodExecutor executor = container.deploy(deployment);
+      context.fire(new BeforeDeploy());
+      ContainerMethodExecutor executor = container.deploy(context, deployment);
       context.add(ContainerMethodExecutor.class, executor);
+      context.fire(new AfterDeploy());
    }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerRestarter.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerRestarter.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerRestarter.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -16,11 +16,10 @@
  */
 package org.jboss.arquillian.impl.handler;
 
-import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.ClassContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 
 /**
  * A Handler for restarting the {@link DeployableContainer} for every X deployments.<br/>
@@ -33,29 +32,26 @@
  * @version $Revision: $
  * @see DeployableContainer
  */
-public class ContainerRestarter implements EventHandler<ClassContext, SuiteEvent>
+public class ContainerRestarter implements EventHandler<SuiteEvent>
 {
    private static final int MAX_DEPLOYMENTS_BEFORE_RESTART = 5;
    
    private int deploymentCount = 0;
    
    
-   public void callback(ClassContext context, SuiteEvent event) throws Exception
+   public void callback(Context context, SuiteEvent event) throws Exception
    {
-      DeployableContainer container = context.get(DeployableContainer.class);
-      Validate.stateNotNull(container, "No " + DeployableContainer.class.getName() + " found in context");
-
       if(deploymentCount == getMaxDeployments(context) -1)
       {
-         container.stop();
-         container.start();
+         new ContainerStopper().callback(context, event);
+         new ContainerStarter().callback(context, event);
          
          deploymentCount = 0;
       }
       deploymentCount++;
    }
    
-   private int getMaxDeployments(ClassContext context)
+   private int getMaxDeployments(Context context)
    {
       //context.get(Configuration.class).getMaxDeploymentsBeforeRestart();
       return MAX_DEPLOYMENTS_BEFORE_RESTART;

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStarter.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStarter.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStarter.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,12 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.container.AfterStart;
+import org.jboss.arquillian.spi.event.container.BeforeStart;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 
 /**
  * A Handler for starting the {@link DeployableContainer}.<br/>
@@ -33,14 +35,16 @@
  * @version $Revision: $
  * @see DeployableContainer
  */
-public class ContainerStarter implements EventHandler<SuiteContext, SuiteEvent>
+public class ContainerStarter implements EventHandler<SuiteEvent>
 {
    
-   public void callback(SuiteContext context, SuiteEvent event) throws Exception
+   public void callback(Context context, SuiteEvent event) throws Exception
    {
       DeployableContainer container = context.get(DeployableContainer.class);
       Validate.stateNotNull(container, "No " + DeployableContainer.class.getName() + " found in context");
       
-      container.start();
+      context.fire(new BeforeStart());
+      container.start(context);
+      context.fire(new AfterStart());
    }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStopper.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStopper.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerStopper.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,12 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.container.AfterStop;
+import org.jboss.arquillian.spi.event.container.BeforeStop;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 
 /**
  * A Handler for stopping the {@link DeployableContainer}.<br/>
@@ -33,14 +35,16 @@
  * @version $Revision: $
  * @see DeployableContainer
  */
-public class ContainerStopper implements EventHandler<SuiteContext, SuiteEvent>
+public class ContainerStopper implements EventHandler<SuiteEvent>
 {
    
-   public void callback(SuiteContext context, SuiteEvent event) throws Exception
+   public void callback(Context context, SuiteEvent event) throws Exception
    {
       DeployableContainer container = context.get(DeployableContainer.class);
       Validate.stateNotNull(container, "No " + DeployableContainer.class.getName() + " found in context");
       
-      container.stop();
+      context.fire(new BeforeStop());
+      container.stop(context);
+      context.fire(new AfterStop());
    }
 }
\ No newline at end of file

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerTestExecuter.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerTestExecuter.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerTestExecuter.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,12 +17,12 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.Test;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.TestResult;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * A Handler for executing the remote Test Method.<br/>
@@ -35,10 +35,10 @@
  * @version $Revision: $
  * @see DeployableContainer
  */
-public class ContainerTestExecuter implements EventHandler<TestContext, Test>
+public class ContainerTestExecuter implements EventHandler<Test>
 {
    
-   public void callback(TestContext context, Test event) throws Exception
+   public void callback(Context context, Test event) throws Exception
    {
       ContainerMethodExecutor executor = context.get(ContainerMethodExecutor.class);
       Validate.stateNotNull(executor, "No " + ContainerMethodExecutor.class.getName() + " found in context");

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerUndeployer.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerUndeployer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ContainerUndeployer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,12 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.Validate;
-import org.jboss.arquillian.impl.context.ClassContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.DeployableContainer;
+import org.jboss.arquillian.spi.event.container.AfterUnDeploy;
+import org.jboss.arquillian.spi.event.container.BeforeUnDeploy;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 import org.jboss.shrinkwrap.api.Archive;
 
 /**
@@ -37,10 +39,10 @@
  * @see DeployableContainer
  * @see Archive 
  */
-public class ContainerUndeployer implements EventHandler<ClassContext, ClassEvent>
+public class ContainerUndeployer implements EventHandler<ClassEvent>
 {
    
-   public void callback(ClassContext context, ClassEvent event) throws Exception
+   public void callback(Context context, ClassEvent event) throws Exception
    {
       DeployableContainer container = context.get(DeployableContainer.class);
       Validate.stateNotNull(container, "No " + DeployableContainer.class.getName() + " found in context");
@@ -48,6 +50,8 @@
       Archive<?> deployment = context.get(Archive.class);
       Validate.stateNotNull(deployment, "No " + Archive.class.getName() + " found in context");
       
-      container.undeploy(deployment);
+      context.fire(new BeforeUnDeploy());
+      container.undeploy(context, deployment);
+      context.fire(new AfterUnDeploy());
    }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ExecutionTimer.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ExecutionTimer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/ExecutionTimer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,9 +17,9 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.DeployableTestBuilder;
-import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
+import org.jboss.arquillian.spi.Context;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 
 /**
  * A Handler for simple execution time tracking. Prints to System.out the 
@@ -28,12 +28,12 @@
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class ExecutionTimer implements EventHandler<SuiteContext, SuiteEvent>
+public class ExecutionTimer implements EventHandler<SuiteEvent>
 {
    private long start = System.currentTimeMillis();
    private long previous = System.currentTimeMillis();
    
-   public void callback(SuiteContext context, SuiteEvent event) throws Exception 
+   public void callback(Context context, SuiteEvent event) throws Exception 
    {
       System.out.println(DeployableTestBuilder.getProfile() + "-" + event.getClass().getName() + " " + (previous - start) + " ms");
       start = previous;

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestCaseEnricher.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestCaseEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestCaseEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,10 +18,10 @@
 
 import java.util.Collection;
 
-import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.TestEvent;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.TestEvent;
 
 /**
  * A Handler for enriching the Test instance.<br/>
@@ -29,15 +29,18 @@
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class TestCaseEnricher implements EventHandler<TestContext, TestEvent>
+public class TestCaseEnricher implements EventHandler<TestEvent>
 {
    
-   public void callback(TestContext context, TestEvent event) throws Exception
+   /* (non-Javadoc)
+    * @see org.jboss.arquillian.impl.event.EventHandler#callback(org.jboss.arquillian.impl.context.Context, java.lang.Object)
+    */
+   public void callback(Context context, TestEvent event) throws Exception
    {
       Collection<TestEnricher> testEnrichers = context.getServiceLoader().all(TestEnricher.class);
       for(TestEnricher enricher : testEnrichers) 
       {
-         enricher.enrich(event.getTestInstance());
+         enricher.enrich(context, event.getTestInstance());
       }
    }
 }

Modified: arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestEventExecuter.java
===================================================================
--- arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestEventExecuter.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/main/java/org/jboss/arquillian/impl/handler/TestEventExecuter.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,10 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.TestResultImpl;
-import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.Test;
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestResult.Status;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.Test;
 
 /**
  * A Handler for executing the Test Method.
@@ -28,10 +28,15 @@
  * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
  * @version $Revision: $
  */
-public class TestEventExecuter implements EventHandler<TestContext, Test>
+public class TestEventExecuter implements EventHandler<Test>
 {
    
-   public void callback(TestContext context, Test event) throws Exception 
+   /**
+    * @param context
+    * @param event
+    * @throws Exception
+    */
+   public void callback(Context context, Test event) throws Exception 
    {
       try 
       {

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/EventTestRunnerAdaptorTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/EventTestRunnerAdaptorTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/EventTestRunnerAdaptorTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -23,12 +23,12 @@
 import org.jboss.arquillian.impl.context.ProfileBuilder;
 import org.jboss.arquillian.impl.context.SuiteContext;
 import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
-import org.jboss.arquillian.impl.event.type.TestEvent;
 import org.jboss.arquillian.spi.ServiceLoader;
 import org.jboss.arquillian.spi.TestMethodExecutor;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
+import org.jboss.arquillian.spi.event.suite.TestEvent;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -55,13 +55,13 @@
    public ProfileBuilder profileBuilder;
    
    @Mock
-   private EventHandler<SuiteContext, SuiteEvent> suiteEventHandler;
+   private EventHandler<SuiteEvent> suiteEventHandler;
 
    @Mock
-   private EventHandler<ClassContext, ClassEvent> classEventHandler;
+   private EventHandler<ClassEvent> classEventHandler;
 
    @Mock
-   private EventHandler<TestContext, TestEvent> testEventHandler;
+   private EventHandler<TestEvent> testEventHandler;
 
    @Before
    public void createContexts() throws Exception 
@@ -73,8 +73,8 @@
          public Void answer(InvocationOnMock invocation) throws Throwable
          {
             SuiteContext context = (SuiteContext)invocation.getArguments()[0];
-            context.register(org.jboss.arquillian.impl.event.type.BeforeSuite.class, suiteEventHandler);
-            context.register(org.jboss.arquillian.impl.event.type.AfterSuite.class, suiteEventHandler);
+            context.register(org.jboss.arquillian.spi.event.suite.BeforeSuite.class, suiteEventHandler);
+            context.register(org.jboss.arquillian.spi.event.suite.AfterSuite.class, suiteEventHandler);
             return null;
          }
       }).when(profileBuilder).buildSuiteContext(Mockito.any(SuiteContext.class));
@@ -84,8 +84,8 @@
                public Void answer(InvocationOnMock invocation) throws Throwable
                {
                   ClassContext context = (ClassContext)invocation.getArguments()[0];
-                  context.register(org.jboss.arquillian.impl.event.type.BeforeClass.class, classEventHandler);
-                  context.register(org.jboss.arquillian.impl.event.type.AfterClass.class, classEventHandler);
+                  context.register(org.jboss.arquillian.spi.event.suite.BeforeClass.class, classEventHandler);
+                  context.register(org.jboss.arquillian.spi.event.suite.AfterClass.class, classEventHandler);
                   return null;
                }
             }).when(profileBuilder).buildClassContext(Mockito.any(ClassContext.class), Mockito.any(Class.class));
@@ -95,9 +95,9 @@
                public Void answer(InvocationOnMock invocation) throws Throwable
                {
                   TestContext context = (TestContext)invocation.getArguments()[0];
-                  context.register(org.jboss.arquillian.impl.event.type.Before.class, testEventHandler);
-                  context.register(org.jboss.arquillian.impl.event.type.Test.class, testEventHandler);
-                  context.register(org.jboss.arquillian.impl.event.type.After.class, testEventHandler);
+                  context.register(org.jboss.arquillian.spi.event.suite.Before.class, testEventHandler);
+                  context.register(org.jboss.arquillian.spi.event.suite.Test.class, testEventHandler);
+                  context.register(org.jboss.arquillian.spi.event.suite.After.class, testEventHandler);
                   return null;
                }
             }).when(profileBuilder).buildTestContext(Mockito.any(TestContext.class), Mockito.any(Class.class));

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/context/ContextLifecycleManagerTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/context/ContextLifecycleManagerTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/context/ContextLifecycleManagerTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -23,12 +23,12 @@
 import org.jboss.arquillian.impl.context.ProfileBuilder;
 import org.jboss.arquillian.impl.context.SuiteContext;
 import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.EventHandler;
-import org.jboss.arquillian.impl.event.type.Before;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
-import org.jboss.arquillian.impl.event.type.TestEvent;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.suite.Before;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
+import org.jboss.arquillian.spi.event.suite.TestEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -52,13 +52,13 @@
    private ProfileBuilder profileBuilder;
    
    @Mock
-   private EventHandler<SuiteContext, SuiteEvent> suiteEventHandler;
+   private EventHandler<SuiteEvent> suiteEventHandler;
 
    @Mock
-   private EventHandler<ClassContext, ClassEvent> classEventHandler;
+   private EventHandler<ClassEvent> classEventHandler;
 
    @Mock
-   private EventHandler<TestContext, TestEvent> testEventHandler;
+   private EventHandler<TestEvent> testEventHandler;
 
    @Test
    public void shouldBeAbleToCreateRestoreSuiteContext() throws Exception 

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/event/EventManagerTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/event/EventManagerTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/event/EventManagerTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,8 +17,9 @@
 package org.jboss.arquillian.impl.event;
 
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -39,7 +40,7 @@
    private ServiceLoader serviceLoader;
    
    @Mock 
-   private EventHandler<SuiteContext, SuiteEvent> handler;
+   private EventHandler<SuiteEvent> handler;
 
    @Test(expected = FiredEventException.class)
    public void shouldWrapException() throws Exception 
@@ -51,7 +52,7 @@
       SuiteContext context = new SuiteContext(serviceLoader);
       SuiteEvent event =  new SuiteEvent();
       
-      EventManager<SuiteContext, SuiteEvent> manager = new MapEventManager<SuiteContext, SuiteEvent>();
+      EventManager manager = new MapEventManager();
       manager.register(SuiteEvent.class, handler);
       
       manager.fire(context, event);
@@ -65,7 +66,7 @@
       SuiteContext context = new SuiteContext(serviceLoader);
       SuiteEvent event =  new SuiteEvent();
       
-      EventManager<SuiteContext, SuiteEvent> manager = new MapEventManager<SuiteContext, SuiteEvent>();
+      EventManager manager = new MapEventManager();
       for(int i = 0; i < handlerCount; i++)
       {
          manager.register(SuiteEvent.class, handler);

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocalTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocalTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ActivateRunModeTypeLocalTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -22,9 +22,9 @@
 import org.jboss.arquillian.api.RunModeType;
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.BeforeClass;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.suite.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ArchiveGeneratorTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ArchiveGeneratorTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ArchiveGeneratorTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -21,8 +21,8 @@
 import org.jboss.arquillian.impl.DeploymentGenerator;
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerCreatorTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerCreatorTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerCreatorTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -19,10 +19,14 @@
 import junit.framework.Assert;
 
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
 import org.jboss.arquillian.spi.Configuration;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterSetup;
+import org.jboss.arquillian.spi.event.container.BeforeSetup;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -45,6 +49,9 @@
    @Mock
    private DeployableContainer container;
    
+   @Mock 
+   private EventHandler<ContainerEvent> eventHandler;
+   
    @Test
    public void shouldLoadAndSetupTheContainer() throws Exception
    {
@@ -54,12 +61,20 @@
       
       SuiteContext context = new SuiteContext(serviceLoader);
       context.add(Configuration.class, configuration);
+      context.register(BeforeSetup.class, eventHandler);
+      context.register(AfterSetup.class, eventHandler);
       
       ContainerCreator handler = new ContainerCreator();
       handler.callback(context, new SuiteEvent());
       
-      Mockito.verify(container).setup(configuration);
+      // verify that the container was setup
+      Mockito.verify(container).setup(context, configuration);
+
+      // verify that all the events where fired
+      Mockito.verify(eventHandler, Mockito.times(2)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
       
+      // verify that the container was exported
       Assert.assertNotNull(
             "Should have exported " + DeployableContainer.class,
             context.get(DeployableContainer.class));

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerDeployerTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerDeployerTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerDeployerTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -20,10 +20,14 @@
 
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
 import org.jboss.arquillian.spi.ContainerMethodExecutor;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterDeploy;
+import org.jboss.arquillian.spi.event.container.BeforeDeploy;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
@@ -51,6 +55,9 @@
    @Mock
    private ContainerMethodExecutor executor;
    
+   @Mock
+   private EventHandler<ContainerEvent> eventHandler;
+   
    @Test(expected = IllegalStateException.class)
    public void shouldThrowIllegalStateOnMissingDeployableContainer() throws Exception 
    {
@@ -71,21 +78,31 @@
    }
 
    @Test
-   public void shouldExportContainerMethodExecutor() throws Exception 
+   public void shouldExportContainerMethodExecutorAndFireEvents() throws Exception 
    {
       Archive<?> deployment = ShrinkWrap.create("test.jar", JavaArchive.class);
       
-      Mockito.when(container.deploy(deployment)).thenReturn(executor);
-      
       ClassContext context = new ClassContext(new SuiteContext(serviceLoader));
       context.add(DeployableContainer.class, container);
       context.add(Archive.class, deployment);
+      context.register(BeforeDeploy.class, eventHandler);
+      context.register(AfterDeploy.class, eventHandler);
       
+      Mockito.when(container.deploy(context, deployment)).thenReturn(executor);
+      
       ContainerDeployer handler = new ContainerDeployer();
       handler.callback(context, new ClassEvent(getClass()));
       
+      // verify that the deployment was deployed to the container
+      Mockito.verify(container).deploy(context, deployment);
+      
+      // verify that the ContainerMethodExecutor was exported
       Assert.assertNotNull(
             "Should have exported " + ContainerMethodExecutor.class.getSimpleName(), 
             context.get(ContainerMethodExecutor.class));
+      
+      // verify that all the events where fired
+      Mockito.verify(eventHandler, Mockito.times(2)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
    }
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerRestarterTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerRestarterTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerRestarterTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,9 +18,15 @@
 
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterStart;
+import org.jboss.arquillian.spi.event.container.AfterStop;
+import org.jboss.arquillian.spi.event.container.BeforeStart;
+import org.jboss.arquillian.spi.event.container.BeforeStop;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -43,12 +49,19 @@
    
    @Mock
    private DeployableContainer container;
-   
+
+   @Mock
+   private EventHandler<ContainerEvent> eventHandler;
+
    @Test
    public void shouldRestartContainerForEveryX() throws Exception 
    {
       ClassContext context = new ClassContext(new SuiteContext(serviceLoader));
       context.add(DeployableContainer.class, container);
+      context.register(BeforeStart.class, eventHandler);
+      context.register(AfterStart.class, eventHandler);
+      context.register(BeforeStop.class, eventHandler);
+      context.register(AfterStop.class, eventHandler);
       
       ContainerRestarter handler = new ContainerRestarter();
       
@@ -57,7 +70,12 @@
          handler.callback(context, new SuiteEvent());
       }
       
-      Mockito.verify(container, Mockito.times(2)).stop();
-      Mockito.verify(container, Mockito.times(2)).start();
+      // verify that the container was restarted twice
+      Mockito.verify(container, Mockito.times(2)).stop(context);
+      Mockito.verify(container, Mockito.times(2)).start(context);
+      
+      // verify that all the events where fired (2 times restart * 4(2 start + 2 stop))
+      Mockito.verify(eventHandler, Mockito.times(8)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
    }
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStarterTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStarterTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStarterTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,13 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
-import org.jboss.arquillian.impl.handler.ContainerStarter;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterStart;
+import org.jboss.arquillian.spi.event.container.BeforeStart;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -42,6 +45,9 @@
    @Mock
    private DeployableContainer container;
 
+   @Mock
+   private EventHandler<ContainerEvent> eventHandler;
+
    @Test(expected = IllegalStateException.class)
    public void shouldThrowIllegalStateOnMissingDeployableContainer() throws Exception
    {
@@ -56,10 +62,17 @@
    {
       SuiteContext context = new SuiteContext(serviceLoader);
       context.add(DeployableContainer.class, container);
+      context.register(BeforeStart.class, eventHandler);
+      context.register(AfterStart.class, eventHandler);
       
       ContainerStarter handler = new ContainerStarter();
       handler.callback(context, new SuiteEvent());
       
-      Mockito.verify(container).start();
+      // verify that the contianer was started
+      Mockito.verify(container).start(context);
+   
+      // verify that all the events where fired
+      Mockito.verify(eventHandler, Mockito.times(2)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
    }
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStopperTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStopperTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerStopperTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,10 +17,13 @@
 package org.jboss.arquillian.impl.handler;
 
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.SuiteEvent;
-import org.jboss.arquillian.impl.handler.ContainerStopper;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterStop;
+import org.jboss.arquillian.spi.event.container.BeforeStop;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+import org.jboss.arquillian.spi.event.suite.SuiteEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -43,6 +46,9 @@
    @Mock
    private DeployableContainer container;
 
+   @Mock
+   private EventHandler<ContainerEvent> eventHandler;
+
    @Test(expected = IllegalStateException.class)
    public void shouldThrowIllegalStateOnMissingDeployableContainer() throws Exception
    {
@@ -57,12 +63,17 @@
    {
       SuiteContext context = new SuiteContext(serviceLoader);
       context.add(DeployableContainer.class, container);
-      
+      context.register(BeforeStop.class, eventHandler);
+      context.register(AfterStop.class, eventHandler);
+
       ContainerStopper handler = new ContainerStopper();
       handler.callback(context, new SuiteEvent());
       
-      Mockito.verify(container).stop();
+      // verify that the container was stopped
+      Mockito.verify(container).stop(context);
+
+      // verify that all the events where fired
+      Mockito.verify(eventHandler, Mockito.times(2)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
    }
-
-   
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerTestExecuterTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerTestExecuterTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerTestExecuterTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -65,7 +65,7 @@
       
       ContainerTestExecuter handler = new ContainerTestExecuter();
       handler.callback(context, 
-            new org.jboss.arquillian.impl.event.type.Test(testExecutor));
+            new org.jboss.arquillian.spi.event.suite.Test(testExecutor));
    }
    
    @Test
@@ -82,7 +82,7 @@
       
       ContainerTestExecuter handler = new ContainerTestExecuter();
       handler.callback(context, 
-            new org.jboss.arquillian.impl.event.type.Test(testExecutor));
+            new org.jboss.arquillian.spi.event.suite.Test(testExecutor));
    }
    
    @Test
@@ -97,7 +97,7 @@
       TestContext context = new TestContext(new ClassContext(new SuiteContext(serviceLoader)));
       context.add(ContainerMethodExecutor.class, executor);
       
-      org.jboss.arquillian.impl.event.type.Test event = new org.jboss.arquillian.impl.event.type.Test(testExecutor);
+      org.jboss.arquillian.spi.event.suite.Test event = new org.jboss.arquillian.spi.event.suite.Test(testExecutor);
       ContainerTestExecuter handler = new ContainerTestExecuter();
       handler.callback(context, event);
       

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerUndeployerTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerUndeployerTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/ContainerUndeployerTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,9 +18,13 @@
 
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
-import org.jboss.arquillian.impl.event.type.ClassEvent;
 import org.jboss.arquillian.spi.DeployableContainer;
 import org.jboss.arquillian.spi.ServiceLoader;
+import org.jboss.arquillian.spi.event.container.AfterUnDeploy;
+import org.jboss.arquillian.spi.event.container.BeforeUnDeploy;
+import org.jboss.arquillian.spi.event.container.ContainerEvent;
+import org.jboss.arquillian.spi.event.suite.ClassEvent;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
@@ -45,6 +49,9 @@
    
    @Mock
    private DeployableContainer container;
+
+   @Mock
+   private EventHandler<ContainerEvent> eventHandler;
    
    @Test(expected = IllegalStateException.class)
    public void shouldThrowIllegalStateOnMissingDeployableContainer() throws Exception
@@ -73,10 +80,17 @@
       ClassContext context = new ClassContext(new SuiteContext(serviceLoader));
       context.add(DeployableContainer.class, container);
       context.add(Archive.class, deployment);
+      context.register(BeforeUnDeploy.class, eventHandler);
+      context.register(AfterUnDeploy.class, eventHandler);
 
       ContainerUndeployer handler = new ContainerUndeployer();
       handler.callback(context, new ClassEvent(getClass()));
       
-      Mockito.verify(container).undeploy(deployment);
+      // verify that the deployment was undeployed from the container
+      Mockito.verify(container).undeploy(context, deployment);
+
+      // verify that all the events where fired
+      Mockito.verify(eventHandler, Mockito.times(2)).callback(
+            Mockito.any(SuiteContext.class), Mockito.any(ContainerEvent.class));
    }
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestCaseEnricherTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestCaseEnricherTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestCaseEnricherTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -21,9 +21,9 @@
 import org.jboss.arquillian.impl.context.ClassContext;
 import org.jboss.arquillian.impl.context.SuiteContext;
 import org.jboss.arquillian.impl.context.TestContext;
-import org.jboss.arquillian.impl.event.type.TestEvent;
 import org.jboss.arquillian.spi.ServiceLoader;
 import org.jboss.arquillian.spi.TestEnricher;
+import org.jboss.arquillian.spi.event.suite.TestEvent;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -56,6 +56,6 @@
       TestCaseEnricher handler = new TestCaseEnricher();
       handler.callback(context, event);
       
-      Mockito.verify(enricher, Mockito.times(2)).enrich(this);
+      Mockito.verify(enricher, Mockito.times(2)).enrich(context, this);
    }
 }

Modified: arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestEventExecuterTestCase.java
===================================================================
--- arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestEventExecuterTestCase.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/impl-base/src/test/java/org/jboss/arquillian/impl/handler/TestEventExecuterTestCase.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -58,7 +58,7 @@
       
       TestContext context = new TestContext(new ClassContext(new SuiteContext(serviceLoader)));
 
-      org.jboss.arquillian.impl.event.type.Test event = new org.jboss.arquillian.impl.event.type.Test(testExecutor);
+      org.jboss.arquillian.spi.event.suite.Test event = new org.jboss.arquillian.spi.event.suite.Test(testExecutor);
       TestEventExecuter handler = new TestEventExecuter();
       handler.callback(context, event);
 
@@ -88,7 +88,7 @@
       
       TestContext context = new TestContext(new ClassContext(new SuiteContext(serviceLoader)));
 
-      org.jboss.arquillian.impl.event.type.Test event = new org.jboss.arquillian.impl.event.type.Test(testExecutor);
+      org.jboss.arquillian.spi.event.suite.Test event = new org.jboss.arquillian.spi.event.suite.Test(testExecutor);
       TestEventExecuter handler = new TestEventExecuter();
       handler.callback(context, event);
 

Modified: arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java
===================================================================
--- arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/junit/src/main/java/org/jboss/arquillian/junit/Arquillian.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -58,6 +58,7 @@
          {
             throw new InitializationError(Arrays.asList((Throwable)e));
          }
+         // TODO: The JVM is never shutdown, hook never called. Figure out how to kill it
          Runtime.getRuntime().addShutdownHook(new Thread() 
          {
             @Override
@@ -91,16 +92,14 @@
     * Override to allow test methods with arguments
     */
    @Override
-   protected void validatePublicVoidNoArgMethods(Class<? extends Annotation> annotation, boolean isStatic, List<Throwable> errors) 
+   protected void validatePublicVoidNoArgMethods(Class<? extends Annotation> annotation, boolean isStatic, List<Throwable> errors)
    {
-     List<FrameworkMethod> methods= getTestClass().getAnnotatedMethods(annotation);
-
-     for (FrameworkMethod eachTestMethod : methods) 
-     {
-        eachTestMethod.validatePublicVoid(isStatic, errors);
-     }
-  }
-   
+      List<FrameworkMethod> methods = getTestClass().getAnnotatedMethods(annotation);
+      for (FrameworkMethod eachTestMethod : methods)
+      {
+         eachTestMethod.validatePublicVoid(isStatic, errors);
+      }
+   }
       
    @Override
    protected Statement withBeforeClasses(final Statement originalStatement)
@@ -174,7 +173,7 @@
             {
                public void invoke() throws Throwable
                {
-                  Object parameterValues = TestEnrichers.enrich(getMethod());
+                  Object parameterValues = TestEnrichers.enrich(deployableTest.get().getActiveContext(), getMethod());
                   method.invokeExplosively(test, (Object[])parameterValues);
                }
                

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/Context.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/Context.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/Context.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,81 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi;
+
+import org.jboss.arquillian.spi.event.Event;
+import org.jboss.arquillian.spi.event.suite.EventHandler;
+
+
+/**
+ * 
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ * @param <X>
+ * @param <T>
+ */
+public interface Context 
+{
+   /**
+    * Fire a new {@link Event}.
+    * 
+    * @param event The {@link Event} instance to fire
+    */
+   void  fire(Event event); 
+   
+   /**
+    * Register a {@link EventHandler} for a specific {@link Event}.
+    * 
+    * @param <K>
+    * @param eventType The Type of {@link Event} to listen to
+    * @param handler The receiver of the {@link Event}
+    */
+   <K extends Event> void register(Class<? extends K> eventType, EventHandler<? super K> handler);
+
+   /**
+    * Get the defined {@link ServiceLoader}
+    * 
+    * @return A instance of {@link ServiceLoader}
+    * @see #get(Class)
+    */
+   ServiceLoader getServiceLoader();
+   
+   /**
+    * Get this contexts parent context.
+    * 
+    * @return The parent context if any, null if this is the top context.
+    */
+   Context getParentContext();
+
+   /**
+    * Add a instance of B to the context.
+    * 
+    * @param <B>
+    * @param type The Type of the instance to add
+    * @param instance The instance to add
+    */
+   <B> void add(Class<B> type, B instance);
+   
+   /**
+    * Get a instance of B from the context.
+    * 
+    * @param <B>
+    * @param type Type to lookup
+    * @return A instance of B or null if not found
+    */
+   <B> B get(Class<B> type);
+}

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/DeployableContainer.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/DeployableContainer.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/DeployableContainer.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -26,14 +26,13 @@
  */
 public interface DeployableContainer
 {
-   void setup(Configuration configuration);
+   void setup(Context context, Configuration configuration);
    
-   void start() throws LifecycleException;
+   void start(Context context) throws LifecycleException;
    
-   void stop() throws LifecycleException;
+   ContainerMethodExecutor deploy(Context context, Archive<?> archive) throws DeploymentException;
    
-   ContainerMethodExecutor deploy(Archive<?> archive) throws DeploymentException;
-   
-   void undeploy(Archive<?> archive) throws DeploymentException;
+   void undeploy(Context context, Archive<?> archive) throws DeploymentException;
 
+   void stop(Context context) throws LifecycleException;
 }
\ No newline at end of file

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -34,7 +34,7 @@
     *  
     * @param testCase The test case instance
     */
-   void enrich(Object testCase);
+   void enrich(Context context, Object testCase);
    
    /**
     * Extension point to add features to the test method arguments.<br/>
@@ -48,5 +48,5 @@
     * @param method
     * @return A Object[] of Arguments 
     */
-   Object[] resolve(Method method);
+   Object[] resolve(Context context, Method method);
 }

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestRunnerAdaptor.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestRunnerAdaptor.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/TestRunnerAdaptor.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -28,7 +28,17 @@
  */
 public interface TestRunnerAdaptor
 {
+   /*
+    *  TODO: reevaluate this. a  basic stack that will peek at the top, suite/class/test context.
+    *  used to fetch the context outside the test adaptor inside the test framework integration to 
+    *  do method argumnet injection. 
+    */
    /**
+    * @return
+    */
+   Context getActiveContext();
+   
+   /**
     * @throws Exception
     */
    void beforeSuite() throws Exception; 

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/Event.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/Event.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/Event.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,27 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event;
+
+/**
+ * Event
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public interface Event
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterDeploy.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterDeploy.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterDeploy.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterDeploy extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterSetup.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterSetup.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterSetup.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterSetup extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStart.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStart.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStart.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterStart extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStop.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStop.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterStop.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterStop extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterUnDeploy.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterUnDeploy.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/AfterUnDeploy.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterUnDeploy extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeDeploy.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeDeploy.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeDeploy.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeDeploy extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeSetup.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeSetup.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeSetup.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeSetup extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStart.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStart.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStart.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeStart extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStop.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStop.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeStop.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeStop extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeUnDeploy.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeUnDeploy.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/BeforeUnDeploy.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeUnDeploy extends ContainerEvent
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/ContainerEvent.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/ContainerEvent.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/container/ContainerEvent.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,29 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.container;
+
+import org.jboss.arquillian.spi.event.Event;
+
+/**
+ * BeforeContainerStart
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ContainerEvent implements Event
+{
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/After.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/After.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/After.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import java.lang.reflect.Method;
+
+/**
+ * Event fired After the Test method execution.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class After extends TestEvent
+{
+   /**
+    * @param testInstance The test case instance being tested
+    * @param testMethod The test method that was executed
+    */
+   public After(Object testInstance, Method testMethod)
+   {
+      super(testInstance, testMethod);
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterClass.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterClass.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterClass.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+/**
+ * Event fired After the Class execution.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterClass extends ClassEvent
+{
+   /**
+    * @param testClass The Test case {@link Class}
+    */
+   public AfterClass(Class<?> testClass)
+   {
+      super(testClass);
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterSuite.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterSuite.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/AfterSuite.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+/**
+ * Event fired After the Suite execution.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class AfterSuite extends SuiteEvent
+{
+   public AfterSuite()
+   {
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Before.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Before.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Before.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import java.lang.reflect.Method;
+
+/**
+ * Event fired Before the Test method execution
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class Before extends TestEvent
+{
+   /**
+    * @param testInstance The test case instance being tested
+    * @param testMethod The test method that is about to be executed
+    */
+   public Before(Object testInstance, Method testMethod)
+   {
+      super(testInstance, testMethod);
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeClass.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeClass.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeClass.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+/**
+ * Event fired Before the Class execution.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeClass extends ClassEvent
+{
+   /**
+    * @param testClass The Test case {@link Class}
+    */
+   public BeforeClass(Class<?> testClass)
+   {
+      super(testClass);
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeSuite.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeSuite.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/BeforeSuite.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+/**
+ * Event fired Before the Suite execution.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class BeforeSuite extends SuiteEvent
+{
+   public BeforeSuite()
+   {
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/ClassEvent.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/ClassEvent.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/ClassEvent.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+
+/**
+ * Base for events fired in the Test Class execution face.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class ClassEvent extends SuiteEvent
+{
+   private Class<?> testClass;
+   
+   /**
+    * @param testClass The Test case {@link Class}
+    * @throws IllegalArgumentException if testCase is null 
+    */
+   public ClassEvent(Class<?> testClass)
+   {
+      Validate.notNull(testClass, "TestClass must be specified");
+      
+      this.testClass = testClass;
+   }
+   
+   public Class<?> getTestClass()
+   {
+      return testClass;
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/EventHandler.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/EventHandler.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/EventHandler.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import org.jboss.arquillian.spi.Context;
+
+
+/**
+ * EventHandler
+ *
+ * @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ * @param <X> The Context
+ * @param <T> The Event 
+ */
+public interface EventHandler<T>
+{
+   
+   /**
+    * @param context
+    * @param event
+    * @throws Exception
+    */
+   void callback(Context context, T event) throws Exception;
+   
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/SuiteEvent.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/SuiteEvent.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/SuiteEvent.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import org.jboss.arquillian.spi.event.Event;
+
+
+/**
+ * Base for events fired in the Suite execution cycle.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class SuiteEvent implements Event
+{
+   public SuiteEvent()
+   {
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Test.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Test.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Test.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,60 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import org.jboss.arquillian.spi.TestMethodExecutor;
+import org.jboss.arquillian.spi.TestResult;
+
+/**
+ * Event fired to execute the Test method
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class Test extends TestEvent
+{
+   private TestMethodExecutor testMethodExecutor;
+   private TestResult testResult;
+   
+   /**
+    * @param testMethodExecutor The executor responsible for executing the test method
+    */
+   public Test(TestMethodExecutor testMethodExecutor)
+   {
+      // TODO: how to validate testMethodExecutor
+      super(testMethodExecutor.getInstance(), testMethodExecutor.getMethod());
+      
+      //Validate.notNull(testMethodExecutor, "TestMethodExecutor must be specified");
+      
+      this.testMethodExecutor = testMethodExecutor;
+   }
+   
+   public TestMethodExecutor getTestMethodExecutor()
+   {
+      return testMethodExecutor;
+   }
+   
+   public TestResult getTestResult()
+   {
+      return testResult;
+   }
+   
+   public void setTestResult(TestResult testResult)
+   {
+      this.testResult = testResult;
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/TestEvent.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/TestEvent.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/TestEvent.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+import java.lang.reflect.Method;
+
+/**
+ * Base for events fired in the Test execution cycle.
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class TestEvent extends ClassEvent
+{
+   private Object testInstance;
+   private Method testMethod;
+
+   /**
+    * @param testInstance The test case instance
+    * @param testMethod The test method 
+    * @throws IllegalArgumentException if testInstance is null
+    * @throws IllegalArgumentException if testMethod is null
+    */
+   public TestEvent(Object testInstance, Method testMethod)
+   {
+      super(validateAndExtractClass(testInstance, testMethod));
+      
+      this.testInstance = testInstance;
+      this.testMethod = testMethod;
+   }
+
+   // TODO: eeehh..? 
+   private static Class<?> validateAndExtractClass(Object testInstance, Method testMethod) 
+   {
+      Validate.notNull(testInstance, "TestInstance must be specified");
+      Validate.notNull(testMethod, "TestMethod must be specified");
+      
+      return testInstance.getClass();
+   }
+   
+   public Object getTestInstance()
+   {
+      return testInstance;
+   }
+   
+   public Method getTestMethod()
+   {
+      return testMethod;
+   }
+}

Added: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Validate.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Validate.java	                        (rev 0)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/event/suite/Validate.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jboss.arquillian.spi.event.suite;
+
+/**
+ * Validate
+ * 
+ * Validation utility
+ *
+ * @author <a href="mailto:aslak at conduct.no">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+final class Validate
+{
+   private Validate()
+   {
+   }
+
+   /**
+    * Checks that object is not null, throws exception if it is.
+    * 
+    * @param obj The object to check
+    * @param message The exception message
+    * @throws IllegalArgumentException Thrown if obj is null 
+    */
+   public static void notNull(final Object obj, final String message) throws IllegalArgumentException
+   {
+      if (obj == null)
+      {
+         throw new IllegalArgumentException(message);
+      }
+   }
+
+   /**
+    * Checks that the specified String is not null or empty, 
+    * throws exception if it is.
+    * 
+    * @param string The object to check
+    * @param message The exception message
+    * @throws IllegalArgumentException Thrown if obj is null 
+    */
+   public static void notNullOrEmpty(final String string, final String message) throws IllegalArgumentException
+   {
+      if (string == null || string.length() == 0)
+      {
+         throw new IllegalArgumentException(message);
+      }
+   }
+   
+   /**
+    * Checks that obj is not null, throws exception if it is.
+    * 
+    * @param obj The object to check
+    * @param message The exception message
+    * @throws IllegalStateException Thrown if obj is null
+    */
+   public static void stateNotNull(final Object obj, final String message) throws IllegalStateException
+   {
+      if(obj == null)
+      {
+         throw new IllegalStateException(message);
+      }
+   }
+}

Modified: arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java
===================================================================
--- arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/spi/src/main/java/org/jboss/arquillian/spi/util/TestEnrichers.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,6 +18,7 @@
 
 import java.lang.reflect.Method;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
@@ -35,36 +36,20 @@
    }
 
    /**
-    * Enrich a object based on all found TestEnricher providers.
-    * 
-    * @param testCase
-    *           The object that should be enriched.
-    */
-   public static void enrich(Object testCase)
-   {
-      DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
-            .load(TestEnricher.class);
-      for (TestEnricher enricher : serviceLoader)
-      {
-         enricher.enrich(testCase);
-      }
-   }
-
-   /**
     * Enrich the method arguments of a method call.<br/>
     * The Object[] index will match the method parameterType[] index.
     * 
     * @param method
     * @return the argument values
     */
-   public static Object[] enrich(Method method)
+   public static Object[] enrich(Context context, Method method)
    {
       Object[] values = new Object[method.getParameterTypes().length];
       DefaultServiceLoader<TestEnricher> serviceLoader = DefaultServiceLoader
             .load(TestEnricher.class);
       for (TestEnricher enricher : serviceLoader)
       {
-         mergeValues(values, enricher.resolve(method));
+         mergeValues(values, enricher.resolve(context, method));
       }
       return values;
    }

Modified: arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -17,6 +17,7 @@
 package org.jboss.arquillian.testenricher.cdi;
 
 import java.lang.annotation.Annotation;
+
 import java.lang.reflect.Method;
 
 import javax.enterprise.context.spi.CreationalContext;
@@ -25,6 +26,7 @@
 import javax.enterprise.inject.spi.InjectionTarget;
 import javax.naming.InitialContext;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
@@ -40,25 +42,25 @@
    private static final String ANNOTATION_NAME = "javax.inject.Inject";
    
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(org.jboss.arquillian.spi.Context, java.lang.Object)
     */
-   public void enrich(Object testCase)
+   public void enrich(Context context, Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
       {
-         injectClass(testCase);
+         injectClass(context, testCase);
       }
    }
    
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(org.jboss.arquillian.spi.Context, java.lang.reflect.Method)
     */
-   public Object[] resolve(Method method) 
+   public Object[] resolve(Context context, Method method) 
    {
      Object[] values = new Object[method.getParameterTypes().length];
      if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
      {
-        BeanManager beanManager = lookupBeanManager();
+        BeanManager beanManager = lookupBeanManager(context);
         if(beanManager == null) 
         {
              return values;
@@ -83,11 +85,11 @@
       return (T) manager.getReference(bean, type, cc);
    }
    
-   protected void injectClass(Object testCase) 
+   protected void injectClass(Context context, Object testCase) 
    {
       try 
       {
-         BeanManager beanManager = lookupBeanManager();
+         BeanManager beanManager = lookupBeanManager(context);
          if(beanManager != null) {
             injectNonContextualInstance(beanManager, testCase);            
          }
@@ -107,7 +109,7 @@
       injectionTarget.inject(instance, creationalContext);
    }
 
-   protected BeanManager lookupBeanManager() 
+   protected BeanManager lookupBeanManager(Context context) 
    {
       try 
       {

Modified: arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/testenrichers/ejb/src/main/java/org/jboss/arquillian/testenricher/ejb/EJBInjectionEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -21,10 +21,10 @@
 import java.lang.reflect.Method;
 import java.util.List;
 
-import javax.ejb.EJB;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
@@ -41,25 +41,25 @@
    private static final String ANNOTATION_FIELD_MAPPED_NAME = "mappedName";
    
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(org.jboss.arquillian.spi.Context, java.lang.Object)
     */
-   public void enrich(Object testCase)
+   public void enrich(Context context, Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
       {
-         injectClass(testCase);
+         injectClass(context, testCase);
       }
    }
 
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(org.jboss.arquillian.spi.Context, java.lang.reflect.Method)
     */
-   public Object[] resolve(Method method) 
+   public Object[] resolve(Context context, Method method) 
    {
      return new Object[method.getParameterTypes().length];
    }
    
-   protected void injectClass(Object testCase) 
+   protected void injectClass(Context context, Object testCase) 
    {
       try 
       {
@@ -72,7 +72,7 @@
          
          for(Field field : annotatedFields) 
          {
-            Object ejb = lookupEJB(field.getType());
+            Object ejb = lookupEJB(context, field.getType());
             field.set(testCase, ejb);
          }
          
@@ -90,7 +90,7 @@
             {
                throw new RuntimeException("@EJB only allowed on 'set' methods");
             }
-            Object ejb = lookupEJB(method.getParameterTypes()[0]);
+            Object ejb = lookupEJB(context, method.getParameterTypes()[0]);
             method.invoke(testCase, ejb);
          }
          
@@ -101,28 +101,28 @@
       }
    }
    
-   protected Object lookupEJB(Class<?> fieldType) throws Exception 
+   protected Object lookupEJB(Context context, Class<?> fieldType) throws Exception 
    {
       // TODO: figure out test context ? 
-      InitialContext context = createContext();
+      InitialContext initcontext = createContext(context);
       try 
       {
-         return context.lookup("java:global/test.ear/test/" + fieldType.getSimpleName() + "Bean");
+         return initcontext.lookup("java:global/test.ear/test/" + fieldType.getSimpleName() + "Bean");
       } 
       catch (NamingException e) 
       {
     	  try 
     	  {
-    	     return context.lookup("test/" + fieldType.getSimpleName() + "Bean/local");
+    	     return initcontext.lookup("test/" + fieldType.getSimpleName() + "Bean/local");
     	  } 
     	  catch (NamingException e2) 
     	  {
-    	     return context.lookup("test/" + fieldType.getSimpleName() + "Bean/remote");    	    
+    	     return initcontext.lookup("test/" + fieldType.getSimpleName() + "Bean/remote");    	    
     	  }
       }
    }
    
-   protected InitialContext createContext() throws Exception
+   protected InitialContext createContext(Context context) throws Exception
    {
       return new InitialContext();
    }

Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -24,6 +24,7 @@
 import javax.annotation.Resource;
 import javax.naming.InitialContext;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.TestEnricher;
 
 /**
@@ -38,9 +39,9 @@
    private static final String ANNOTATION_NAME = "javax.annotation.Resource";
    
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#enrich(java.lang.Object)
+    * @see org.jboss.arquillian.spi.TestEnricher#enrich(org.jboss.arquillian.spi.Context, java.lang.Object)
     */
-   public void enrich(Object testCase)
+   public void enrich(Context context, Object testCase)
    {
       if(SecurityActions.isClassPresent(ANNOTATION_NAME)) 
       {
@@ -49,9 +50,9 @@
    }
 
    /* (non-Javadoc)
-    * @see org.jboss.arquillian.spi.TestEnricher#resolve(java.lang.reflect.Method)
+    * @see org.jboss.arquillian.spi.TestEnricher#resolve(org.jboss.arquillian.spi.Context, java.lang.reflect.Method)
     */
-   public Object[] resolve(Method method) 
+   public Object[] resolve(Context context, Method method) 
    {
      return new Object[method.getParameterTypes().length];
    }

Modified: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/Arquillian.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/Arquillian.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/Arquillian.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -24,6 +24,7 @@
 import org.jboss.arquillian.spi.TestMethodExecutor;
 import org.jboss.arquillian.spi.TestResult;
 import org.jboss.arquillian.spi.TestRunnerAdaptor;
+import org.jboss.arquillian.spi.util.TestEnrichers;
 import org.testng.IHookCallBack;
 import org.testng.IHookable;
 import org.testng.ITestResult;
@@ -33,6 +34,7 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.DataProvider;
 
 /**
  * Arquillian
@@ -42,6 +44,8 @@
  */
 public abstract class Arquillian implements IHookable
 {
+   public static final String ARQUILLIAN_DATA_PROVIDER = "ARQUILLIAN_DATA_PROVIDER";
+   
    private static ThreadLocal<TestRunnerAdaptor> deployableTest = new ThreadLocal<TestRunnerAdaptor>();
 
    @BeforeSuite(alwaysRun = true)
@@ -99,7 +103,27 @@
             public void invoke() throws Throwable
             {
                callback.runTestMethod(testResult);
+               
+               clearParameters(testResult);
             }
+
+            private void clearParameters(final ITestResult testResult)
+            {
+               // clear parameters. they can be contextual and might fail TestNG during the report writing.
+               Object[] parameters = testResult.getParameters();
+               for(int i = 0; parameters != null && i < parameters.length; i++)
+               {
+                  Object parameter = parameters[i];
+                  if(parameter != null)
+                  {
+                     parameters[i] = parameter.getClass().getName();
+                  }
+                  else
+                  {
+                     parameters[i] = "null";
+                  }
+               }
+            }
             
             public Method getMethod()
             {
@@ -121,4 +145,14 @@
          testResult.setThrowable(e);
       }
    }
+   
+   @DataProvider(name = Arquillian.ARQUILLIAN_DATA_PROVIDER)
+   public Object[][] arquillianArgumentProvider(Method method) 
+   {
+      Object[] parameterValues = TestEnrichers.enrich(deployableTest.get().getActiveContext(), method);
+      Object[][] values = new Object[1][method.getParameterTypes().length];
+      values[0] = parameterValues; 
+      
+      return values;
+   }
 }

Modified: arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java
===================================================================
--- arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java	2010-04-24 20:40:20 UTC (rev 4328)
+++ arquillian/trunk/testng/src/main/java/org/jboss/arquillian/testng/TestEnricherDataProvider.java	2010-04-24 20:48:13 UTC (rev 4329)
@@ -18,6 +18,7 @@
 
 import java.lang.reflect.Method;
 
+import org.jboss.arquillian.spi.Context;
 import org.jboss.arquillian.spi.util.TestEnrichers;
 import org.testng.annotations.DataProvider;
 
@@ -34,7 +35,7 @@
 	@DataProvider(name = PROVIDER_NAME)
 	public static Object[][] enrich(Method method) 
 	{
-		Object[] parameterValues = TestEnrichers.enrich(method);
+		Object[] parameterValues = TestEnrichers.enrich(null, method);
 		Object[][] values = new Object[1][method.getParameterTypes().length];
 		values[0] = parameterValues; 
 		



More information about the jboss-svn-commits mailing list