diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 28b267e43898678ae939d10a3b2d693be99fea36..e353eb954e7946d3834adc8583bbdf410a338c29 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -250,6 +250,10 @@ public class CouchDBDao implements IDatabaseDao { ); question.setPossibleAnswers(new ArrayList<PossibleAnswer>(answers)); question.setSessionKeyword(this.getSessionKeyword(question.getSessionId())); + if (!"freetext".equals(question.getQuestionType()) && 0 == question.getPiRound()) { + /* needed for legacy questions whose piRound property has not been set */ + question.setPiRound(1); + } result.add(question); } @@ -558,6 +562,7 @@ public class CouchDBDao implements IDatabaseDao { q.put("releasedFor", question.getReleasedFor()); q.put("possibleAnswers", question.getPossibleAnswers()); q.put("noCorrect", question.isNoCorrect()); + q.put("piRound", question.getPiRound()); q.put("showStatistic", question.isShowStatistic()); q.put("showAnswer", question.isShowAnswer()); try { @@ -581,6 +586,7 @@ public class CouchDBDao implements IDatabaseDao { q.put("releasedFor", question.getReleasedFor()); q.put("possibleAnswers", question.getPossibleAnswers()); q.put("noCorrect", question.isNoCorrect()); + q.put("piRound", question.getPiRound()); q.put("showStatistic", question.isShowStatistic()); q.put("showAnswer", question.isShowAnswer()); this.database.saveDocument(q); @@ -825,21 +831,39 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public final Answer getMyAnswer(final String questionId) { + public final Answer getMyAnswer(final String questionId, int piRound) { User user = userService.getCurrentUser(); if (user == null) { throw new UnauthorizedException(); } try { - View view = new View("answer/by_question_and_user"); - view.setKey( - "[" + URLEncoder.encode( - "\"" + questionId + "\",\"" + user.getUsername() + "\"", - "UTF-8" - ) - + "]" - ); + View view = new View("answer/by_question_and_user_and_piround"); + if (2 == piRound) { + view.setKey( + "[" + URLEncoder.encode( + "\"" + questionId + "\",\"" + user.getUsername() + "\",2", + "UTF-8" + ) + + "]" + ); + } else { + /* needed for legacy questions whose piRound property has not been set */ + view.setStartKey( + "[" + URLEncoder.encode( + "\"" + questionId + "\",\"" + user.getUsername() + "\"", + "UTF-8" + ) + + "]" + ); + view.setEndKey( + "[" + URLEncoder.encode( + "\"" + questionId + "\",\"" + user.getUsername() + "\",1", + "UTF-8" + ) + + "]" + ); + } ViewResults results = this.getDatabase().view(view); if (results.getResults().isEmpty()) { return null; @@ -859,11 +883,11 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public final List<Answer> getAnswers(final String questionId) { + public final List<Answer> getAnswers(final String questionId, int piRound) { try { - View view = new View("skill_question/count_answers"); - view.setStartKey("[" + URLEncoder.encode("\"" + questionId + "\"", "UTF-8") + "]"); - view.setEndKey("[" + URLEncoder.encode("\"" + questionId + "\",{}", "UTF-8") + "]"); + View view = new View("skill_question/count_answers_by_question_and_piround"); + view.setStartKey("[" + URLEncoder.encode("\"" + questionId + "\"," + piRound, "UTF-8") + "]"); + view.setEndKey("[" + URLEncoder.encode("\"" + questionId + "\"," + piRound + ",{}", "UTF-8") + "]"); view.setGroup(true); ViewResults results = this.getDatabase().view(view); List<Answer> answers = new ArrayList<Answer>(); @@ -871,8 +895,8 @@ public class CouchDBDao implements IDatabaseDao { 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)); + a.setPiRound(d.getJSONObject().getJSONArray("key").getInt(1)); + a.setAnswerText(d.getJSONObject().getJSONArray("key").getString(2)); answers.add(a); } return answers; @@ -1312,6 +1336,7 @@ public class CouchDBDao implements IDatabaseDao { a.put("answerText", answer.getAnswerText()); a.put("timestamp", answer.getTimestamp()); a.put("user", user.getUsername()); + a.put("piRound", answer.getPiRound()); this.database.saveDocument(a); answer.set_id(a.getId()); answer.set_rev(a.getRev()); diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 8f1fc5cc74b9f1d6c15f01ab0777c98fc1b8951e..adfca01274f41cf07040c5b5d9c70f0ca5e486b0 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -72,9 +72,9 @@ public interface IDatabaseDao { List<String> getUnAnsweredQuestions(Session session, User user); - Answer getMyAnswer(String questionId); + Answer getMyAnswer(String questionId, int piRound); - List<Answer> getAnswers(String questionId); + List<Answer> getAnswers(String questionId, int piRound); int getAnswerCount(String questionId); diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index 3438bb14b7dc3414befd8a880c16280a81b86868..273d5942683d2aea489c03f336b8d869ac2b2a8a 100644 --- a/src/main/java/de/thm/arsnova/entities/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/Answer.java @@ -10,6 +10,7 @@ public class Answer { private String questionId; private String answerText; private String answerSubject; + private int piRound; private String user; private long timestamp; private int answerCount; @@ -74,6 +75,14 @@ public class Answer { this.answerSubject = answerSubject; } + public int getPiRound() { + return piRound; + } + + public void setPiRound(int piRound) { + this.piRound = piRound; + } + public final String getUser() { return user; } diff --git a/src/main/java/de/thm/arsnova/entities/Question.java b/src/main/java/de/thm/arsnova/entities/Question.java index 5e4249f35ca6296641392cc776d58a077086cb5b..ee0b29eafcb3295678622d070fb14095d6ec2aab 100644 --- a/src/main/java/de/thm/arsnova/entities/Question.java +++ b/src/main/java/de/thm/arsnova/entities/Question.java @@ -36,6 +36,7 @@ public class Question { private long timestamp; private int number; private int duration; + private int piRound; private boolean showStatistic; // sic private boolean showAnswer; private String _id; @@ -153,6 +154,14 @@ public class Question { this.duration = duration; } + public int getPiRound() { + return piRound; + } + + public void setPiRound(int piRound) { + this.piRound = piRound; + } + public boolean isShowStatistic() { return showStatistic; } diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java index 444d3c01d7d675c85a0fc7c6df13eb3f43837fbb..0cd315013ed1a82a38c6a45408520f2769f3aa49 100644 --- a/src/main/java/de/thm/arsnova/services/IQuestionService.java +++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java @@ -45,6 +45,8 @@ public interface IQuestionService { Answer getMyAnswer(String questionId); + List<Answer> getAnswers(String questionId, int piRound); + List<Answer> getAnswers(String questionId); int getAnswerCount(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 ed2a816bad38b6221342a25e83c4921d1ed737b6..c07105664e80913b339a77d2450a0614f4565b2e 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -76,6 +76,13 @@ public class QuestionService implements IQuestionService { public Question saveQuestion(Question question) { Session session = this.databaseDao.getSessionFromKeyword(question.getSessionKeyword()); question.setSessionId(session.get_id()); + + if ("freetext".equals(question.getQuestionType())) { + question.setPiRound(0); + } else if (question.getPiRound() < 1 || question.getPiRound() > 2) { + question.setPiRound(1); + } + Question result = this.databaseDao.saveQuestion(session, question); socketIoServer.reportLecturerQuestionAvailable(result.getSessionKeyword(), result.get_id()); @@ -100,7 +107,13 @@ public class QuestionService implements IQuestionService { @Override @Authenticated public Question getQuestion(String id) { - return databaseDao.getQuestion(id); + Question result = databaseDao.getQuestion(id); + if (!"freetext".equals(result.getQuestionType()) && 0 == result.getPiRound()) { + /* needed for legacy questions whose piRound property has not been set */ + result.setPiRound(1); + } + + return result; } @Override @@ -181,15 +194,26 @@ public class QuestionService implements IQuestionService { @Override @Authenticated public Answer getMyAnswer(String questionId) { - return databaseDao.getMyAnswer(questionId); + Question question = getQuestion(questionId); + + return databaseDao.getMyAnswer(questionId, question.getPiRound()); + } + + @Override + @Authenticated + public List<Answer> getAnswers(String questionId, int piRound) { + return databaseDao.getAnswers(questionId, piRound); } @Override @Authenticated public List<Answer> getAnswers(String questionId) { - return databaseDao.getAnswers(questionId); + Question question = getQuestion(questionId); + + return getAnswers(questionId, question.getPiRound()); } + /* TODO add implementation for piRound */ @Override @Authenticated public int getAnswerCount(String questionId) { @@ -205,6 +229,7 @@ public class QuestionService implements IQuestionService { @Override @Authenticated public List<Answer> getMytAnswers(String sessionKey) { + /* TODO Peer Instruction implementation needed */ return databaseDao.getMyAnswers(sessionKey); } @@ -255,7 +280,8 @@ public class QuestionService implements IQuestionService { @Override @Authenticated public void update(Question question) { - if (databaseDao.getQuestion(question.get_id()) == null) { + Question oldQuestion = databaseDao.getQuestion(question.get_id()); + if (null == oldQuestion) { throw new NotFoundException(); } @@ -264,6 +290,13 @@ public class QuestionService implements IQuestionService { if (user == null || session == null || !session.isCreator(user)) { throw new UnauthorizedException(); } + + if ("freetext".equals(question.getQuestionType())) { + question.setPiRound(0); + } else if (question.getPiRound() < 1 || question.getPiRound() > 2) { + question.setPiRound(oldQuestion.getPiRound() > 0 ? oldQuestion.getPiRound() : 1); + } + this.databaseDao.updateQuestion(question); } @@ -279,6 +312,12 @@ public class QuestionService implements IQuestionService { throw new NotFoundException(); } + if ("freetext".equals(question.getQuestionType())) { + answer.setPiRound(0); + } else { + answer.setPiRound(question.getPiRound()); + } + Answer result = this.databaseDao.saveAnswer(answer, user); socketIoServer.reportAnswersToLecturerQuestionAvailable(question.getSessionKeyword(), question.get_id()); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 5e8df373853d23fdb9d162b03b8a68622cc50b9f..2e8f7a9c9b527f40fc9bfab7fc6f6757fcfd11f1 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -244,13 +244,13 @@ public class StubDatabaseDao implements IDatabaseDao { } @Override - public Answer getMyAnswer(String questionId) { + public Answer getMyAnswer(String questionId, int piRound) { // TODO Auto-generated method stub return null; } @Override - public List<Answer> getAnswers(String questionId) { + public List<Answer> getAnswers(String questionId, int piRound) { // TODO Auto-generated method stub return null; }