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