From 044cea7cb989b0986be4446ceb147943e3a8fe5a Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <daniel.gerhardt@mni.thm.de>
Date: Fri, 8 Mar 2013 12:18:52 +0100
Subject: [PATCH] Socket.IO solution now updates user's and creator's last
 activity in CouchDB and visited sessions.

---
 .../thm/arsnova/services/ISessionService.java |  3 ++
 .../thm/arsnova/services/SessionService.java  | 30 +++++++++++++++++++
 .../arsnova/socket/ARSnovaSocketIOServer.java |  6 ++--
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index acea01b7..5687d117 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -20,6 +20,7 @@
 package de.thm.arsnova.services;
 
 import java.util.List;
+import java.util.UUID;
 
 import de.thm.arsnova.connector.model.Course;
 import de.thm.arsnova.entities.LoggedIn;
@@ -46,4 +47,6 @@ public interface ISessionService {
 	int countSessions(List<Course> courses);
 
 	Session setActive(String sessionkey, Boolean lock);
+
+	Session joinSession(String keyword, UUID socketId);
 }
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 52343f34..60915c60 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -26,6 +26,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -61,9 +62,36 @@ public class SessionService implements ISessionService {
 		this.databaseDao = newDatabaseDao;
 	}
 
+	@Override
+	@Authenticated
+	public final Session joinSession(final String keyword, UUID socketId) {
+		/* Socket.IO solution */
+
+		Session session = databaseDao.getSession(keyword);
+		User user = userService.getUser2SocketId(socketId);
+
+		userService.addUserToSessionBySocketId(socketId, keyword);
+
+		if (session.getCreator().equals(user.getUsername())) {
+			databaseDao.updateSessionOwnerActivity(session);
+		}
+		databaseDao.registerAsOnlineUser(user, session);
+
+		if (connectorClient != null && session.isCourseSession()) {
+			String courseid = session.getCourseId();
+			if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) {
+				throw new ForbiddenException();
+			}
+		}
+
+		return session;
+	}
+
 	@Override
 	@Authenticated
 	public final Session joinSession(final String keyword) {
+		/* HTTP polling solution (legacy) */
+
 		userService.addCurrentUserToSessionMap(keyword);
 		socketIoServer.reportActiveUserCountForSession(keyword);
 
@@ -144,6 +172,8 @@ public class SessionService implements ISessionService {
 	@Override
 	@Authenticated
 	public final LoggedIn registerAsOnlineUser(final User user, final String sessionkey) {
+		/* HTTP polling solution (legacy) */
+		
 		Session session = this.joinSession(sessionkey);
 		if (session == null) {
 			return null;
diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
index 9ce63e7f..d62a882e 100644
--- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
+++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
@@ -103,7 +103,7 @@ public class ARSnovaSocketIOServer {
 		server.addEventListener("setSession", Session.class, new DataListener<Session>() {
 			@Override
 			public void onData(SocketIOClient client, Session session, AckRequest ackSender) {
-				userService.addUserToSessionBySocketId(client.getSessionId(), session.getKeyword());
+				sessionService.joinSession(session.getKeyword(), client.getSessionId());
 				reportActiveUserCountForSession(session.getKeyword());
 				reportSessionDataToClient(session.getKeyword(), client);
 			}
@@ -225,11 +225,9 @@ public class ARSnovaSocketIOServer {
 	 * @param client
 	 */
 	public void reportSessionDataToClient(String sessionKey, SocketIOClient client) {
+		broadcastInSession(sessionKey, "updateActiveUserCount", sessionService.countActiveUsers(sessionKey));
 		de.thm.arsnova.entities.Feedback fb = feedbackService.getFeedback(sessionKey);
 		client.sendEvent("updateFeedback", fb.getValues());
-
-		/* updateActiveUserCount does not need to be send since it is broadcasted
-		 * after the client joined the session */
 	}
 
 	public void reportUpdatedFeedbackForSession(String sessionKey) {
-- 
GitLab