From c37a8d17dfa526b2382ef85a8b1cabc015eccb60 Mon Sep 17 00:00:00 2001
From: Julian Hochstetter <julian.hochstetter@mni.thm.de>
Date: Mon, 29 Oct 2012 13:54:22 +0100
Subject: [PATCH] Task #4041: countAnswers

---
 .../controller/QuestionController.java        | 27 ++++++++++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 35 ++++++++++++++++++-
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  2 ++
 .../java/de/thm/arsnova/entities/Answer.java  | 33 ++++++++++-------
 .../arsnova/services/IQuestionService.java    |  2 ++
 .../thm/arsnova/services/QuestionService.java |  6 ++++
 6 files changed, 92 insertions(+), 13 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java
index 73f86a4e..224186db 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java
@@ -152,4 +152,31 @@ public class QuestionController extends AbstractController {
 		}
 		return answer;
 	}
+	
+	/**
+	 * returns a list of {@link Answer}s encoded as a JSON document for a given
+	 * question id. In this case only {@link Answer} <tt>questionId</tt>,
+	 * <tt>answerText</tt>, <tt>answerSubject</tt> and <tt>answerCount</tt>
+	 * properties are set
+	 * 
+	 * @param sessionKey
+	 *            Session Keyword to which the question belongs to
+	 * @param questionId
+	 *            CouchDB Question ID for which the given answers should be
+	 *            retrieved
+	 * @return List<{@link Answer}> or {@link NotFoundException}
+	 * @throws NotFoundException
+	 *             if wrong session, wrong question or no answers was given
+	 * @throws ForbiddenException
+	 *             if not logged in
+	 */
+	@RequestMapping(value="/session/{sessionKey}/question/{questionId}/answers", method=RequestMethod.GET)
+	@ResponseBody
+	public List<Answer> getAnswers(@PathVariable String sessionKey, @PathVariable String questionId, HttpServletResponse response) {
+		List<Answer> answers = questionService.getAnswers(sessionKey, questionId);
+		if(answers == null || answers.isEmpty()) {
+			throw new NotFoundException();
+		}
+		return answers;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 2d8068b9..a39e2815 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -717,7 +717,40 @@ public class CouchDBDao implements IDatabaseDao {
 			return (Answer) JSONObject.toBean(results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
 					Answer.class);
 		} catch (UnsupportedEncodingException e) {
-			logger.error("Error while retrieving unansweredquestions", e);
+			logger.error("Error while retrieving answer for user {} and question {}, {}", new Object[]{user, questionId, e});
+		}
+		
+		return null;
+	}
+	
+	@Override
+	public List<Answer> getAnswers(String sessionKey, String questionId) {
+		Session s = this.getSessionFromKeyword(sessionKey);
+		if(s == null) {
+			throw new NotFoundException();
+		}
+		
+		try {
+			View view = new View("skill_question/count_answers");
+			view.setStartKey("[" + URLEncoder.encode("\"" + questionId + "\"", "UTF-8") + "]");
+			view.setEndKey("[" + URLEncoder.encode("\"" + questionId + "\",{}", "UTF-8") + "]");
+			view.setGroup(true);
+			ViewResults results = this.getDatabase().view(view);
+			if(results.getResults().isEmpty()) {
+				throw new NotFoundException();
+			}
+			List<Answer> answers = new ArrayList<Answer>();
+			for(Document d : results.getResults()) {
+				Answer a = new Answer();
+				a.setAnswerCount(d.getInt("value"));
+				a.setQuestionId(d.getJSONObject().getJSONArray("key").getString(0));
+				a.setAnswerText(d.getJSONObject().getJSONArray("key").getString(1));
+				a.setAnswerSubject(d.getJSONObject().getJSONArray("key").getString(2));
+				answers.add(a);
+			}
+			return answers;
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Error while retrieving answers", e);
 		}
 		
 		return null;
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index e68b0832..77b65e9e 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -67,4 +67,6 @@ public interface IDatabaseDao {
 
 	public Answer getMyAnswer(String sessionKey, String questionId);
 
+	public List<Answer> getAnswers(String sessionKey, String questionId);
+
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java
index 1ef1553f..6b81e231 100644
--- a/src/main/java/de/thm/arsnova/entities/Answer.java
+++ b/src/main/java/de/thm/arsnova/entities/Answer.java
@@ -1,17 +1,6 @@
 package de.thm.arsnova.entities;
 
-import java.util.ArrayList;
-import java.util.List;
-
-/*
-"type":"skill_question_answer",
-"sessionId":"61d33ea2ec73acefbba898c3510325c9",
-"questionId":"61d33ea2ec73acefbba898c351040280",
-"answerText":"2500 $",
-"user":"jhtr80"
-}}
-
-*/
+
 public class Answer {
 	
 	private String _id;
@@ -20,7 +9,9 @@ public class Answer {
 	private String sessionId;
 	private String questionId;
 	private String answerText;
+	private String answerSubject;
 	private String user;
+	private int answerCount;
 
 	public Answer() {
 		this.type = "skill_question_answer";
@@ -74,6 +65,14 @@ public class Answer {
 		this.answerText = answerText;
 	}
 
+	public String getAnswerSubject() {
+		return answerSubject;
+	}
+
+	public void setAnswerSubject(String answerSubject) {
+		this.answerSubject = answerSubject;
+	}
+
 	public String getUser() {
 		return user;
 	}
@@ -82,11 +81,21 @@ public class Answer {
 		this.user = user;
 	}
 
+	public int getAnswerCount() {
+		return answerCount;
+	}
+
+	public void setAnswerCount(int answerCount) {
+		this.answerCount = answerCount;
+	}
+
 	@Override
 	public String toString() {
 		return "Answer type:'" + type + "'" +
 				", session: " + sessionId + 
 				", question: " + questionId +
+				", subject: " + answerSubject +
+				", answerCount: " + answerCount +
 				", answer: " + answerText + 
 				", user: " + user;
 	}
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index 72cc41f6..bcfec128 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -40,4 +40,6 @@ public interface IQuestionService {
 	public List<String> getUnAnsweredQuestions(String sessionKey);
 
 	public Answer getMyAnswer(String sessionKey, String questionId);
+
+	public List<Answer> getAnswers(String sessionKey, String questionId);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index be738f10..0ef9ce28 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -100,4 +100,10 @@ public class QuestionService implements IQuestionService {
 	public Answer getMyAnswer(String sessionKey, String questionId) {
 		return databaseDao.getMyAnswer(sessionKey, questionId);
 	}
+
+	@Override
+	@Authenticated
+	public List<Answer> getAnswers(String sessionKey, String questionId) {
+		return databaseDao.getAnswers(sessionKey, questionId);
+	}
 }
-- 
GitLab