From a9d3fd94c5a2929bf7fdf469c0ee9457ede94a45 Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Mon, 23 Mar 2015 13:47:17 +0100
Subject: [PATCH] Store enabled features in session document

---
 .../arsnova/controller/SessionController.java | 18 +++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   |  2 +
 .../java/de/thm/arsnova/entities/Session.java | 10 +++
 .../thm/arsnova/entities/SessionFeature.java  | 81 +++++++++++++++++++
 .../thm/arsnova/services/ISessionService.java |  5 ++
 .../thm/arsnova/services/SessionService.java  | 19 ++++-
 6 files changed, 134 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/SessionFeature.java

diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 893bd56b7..c1e5b78fd 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -38,6 +38,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import de.thm.arsnova.connector.model.Course;
 import de.thm.arsnova.entities.Session;
+import de.thm.arsnova.entities.SessionFeature;
 import de.thm.arsnova.entities.SessionInfo;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import de.thm.arsnova.entities.transport.LearningProgressValues;
@@ -248,6 +249,23 @@ public class SessionController extends AbstractController {
 		return sessionService.getMyLearningProgress(sessionkey, progressType);
 	}
 
+	@RequestMapping(value = "/{sessionkey}/features", method = RequestMethod.GET)
+	public SessionFeature sessionFeatures(
+			@PathVariable final String sessionkey,
+			final HttpServletResponse response
+			) {
+		return sessionService.getSessionFeatures(sessionkey);
+	}
+
+	@RequestMapping(value = "/{sessionkey}/features", method = RequestMethod.PATCH)
+	public SessionFeature changeSessionFeatures(
+			@PathVariable final String sessionkey,
+			@RequestBody final SessionFeature features,
+			final HttpServletResponse response
+			) {
+		return sessionService.changeSessionFeatures(sessionkey, features);
+	}
+
 	/* internal redirections */
 
 	@RequestMapping(value = "/{sessionKey}/lecturerquestion")
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index e8be244c4..df2febfa3 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -447,6 +447,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		sessionDocument.put("ppFaculty", session.getPpFaculty());
 		sessionDocument.put("ppLevel", session.getPpLevel());
 		sessionDocument.put("sessionType", session.getSessionType());
+		sessionDocument.put("features", JSONObject.fromObject(session.getFeatures()));
 		try {
 			database.saveDocument(sessionDocument);
 		} catch (final IOException e) {
@@ -1380,6 +1381,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			s.put("shortName", session.getShortName());
 			s.put("active", session.isActive());
 			s.put("learningProgressType", session.getLearningProgressType());
+			s.put("features", JSONObject.fromObject(session.getFeatures()));
 			database.saveDocument(s);
 			session.set_rev(s.getRev());
 
diff --git a/src/main/java/de/thm/arsnova/entities/Session.java b/src/main/java/de/thm/arsnova/entities/Session.java
index 6a4f17f91..80311ff8a 100644
--- a/src/main/java/de/thm/arsnova/entities/Session.java
+++ b/src/main/java/de/thm/arsnova/entities/Session.java
@@ -38,6 +38,7 @@ public class Session implements Serializable {
 	private List<String> _conflicts;
 	private long creationTime;
 	private String learningProgressType = "questions";
+	private SessionFeature features;
 
 	private String ppAuthorName;
 	private String ppAuthorMail;
@@ -71,6 +72,7 @@ public class Session implements Serializable {
 		copy.courseId = original.courseId;
 		copy.creationTime = original.creationTime;
 		copy.learningProgressType = original.learningProgressType;
+		copy.features = new SessionFeature(original.features);
 		// public pool
 		copy.ppAuthorName = original.ppAuthorName;
 		copy.ppAuthorMail = original.ppAuthorMail;
@@ -209,6 +211,14 @@ public class Session implements Serializable {
 		this.learningProgressType = learningProgressType;
 	}
 
+	public SessionFeature getFeatures() {
+		return features;
+	}
+
+	public void setFeatures(SessionFeature features) {
+		this.features = features;
+	}
+
 	public String getPpAuthorName() {
 		return ppAuthorName;
 	}
diff --git a/src/main/java/de/thm/arsnova/entities/SessionFeature.java b/src/main/java/de/thm/arsnova/entities/SessionFeature.java
new file mode 100644
index 000000000..8cbaff516
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/SessionFeature.java
@@ -0,0 +1,81 @@
+/*
+ * This file is part of ARSnova Backend.
+ * Copyright (C) 2012-2015 The ARSnova Team
+ *
+ * ARSnova Backend is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ARSnova Backend is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.thm.arsnova.entities;
+
+public class SessionFeature {
+
+	private boolean jitt;
+	private boolean feedback;
+	private boolean interposed;
+	private boolean pi;
+	private boolean learningProgress;
+
+	public SessionFeature(SessionFeature features) {
+		this();
+		if (features != null) {
+			this.jitt = features.jitt;
+			this.feedback = features.feedback;
+			this.interposed = features.interposed;
+			this.pi = features.pi;
+			this.learningProgress = features.learningProgress;
+		}
+	}
+
+	public SessionFeature() {}
+
+	public boolean isJitt() {
+		return jitt;
+	}
+
+	public void setJitt(boolean jitt) {
+		this.jitt = jitt;
+	}
+
+	public boolean isFeedback() {
+		return feedback;
+	}
+
+	public void setFeedback(boolean feedback) {
+		this.feedback = feedback;
+	}
+
+	public boolean isInterposed() {
+		return interposed;
+	}
+
+	public void setInterposed(boolean interposed) {
+		this.interposed = interposed;
+	}
+
+	public boolean isPi() {
+		return pi;
+	}
+
+	public void setPi(boolean pi) {
+		this.pi = pi;
+	}
+
+	public boolean isLearningProgress() {
+		return learningProgress;
+	}
+
+	public void setLearningProgress(boolean learningProgress) {
+		this.learningProgress = learningProgress;
+	}
+
+}
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index 1661b0e11..64c3a8663 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 
 import de.thm.arsnova.connector.model.Course;
 import de.thm.arsnova.entities.Session;
+import de.thm.arsnova.entities.SessionFeature;
 import de.thm.arsnova.entities.SessionInfo;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.transport.ImportExportSession;
@@ -69,4 +70,8 @@ public interface ISessionService {
 	List<SessionInfo> getMyVisitedSessionsInfo();
 
 	SessionInfo importSession(ImportExportSession session);
+
+	SessionFeature getSessionFeatures(String sessionkey);
+
+	SessionFeature changeSessionFeatures(String sessionkey, SessionFeature features);
 }
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 2f8211bd5..2926e8cf2 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.services;
 
 import java.io.Serializable;
-import java.util.AbstractMap.SimpleEntry;
 import java.util.Comparator;
 import java.util.List;
 import java.util.UUID;
@@ -39,6 +38,7 @@ import de.thm.arsnova.dao.IDatabaseDao;
 import de.thm.arsnova.domain.ILearningProgressFactory;
 import de.thm.arsnova.domain.LearningProgress;
 import de.thm.arsnova.entities.Session;
+import de.thm.arsnova.entities.SessionFeature;
 import de.thm.arsnova.entities.SessionInfo;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.transport.ImportExportSession;
@@ -48,6 +48,7 @@ import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.exceptions.ForbiddenException;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.exceptions.RequestEntityTooLargeException;
+import de.thm.arsnova.exceptions.UnauthorizedException;
 
 @Service
 public class SessionService implements ISessionService, ApplicationEventPublisherAware {
@@ -341,4 +342,20 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 	public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
 		this.publisher = publisher;
 	}
+
+	@Override
+	public SessionFeature getSessionFeatures(String sessionkey) {
+		return databaseDao.getSessionFromKeyword(sessionkey).getFeatures();
+	}
+
+	@Override
+	public SessionFeature changeSessionFeatures(String sessionkey, SessionFeature features) {
+		final Session session = databaseDao.getSessionFromKeyword(sessionkey);
+		final User user = userService.getCurrentUser();
+		if (!session.isCreator(user)) {
+			throw new UnauthorizedException();
+		}
+		session.setFeatures(features);
+		return databaseDao.updateSession(session).getFeatures();
+	}
 }
-- 
GitLab