From c22330fd5e9e783546a1ab1402866f8cc580ea56 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Wed, 12 Jun 2013 18:50:21 +0200
Subject: [PATCH] Store UserSessionServices for all sessions

This enables access to all UserSessionService objects from within the
application. This could be used to send events to all session users.
---
 .../arsnova/events/ARSnovaEventListener.java  | 10 ++++++++--
 .../thm/arsnova/services/FeedbackService.java |  2 ++
 .../de/thm/arsnova/services/IUserService.java |  6 ++++--
 .../de/thm/arsnova/services/UserService.java  | 20 ++++++++++++-------
 .../arsnova/services/UserSessionService.java  |  2 ++
 .../services/UserSessionServiceImpl.java      |  7 ++++++-
 .../arsnova/socket/ARSnovaSocketIOServer.java |  2 +-
 7 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java b/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java
index cdc0ce474..5cefd4ab9 100644
--- a/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java
+++ b/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java
@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationListener;
 import org.springframework.stereotype.Component;
 
+import de.thm.arsnova.services.UserService;
 import de.thm.arsnova.services.UserSessionService;
 import de.thm.arsnova.socket.ARSnovaSocketIOServer;
 
@@ -18,10 +19,15 @@ public class ARSnovaEventListener implements ApplicationListener<ARSnovaEvent> {
 	private ARSnovaSocketIOServer socketIoServer;
 
 	@Autowired
-	private UserSessionService userSessionService;
+	private UserService userService;
 
 	@Override
 	public void onApplicationEvent(ARSnovaEvent event) {
-		userSessionService.sendEventViaWebSocket(socketIoServer, event);
+		for( UserSessionService userSessionService : userService.getUserSessionServices().values() ) {
+			if (userSessionService != null) {
+				LOGGER.info(userSessionService.getUser().getUsername());
+				userSessionService.sendEventViaWebSocket(socketIoServer, event);
+			}
+		}
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackService.java b/src/main/java/de/thm/arsnova/services/FeedbackService.java
index db7bff304..d6ab9cd6f 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackService.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackService.java
@@ -19,6 +19,7 @@
 
 package de.thm.arsnova.services;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -111,6 +112,7 @@ public class FeedbackService implements IFeedbackService {
 	public final boolean saveFeedback(final String keyword, final int value, final User user) {
 		boolean result = feedbackStorage.saveFeedback(keyword, value, user);
 		if (result) {
+			System.out.println(new Date().toLocaleString());
 			this.server.reportUpdatedFeedbackForSession(keyword);
 		}
 		return result;
diff --git a/src/main/java/de/thm/arsnova/services/IUserService.java b/src/main/java/de/thm/arsnova/services/IUserService.java
index 485a75c65..cdf2f93fe 100644
--- a/src/main/java/de/thm/arsnova/services/IUserService.java
+++ b/src/main/java/de/thm/arsnova/services/IUserService.java
@@ -19,10 +19,10 @@
 
 package de.thm.arsnova.services;
 
-import java.util.Date;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 
 import de.thm.arsnova.entities.User;
 
@@ -55,5 +55,7 @@ public interface IUserService {
 
 	int loggedInUsers();
 
-	void setLastOnlineActivity(User user, Date date);
+	void triggerOnlineActivity(User user, UserSessionService uss);
+
+	ConcurrentHashMap<User, UserSessionService> getUserSessionServices();
 }
diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java
index 8adff15bb..0c5a51d3b 100644
--- a/src/main/java/de/thm/arsnova/services/UserService.java
+++ b/src/main/java/de/thm/arsnova/services/UserService.java
@@ -1,7 +1,8 @@
 package de.thm.arsnova.services;
 
-import java.util.Date;
+import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -40,18 +41,18 @@ public class UserService implements IUserService {
 	/* used for HTTP polling online check solution (legacy) */
 	private static final ConcurrentHashMap<User, String> user2sessionLegacy = new ConcurrentHashMap<User, String>();
 
-	private static final ConcurrentHashMap<User, Date> lastOnline = new ConcurrentHashMap<User, Date>();
+	private static final ConcurrentHashMap<User, UserSessionService> userSessionServices = new ConcurrentHashMap<User, UserSessionService>();
 
 	@Override
-	public void setLastOnlineActivity(User user, Date date) {
-		lastOnline.put(user, date);
+	public void triggerOnlineActivity(User user, UserSessionService uss) {
+		userSessionServices.put(user, uss);
 		LOGGER.info("Updating active user {}", user.getUsername());
 		
-		for (Entry<User,Date> e : lastOnline.entrySet()) {
+		for (Entry<User,UserSessionService> e : userSessionServices.entrySet()) {
 			LOGGER.info("User in Map {}", e.getKey().getUsername());
-			if (e.getValue().getTime() < System.currentTimeMillis() - MAX_USER_INACTIVE_SECONDS * 1000) {
+			if (e.getValue().getLastActivity().getTime() < System.currentTimeMillis() - MAX_USER_INACTIVE_SECONDS * 1000) {
 				LOGGER.info("Removing inactive user {}", e.getKey());
-				lastOnline.remove(e.getKey());
+				userSessionServices.remove(e.getKey());
 				this.removeUserFromMaps(e.getKey());
 				LOGGER.info("Active user count: {}", this.loggedInUsers());
 			}
@@ -208,4 +209,9 @@ public class UserService implements IUserService {
 	public int loggedInUsers() {
 		return user2sessionLegacy.size();
 	}
+	
+	@Override
+	public ConcurrentHashMap<User, UserSessionService> getUserSessionServices() {
+		return userSessionServices;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/services/UserSessionService.java b/src/main/java/de/thm/arsnova/services/UserSessionService.java
index c514a700d..f2d2de5ef 100644
--- a/src/main/java/de/thm/arsnova/services/UserSessionService.java
+++ b/src/main/java/de/thm/arsnova/services/UserSessionService.java
@@ -1,5 +1,6 @@
 package de.thm.arsnova.services;
 
+import java.util.Date;
 import java.util.UUID;
 
 import de.thm.arsnova.entities.LoggedIn;
@@ -20,6 +21,7 @@ public interface UserSessionService {
 	UUID getSocketId();
 
 	LoggedIn keepalive();
+	public Date getLastActivity();
 
 	void sendEventViaWebSocket(ARSnovaSocketIOServer server, ARSnovaEvent event);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
index 57340a41f..ee60dcd26 100644
--- a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
@@ -80,7 +80,7 @@ public class UserSessionServiceImpl implements UserSessionService, Serializable
 	public LoggedIn keepalive() {
 		if (this.user != null) {
 			this.lastActive = new Date();
-			userService.setLastOnlineActivity(this.user, this.lastActive);
+			userService.triggerOnlineActivity(this.user, this);
 			
 			LoggedIn result = new LoggedIn();
 			result.setUser(this.user.getUsername());
@@ -91,6 +91,11 @@ public class UserSessionServiceImpl implements UserSessionService, Serializable
 		return new LoggedIn();
 	}
 	
+	@Override
+	public Date getLastActivity() {
+		return this.lastActive;
+	}
+	
 	private boolean hasConnectedWebSocket() {
 		return getSocketId() != null;
 	}
diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
index b6b2044a6..affae3483 100644
--- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
+++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
@@ -308,7 +308,7 @@ public class ARSnovaSocketIOServer {
 	public void sendToClient(UUID sessionId, ARSnovaEvent event) {
 		for (SocketIOClient c : server.getAllClients()) {
 			if (c.getSessionId().equals(sessionId)) {
-				LOGGER.info("Send Event {}", event.getEventName());
+				LOGGER.info("Send Event {} -- {}", event.getEventName(), userService.getCurrentUser().getUsername());
 				c.sendEvent(event.getEventName(), event.getData());
 				break;
 			}
-- 
GitLab