From 8fae4789ad3cb8f6e5b4a777e41e0e4bf3fda40b Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Sun, 15 Mar 2026 19:37:43 +0100 Subject: [PATCH] Add: Make UserRegistry use multiple Maps to accelerate lookups --- .../server/domain/user/UserRegistry.java | 63 ++++++++----------- 1 file changed, 26 insertions(+), 37 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java index ec128bd..061298d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserRegistry.java @@ -1,56 +1,27 @@ package ch.unibas.dmi.dbis.cs108.casono.server.domain.user; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; - import java.util.Collection; -import java.util.Iterator; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; public class UserRegistry { private final ConcurrentHashMap byId = new ConcurrentHashMap<>(); + private final ConcurrentHashMap byName = new ConcurrentHashMap<>(); + private final ConcurrentHashMap bySessionId = new ConcurrentHashMap<>(); public synchronized Optional registerIfAvailable(String name, SessionId sessionId) { - Iterator users = byId.elements().asIterator(); - while(users.hasNext()) { - User user = users.next(); - - if (user.getName() == name) { - return Optional.empty(); - } + if (byName.containsKey(name)) { + return Optional.empty(); } User user = new User(new UserId(), name, sessionId); byId.put(user.getId(), user); + byName.put(user.getName(), user); + bySessionId.put(sessionId, user); return Optional.of(user); } - public Optional findBySessionId(SessionId sessionId) { - Iterator users = byId.elements().asIterator(); - while(users.hasNext()) { - User user = users.next(); - Optional currentSessionId = user.getSessionId(); - - if (currentSessionId.isEmpty()) { - continue; - } - - if (currentSessionId.get() == sessionId) { - return Optional.of(user); - } - } - return Optional.empty(); - } - - // TODO: Add to EventRegistry with DisconnectEvent - public synchronized void onDisconnect(SessionId sessionId) { - Optional user = findBySessionId(sessionId); - - if (user.isPresent()) { - user.get().markDisconnected(); - } - } - public synchronized boolean removeIfStillDisconnected(UserId userId) { User user = byId.get(userId); if (user == null) { @@ -62,17 +33,35 @@ public class UserRegistry { } byId.remove(user.getId()); + byName.remove(user.getName()); return true; } + // TODO: Add to EventRegistry with DisconnectEvent + public synchronized void onDisconnect(SessionId sessionId) { + User user = bySessionId.remove(sessionId); + if (user == null) { + return; + } + + user.markDisconnected(); + } + public synchronized Optional reassignSession(UserId userId, SessionId sessionId) { User user = byId.get(userId); - if (user == null) return Optional.empty(); - + if (user == null) { + return Optional.empty(); + } + user.reassignSession(sessionId); + bySessionId.put(sessionId, user); return Optional.of(user); } + public Optional findBySessionId(SessionId sessionId) { + return Optional.ofNullable(bySessionId.get(sessionId)); + } + public Collection getAllUsers() { return byId.values(); }