From 1a565bbce46c8b6d819492dd04b50f5b34207659 Mon Sep 17 00:00:00 2001
From: agrt56 <andreas.gaertner@mni.thm.de>
Date: Fri, 23 Jan 2015 21:55:05 +0100
Subject: [PATCH] Added abstention count retrieval (by question) and added
 abstention count to NewAnswerEvent websocket broadcast. Task #14471

---
 .../LecturerQuestionController.java           | 11 +++++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   |  4 +++-
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  2 ++
 .../arsnova/services/IQuestionService.java    |  4 +++-
 .../thm/arsnova/services/QuestionService.java | 23 ++++++++++++++++---
 .../arsnova/socket/ARSnovaSocketIOServer.java |  2 +-
 6 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
index f1b1c5be..3e4f7b3d 100644
--- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
@@ -18,6 +18,7 @@
 package de.thm.arsnova.controller;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import javax.servlet.http.HttpServletResponse;
@@ -377,6 +378,16 @@ public class LecturerQuestionController extends AbstractController {
 		return questionService.getAnswerCount(questionId);
 	}
 
+	@RequestMapping(value = "/{questionId}/answerandabstentioncount", method = RequestMethod.GET)
+	public final List<Integer> getAnswerAndAbstentionCount(@PathVariable final String questionId) {
+		List<Integer> list = Arrays.asList(
+			questionService.getAnswerCount(questionId),
+			questionService.getAbstentionAnswerCount(questionId)
+		);
+		
+		return list;
+	}
+	
 	@RequestMapping(value = "/{questionId}/freetextanswer/", method = RequestMethod.GET)
 	public final List<Answer> getFreetextAnswers(@PathVariable final String questionId) {
 		return questionService.getFreetextAnswers(questionId);
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index d3666f3d..01482c04 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -735,7 +735,8 @@ public class CouchDBDao implements IDatabaseDao {
 		return answers;
 	}
 
-	private int getAbstentionAnswerCount(final String questionId) {
+	@Override
+	public int getAbstentionAnswerCount(final String questionId) {
 		final NovaView view = new NovaView("skill_question/count_abstention_answers_by_question");
 		view.setKey(questionId);
 		view.setGroup(true);
@@ -756,6 +757,7 @@ public class CouchDBDao implements IDatabaseDao {
 		if (results.getResults().size() == 0) {
 			return 0;
 		}
+		
 		return results.getJSONArray("rows").optJSONObject(0).optInt("value");
 	}
 
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index e0814aba..5849001b 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -71,6 +71,8 @@ public interface IDatabaseDao {
 	List<Answer> getAnswers(String questionId, int piRound);
 
 	int getAnswerCount(Question question, int piRound);
+	
+	int getAbstentionAnswerCount(String questionId);
 
 	List<Answer> getFreetextAnswers(String questionId);
 
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index a0e05fa6..a79438cc 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -91,7 +91,7 @@ public interface IQuestionService {
 
 	int getPreparationQuestionCount(String sessionkey);
 	
-	SimpleEntry<String,Integer> getAnswerCountByQuestion(String questionid);
+	SimpleEntry<String, List<Integer>> getAnswerAndAbstentionCountByQuestion(String questionid);
 
 	int countLectureQuestionAnswers(String sessionkey);
 
@@ -126,4 +126,6 @@ public interface IQuestionService {
 	void deleteAllPreparationAnswers(String sessionkey);
 
 	void deleteAllLectureAnswers(String sessionkey);
+
+	int getAbstentionAnswerCount(String questionId);
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index 8aa9991c..1f689b9c 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -19,6 +19,7 @@ package de.thm.arsnova.services;
 
 import java.util.AbstractMap;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -269,8 +270,20 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 		if (question == null) {
 			return 0;
 		}
+		
 		return databaseDao.getAnswerCount(question, question.getPiRound());
 	}
+	
+	@Override
+	@PreAuthorize("isAuthenticated()")
+	public int getAbstentionAnswerCount(final String questionId) {
+		final Question question = getQuestion(questionId);
+		if (question == null) {
+			return 0;
+		}
+		
+		return databaseDao.getAbstentionAnswerCount(questionId);
+	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
@@ -503,9 +516,13 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 	
 	@Override
 	@PreAuthorize("isAuthenticated()")
-	public SimpleEntry<String,Integer> getAnswerCountByQuestion(final String questionid) {
-		final int questioncount = getAnswerCount(questionid);
-		return new AbstractMap.SimpleEntry<String, Integer>(questionid, questioncount);
+	public SimpleEntry<String,List<Integer>> getAnswerAndAbstentionCountByQuestion(final String questionid) {
+		final List<Integer> countList = Arrays.asList(
+			getAnswerCount(questionid),
+			getAbstentionAnswerCount(questionid)
+		);
+		
+		return new AbstractMap.SimpleEntry<String, List<Integer>>(questionid, countList);
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
index f8a8dcc2..c925e80d 100644
--- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
+++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java
@@ -420,7 +420,7 @@ public class ARSnovaSocketIOServer implements ApplicationListener<NovaEvent>, No
 	public void visit(NewAnswerEvent event) {
 		final String sessionKey = event.getSession().getKeyword();
 		this.reportAnswersToLecturerQuestionAvailable(event.getSession(), new Question(event.getQuestion()));
-		broadcastInSession(sessionKey, "countQuestionAnswersByQuestion", questionService.getAnswerCountByQuestion(event.getQuestion().get_id()));
+		broadcastInSession(sessionKey, "countQuestionAnswersByQuestion", questionService.getAnswerAndAbstentionCountByQuestion(event.getQuestion().get_id()));
 		broadcastInSession(sessionKey, "countLectureQuestionAnswers", questionService.countLectureQuestionAnswersInternal(sessionKey));
 		broadcastInSession(sessionKey, "countPreparationQuestionAnswers", questionService.countPreparationQuestionAnswersInternal(sessionKey));
 		sendToUser(event.getUser(), "unansweredLecturerQuestions", questionService.getUnAnsweredLectureQuestionIds(sessionKey, event.getUser()));
-- 
GitLab