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 <[email protected]>
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));
}