This is an automated email from the ASF dual-hosted git repository.

arne pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 4baa03b  OWB-1387: Don't throw Lifecycle events for inactive contexts
4baa03b is described below

commit 4baa03b8c757dd40d0433f8c2b84259f510f8d18
Author: arne <a...@apache.org>
AuthorDate: Sun Jul 4 21:40:21 2021 +0200

    OWB-1387: Don't throw Lifecycle events for inactive contexts
---
 .../webbeans/corespi/se/BaseSeContextsService.java | 18 ++++++----
 .../contexts/session/tests/SessionContextTest.java | 40 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 7 deletions(-)

diff --git 
a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/se/BaseSeContextsService.java
 
b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/se/BaseSeContextsService.java
index c2bec79..bc432a5 100644
--- 
a/webbeans-impl/src/main/java/org/apache/webbeans/corespi/se/BaseSeContextsService.java
+++ 
b/webbeans-impl/src/main/java/org/apache/webbeans/corespi/se/BaseSeContextsService.java
@@ -422,13 +422,13 @@ public abstract class BaseSeContextsService extends 
AbstractContextsService
         }
 
 
-        if (shouldFireRequestLifecycleEvents())
+        final RequestContext ctx = BaseSeContextsService.requestContext.get();
+        if (ctx != null && shouldFireRequestLifecycleEvents())
         {
             webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
                     new Object(), 
BeforeDestroyedLiteral.INSTANCE_REQUEST_SCOPED);
         }
 
-        final RequestContext ctx = BaseSeContextsService.requestContext.get();
         if (ctx != null)
         {
             ctx.destroy();
@@ -438,7 +438,7 @@ public abstract class BaseSeContextsService extends 
AbstractContextsService
         BaseSeContextsService.requestContext.remove();
         RequestScopedBeanInterceptorHandler.removeThreadLocals();
 
-        if (shouldFireRequestLifecycleEvents())
+        if (ctx != null && shouldFireRequestLifecycleEvents())
         {
             webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
                     ctx, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
@@ -450,16 +450,20 @@ public abstract class BaseSeContextsService extends 
AbstractContextsService
     {
         webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
                 new Object(), BeforeDestroyedLiteral.INSTANCE_SESSION_SCOPED);
-        if(sessionContext.get() != null)
+        SessionContext activeContext = sessionContext.get();
+        if(activeContext != null)
         {
-            sessionContext.get().destroy();   
+            activeContext.destroy();   
         }
 
         sessionContext.set(null);
         sessionContext.remove();
         SessionScopedBeanInterceptorHandler.removeThreadLocals();
-        webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
-            new Object(), DestroyedLiteral.INSTANCE_SESSION_SCOPED);
+        if (activeContext != null)
+        {
+            webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
+                new Object(), DestroyedLiteral.INSTANCE_SESSION_SCOPED);
+        }
     }
 
     
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/session/tests/SessionContextTest.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/session/tests/SessionContextTest.java
index dd3c834..c3ab74b 100644
--- 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/session/tests/SessionContextTest.java
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/contexts/session/tests/SessionContextTest.java
@@ -112,4 +112,44 @@ public class SessionContextTest extends AbstractUnitTest
 
         Assert.assertEquals(1, AppScopedBean.appContextDestroyedEvent.size());
     }
+
+    @Test
+    public void testRequestContextDestroyedEventOnShutdown()
+    {
+        Collection<Class<?>> classes = new ArrayList<Class<?>>();
+        classes.add(PersonalDataBean.class);
+        classes.add(AppScopedBean.class);
+        classes.add(CircularDependentScopedBean.class);
+        classes.add(CircularApplicationScopedBean.class);
+
+        AppScopedBean.appContextInitializedEvent.clear();
+        AppScopedBean.appContextDestroyedEvent.clear();
+        AppScopedBean.sessionContextInitializedEvent.clear();
+        AppScopedBean.sessionContextDestroyedEvent.clear();
+        AppScopedBean.requestContextInitializedEvent.clear();
+        AppScopedBean.requestContextDestroyedEvent.clear();
+
+        startContainer(classes);
+        
+        AppScopedBean appBeanInstance = getInstance(AppScopedBean.class);
+        Assert.assertNotNull(appBeanInstance);
+        PersonalDataBean pdb1 = appBeanInstance.getPdb().getInstance();
+        Assert.assertNotNull(pdb1);
+        
+        // now we reset the session Context so we should get a new contextual 
instance.
+        
getWebBeansContext().getContextsService().endContext(SessionScoped.class, null);
+        
getWebBeansContext().getContextsService().endContext(RequestScoped.class, null);
+
+        Assert.assertEquals(1, 
AppScopedBean.appContextInitializedEvent.size());
+        Assert.assertEquals(1, 
AppScopedBean.sessionContextInitializedEvent.size());
+        Assert.assertEquals(1, 
AppScopedBean.sessionContextDestroyedEvent.size());
+        Assert.assertEquals(1, 
AppScopedBean.requestContextInitializedEvent.size());
+        Assert.assertEquals(1, 
AppScopedBean.requestContextDestroyedEvent.size());
+
+        shutDownContainer();
+        Assert.assertEquals(1, 
AppScopedBean.requestContextDestroyedEvent.size());
+        Assert.assertEquals(1, 
AppScopedBean.sessionContextDestroyedEvent.size());
+
+        Assert.assertEquals(1, AppScopedBean.appContextDestroyedEvent.size());
+    }
 }

Reply via email to