diff --git a/pom.xml b/pom.xml index 0f7c6459a227dab3539844d12a0aac7c1621bc3f..40974a1936abb809f201537327bacc228293ecf9 100644 --- a/pom.xml +++ b/pom.xml @@ -76,7 +76,7 @@ <version.selenium>3.141.59</version.selenium> <version.drone>2.5.1</version.drone> <activemq.version>5.16.0</activemq.version> - <qtiworks.version>1.0.19</qtiworks.version> + <qtiworks.version>1.0.20</qtiworks.version> <!-- properties for testing and Q&A --> <!-- by default no tests are executed so far (April 2011). Use appropriate profiles and properties on the command line --> 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 9d63aaf4a24f03088d992473691644f858fef014..51772d9fc365241b89d3c7d929e81302f696f1c2 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java @@ -179,8 +179,7 @@ public class AssessmentTestDisplayController extends BasicController implements private DialogBoxController confirmSuspendDialog; private CandidateEvent lastEvent; - private Date touchTimestamp; - private Date currentRequestTimestamp; + private Date touchCacheTimestamp; private AssessmentTestSession candidateSession; private ResolvedAssessmentTest resolvedAssessmentTest; private AssessmentTestMarks marks; @@ -265,12 +264,10 @@ public class AssessmentTestDisplayController extends BasicController implements FileResourceManager frm = FileResourceManager.getInstance(); fUnzippedDirRoot = frm.unzipFileResource(testEntry.getOlatResource()); resolvedAssessmentTest = qtiService.loadAndResolveAssessmentTest(fUnzippedDirRoot, false, false); - touchTimestamp = ureq.getRequestTimestamp(); + touchCacheTimestamp = ureq.getRequestTimestamp(); if(resolvedAssessmentTest == null || resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful() == null) { mainVC = createVelocityContainer("error"); } else { - currentRequestTimestamp = ureq.getRequestTimestamp(); - initMarks(); initOrResumeAssessmentTestSession(ureq, authorMode); @@ -280,6 +277,7 @@ public class AssessmentTestDisplayController extends BasicController implements new ResourcesMapper(assessmentObjectUri, submissionDir)); /* Handle immediate end of test session */ + testSessionController.setCurrentRequestTimestamp(ureq.getRequestTimestamp()); if (testSessionController.getTestSessionState() != null && testSessionController.getTestSessionState().isEnded()) { immediateEndTestSession(ureq); mainVC = createVelocityContainer("end"); @@ -318,7 +316,7 @@ public class AssessmentTestDisplayController extends BasicController implements candidateSession = qtiService.updateAssessmentTestSession(candidateSession); } else { candidateSession = qtiService.finishTestSession(candidateSession, testSessionController.getTestSessionState(), assessmentResult, - currentRequestTimestamp, getDigitalSignatureOptions(), getIdentity()); + ureq.getRequestTimestamp(), getDigitalSignatureOptions(), getIdentity()); } } @@ -470,7 +468,7 @@ public class AssessmentTestDisplayController extends BasicController implements @Override public Date getCurrentRequestTimestamp() { - return currentRequestTimestamp; + return testSessionController.getCurrentRequestTimestamp(); } public boolean isResultsVisible() { @@ -594,7 +592,7 @@ public class AssessmentTestDisplayController extends BasicController implements return false; } - testSessionController.touchDurations(currentRequestTimestamp); + testSessionController.touchDurations(testSessionController.getCurrentRequestTimestamp()); testSessionController.suspendTestSession(requestTimestamp); TestSessionState testSessionState = testSessionController.getTestSessionState(); @@ -677,8 +675,8 @@ public class AssessmentTestDisplayController extends BasicController implements private void touchResolvedAssessmentTest(UserRequest ureq) { try { Date timestamp = ureq.getRequestTimestamp(); - if(touchTimestamp == null || (timestamp.getTime() > touchTimestamp.getTime() + 300000l)) { - touchTimestamp = timestamp; + if(touchCacheTimestamp == null || (timestamp.getTime() > touchCacheTimestamp.getTime() + 300000l)) { + touchCacheTimestamp = timestamp; qtiService.touchCachedResolveAssessmentTest(fUnzippedDirRoot); } } catch (Exception e) { @@ -695,7 +693,7 @@ public class AssessmentTestDisplayController extends BasicController implements long durationMillis = testSessionState.getDurationAccumulated(); durationMillis += getRequestTimeStampDifferenceToNow(); if(durationMillis > maximumAssessmentTestDuration) { - currentRequestTimestamp = ureq.getRequestTimestamp(); + testSessionController.setCurrentRequestTimestamp(ureq.getRequestTimestamp()); processExitTestAfterTimeLimit(ureq); return true; } @@ -746,7 +744,7 @@ public class AssessmentTestDisplayController extends BasicController implements private Long getLeadingTimeEndTestOption() { if(overrideOptions != null && overrideOptions.getEndTestDate() != null) { Date endTestDate = overrideOptions.getEndTestDate(); - long diff = endTestDate.getTime() - currentRequestTimestamp.getTime(); + long diff = endTestDate.getTime() - testSessionController.getCurrentRequestTimestamp().getTime(); if(diff < 0l) { diff = 0l; } @@ -760,9 +758,9 @@ public class AssessmentTestDisplayController extends BasicController implements */ private long getRequestTimeStampDifferenceToNow() { long diff = 0l; - if(currentRequestTimestamp != null) { + if(testSessionController.getCurrentRequestTimestamp() != null) { //take time between 2 reloads if the user reload the page - diff = (new Date().getTime() - currentRequestTimestamp.getTime()); + diff = (new Date().getTime() - testSessionController.getCurrentRequestTimestamp().getTime()); if(diff < 0) { diff = 0; } @@ -775,19 +773,21 @@ public class AssessmentTestDisplayController extends BasicController implements */ private long getAssessmentTestDuration() { TestSessionState testSessionState = testSessionController.getTestSessionState(); - long duration = testSessionState.getDurationAccumulated(); - duration += getRequestTimeStampDifferenceToNow(); - return duration; + + Date timestamp = new Date(); + Date startTime = testSessionState.getDurationIntervalStartTime(); + final long durationDelta = timestamp.getTime() - startTime.getTime(); + return testSessionState.getDurationAccumulated() + durationDelta; } private void processQTIEvent(UserRequest ureq, QTIWorksAssessmentTestEvent qe) { testSessionController = qtiService.getCachedTestSessionController(candidateSession, testSessionController); - + testSessionController.setCurrentRequestTimestamp(ureq.getRequestTimestamp()); + if(timeLimitBarrier(ureq) || sessionReseted(ureq) || sessionEndedOrSuspended()) { return; } - currentRequestTimestamp = ureq.getRequestTimestamp(); switch(qe.getEvent()) { case selectItem: processSelectItem(ureq, qe.getSubCommand()); @@ -1619,7 +1619,7 @@ public class AssessmentTestDisplayController extends BasicController implements if(testSessionState.isEnded() || testSessionState.isExited()) return; //close duration - testSessionController.touchDurations(currentRequestTimestamp); + testSessionController.touchDurations(testSessionController.getCurrentRequestTimestamp()); final Date requestTimestamp = ureq.getRequestTimestamp(); testSessionController.exitTestIncomplete(requestTimestamp); @@ -1698,7 +1698,7 @@ public class AssessmentTestDisplayController extends BasicController implements if(currentTestPart != null && currentTestPart.getNavigationMode() == NavigationMode.NONLINEAR) { //go to the first assessment item if(testSessionController.hasFollowingNonLinearItem()) { - testSessionController.selectFollowingItemNonLinear(currentRequestTimestamp); + testSessionController.selectFollowingItemNonLinear(ureq.getRequestTimestamp()); } } } @@ -1747,7 +1747,9 @@ public class AssessmentTestDisplayController extends BasicController implements final NotificationRecorder notificationRecorder = new NotificationRecorder(NotificationLevel.INFO); TestSessionController controller = createTestSessionController(notificationRecorder); - if(!controller.getTestSessionState().isEnded() && !controller.getTestSessionState().isExited()) { + if(!controller.getTestSessionState().isEnded() && !controller.getTestSessionState().isExited() + && (controller.getTestSessionState().isSuspended() || controller.getCurrentRequestTimestamp() == null)) { + controller.setCurrentRequestTimestamp(ureq.getRequestTimestamp()); controller.unsuspendTestSession(requestTimestamp); TestSessionState testSessionState = controller.getTestSessionState();