From 307b55066ad9405c75db29691ce538aceae7b181 Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Wed, 29 Oct 2014 10:19:20 +0100 Subject: [PATCH] Implemented missing Web Socket notification of deleted feedback --- .../java/de/thm/arsnova/FeedbackStorage.java | 20 ++++++++---- .../thm/arsnova/services/FeedbackService.java | 32 ++++++++++++++++++- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/thm/arsnova/FeedbackStorage.java b/src/main/java/de/thm/arsnova/FeedbackStorage.java index 41df30bc2..785a268e9 100644 --- a/src/main/java/de/thm/arsnova/FeedbackStorage.java +++ b/src/main/java/de/thm/arsnova/FeedbackStorage.java @@ -1,6 +1,9 @@ package de.thm.arsnova; +import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -108,24 +111,29 @@ public class FeedbackStorage { } @Transactional(isolation = Isolation.READ_COMMITTED) - public void cleanFeedbackVotes(final int cleanupFeedbackDelay) { + public Map<String, List<User>> cleanFeedbackVotes(final int cleanupFeedbackDelay) { + final Map<String, List<User>> removedFeedbackOfUsersInSession = new HashMap<String, List<User>>();; for (final String keyword : data.keySet()) { - cleanSessionFeedbackVotes(keyword, cleanupFeedbackDelay); + List<User> feedbackOfUsers = cleanFeedbackVotesInSession(keyword, cleanupFeedbackDelay); + removedFeedbackOfUsersInSession.put(keyword, feedbackOfUsers); } + return removedFeedbackOfUsersInSession; } - private void cleanSessionFeedbackVotes(final String keyword, final int cleanupFeedbackDelay) { + private List<User> cleanFeedbackVotesInSession(final String keyword, final int cleanupFeedbackDelay) { final long timelimitInMillis = 60000 * (long) cleanupFeedbackDelay; final long maxAllowedTimeInMillis = System.currentTimeMillis() - timelimitInMillis; final Map<String, FeedbackStorageObject> sessionFeedbacks = data.get(keyword); + final List<User> feedbackOfUsers = new ArrayList<User>(); for (final Map.Entry<String, FeedbackStorageObject> entry : sessionFeedbacks.entrySet()) { - if ( - entry.getValue().getTimestamp().getTime() < maxAllowedTimeInMillis - ) { + final boolean timeIsUp = entry.getValue().getTimestamp().getTime() < maxAllowedTimeInMillis; + if (timeIsUp) { sessionFeedbacks.remove(entry.getKey()); + feedbackOfUsers.add(entry.getValue().user); } } + return feedbackOfUsers; } } diff --git a/src/main/java/de/thm/arsnova/services/FeedbackService.java b/src/main/java/de/thm/arsnova/services/FeedbackService.java index 116578bd5..acd5bba58 100644 --- a/src/main/java/de/thm/arsnova/services/FeedbackService.java +++ b/src/main/java/de/thm/arsnova/services/FeedbackService.java @@ -19,7 +19,11 @@ package de.thm.arsnova.services; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import javax.annotation.PostConstruct; @@ -66,7 +70,33 @@ public class FeedbackService implements IFeedbackService { @Override @Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY) public final void cleanFeedbackVotes() { - feedbackStorage.cleanFeedbackVotes(cleanupFeedbackDelay); + Map<String, List<User>> deletedFeedbackOfUsersInSession = feedbackStorage.cleanFeedbackVotes(cleanupFeedbackDelay); + /* + * mapping (Session -> Users) is not suitable for web sockets, because we want to sent all affected + * sessions to a single user in one go instead of sending multiple messages for each session. Hence, + * we need the mapping (User -> Sessions) + */ + final Map<User, Set<String>> affectedSessionsOfUsers = new HashMap<User, Set<String>>(); + + for (Map.Entry<String, List<User>> entry : deletedFeedbackOfUsersInSession.entrySet()) { + final String sessionKeyword = entry.getKey(); + final List<User> users = entry.getValue(); + for (User user : users) { + Set<String> affectedSessions; + if (affectedSessionsOfUsers.containsKey(user)) { + affectedSessions = affectedSessionsOfUsers.get(user); + } else { + affectedSessions = new HashSet<String>(); + } + affectedSessions.add(sessionKeyword); + affectedSessionsOfUsers.put(user, affectedSessions); + } + } + for (Map.Entry<User, Set<String>> entry : affectedSessionsOfUsers.entrySet()) { + final User user = entry.getKey(); + final Set<String> arsSessions = entry.getValue(); + server.reportDeletedFeedback(user.getUsername(), arsSessions); + } } @Override -- GitLab