From cf9f8464c82bdad42be8f7ad726fe39d77887e0b Mon Sep 17 00:00:00 2001 From: Christoph Thelen <christoph.thelen@mni.thm.de> Date: Mon, 10 Mar 2014 20:58:11 +0100 Subject: [PATCH] Added methods for "learning progress" feature --- .../arsnova/controller/SessionController.java | 18 +++++++++ .../java/de/thm/arsnova/dao/CouchDBDao.java | 37 +++++++++++++++++++ .../java/de/thm/arsnova/dao/IDatabaseDao.java | 4 ++ .../java/de/thm/arsnova/entities/Answer.java | 9 +++++ .../thm/arsnova/entities/PossibleAnswer.java | 9 +++++ .../thm/arsnova/services/ISessionService.java | 4 ++ .../thm/arsnova/services/SessionService.java | 15 ++++++++ .../de/thm/arsnova/dao/StubDatabaseDao.java | 12 ++++++ 8 files changed, 108 insertions(+) diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 525bd65d..b8443784 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -191,6 +191,24 @@ public class SessionController extends AbstractController { return null; } + @RequestMapping(value = "/{sessionkey}/learningprogress", method = RequestMethod.GET) + @ResponseBody + public final int learningProgress( + @PathVariable final String sessionkey, + final HttpServletResponse response + ) { + return sessionService.getLearningProgress(sessionkey); + } + + @RequestMapping(value = "/{sessionkey}/mylearningprogress", method = RequestMethod.GET) + @ResponseBody + public final int myLearningProgress( + @PathVariable final String sessionkey, + final HttpServletResponse response + ) { + return sessionService.getMyLearningProgress(sessionkey); + } + /* internal redirections */ @RequestMapping(value = "/{sessionKey}/lecturerquestion") diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index fa3b627f..fec9faff 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -913,6 +913,7 @@ public class CouchDBDao implements IDatabaseDao { a.put("questionId", answer.getQuestionId()); a.put("answerSubject", answer.getAnswerSubject()); a.put("questionVariant", answer.getQuestionVariant()); + a.put("questionValue", answer.getQuestionValue()); a.put("answerText", answer.getAnswerText()); a.put("timestamp", answer.getTimestamp()); a.put("user", user.getUsername()); @@ -936,6 +937,7 @@ public class CouchDBDao implements IDatabaseDao { a.put("answerText", answer.getAnswerText()); a.put("timestamp", answer.getTimestamp()); a.put("abstention", answer.isAbstention()); + a.put("questionValue", answer.getQuestionValue()); this.database.saveDocument(a); answer.set_rev(a.getRev()); return answer; @@ -1338,4 +1340,39 @@ public class CouchDBDao implements IDatabaseDao { this.deleteAnswers(q); } } + + @Override + public int getLearningProgress(Session session) { + NovaView courseView = new NovaView("learning_progress/course_value"); + NovaView maximumView = new NovaView("learning_progress/maximum_value"); + courseView.setKey(session.get_id()); + maximumView.setKey(session.get_id()); + + return getProgressPercentage(courseView, maximumView); + } + + @Override + public int getMyLearningProgress(Session session, User user) { + NovaView userView = new NovaView("learning_progress/user_value"); + NovaView maximumView = new NovaView("learning_progress/maximum_value"); + userView.setKey(session.get_id(), user.getUsername()); + maximumView.setKey(session.get_id()); + + return getProgressPercentage(userView, maximumView); + } + + private int getProgressPercentage(NovaView progressView, NovaView maximumView) { + List<Document> progressValue = this.getDatabase().view(progressView).getResults(); + List<Document> maximumValue = this.getDatabase().view(maximumView).getResults(); + if (maximumValue.isEmpty()) { + return 0; + } + int maximum = maximumValue.get(0).getInt("value"); + int progress = 0; + if (!progressValue.isEmpty()) { + progress = progressValue.get(0).getInt("value"); + } + int percentage = (int)((progress * 100.0f) / maximum); + return percentage < 0 ? 0 : percentage; + } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index b7f153c1..b4c9c300 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -161,4 +161,8 @@ public interface IDatabaseDao { void publishAllQuestions(Session session, boolean publish); void deleteAllQuestionsAnswers(Session session); + + int getLearningProgress(Session session); + + int getMyLearningProgress(Session session, User user); } diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index aed482cf..d2361ed9 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 answerText; private String answerSubject; private String questionVariant; + private int questionValue; private int piRound; private String user; private long timestamp; @@ -133,6 +134,14 @@ public class Answer { this.questionVariant = questionVariant; } + public int getQuestionValue() { + return questionValue; + } + + public void setQuestionValue(int questionValue) { + this.questionValue = questionValue; + } + @Override public final String toString() { return "Answer type:'" + type + "'" diff --git a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java b/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java index acfea0d3..ebc36f98 100644 --- a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java +++ b/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java @@ -23,6 +23,7 @@ public class PossibleAnswer { private String id; private String text; private boolean correct; + private int value; public String getId() { return this.id; @@ -48,6 +49,14 @@ public class PossibleAnswer { this.correct = correct; } + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + @Override public String toString() { return "PossibleAnswer [id=" + id + ", text=" + text + ", correct=" + correct + "]"; diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index d868e4bc..611f3ce9 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -51,4 +51,8 @@ public interface ISessionService { Session updateSession(String sessionkey, Session session); void deleteSession(String sessionkey, User user); + + int getLearningProgress(String sessionkey); + + int getMyLearningProgress(String sessionkey); } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index e9e6af9b..205ee49b 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -256,4 +256,19 @@ public class SessionService implements ISessionService { } databaseDao.deleteSession(session); } + + @Override + @Authenticated + public int getLearningProgress(String sessionkey) { + Session session = databaseDao.getSession(sessionkey); + return databaseDao.getLearningProgress(session); + } + + @Override + @Authenticated + public int getMyLearningProgress(String sessionkey) { + Session session = databaseDao.getSession(sessionkey); + User user = userService.getCurrentUser(); + return databaseDao.getMyLearningProgress(session, user); + } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 8e354540..bfd23302 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -497,4 +497,16 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub } + + @Override + public int getLearningProgress(Session session) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getMyLearningProgress(Session session, User user) { + // TODO Auto-generated method stub + return 0; + } } -- GitLab