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