This is an automated email from the ASF dual-hosted git repository.

snoopdave pushed a commit to branch session-mgmt-simple
in repository https://gitbox.apache.org/repos/asf/roller.git

commit dfd7e1b6da2fb00f5e3df12a30e5535e4e6310af
Author: David M. Johnson <snoopd...@apache.org>
AuthorDate: Mon Jan 20 16:41:50 2025 -0500

    Add a test and fixes for problems revealed.
---
 .../roller/weblogger/ui/core/RollerSession.java    |  22 +----
 .../weblogger/ui/core/RollerSessionManager.java    |  17 +++-
 .../ui/core/RollerSessionManagerTest.java          | 106 +++++++++++++++++++++
 3 files changed, 123 insertions(+), 22 deletions(-)

diff --git 
a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java 
b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java
index ef5d7d5af..6be878bff 100644
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSession.java
@@ -66,17 +66,18 @@ public class RollerSession
             rollerSession = 
(RollerSession)session.getAttribute(ROLLER_SESSION);
 
             if (rollerSession == null) {
+                // Create new session if none exists
                 rollerSession = new RollerSession();
                 session.setAttribute(ROLLER_SESSION, rollerSession);
             } else if (rollerSession.getAuthenticatedUser() != null) {
-                RollerSessionManager sessionManager = 
RollerSessionManager.getInstance();
-                if 
(sessionManager.get(rollerSession.getAuthenticatedUser().getUserName()) == 
null) {
-                    // session not present in cache means that it is invalid
+                // Check if session is still valid in cache
+                RollerSessionManager manager = 
RollerSessionManager.getInstance();
+                String username = 
rollerSession.getAuthenticatedUser().getUserName();
+                if (manager.get(username) == null) {
                     rollerSession = new RollerSession();
                     session.setAttribute(ROLLER_SESSION, rollerSession);
                 }
             }
-            
             Principal principal = request.getUserPrincipal();
 
             // If we've got a principal but no user object, then attempt to get
@@ -152,17 +153,4 @@ public class RollerSession
         RollerSessionManager sessionManager = 
RollerSessionManager.getInstance();
         sessionManager.register(authenticatedUser.getUserName(), this);
     }
-
-    private void clearSession(HttpSessionEvent se) {
-        HttpSession session = se.getSession();
-        try {
-            session.removeAttribute(ROLLER_SESSION);
-        } catch (Exception e) {
-            if (log.isDebugEnabled()) {
-                // ignore purge exceptions
-                log.debug("EXCEPTION PURGING session attributes",e);
-            }
-        }
-    }
-    
 }
diff --git 
a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSessionManager.java
 
b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSessionManager.java
index dca4e11c0..f8dff5028 100644
--- 
a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSessionManager.java
+++ 
b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerSessionManager.java
@@ -13,7 +13,6 @@ import java.util.Map;
 public class RollerSessionManager {
    private static final Log log = 
LogFactory.getLog(RollerSessionManager.class);
    private static final String CACHE_ID = "roller.session.cache";
-
    private final Cache sessionCache;
 
    public static RollerSessionManager getInstance() {
@@ -24,20 +23,28 @@ public class RollerSessionManager {
       private static final RollerSessionManager INSTANCE = new 
RollerSessionManager();
    }
 
-   private class SessionCacheHandler extends CacheHandlerAdapter {
-     public void invalidateUser(User user) {
+   class SessionCacheHandler extends CacheHandlerAdapter {
+     @Override
+     public void invalidate(User user) {
          if (user != null && user.getUserName() != null) {
             sessionCache.remove(user.getUserName());
          }
       }
    }
 
+   /** Testing purpose only */
+   RollerSessionManager(Cache cache) {
+      this.sessionCache = cache;
+      CacheManager.registerHandler(new SessionCacheHandler());
+   }
+
    private RollerSessionManager() {
       Map<String, String> cacheProps = new HashMap<>();
       cacheProps.put("id", CACHE_ID);
+      cacheProps.put("size", "1000");  // Cache up to 1000 sessions
+      cacheProps.put("timeout", "3600"); // Session timeout in seconds (1 hour)
       this.sessionCache = CacheManager.constructCache(null, cacheProps);
-      SessionCacheHandler cacheHandler = new SessionCacheHandler();
-      CacheManager.registerHandler(cacheHandler);
+      CacheManager.registerHandler(new SessionCacheHandler());
    }
 
    public void register(String userName, RollerSession session) {
diff --git 
a/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionManagerTest.java
 
b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionManagerTest.java
new file mode 100644
index 000000000..1275e2c62
--- /dev/null
+++ 
b/app/src/test/java/org/apache/roller/weblogger/ui/core/RollerSessionManagerTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  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.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.weblogger.ui.core;
+
+import org.apache.roller.weblogger.pojos.User;
+import org.apache.roller.weblogger.util.cache.Cache;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+class RollerSessionManagerTest {
+    private RollerSessionManager sessionManager;
+    private Cache mockCache;
+
+    @BeforeEach
+    void setUp() {
+        mockCache = mock(Cache.class);
+        sessionManager = new RollerSessionManager(mockCache);
+    }
+
+    @Test
+    void testRegisterSession() {
+        RollerSession mockSession = mock(RollerSession.class);
+        String userName = "testUser";
+
+        sessionManager.register(userName, mockSession);
+
+        verify(mockCache).put(userName, mockSession);
+    }
+
+    @Test
+    void testGetSession() {
+        RollerSession mockSession = mock(RollerSession.class);
+        String userName = "testUser";
+        when(mockCache.get(userName)).thenReturn(mockSession);
+
+        RollerSession result = sessionManager.get(userName);
+
+        assertEquals(mockSession, result);
+        verify(mockCache).get(userName);
+    }
+
+    @Test
+    void testInvalidateSession() {
+        String userName = "testUser";
+
+        sessionManager.invalidate(userName);
+
+        verify(mockCache).remove(userName);
+    }
+
+    @Test
+    void testCacheHandlerInvalidation() {
+        User mockUser = mock(User.class);
+        String userName = "testUser";
+        when(mockUser.getUserName()).thenReturn(userName);
+
+        sessionManager.new SessionCacheHandler().invalidate(mockUser);
+
+        verify(mockCache).remove(userName);
+    }
+
+    @Test
+    void testNullInputHandling() {
+        RollerSession mockSession = mock(RollerSession.class);
+
+        sessionManager.register(null, mockSession);
+        sessionManager.invalidate(null);
+        sessionManager.get(null);
+
+        verify(mockCache, never()).put(any(), any());
+        verify(mockCache, never()).remove(any());
+        verify(mockCache, never()).get(any());
+    }
+
+    @Test
+    void testSessionTimeout() {
+        String userName = "testUser";
+        when(mockCache.get(userName)).thenReturn(null);
+
+        RollerSession result = sessionManager.get(userName);
+
+        assertNull(result);
+        verify(mockCache).get(userName);
+    }
+}
\ No newline at end of file

Reply via email to