This is an automated email from the ASF dual-hosted git repository. rmannibucau 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 317ece3 [OWB-1385] ensure request context controller is properly implemented 317ece3 is described below commit 317ece34fb0692bd14d291f157d42c711d127415 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Tue May 18 11:30:09 2021 +0200 [OWB-1385] ensure request context controller is properly implemented --- .../ActivateRequestContextInterceptorBean.java | 14 ++--- .../control/OwbRequestContextController.java | 62 +++------------------- .../control/OwbRequestContextControllerTest.java | 10 ++-- 3 files changed, 15 insertions(+), 71 deletions(-) diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/context/control/ActivateRequestContextInterceptorBean.java b/webbeans-impl/src/main/java/org/apache/webbeans/context/control/ActivateRequestContextInterceptorBean.java index 093d844..8904204 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/context/control/ActivateRequestContextInterceptorBean.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/context/control/ActivateRequestContextInterceptorBean.java @@ -47,12 +47,10 @@ public class ActivateRequestContextInterceptorBean private static final InterceptorClass INSTANCE = new InterceptorClass(); private final WebBeansContext webBeansContext; - private transient RequestContextController contextController; public ActivateRequestContextInterceptorBean(final WebBeansContext webBeansContext) { this.webBeansContext = webBeansContext; - this.contextController = new OwbRequestContextController(webBeansContext); } @Override @@ -71,21 +69,15 @@ public class ActivateRequestContextInterceptorBean public Object intercept(final InterceptionType type, final InterceptorClass instance, final InvocationContext ctx) throws Exception { - if (contextController == null) // synchro is not needed since the instance is backed by contextsservice - { - contextController = new OwbRequestContextController(webBeansContext); - } - final boolean activated = contextController.activate(); + final RequestContextController contextController = new OwbRequestContextController(webBeansContext); + contextController.activate(); try { return ctx.proceed(); } finally { - if (activated) - { - contextController.deactivate(); - } + contextController.deactivate(); } } diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/context/control/OwbRequestContextController.java b/webbeans-impl/src/main/java/org/apache/webbeans/context/control/OwbRequestContextController.java index a6f66f8..b1b3155 100644 --- a/webbeans-impl/src/main/java/org/apache/webbeans/context/control/OwbRequestContextController.java +++ b/webbeans-impl/src/main/java/org/apache/webbeans/context/control/OwbRequestContextController.java @@ -27,87 +27,37 @@ import javax.enterprise.context.ContextNotActiveException; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.control.RequestContextController; import javax.enterprise.context.spi.Context; -import java.util.ArrayList; -import java.util.List; public class OwbRequestContextController implements RequestContextController { private final ContextsService contextsService; - private final ThreadLocal<List<Op>> deactivateOperations; + private boolean enabled; OwbRequestContextController(final WebBeansContext context) { this.contextsService = context.getContextsService(); - this.deactivateOperations = findThreadLocal(context); } @Override public boolean activate() { final Context ctx = contextsService.getCurrentContext(RequestScoped.class, false); - if (ctx == null || !ctx.isActive()) + enabled = ctx == null || !ctx.isActive(); + if (enabled) { contextsService.startContext(RequestScoped.class, null); - final List<Op> ops = new ArrayList<>(); - ops.add(Op.DEACTIVATE); - deactivateOperations.set(ops); - return true; } - List<Op> deactivateOps = deactivateOperations.get(); - if (deactivateOps == null) - { - deactivateOps = new ArrayList<>(); - deactivateOperations.set(deactivateOps); - } - deactivateOps.add(Op.NOOP); - return false; + return enabled; } @Override public void deactivate() throws ContextNotActiveException { - // spec says we only must deactivate the RequestContest "if it was activated by this context controller" - final List<Op> ops = deactivateOperations.get(); - if (ops == null) - { - return; - } - if (ops.remove(ops.size() - 1) == Op.DEACTIVATE) + if (enabled) { contextsService.endContext(RequestScoped.class, null); RequestScopedBeanInterceptorHandler.removeThreadLocals(); + enabled = false; } - if (ops.isEmpty()) - { - deactivateOperations.remove(); - } - } - - // must be per webbeanscontext - private ThreadLocal<List<Op>> findThreadLocal(final WebBeansContext context) - { - ThreadLocalService service = context.getService(ThreadLocalService.class); - if (service == null) - { - synchronized (context) - { - if (service == null) - { - service = new ThreadLocalService(); - context.registerService(ThreadLocalService.class, service); - } - } - } - return service.instance; - } - - private enum Op - { - DEACTIVATE, NOOP - } - - private static class ThreadLocalService - { - private final ThreadLocal<List<Op>> instance = new ThreadLocal<>(); } } diff --git a/webbeans-impl/src/test/java/org/apache/webbeans/context/control/OwbRequestContextControllerTest.java b/webbeans-impl/src/test/java/org/apache/webbeans/context/control/OwbRequestContextControllerTest.java index e6edd6e..16176df 100644 --- a/webbeans-impl/src/test/java/org/apache/webbeans/context/control/OwbRequestContextControllerTest.java +++ b/webbeans-impl/src/test/java/org/apache/webbeans/context/control/OwbRequestContextControllerTest.java @@ -41,11 +41,13 @@ public class OwbRequestContextControllerTest extends AbstractUnitTest final RequestContextController controller = getInstance(RequestContextController.class); assertNull(cs.getCurrentContext(RequestScoped.class)); assertTrue(controller.activate()); - assertFalse(controller.activate()); - assertFalse(getInstance(RequestContextController.class).activate()); + final RequestContextController i2 = getInstance(RequestContextController.class); + assertFalse(i2.activate()); + final RequestContextController i3 = getInstance(RequestContextController.class); + assertFalse(i3.activate()); assertTrue(cs.getCurrentContext(RequestScoped.class).isActive()); - controller.deactivate(); - controller.deactivate(); + i2.deactivate(); + // skip i3 to ensure we deactivate by the "owner" controller.deactivate(); assertNull(cs.getCurrentContext(RequestScoped.class)); }