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