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()); + } }