From f8f388c0a80862573b8e70aec8ec375971fbe1ec Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Wed, 11 Feb 2015 17:24:37 +0100 Subject: [PATCH] Implement web socket support for learning progress --- .../java/de/thm/arsnova/entities/Session.java | 2 ++ .../thm/arsnova/services/ISessionService.java | 5 +++++ .../thm/arsnova/services/SessionService.java | 21 +++++++++++++++++++ .../arsnova/socket/ARSnovaSocketIOServer.java | 7 +++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/thm/arsnova/entities/Session.java b/src/main/java/de/thm/arsnova/entities/Session.java index f93ddbba..467bf26b 100644 --- a/src/main/java/de/thm/arsnova/entities/Session.java +++ b/src/main/java/de/thm/arsnova/entities/Session.java @@ -69,6 +69,8 @@ public class Session implements Serializable { copy.lastOwnerActivity = original.lastOwnerActivity; copy.courseType = original.courseType; copy.courseId = original.courseId; + copy.creationTime = original.creationTime; + copy.learningProgressType = original.learningProgressType; copy._id = original._id; copy._rev = original._rev; return copy; diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index 60c7479e..9104ddfb 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -24,11 +24,14 @@ import java.util.UUID; import de.thm.arsnova.connector.model.Course; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.SessionInfo; +import de.thm.arsnova.entities.User; import de.thm.arsnova.entities.transport.ImportExportSession; public interface ISessionService { Session getSession(String keyword); + Session getSessionInternal(String keyword, User user); + Session saveSession(Session session); boolean sessionKeyAvailable(String keyword); @@ -49,6 +52,8 @@ public interface ISessionService { Session updateSession(String sessionkey, Session session); + Session updateSessionInternal(Session session, User user); + void deleteSession(String sessionkey); int getLearningProgress(String sessionkey, String progressType); diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index 533433e0..9d490dad 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -143,6 +143,15 @@ public class SessionService implements ISessionService { @PreAuthorize("isAuthenticated()") public final Session getSession(final String keyword) { final User user = userService.getCurrentUser(); + return this.getSessionInternal(keyword, user); + } + + /* + * The "internal" suffix means it is called by internal services that have no authentication! + * TODO: Find a better way of doing this... + */ + @Override + public final Session getSessionInternal(final String keyword, final User user) { final Session session = databaseDao.getSessionFromKeyword(keyword); if (session == null) { throw new NotFoundException(); @@ -279,6 +288,18 @@ public class SessionService implements ISessionService { return databaseDao.updateSession(session); } + /* + * The "internal" suffix means it is called by internal services that have no authentication! + * TODO: Find a better way of doing this... + */ + @Override + public Session updateSessionInternal(final Session session, final User user) { + if (session.isCreator(user)) { + return databaseDao.updateSession(session); + } + return null; + } + @Override @PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')") public void deleteSession(final String sessionkey) { diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index 94fa0787..8cf4e745 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -196,10 +196,11 @@ public class ARSnovaSocketIOServer implements ApplicationListener<NovaEvent>, No @Override public void onData(SocketIOClient client, LearningProgressType progressType, AckRequest ack) { final User user = userService.getUser2SocketId(client.getSessionId()); - final de.thm.arsnova.entities.Session session = sessionService.getSession(progressType.getSessionKeyword()); + final de.thm.arsnova.entities.Session session = sessionService.getSessionInternal(progressType.getSessionKeyword(), user); if (session.isCreator(user)) { session.setLearningProgressType(progressType.getLearningProgressType()); - sessionService.updateSession(progressType.getSessionKeyword(), session); + sessionService.updateSessionInternal(session, user); + broadcastInSession(session.getKeyword(), "learningProgressType", progressType.getLearningProgressType()); } } }); @@ -332,11 +333,13 @@ public class ARSnovaSocketIOServer implements ApplicationListener<NovaEvent>, No * @param client */ public void reportSessionDataToClient(final String sessionKey, final User user, final SocketIOClient client) { + final de.thm.arsnova.entities.Session session = sessionService.getSessionInternal(sessionKey, user); client.sendEvent("unansweredLecturerQuestions", questionService.getUnAnsweredLectureQuestionIds(sessionKey, user)); client.sendEvent("unansweredPreparationQuestions", questionService.getUnAnsweredPreparationQuestionIds(sessionKey, user)); client.sendEvent("countLectureQuestionAnswers", questionService.countLectureQuestionAnswersInternal(sessionKey)); client.sendEvent("countPreparationQuestionAnswers", questionService.countPreparationQuestionAnswersInternal(sessionKey)); client.sendEvent("activeUserCountData", sessionService.activeUsers(sessionKey)); + client.sendEvent("learningProgressType", session.getLearningProgressType()); final de.thm.arsnova.entities.Feedback fb = feedbackService.getFeedback(sessionKey); client.sendEvent("feedbackData", fb.getValues()); try { -- GitLab