From 9040673efa26a740de1dd67292e7702e548a0264 Mon Sep 17 00:00:00 2001
From: Jan Kammer <jan.kammer@mni.thm.de>
Date: Wed, 28 Nov 2012 16:24:26 +0100
Subject: [PATCH] functionality for interposed questions

---
 .../controller/QuestionController.java        | 25 +++++-
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 33 ++++++--
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  6 +-
 .../arsnova/entities/InterposedQuestion.java  | 83 +++++++++++++++++++
 .../arsnova/services/IQuestionService.java    |  6 +-
 .../thm/arsnova/services/QuestionService.java | 11 ++-
 6 files changed, 154 insertions(+), 10 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/InterposedQuestion.java

diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java
index 64074fa7e..e96e332c3 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java
@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.IQuestionService;
@@ -261,11 +262,33 @@ public class QuestionController extends AbstractController {
 
 	@RequestMapping(value = "/session/{sessionKey}/interposed", method = RequestMethod.GET)
 	@ResponseBody
-	public final List<Question> getInterposedQuestions(
+	public final List<InterposedQuestion> getInterposedQuestions(
 			@PathVariable final String sessionKey,
 			final HttpServletResponse response
 	) {
 		return questionService.getInterposedQuestions(sessionKey);
 	}
+	
+	
+	@RequestMapping(value = "/session/{sessionkey}/interposed", method = RequestMethod.POST)
+	@ResponseBody
+	public final void postInterposedQuestion(
+			@PathVariable final String sessionkey,
+			@RequestBody final InterposedQuestion question,
+			final HttpServletResponse response
+	) {
+		if (!sessionkey.equals(question.getSession())) {
+			response.setStatus(HttpStatus.PRECONDITION_FAILED.value());
+			return;
+		}
+
+		if (questionService.saveQuestion(question)) {
+			response.setStatus(HttpStatus.CREATED.value());
+			return;
+		}
+
+		response.setStatus(HttpStatus.BAD_REQUEST.value());
+		return;
+	}
 
 }
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index a3f692b3d..5c2652aae 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -57,6 +57,7 @@ import com.fourspaces.couchdb.ViewResults;
 import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.FoodVote;
+import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.PossibleAnswer;
 import de.thm.arsnova.entities.Question;
@@ -541,11 +542,30 @@ public class CouchDBDao implements IDatabaseDao {
 		q.put("noCorrect", question.isNoCorrect());
 		try {
 			database.saveDocument(q);
+			return true;
 		} catch (IOException e) {
 			LOGGER.error("Could not save question {}", question);
 		}
 		return false;
 	}
+	
+	@Override
+	public final boolean saveQuestion(final Session session, final InterposedQuestion question) {
+		Document q = new Document();
+		q.put("type", "interposed_question");
+		q.put("sessionId", session.get_id());
+		q.put("subject", question.getSubject());
+		q.put("text", question.getText());
+		q.put("timestamp", System.currentTimeMillis());
+		q.put("read", false);
+		try {
+			database.saveDocument(q);
+			return true;
+		} catch (IOException e) {
+			LOGGER.error("Could not save interposed question {}", question);
+		}
+		return false;
+	}
 
 	@Override
 	public final Question getQuestion(final String id, final String sessionKey) {
@@ -1020,7 +1040,7 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 
 	@Override
-	public List<Question> getInterposedQuestions(String sessionKey) {
+	public List<InterposedQuestion> getInterposedQuestions(String sessionKey) {
 		Session s = this.getSessionFromKeyword(sessionKey);
 		if (s == null) {
 			throw new NotFoundException();
@@ -1033,14 +1053,15 @@ public class CouchDBDao implements IDatabaseDao {
 			if (questions == null || questions.isEmpty()) {
 				return null;
 			}
-			List<Question> result = new ArrayList<Question>();
+			List<InterposedQuestion> result = new ArrayList<InterposedQuestion>();
+			LOGGER.debug("{}", questions.getResults());
 			for (Document document : questions.getResults()) {
-				Question question = (Question) JSONObject.toBean(
+				InterposedQuestion question = (InterposedQuestion) JSONObject.toBean(
 						document.getJSONObject().getJSONObject("value"),
-						Question.class
+						InterposedQuestion.class
 				);
-				question.setQuestionType("interposed_question");
-				question.setSession(s.get_id());
+				question.setSession(sessionKey);
+				question.set_id(document.getId());
 				result.add(question);
 			}
 			return result;
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 0f53ed9e7..374fe7170 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -24,6 +24,7 @@ import java.util.List;
 import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.FoodVote;
+import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.Session;
@@ -47,6 +48,8 @@ public interface IDatabaseDao {
 	boolean sessionKeyAvailable(String keyword);
 
 	boolean saveQuestion(Session session, Question question);
+	
+	boolean saveQuestion(Session session, InterposedQuestion question);
 
 	Question getQuestion(String id, String sessionKey);
 
@@ -84,7 +87,7 @@ public interface IDatabaseDao {
 
 	int getInterposedCount(String sessionKey);
 
-	List<Question> getInterposedQuestions(String sessionKey);
+	List<InterposedQuestion> getInterposedQuestions(String sessionKey);
 
 	void vote(String menu);
 
@@ -101,4 +104,5 @@ public interface IDatabaseDao {
 	int countAnswers();
 
 	int countQuestions();
+
 }
diff --git a/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java
new file mode 100644
index 000000000..477cf799b
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2012 THM webMedia
+ * 
+ * This file is part of ARSnova.
+ *
+ * ARSnova 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 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 InterposedQuestion {
+	
+	private String _id;
+	private String _rev;
+	private String type;
+	private String subject;
+	private String text;
+	private String session;
+	private long timestamp;
+	private boolean read;
+
+	public String get_id() {
+		return _id;
+	}
+	public void set_id(String _id) {
+		this._id = _id;
+	}
+	public String get_rev() {
+		return _rev;
+	}
+	public void set_rev(String _rev) {
+		this._rev = _rev;
+	}
+	public boolean isRead() {
+		return read;
+	}
+	public void setRead(boolean read) {
+		this.read = read;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getSubject() {
+		return subject;
+	}
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	public String getSession() {
+		return session;
+	}
+	public void setSession(String session) {
+		this.session = session;
+	}
+	public long getTimestamp() {
+		return timestamp;
+	}
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+}
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index 1ca5ccdcb..7b9ce1fb3 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -22,10 +22,13 @@ package de.thm.arsnova.services;
 import java.util.List;
 
 import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.Question;
 
 public interface IQuestionService {
 	boolean saveQuestion(Question question);
+	
+	boolean saveQuestion(InterposedQuestion question);
 
 	Question getQuestion(String id, String sessionkey);
 
@@ -53,5 +56,6 @@ public interface IQuestionService {
 
 	int getInterposedCount(String sessionKey);
 
-	List<Question> getInterposedQuestions(String sessionKey);
+	List<InterposedQuestion> getInterposedQuestions(String sessionKey);
+
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index a4fb8275b..879180c78 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
 import de.thm.arsnova.annotation.Authenticated;
 import de.thm.arsnova.dao.IDatabaseDao;
 import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.exceptions.NoContentException;
@@ -64,6 +65,14 @@ public class QuestionService implements IQuestionService {
 		return this.databaseDao.saveQuestion(session, question);
 	}
 
+	@Override
+	@Authenticated
+	public boolean saveQuestion(InterposedQuestion question) {
+		Session session = this.databaseDao.getSessionFromKeyword(question.getSession());
+		return this.databaseDao.saveQuestion(session, question);
+	}
+
+	
 	@Override
 	@Authenticated
 	public Question getQuestion(String id, String sessionKey) {
@@ -133,7 +142,7 @@ public class QuestionService implements IQuestionService {
 	
 	@Override
 	@Authenticated
-	public List<Question> getInterposedQuestions(String sessionKey) {
+	public List<InterposedQuestion> getInterposedQuestions(String sessionKey) {
 		return databaseDao.getInterposedQuestions(sessionKey);
 	}
 }
-- 
GitLab