Repository: deltaspike
Updated Branches:
  refs/heads/master 0b93d70ec -> 3c16c913e


DELTASPIKE-602 forward manual request-handling to myfaces-test


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/3c16c913
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/3c16c913
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/3c16c913

Branch: refs/heads/master
Commit: 3c16c913e62709c730b2f893f5fed79e42cce60a
Parents: 0b93d70
Author: gpetracek <[email protected]>
Authored: Wed May 21 15:17:04 2014 +0200
Committer: gpetracek <[email protected]>
Committed: Wed May 21 15:17:04 2014 +0200

----------------------------------------------------------------------
 .../testcontrol/api/junit/CdiTestRunner.java    | 128 +++++++++++++------
 deltaspike/modules/test-control/impl/pom.xml    |   2 +-
 .../impl/jsf/MockedJsf2TestContainer.java       |  22 ++++
 .../impl/jsf/MockedJsfTestContainerAdapter.java |  22 ++++
 .../impl/jsf/MyFacesContainerAdapter.java       |  22 ++++
 .../MyFacesContainerPerTestMethodAdapter.java   |  23 ++++
 .../impl/request/ContextControlDecorator.java   |  89 +++++++++++++
 .../request/ManuallyHandledRequestEvent.java    |  39 ++++++
 .../impl/src/main/resources/META-INF/beans.xml  |   5 +
 9 files changed, 310 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/api/src/main/java/org/apache/deltaspike/testcontrol/api/junit/CdiTestRunner.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/api/src/main/java/org/apache/deltaspike/testcontrol/api/junit/CdiTestRunner.java
 
b/deltaspike/modules/test-control/api/src/main/java/org/apache/deltaspike/testcontrol/api/junit/CdiTestRunner.java
index 195045b..1c0a427 100644
--- 
a/deltaspike/modules/test-control/api/src/main/java/org/apache/deltaspike/testcontrol/api/junit/CdiTestRunner.java
+++ 
b/deltaspike/modules/test-control/api/src/main/java/org/apache/deltaspike/testcontrol/api/junit/CdiTestRunner.java
@@ -80,6 +80,8 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
         USE_TEST_CLASS_AS_CDI_BEAN = 
Boolean.parseBoolean(useTestClassAsCdiBeanValue);
     }
 
+    private static ThreadLocal<Boolean> automaticScopeHandlingActive = new 
ThreadLocal<Boolean>();
+
     private List<TestStatementDecoratorFactory> statementDecoratorFactories;
 
     private ContainerAwareTestContext testContext;
@@ -478,8 +480,9 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
 
             if (this.externalContainers == null)
             {
-                this.externalContainers = 
ServiceUtils.loadServiceImplementations(ExternalContainer.class);
-                Collections.sort(this.externalContainers, new 
Comparator<ExternalContainer>()
+                List<ExternalContainer> configuredExternalContainers =
+                    
ServiceUtils.loadServiceImplementations(ExternalContainer.class);
+                Collections.sort(configuredExternalContainers, new 
Comparator<ExternalContainer>()
                 {
                     @Override
                     public int compare(ExternalContainer ec1, 
ExternalContainer ec2)
@@ -488,6 +491,24 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
                     }
                 });
 
+                this.externalContainers = new 
ArrayList<ExternalContainer>(configuredExternalContainers.size());
+
+                ExternalContainer externalContainerBean;
+                for (ExternalContainer externalContainer : 
configuredExternalContainers)
+                {
+                    //needed to use cdi-observers in the container optionally
+                    externalContainerBean = 
BeanProvider.getContextualReference(externalContainer.getClass(), true);
+
+                    if (externalContainerBean != null)
+                    {
+                        this.externalContainers.add(externalContainerBean);
+                    }
+                    else
+                    {
+                        this.externalContainers.add(externalContainer);
+                    }
+                }
+
                 for (ExternalContainer externalContainer : 
this.externalContainers)
                 {
                     try
@@ -577,46 +598,56 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
 
         private void startScopes(CdiContainer container, Class<? extends 
Annotation>... restrictedScopes)
         {
-            ContextControl contextControl = container.getContextControl();
+            try
+            {
+                automaticScopeHandlingActive.set(Boolean.TRUE);
 
-            List<Class<? extends Annotation>> scopeClasses = new 
ArrayList<Class<? extends Annotation>>();
+                ContextControl contextControl = container.getContextControl();
 
-            Collections.addAll(scopeClasses, this.testControl.startScopes());
+                List<Class<? extends Annotation>> scopeClasses = new 
ArrayList<Class<? extends Annotation>>();
 
-            if (this.testControl.startScopes().length == 0)
-            {
-                addScopesForDefaultBehavior(scopeClasses);
-            }
+                Collections.addAll(scopeClasses, 
this.testControl.startScopes());
 
-            for (Class<? extends Annotation> scopeAnnotation : scopeClasses)
-            {
-                if (this.parent != null && 
this.parent.isScopeStarted(scopeAnnotation))
+                if (this.testControl.startScopes().length == 0)
                 {
-                    continue;
+                    addScopesForDefaultBehavior(scopeClasses);
                 }
 
-                if (isRestrictedScope(scopeAnnotation, restrictedScopes))
+                for (Class<? extends Annotation> scopeAnnotation : 
scopeClasses)
                 {
-                    continue;
-                }
+                    if (this.parent != null && 
this.parent.isScopeStarted(scopeAnnotation))
+                    {
+                        continue;
+                    }
 
-                try
-                {
-                    //force a clean context - TODO discuss onScopeStopped call
-                    contextControl.stopContext(scopeAnnotation);
+                    if (isRestrictedScope(scopeAnnotation, restrictedScopes))
+                    {
+                        continue;
+                    }
 
-                    contextControl.startContext(scopeAnnotation);
-                    this.startedScopes.add(scopeAnnotation);
+                    try
+                    {
+                        //force a clean context - TODO discuss onScopeStopped 
call
+                        contextControl.stopContext(scopeAnnotation);
 
-                    onScopeStarted(scopeAnnotation);
-                }
-                catch (RuntimeException e)
-                {
-                    Logger logger = 
Logger.getLogger(CdiTestRunner.class.getName());
-                    logger.setLevel(Level.SEVERE);
-                    logger.log(Level.SEVERE, "failed to start scope @" + 
scopeAnnotation.getName(), e);
+                        contextControl.startContext(scopeAnnotation);
+                        this.startedScopes.add(scopeAnnotation);
+
+                        onScopeStarted(scopeAnnotation);
+                    }
+                    catch (RuntimeException e)
+                    {
+                        Logger logger = 
Logger.getLogger(CdiTestRunner.class.getName());
+                        logger.setLevel(Level.SEVERE);
+                        logger.log(Level.SEVERE, "failed to start scope @" + 
scopeAnnotation.getName(), e);
+                    }
                 }
             }
+            finally
+            {
+                automaticScopeHandlingActive.remove();
+                automaticScopeHandlingActive.set(null);
+            }
         }
 
         private void addScopesForDefaultBehavior(List<Class<? extends 
Annotation>> scopeClasses)
@@ -657,22 +688,32 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
 
         private void stopStartedScopes(CdiContainer container)
         {
-            while (!this.startedScopes.empty())
+            try
             {
-                Class<? extends Annotation> scopeAnnotation = 
this.startedScopes.pop();
-                //TODO check if context was started by parent
-                try
-                {
-                    container.getContextControl().stopContext(scopeAnnotation);
-                    onScopeStopped(scopeAnnotation);
-                }
-                catch (RuntimeException e)
+                automaticScopeHandlingActive.set(Boolean.TRUE);
+
+                while (!this.startedScopes.empty())
                 {
-                    Logger logger = 
Logger.getLogger(CdiTestRunner.class.getName());
-                    logger.setLevel(Level.SEVERE);
-                    logger.log(Level.SEVERE, "failed to stop scope @" + 
scopeAnnotation.getName(), e);
+                    Class<? extends Annotation> scopeAnnotation = 
this.startedScopes.pop();
+                    //TODO check if context was started by parent
+                    try
+                    {
+                        
container.getContextControl().stopContext(scopeAnnotation);
+                        onScopeStopped(scopeAnnotation);
+                    }
+                    catch (RuntimeException e)
+                    {
+                        Logger logger = 
Logger.getLogger(CdiTestRunner.class.getName());
+                        logger.setLevel(Level.SEVERE);
+                        logger.log(Level.SEVERE, "failed to stop scope @" + 
scopeAnnotation.getName(), e);
+                    }
                 }
             }
+            finally
+            {
+                automaticScopeHandlingActive.remove();
+                automaticScopeHandlingActive.set(null);
+            }
         }
 
         private void onScopeStarted(Class<? extends Annotation> scopeClass)
@@ -733,4 +774,9 @@ public class CdiTestRunner extends BlockJUnit4ClassRunner
             }
         }
     }
+
+    public static Boolean isAutomaticScopeHandlingActive()
+    {
+        return automaticScopeHandlingActive.get();
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/test-control/impl/pom.xml 
b/deltaspike/modules/test-control/impl/pom.xml
index dd3ab58..aa569ac 100644
--- a/deltaspike/modules/test-control/impl/pom.xml
+++ b/deltaspike/modules/test-control/impl/pom.xml
@@ -51,7 +51,7 @@
         <dependency>
             <groupId>org.apache.deltaspike.cdictrl</groupId>
             <artifactId>deltaspike-cdictrl-api</artifactId>
-            <scope>test</scope>
+            <scope>provided</scope>
         </dependency>
 
         <dependency>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsf2TestContainer.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsf2TestContainer.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsf2TestContainer.java
index ef2d142..ab38bb7 100644
--- 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsf2TestContainer.java
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsf2TestContainer.java
@@ -19,6 +19,7 @@
 package org.apache.deltaspike.testcontrol.impl.jsf;
 
 import org.apache.deltaspike.core.api.config.ConfigResolver;
+import 
org.apache.deltaspike.testcontrol.impl.request.ManuallyHandledRequestEvent;
 import org.apache.deltaspike.testcontrol.spi.ExternalContainer;
 import org.apache.myfaces.test.mock.MockApplicationFactory;
 import org.apache.myfaces.test.mock.MockExceptionHandlerFactory;
@@ -37,8 +38,11 @@ import 
org.apache.myfaces.test.mock.lifecycle.MockLifecycleFactory;
 import org.apache.myfaces.test.mock.visit.MockVisitContextFactory;
 
 import javax.el.ExpressionFactory;
+import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.SessionScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.event.Reception;
 import javax.faces.FactoryFinder;
 import javax.faces.application.Application;
 import javax.faces.application.ApplicationFactory;
@@ -57,6 +61,7 @@ import java.util.Locale;
 import java.util.Map;
 
 //known restriction: faces-config.xml files are ignored
+@ApplicationScoped
 public class MockedJsf2TestContainer implements ExternalContainer
 {
     protected MockServletConfig servletConfig;
@@ -285,4 +290,21 @@ public class MockedJsf2TestContainer implements 
ExternalContainer
     {
         return LifecycleFactory.DEFAULT_LIFECYCLE;
     }
+
+    public void onManuallyHandledRequest(
+        @Observes(notifyObserver = Reception.IF_EXISTS) 
ManuallyHandledRequestEvent manuallyHandledRequestEvent)
+    {
+        switch (manuallyHandledRequestEvent.getManualAction())
+        {
+            case STARTED:
+                startScope(RequestScoped.class);
+                break;
+            case STOPPED:
+                stopScope(RequestScoped.class);
+                break;
+            default:
+                throw new IllegalArgumentException("unsupported action: " +
+                    manuallyHandledRequestEvent.getManualAction().name());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsfTestContainerAdapter.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsfTestContainerAdapter.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsfTestContainerAdapter.java
index a1e7f20..b68634a 100644
--- 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsfTestContainerAdapter.java
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MockedJsfTestContainerAdapter.java
@@ -18,17 +18,22 @@
  */
 package org.apache.deltaspike.testcontrol.impl.jsf;
 
+import 
org.apache.deltaspike.testcontrol.impl.request.ManuallyHandledRequestEvent;
 import org.apache.deltaspike.testcontrol.spi.ExternalContainer;
 import org.apache.myfaces.test.mock.MockedJsfTestContainer;
 
+import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.SessionScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.event.Reception;
 import java.lang.annotation.Annotation;
 
 /**
  * Optional adapter for MockedJsfTestContainer
  * Requires MyFaces-Test v1.0.6 or higher
  */
+@ApplicationScoped
 public class MockedJsfTestContainerAdapter implements ExternalContainer
 {
     private final MockedJsfTestContainer mockedMyFacesTestContainer = new 
MockedJsfTestContainer();
@@ -74,4 +79,21 @@ public class MockedJsfTestContainerAdapter implements 
ExternalContainer
     {
         return 1000; //default in ds
     }
+
+    public void onManuallyHandledRequest(
+            @Observes(notifyObserver = Reception.IF_EXISTS) 
ManuallyHandledRequestEvent manuallyHandledRequestEvent)
+    {
+        switch (manuallyHandledRequestEvent.getManualAction())
+        {
+            case STARTED:
+                startScope(RequestScoped.class);
+                break;
+            case STOPPED:
+                stopScope(RequestScoped.class);
+                break;
+            default:
+                throw new IllegalArgumentException("unsupported action: " +
+                        manuallyHandledRequestEvent.getManualAction().name());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerAdapter.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerAdapter.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerAdapter.java
index d89ce83..f8dc224 100644
--- 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerAdapter.java
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerAdapter.java
@@ -20,6 +20,7 @@ package org.apache.deltaspike.testcontrol.impl.jsf;
 
 import org.apache.deltaspike.core.api.config.ConfigResolver;
 import org.apache.deltaspike.core.util.metadata.AnnotationInstanceProvider;
+import 
org.apache.deltaspike.testcontrol.impl.request.ManuallyHandledRequestEvent;
 import org.apache.deltaspike.testcontrol.spi.ExternalContainer;
 import org.apache.deltaspike.testcontrol.spi.TestAware;
 import org.apache.myfaces.mc.test.core.annotation.TestConfig;
@@ -27,7 +28,10 @@ import 
org.apache.myfaces.mc.test.core.runner.MyFacesContainer;
 import org.junit.runners.model.TestClass;
 
 import javax.el.ExpressionFactory;
+import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.event.Reception;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.HashMap;
@@ -37,6 +41,7 @@ import java.util.Map;
  * Optional adapter for MyFacesContainer
  * Requires MyFaces-Core 2.2.x, MyFaces-Test v1.0.6 or higher as well as 
org.apache.myfaces.core:myfaces-impl-test
  */
+@ApplicationScoped
 public class MyFacesContainerAdapter implements TestAware, ExternalContainer
 {
     private static final TestConfig DEFAULT_TEST_CONFIG_LITERAL = 
AnnotationInstanceProvider.of(TestConfig.class);
@@ -159,4 +164,21 @@ public class MyFacesContainerAdapter implements TestAware, 
ExternalContainer
     {
         //not needed
     }
+
+    public void onManuallyHandledRequest(
+            @Observes(notifyObserver = Reception.IF_EXISTS) 
ManuallyHandledRequestEvent manuallyHandledRequestEvent)
+    {
+        switch (manuallyHandledRequestEvent.getManualAction())
+        {
+            case STARTED:
+                startScope(RequestScoped.class);
+                break;
+            case STOPPED:
+                stopScope(RequestScoped.class);
+                break;
+            default:
+                throw new IllegalArgumentException("unsupported action: " +
+                        manuallyHandledRequestEvent.getManualAction().name());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerPerTestMethodAdapter.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerPerTestMethodAdapter.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerPerTestMethodAdapter.java
index 139bfee..07fe368 100644
--- 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerPerTestMethodAdapter.java
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/jsf/MyFacesContainerPerTestMethodAdapter.java
@@ -18,9 +18,14 @@
  */
 package org.apache.deltaspike.testcontrol.impl.jsf;
 
+import 
org.apache.deltaspike.testcontrol.impl.request.ManuallyHandledRequestEvent;
 import org.apache.deltaspike.testcontrol.spi.ExternalContainer;
 import org.apache.deltaspike.testcontrol.spi.TestAware;
 
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.event.Reception;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
@@ -28,6 +33,7 @@ import java.lang.reflect.Method;
  * Optional adapter for MyFacesContainer which gets started and stopped for 
every test-method
  * Requires MyFaces-Core 2.2.x, MyFaces-Test v1.0.6 or higher as well as 
org.apache.myfaces.core:myfaces-impl-test
  */
+@ApplicationScoped
 public class MyFacesContainerPerTestMethodAdapter implements TestAware, 
ExternalContainer
 {
     private static ThreadLocal<MyFacesContainerAdapter> 
myFacesContainerAdapterThreadLocal =
@@ -81,4 +87,21 @@ public class MyFacesContainerPerTestMethodAdapter implements 
TestAware, External
             myFacesContainerAdapterThreadLocal.get().shutdown();
         }
     }
+
+    public void onManuallyHandledRequest(
+            @Observes(notifyObserver = Reception.IF_EXISTS) 
ManuallyHandledRequestEvent manuallyHandledRequestEvent)
+    {
+        switch (manuallyHandledRequestEvent.getManualAction())
+        {
+            case STARTED:
+                startScope(RequestScoped.class);
+                break;
+            case STOPPED:
+                stopScope(RequestScoped.class);
+                break;
+            default:
+                throw new IllegalArgumentException("unsupported action: " +
+                        manuallyHandledRequestEvent.getManualAction().name());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ContextControlDecorator.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ContextControlDecorator.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ContextControlDecorator.java
new file mode 100644
index 0000000..21534f2
--- /dev/null
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ContextControlDecorator.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.testcontrol.impl.request;
+
+import org.apache.deltaspike.cdise.api.ContextControl;
+import org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+import java.lang.annotation.Annotation;
+
+/**
+ * Needed to allow the manual usage of
+ * ContextControl#stopContext(RequestScoped.class)
+ * and
+ * ContextControl#startContext(RequestScoped.class)
+ * within a test-method.
+ * That can be useful in combination with the integration of myfaces-test for 
page-bean tests.
+ */
+@Decorator
+//don't use an abstract decorator to keep the compatibility with old version 
of owb/weld
+public class ContextControlDecorator implements ContextControl
+{
+    @Inject
+    @Delegate
+    private ContextControl wrapped;
+
+    @Inject
+    private Event<ManuallyHandledRequestEvent> manualRequestEvent;
+
+    @Override
+    public void startContexts()
+    {
+        wrapped.startContexts();
+    }
+
+    @Override
+    public void stopContexts()
+    {
+        wrapped.stopContexts();
+    }
+
+    @Override
+    public void startContext(Class<? extends Annotation> scopeClass)
+    {
+        wrapped.startContext(scopeClass);
+
+        if (isManuallyHandledRequest(scopeClass))
+        {
+            manualRequestEvent.fire(new 
ManuallyHandledRequestEvent(ManuallyHandledRequestEvent.ManualAction.STARTED));
+        }
+    }
+
+    @Override
+    public void stopContext(Class<? extends Annotation> scopeClass)
+    {
+        wrapped.stopContext(scopeClass);
+
+        if (isManuallyHandledRequest(scopeClass))
+        {
+            manualRequestEvent.fire(new 
ManuallyHandledRequestEvent(ManuallyHandledRequestEvent.ManualAction.STOPPED));
+        }
+    }
+
+    private boolean isManuallyHandledRequest(Class<? extends Annotation> 
scopeClass)
+    {
+        return RequestScoped.class.equals(scopeClass) &&
+            
!Boolean.TRUE.equals(CdiTestRunner.isAutomaticScopeHandlingActive());
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ManuallyHandledRequestEvent.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ManuallyHandledRequestEvent.java
 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ManuallyHandledRequestEvent.java
new file mode 100644
index 0000000..c0700b1
--- /dev/null
+++ 
b/deltaspike/modules/test-control/impl/src/main/java/org/apache/deltaspike/testcontrol/impl/request/ManuallyHandledRequestEvent.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.testcontrol.impl.request;
+
+public class ManuallyHandledRequestEvent
+{
+    private final ManualAction manualAction;
+
+    public ManuallyHandledRequestEvent(ManualAction manualAction)
+    {
+        this.manualAction = manualAction;
+    }
+
+    public ManualAction getManualAction()
+    {
+        return manualAction;
+    }
+
+    public static enum ManualAction
+    {
+        STARTED, STOPPED
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/3c16c913/deltaspike/modules/test-control/impl/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/test-control/impl/src/main/resources/META-INF/beans.xml 
b/deltaspike/modules/test-control/impl/src/main/resources/META-INF/beans.xml
index 4070730..0fd5332 100644
--- a/deltaspike/modules/test-control/impl/src/main/resources/META-INF/beans.xml
+++ b/deltaspike/modules/test-control/impl/src/main/resources/META-INF/beans.xml
@@ -20,4 +20,9 @@
 <beans xmlns="http://java.sun.com/xml/ns/javaee";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd";>
+
+    <decorators>
+        
<class>org.apache.deltaspike.testcontrol.impl.request.ContextControlDecorator</class>
+    </decorators>
+
 </beans>

Reply via email to