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