From b4d78532fe64a87fe38a73475d32794edfee029b Mon Sep 17 00:00:00 2001
From: Julian Hochstetter <julian.hochstetter@mni.thm.de>
Date: Tue, 16 Oct 2012 12:43:46 +0200
Subject: [PATCH] Task #4028: /getSkillQuestions/{session} returns a list of
 questions

---
 .../de/thm/arsnova/SessionController.java     | 15 +++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 40 +++++++++++++++++++
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  1 +
 .../thm/arsnova/services/ISessionService.java |  2 +-
 .../thm/arsnova/services/SessionService.java  |  5 +++
 .../thm/arsnova/socket/message/Question.java  | 30 +++++++++++++-
 6 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/SessionController.java b/src/main/java/de/thm/arsnova/SessionController.java
index e283957c7..f92414b73 100644
--- a/src/main/java/de/thm/arsnova/SessionController.java
+++ b/src/main/java/de/thm/arsnova/SessionController.java
@@ -42,6 +42,7 @@ import de.thm.arsnova.entities.User;
 import de.thm.arsnova.services.ISessionService;
 import de.thm.arsnova.services.IUserService;
 import de.thm.arsnova.socket.ARSnovaSocketIOServer;
+import de.thm.arsnova.socket.message.Question;
 
 @Controller
 public class SessionController {
@@ -108,6 +109,20 @@ public class SessionController {
 		return sessions;
 	}
 	
+	@RequestMapping(value="/getSkillQuestions/{sessionkey}", method=RequestMethod.GET)
+	@ResponseBody
+	public List<Question> getSkillQuestions(@PathVariable String sessionkey, HttpServletResponse response) {
+		List<Question> questions = sessionService.getSkillQuestions(sessionkey);
+		if(questions == null || questions.isEmpty()) {
+			response.setStatus(HttpStatus.NOT_FOUND.value());
+			return null;
+		}
+		logger.info(questions.toString());
+		return questions;
+	}
+	
+	
+	
 	@RequestMapping(value="/socketurl", method=RequestMethod.GET)
 	@ResponseBody
 	public String getSocketUrl() {
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index d90ee94aa..0436f11b2 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -30,9 +30,16 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import net.sf.ezmorph.Morpher;
+import net.sf.ezmorph.MorpherRegistry;
+import net.sf.ezmorph.bean.BeanMorpher;
+import net.sf.ezmorph.bean.MorphDynaBean;
 import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
+import net.sf.json.util.JSONUtils;
 
+import org.apache.commons.beanutils.DynaBean;
+import org.apache.commons.beanutils.DynaClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,6 +60,7 @@ import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.services.ISessionService;
 import de.thm.arsnova.services.IUserService;
+import de.thm.arsnova.socket.message.PossibleAnswer;
 import de.thm.arsnova.socket.message.Question;
 
 @Component
@@ -177,6 +185,38 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 	}
 	
+	@Override
+	public List<Question> getSkillQuestions(String session) {		
+		try {
+			View view = new View("skill_question/by_session");
+			view.setStartKey("[" + URLEncoder.encode("\"" + session + "\"", "UTF-8") + "]");
+			view.setEndKey("[" + URLEncoder.encode("\"" + session + "\",{}", "UTF-8") + "]");
+
+			ViewResults questions = this.getDatabase().view(view);
+	
+			List<Question> result = new ArrayList<Question>();
+			logger.info(questions.toString());
+			MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry();
+			Morpher dynaMorpher = new BeanMorpher(PossibleAnswer.class, morpherRegistry); 
+			morpherRegistry.registerMorpher(dynaMorpher);
+			for (Document d : questions.getResults()) {
+				Question q = (Question) JSONObject.toBean(d.getJSONObject().getJSONObject("value"), Question.class);
+				List<PossibleAnswer> answers = new ArrayList<PossibleAnswer>();
+				for(Object answer : q.getPossibleAnswers()) {
+					PossibleAnswer a = (PossibleAnswer) morpherRegistry.morph(PossibleAnswer.class, answer);
+					answers.add(a);
+				}
+				q.setPossibleAnswers(answers);
+				result.add(q);
+			}
+			
+			return result;
+		} catch (UnsupportedEncodingException e) {
+			return null;
+		}
+	}
+	
+	
 	@Override
 	public Session getSessionFromKeyword(String keyword) {
 		try {
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index d42be57a1..eed604f2c 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -37,4 +37,5 @@ public interface IDatabaseDao {
 	public boolean sessionKeyAvailable(String keyword);
 	
 	public boolean saveQuestion(Session session, Question question);
+	List<Question> getSkillQuestions(String session);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index 12382d6c8..c367f3756 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -26,7 +26,6 @@ import java.util.Set;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
-
 import de.thm.arsnova.socket.message.Question;
 
 
@@ -46,4 +45,5 @@ public interface ISessionService {
 	
 	public List<Session> getMySessions(String username);
 	public boolean saveQuestion(Question question);
+	public List<Question> getSkillQuestions(String sessionkey);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 9a5c774c4..628590cca 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -76,6 +76,11 @@ public class SessionService implements ISessionService {
 		return databaseDao.getMySessions(username);
 	}
 
+	@Override
+	public List<Question> getSkillQuestions(String sessionkey) {
+		return databaseDao.getSkillQuestions(sessionkey);
+	}
+	
 	@Override
 	public Session saveSession(Session session) {
 		return databaseDao.saveSession(session);
diff --git a/src/main/java/de/thm/arsnova/socket/message/Question.java b/src/main/java/de/thm/arsnova/socket/message/Question.java
index e271fcc43..5f68be3d7 100644
--- a/src/main/java/de/thm/arsnova/socket/message/Question.java
+++ b/src/main/java/de/thm/arsnova/socket/message/Question.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 public class Question {
 
+	private String type;
 	private String questionType;
 	private String subject;
 	private String text;
@@ -30,6 +31,16 @@ public class Question {
 	private List<PossibleAnswer> possibleAnswers;
 	private boolean noCorrect;
 	private String session;
+	private int number;	
+	
+	
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
 	
 	public String getQuestionType() {
 		return questionType;
@@ -87,6 +98,14 @@ public class Question {
 		this.noCorrect = noCorrect;
 	}
 	
+	public String getSessionId() {
+		return session;
+	}
+
+	public void setSessionId(String session) {
+		this.session = session;
+	}
+	
 	public String getSession() {
 		return session;
 	}
@@ -95,8 +114,17 @@ public class Question {
 		this.session = session;
 	}
 
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
 	@Override
 	public String toString() {
-		return "Question type '" + this.questionType + "': " + this.subject + ";\n" + this.text;
+		return "Question type '" + this.questionType + "': " + this.subject + ";\n" + this.text +
+				this.possibleAnswers;
 	}
 }
-- 
GitLab