From 8ec547c23d8d9eb5d3c09c13c565f2120dbfcdcd Mon Sep 17 00:00:00 2001 From: agrt56 <andreas.gaertner@mni.thm.de> Date: Tue, 31 Mar 2015 14:30:17 +0200 Subject: [PATCH] Optimized pi round state determination; Added variable to question doc Task #14410 --- .../java/de/thm/arsnova/dao/CouchDBDao.java | 48 ++++++++++--------- .../de/thm/arsnova/entities/Question.java | 9 ++++ .../thm/arsnova/services/QuestionService.java | 40 ++++++++-------- 3 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 88c4aceb..417c3c51 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -511,9 +511,29 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return null; } - private Document toQuestionDocument(final Session session, final Question question) { + private HashMap<String, Object> getRoundMangementState(final Question question) { + final HashMap<String, Object> map = new HashMap<String, Object>(); final long time = new Date().getTime(); - final Document q = new Document(); + + if(time > question.getPiRoundEndTime() + && question.isPiRoundActive()) { + map.put("piRoundEndTime", 0); + map.put("piRoundStartTime", 0); + map.put("piRoundActive", false); + map.put("piRoundFinished", true); + } else { + map.put("piRoundFinished", false); + map.put("piRoundActive", question.isPiRoundActive()); + map.put("piRoundEndTime", question.getPiRoundEndTime()); + map.put("piRoundStartTime", question.getPiRoundStartTime()); + } + + return map; + } + + private Document toQuestionDocument(final Session session, final Question question) { + Document q = new Document(); + q.put("type", "skill_question"); q.put("questionType", question.getQuestionType()); q.put("questionVariant", question.getQuestionVariant()); @@ -553,17 +573,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware q.put("gridScaleFactor", question.getGridScaleFactor()); q.put("imageQuestion", question.isImageQuestion()); q.put("textAnswerEnabled", question.isTextAnswerEnabled()); - - if(time > question.getPiRoundEndTime()) { - q.put("piRoundEndTime", 0); - q.put("piRoundStartTime", 0); - q.put("piRoundActive", false); - } else { - q.put("piRoundActive", question.isPiRoundActive()); - q.put("piRoundEndTime", question.getPiRoundEndTime()); - q.put("piRoundStartTime", question.getPiRoundStartTime()); - } - + q.putAll(getRoundMangementState(question)); + return q; } @@ -610,16 +621,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware q.put("scaleFactor", question.getScaleFactor()); q.put("gridScaleFactor", question.getGridScaleFactor()); q.put("imageQuestion", question.isImageQuestion()); - - if(time > question.getPiRoundEndTime()) { - q.put("piRoundEndTime", 0); - q.put("piRoundStartTime", 0); - q.put("piRoundActive", false); - } else { - q.put("piRoundActive", question.isPiRoundActive()); - q.put("piRoundEndTime", question.getPiRoundEndTime()); - q.put("piRoundStartTime", question.getPiRoundStartTime()); - } + q.putAll(getRoundMangementState(question)); database.saveDocument(q); question.set_rev(q.getRev()); diff --git a/src/main/java/de/thm/arsnova/entities/Question.java b/src/main/java/de/thm/arsnova/entities/Question.java index 4d4516aa..8c668c71 100644 --- a/src/main/java/de/thm/arsnova/entities/Question.java +++ b/src/main/java/de/thm/arsnova/entities/Question.java @@ -40,6 +40,7 @@ public class Question { private int piRound; private long piRoundEndTime = 0; private long piRoundStartTime = 0; + private boolean piRoundFinished = false; private boolean piRoundActive = false; private boolean showStatistic; // sic private boolean showAnswer; @@ -232,6 +233,14 @@ public class Question { this.piRoundActive = piRoundActive; } + public boolean isPiRoundFinished() { + return piRoundFinished; + } + + public void setPiRoundFinished(boolean piRoundFinished) { + this.piRoundFinished = piRoundFinished; + } + public boolean isShowStatistic() { return showStatistic; } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index e47a1f7f..eddb0254 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -201,20 +201,15 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis } @Override - public void startNewPiRound(final String questionId, User user) { + public void startNewPiRound(final String questionId, User user) { + final Question question = databaseDao.getQuestion(questionId); + final Session session = databaseDao.getSessionFromKeyword(question.getSessionKeyword()); + if(null == user) { user = userService.getCurrentUser(); } cancelDelayedPiRoundChange(questionId); - - final Question question = databaseDao.getQuestion(questionId); - final Session session = databaseDao.getSessionFromKeyword(question.getSessionKeyword()); - - question.setPiRound(question.getPiRound() + 1); - question.setPiRoundActive(false); - question.setPiRoundStartTime(0); - question.setPiRoundEndTime(0); question.setActive(false); update(question, user); @@ -224,31 +219,34 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis @Override @PreAuthorize("isAuthenticated() and hasPermission(#questionId, 'question', 'owner')") public void startNewPiRoundDelayed(final String questionId, final int time) { - final Timer timer = new Timer(); - final Date date = new Date(); - final Date endDate = new Date(date.getTime() + (time * 1000)); final IQuestionService questionService = this; final User user = userService.getCurrentUser(); final Question question = databaseDao.getQuestion(questionId); final Session session = databaseDao.getSessionFromKeyword(question.getSessionKeyword()); - cancelDelayedPiRoundChange(questionId); + final Date date = new Date(); + final Timer timer = new Timer(); + final Date endDate = new Date(date.getTime() + (time * 1000)); + final int round = question.getPiRound(); - timer.schedule(new TimerTask() { - @Override - public void run() { - questionService.startNewPiRound(questionId, user); - } - }, endDate); + if(round == 1 && question.isPiRoundFinished()) { + question.setPiRound(round + 1); + } - timerList.put(questionId, timer); question.setActive(true); question.setPiRoundActive(true); question.setPiRoundStartTime(date.getTime()); question.setPiRoundEndTime(endDate.getTime()); - update(question); + update(question); this.publisher.publishEvent(new PiRoundDelayedStartEvent(this, session, question)); + + timer.schedule(new TimerTask() { + @Override + public void run() { + questionService.startNewPiRound(questionId, user); + } + }, endDate); } @Override -- GitLab