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