From 490fa4d84723f170fb04dd4ee1d50b08af6e7a8e Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <daniel.gerhardt@mni.thm.de>
Date: Fri, 8 Mar 2013 19:59:36 +0100
Subject: [PATCH] Added method to count active users by using the existing Maps
 in UserService. Added a scheduled method to delete inactive users from
 user2sessionLegacy Map.

---
 .../de/thm/arsnova/services/IUserService.java |  2 ++
 .../de/thm/arsnova/services/UserService.java  | 30 +++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/src/main/java/de/thm/arsnova/services/IUserService.java b/src/main/java/de/thm/arsnova/services/IUserService.java
index 73581535..1231bf9c 100644
--- a/src/main/java/de/thm/arsnova/services/IUserService.java
+++ b/src/main/java/de/thm/arsnova/services/IUserService.java
@@ -48,4 +48,6 @@ public interface IUserService {
 	void addUserToSessionBySocketId(UUID socketId, String keyword);
 
 	void removeUserFromSessionBySocketId(UUID socketId);
+
+	int getUsersInSessionCount(String keyword);
 }
diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java
index b2e0dcdb..550ac086 100644
--- a/src/main/java/de/thm/arsnova/services/UserService.java
+++ b/src/main/java/de/thm/arsnova/services/UserService.java
@@ -23,6 +23,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.authentication.AnonymousAuthenticationToken;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.cas.authentication.CasAuthenticationToken;
@@ -33,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import com.github.leleuj.ss.oauth.client.authentication.OAuthAuthenticationToken;
 
+import de.thm.arsnova.dao.IDatabaseDao;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.exceptions.UnauthorizedException;
 
@@ -48,6 +51,28 @@ public class UserService implements IUserService, InitializingBean, DisposableBe
 	/* used for HTTP polling online check solution (legacy) */
 	private static final ConcurrentHashMap<User, String> user2sessionLegacy = new ConcurrentHashMap<User, String>();
 
+	@Autowired
+	private IDatabaseDao databaseDao;
+
+	private static final int DEFAULT_SCHEDULER_DELAY_MS = 60000;
+
+	private static final int MAX_USER_INACTIVE_SECONDS = 120;
+
+	@Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY_MS)
+	public final void removeInactiveUsersFromLegacyMap() {
+		List<String> usernames = databaseDao.getInactiveUsers(MAX_USER_INACTIVE_SECONDS);
+		LOGGER.info(
+			"Inactive users count: {}, user2sessionLegacy count: {}",
+			usernames.size(), user2sessionLegacy.size()
+		);
+		for (Entry<User, String> e : user2sessionLegacy.entrySet()) {
+			if (usernames.contains(e.getKey().getUsername())) {
+				LOGGER.debug("Removing user {} from user2sessionLegacy", e.getKey());
+				user2sessionLegacy.remove(e.getKey());
+			}
+		}
+	}
+
 	@Override
 	public User getCurrentUser() {
 		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
@@ -134,6 +159,11 @@ public class UserService implements IUserService, InitializingBean, DisposableBe
 		return result;
 	}
 
+	@Override
+	public int getUsersInSessionCount(String keyword) {
+		return getUsersInSession(keyword).size();
+	}
+
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
 	public void addCurrentUserToSessionMap(String keyword) {
-- 
GitLab