You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2020/02/26 17:54:03 UTC

[openwebbeans] 02/02: OWB-1314 ensure conversation last accessed time is updated when conversation is touched if conversation service handles propagation of id properly

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

commit 239b0b705dcf1c22c7b9308c6c4f3fa6e304605a
Author: Romain Manni-Bucau <rm...@apache.org>
AuthorDate: Wed Feb 26 18:53:06 2020 +0100

    OWB-1314 ensure conversation last accessed time is updated when conversation is touched if conversation service handles propagation of id properly
---
 .../webbeans/conversation/ConversationImpl.java    |  7 +-
 .../webbeans/conversation/ConversationManager.java |  4 ++
 .../webbeans/corespi/se/BaseSeContextsService.java |  8 ++-
 .../conversation/ConversationManagerTest.java      | 79 ++++++++++++++++++++++
 4 files changed, 96 insertions(+), 2 deletions(-)

diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java b/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java
index bbc8c68..1670db4 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java
@@ -178,7 +178,12 @@ public class ConversationImpl implements Conversation, Serializable
         synchronized (this)
         {
             threadsUsingIt.add(thread);
-            return threadsUsingIt.size();
+            final int size = threadsUsingIt.size();
+            if (size == 1)
+            {
+                updateLastAccessTime();
+            }
+            return size;
         }
     }
 
diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java b/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java
index cb10836..8332357 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java
@@ -107,6 +107,10 @@ public class ConversationManager
                                     " is used by other request. It creates a new transient conversation");
                             conversationContext.getConversation().setProblemDuringCreation(problem);
                         }
+                        else
+                        {
+                            conversationContext.getConversation().updateLastAccessTime();
+                        }
 
                         conversationContext.setActive(true);
                         return conversationContext;
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 69c8cf4..11ea0db 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
@@ -41,6 +41,7 @@ import org.apache.webbeans.context.ConversationContext;
 import org.apache.webbeans.context.DependentContext;
 import org.apache.webbeans.context.RequestContext;
 import org.apache.webbeans.context.SessionContext;
+import org.apache.webbeans.conversation.ConversationImpl;
 import org.apache.webbeans.conversation.ConversationManager;
 import org.apache.webbeans.intercept.RequestScopedBeanInterceptorHandler;
 import org.apache.webbeans.intercept.SessionScopedBeanInterceptorHandler;
@@ -311,11 +312,16 @@ public abstract class BaseSeContextsService extends AbstractContextsService
         ctx.setActive(true);
         conversationContext.set(ctx);
 
-        if (ctx.getConversation().isTransient())
+        final ConversationImpl conversation = ctx.getConversation();
+        if (conversation.isTransient())
         {
             webBeansContext.getBeanManagerImpl().fireContextLifecyleEvent(
                 conversationManager.getLifecycleEventPayload(ctx), InitializedLiteral.INSTANCE_CONVERSATION_SCOPED);
         }
+        else
+        {
+            conversation.updateLastAccessTime();
+        }
     }
 
     
diff --git a/webbeans-impl/src/test/java/org/apache/webbeans/conversation/ConversationManagerTest.java b/webbeans-impl/src/test/java/org/apache/webbeans/conversation/ConversationManagerTest.java
new file mode 100644
index 0000000..077a8f8
--- /dev/null
+++ b/webbeans-impl/src/test/java/org/apache/webbeans/conversation/ConversationManagerTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.conversation;
+
+import static java.lang.Thread.sleep;
+import static org.apache.webbeans.util.Asserts.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.enterprise.context.ConversationScoped;
+
+import org.apache.webbeans.context.ConversationContext;
+import org.apache.webbeans.spi.ContextsService;
+import org.apache.webbeans.spi.ConversationService;
+import org.apache.webbeans.test.AbstractUnitTest;
+import org.junit.Test;
+
+public class ConversationManagerTest extends AbstractUnitTest
+{
+    @Test
+    public void ensureLastUpdateIsCorrect()
+    {
+        final AtomicReference<String> conversationId = new AtomicReference<>();
+        addService(ConversationService.class, new DefaultConversationService() {
+            @Override
+            public String getConversationId() {
+                return conversationId.get();
+            }
+        });
+        addConfiguration("org.apache.webbeans.application.supportsConversation", "true");
+        startContainer();
+        final ContextsService contextsService = getWebBeansContext().getContextsService();
+        contextsService.startContext(ConversationScoped.class, null);
+        final ConversationContext conversationContext1 = ConversationContext.class.cast(
+                contextsService.getCurrentContext(ConversationScoped.class));
+        final ConversationImpl conversation1 = conversationContext1.getConversation();
+        assertNotNull(conversation1);
+        assertEquals(0, conversation1.getLastAccessTime());
+        conversation1.begin("foo");
+        conversationId.set(conversation1.getId());
+        final long beginTime = conversation1.getLastAccessTime();
+        assertNotEquals(0, beginTime);
+        try {
+            sleep(100); // avoid cached value (win)
+        } catch (final InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+
+        // another request, will trigger the update
+        contextsService.endContext(ConversationScoped.class, null);
+
+        contextsService.startContext(ConversationScoped.class, null);
+        final ConversationContext conversationContext2 = ConversationContext.class.cast(
+                contextsService.getCurrentContext(ConversationScoped.class));
+        final ConversationImpl conversation2 = conversationContext2.getConversation();
+        assertEquals(conversation1, conversation2);
+
+        contextsService.getCurrentContext(ConversationScoped.class); // trigger update
+        assertNotEquals(beginTime, conversation2.getLastAccessTime());
+    }
+}