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