From 6079d7c8273008d6037ee4d1139c84802d8adfe7 Mon Sep 17 00:00:00 2001
From: Julian Hochstetter <julian.hochstetter@mni.thm.de>
Date: Mon, 29 Oct 2012 12:45:44 +0100
Subject: [PATCH] Task #4040: getUserAnswer

---
 .../controller/QuestionController.java        | 12 ++-
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 32 ++++++-
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  3 +
 .../java/de/thm/arsnova/entities/Answer.java  | 94 +++++++++++++++++++
 .../arsnova/services/IQuestionService.java    |  3 +
 .../thm/arsnova/services/QuestionService.java |  7 ++
 .../de/thm/arsnova/dao/StubDatabaseDao.java   |  7 ++
 7 files changed, 155 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/Answer.java

diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java
index a2ba46452..73049c416 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java
@@ -31,9 +31,9 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.IQuestionService;
@@ -128,4 +128,14 @@ public class QuestionController extends AbstractController {
 		logger.info(answers.toString());
 		return answers;
 	}
+	
+	@RequestMapping(value="/session/{sessionKey}/question/{questionId}/myanswer", method=RequestMethod.GET)
+	@ResponseBody
+	public Answer getMyAnswer(@PathVariable String sessionKey, @PathVariable String questionId, HttpServletResponse response) {
+		Answer answer = questionService.getMyAnswer(sessionKey, questionId);
+		if(answer == null) {
+			throw new NotFoundException();
+		}
+		return answer;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 5bbcc0979..9215e163b 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -52,6 +52,7 @@ import com.fourspaces.couchdb.Document;
 import com.fourspaces.couchdb.View;
 import com.fourspaces.couchdb.ViewResults;
 
+import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.PossibleAnswer;
@@ -688,11 +689,38 @@ public class CouchDBDao implements IDatabaseDao {
 			}
 			return unanswered;
 		} catch (UnsupportedEncodingException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			logger.error("Error while retrieving unansweredquestions", e);
 		}
 		
 		
+		return null;
+	}
+
+	@Override
+	public Answer getMyAnswer(String sessionKey, String questionId) {		
+		User user = userService.getCurrentUser();
+		if(user == null) {
+			throw new UnauthorizedException();
+		}
+		
+		Session s = this.getSessionFromKeyword(sessionKey);
+		if(s == null) {
+			throw new NotFoundException();
+		}
+		
+		try {
+			View view = new View("answer/by_question_and_user");
+			view.setKey("[" + URLEncoder.encode("\"" + questionId + "\",\"" + user.getUsername() + "\"", "UTF-8") + "]");
+			ViewResults results = this.getDatabase().view(view);
+			if(results.getResults().isEmpty()) {
+				throw new NotFoundException();
+			}
+			return (Answer) JSONObject.toBean(results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Answer.class);
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Error while retrieving unansweredquestions", 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 db570db75..e68b08329 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -21,6 +21,7 @@ package de.thm.arsnova.dao;
 
 import java.util.List;
 
+import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.LoggedIn;
@@ -64,4 +65,6 @@ public interface IDatabaseDao {
 
 	public List<String> getUnAnsweredQuestions(String sessionKey);
 
+	public Answer getMyAnswer(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
new file mode 100644
index 000000000..1ef1553f0
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/Answer.java
@@ -0,0 +1,94 @@
+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;
+	private String _rev;
+	private String type;
+	private String sessionId;
+	private String questionId;
+	private String answerText;
+	private String user;
+
+	public Answer() {
+		this.type = "skill_question_answer";
+	}
+	
+	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 String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getSessionId() {
+		return sessionId;
+	}
+
+	public void setSessionId(String sessionId) {
+		this.sessionId = sessionId;
+	}
+
+	public String getQuestionId() {
+		return questionId;
+	}
+
+	public void setQuestionId(String questionId) {
+		this.questionId = questionId;
+	}
+
+	public String getAnswerText() {
+		return answerText;
+	}
+
+	public void setAnswerText(String answerText) {
+		this.answerText = answerText;
+	}
+
+	public String getUser() {
+		return user;
+	}
+
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+	@Override
+	public String toString() {
+		return "Answer type:'" + type + "'" +
+				", session: " + sessionId + 
+				", question: " + questionId +
+				", 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 931db1309..72cc41f60 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -21,6 +21,7 @@ package de.thm.arsnova.services;
 
 import java.util.List;
 
+import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Question;
 
 public interface IQuestionService {
@@ -37,4 +38,6 @@ public interface IQuestionService {
 	public void deleteQuestion(String sessionKey, String questionId);
 
 	public List<String> getUnAnsweredQuestions(String sessionKey);
+
+	public Answer getMyAnswer(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 097b37dc6..be738f107 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -26,6 +26,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.Question;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.exceptions.NoContentException;
@@ -93,4 +94,10 @@ public class QuestionService implements IQuestionService {
 	public List<String> getUnAnsweredQuestions(String sessionKey) {
 		return databaseDao.getUnAnsweredQuestions(sessionKey);
 	}
+
+	@Override
+	@Authenticated
+	public Answer getMyAnswer(String sessionKey, String questionId) {
+		return databaseDao.getMyAnswer(sessionKey, questionId);
+	}
 }
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index 9bbcbed03..d78b5574b 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -8,6 +8,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Question;
@@ -199,4 +200,10 @@ public class StubDatabaseDao implements IDatabaseDao {
 		return null;
 	}
 
+	@Override
+	public Answer getMyAnswer(String sessionKey, String questionId) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }
-- 
GitLab