From df4669837b496fa4dd95100766a8943fab8ebc81 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 23 May 2017 11:28:10 +0200
Subject: [PATCH] OO-2774: resume session of authors under strict control and
 start a new session if something fails.

---
 .../ui/AssessmentTestDisplayController.java   | 44 +++++++++++++++++--
 1 file changed, 40 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
index 9056af8c81b..29021125762 100644
--- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
@@ -314,9 +314,7 @@ public class AssessmentTestDisplayController extends BasicController implements
 
 		AssessmentTestSession lastSession = qtiService.getResumableAssessmentTestSession(assessedIdentity, anonymousIdentifier, entry, subIdent, testEntry, authorMode);
 		if(lastSession == null) {
-			candidateSession = qtiService.createAssessmentTestSession(assessedIdentity, anonymousIdentifier, assessmentEntry, entry, subIdent, testEntry, authorMode);
-			candidateAuditLogger = qtiService.getAssessmentSessionAuditLogger(candidateSession, authorMode);
-			testSessionController = enterSession(ureq);
+			initNewAssessmentTestSession(ureq, assessmentEntry, authorMode);
 		} else {
 			candidateSession = lastSession;
 			candidateAuditLogger = qtiService.getAssessmentSessionAuditLogger(candidateSession, authorMode);
@@ -324,7 +322,45 @@ public class AssessmentTestDisplayController extends BasicController implements
 			lastEvent = new CandidateEvent(candidateSession, testEntry, entry);
 			lastEvent.setTestEventType(CandidateTestEventType.ITEM_EVENT);
 			
-			testSessionController = resumeSession(ureq);
+			if(authorMode) {
+				//check that the resumed session match the current test
+				try {
+					testSessionController = resumeSession(ureq);
+					if(!checkAuthorSession()) {
+						initNewAssessmentTestSession(ureq, assessmentEntry, authorMode);
+					}
+				} catch(Exception e) {
+					logError("Cannot resume session as author", e);
+					initNewAssessmentTestSession(ureq, assessmentEntry, authorMode);
+				}
+			} else {
+				testSessionController = resumeSession(ureq);
+			}
+		}
+	}
+	
+	private void initNewAssessmentTestSession(UserRequest ureq, AssessmentEntry assessmentEntry, boolean authorMode) {
+		candidateSession = qtiService.createAssessmentTestSession(assessedIdentity, anonymousIdentifier, assessmentEntry, entry, subIdent, testEntry, authorMode);
+		candidateAuditLogger = qtiService.getAssessmentSessionAuditLogger(candidateSession, authorMode);
+		testSessionController = enterSession(ureq);
+	}
+	
+	/**
+	 * If the session data doesn't match the current assessmentTest and assessmentItems, it will
+	 * return false.
+	 * @return
+	 */
+	private boolean checkAuthorSession() {
+		try {
+			//
+			TestSessionState testSessionState = testSessionController.getTestSessionState();
+			if(!isTerminated() && !testSessionState.isExited() && testSessionState.getCurrentTestPartKey() != null) {
+				testSessionController.mayEndCurrentTestPart();
+			}
+			return true;
+		} catch(Exception e) {
+			logError("Cannot resume session as author", e);
+			return false;
 		}
 	}
 	
-- 
GitLab