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

Reply via email to