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 1806685ac6d7b52723842eaa2d186192545b84f5..644c1979da0e98ce41a15113c74b8e4314ae0412 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; } } diff --git a/src/main/java/org/olat/restapi/system/ProcSamplerJob.java b/src/main/java/org/olat/restapi/system/ProcSamplerJob.java index ce0c97bea14a7ff32f20d6da025291c6cc9f4ac9..74dec32a364ad5adb40336dd97e86cede971b3bd 100644 --- a/src/main/java/org/olat/restapi/system/ProcSamplerJob.java +++ b/src/main/java/org/olat/restapi/system/ProcSamplerJob.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; @@ -40,6 +41,10 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.restapi.system.MonitoringService.Statistics; import org.olat.restapi.system.vo.SessionsVO; +import org.olat.search.SearchServiceStatus; +import org.olat.search.service.SearchServiceFactory; +import org.olat.search.service.SearchServiceStatusImpl; +import org.olat.search.service.indexer.FullIndexerStatus; import org.quartz.JobExecutionContext; import org.springframework.scheduling.quartz.QuartzJobBean; import org.w3c.dom.Document; @@ -47,6 +52,8 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXParseException; +import net.fortuna.ical4j.util.TimeZones; + /** * * Initial date: 27 févr. 2017<br> @@ -108,9 +115,17 @@ public class ProcSamplerJob extends QuartzJobBean { addValue("totalGroupCount", statistics.getTotalGroupCount(), rootEl, doc); addValue("publishedCourses", statistics.getPublishedCourses(), rootEl, doc); //indexer - addValue("lastFullIndexTime", statistics.getLastFullIndexTime(), rootEl, doc); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + format.setTimeZone(TimeZones.getUtcTimeZone()); + SearchServiceStatus status = SearchServiceFactory.getService().getStatus(); + if(status instanceof SearchServiceStatusImpl) { + SearchServiceStatusImpl statusImpl = (SearchServiceStatusImpl)status; + FullIndexerStatus fStatus = statusImpl.getFullIndexerStatus(); + String date = format.format(new Date(fStatus.getLastFullIndexTime())); + addValue("lastFullIndexTime", date, rootEl, doc); + } //marker - addValue("lastOpenOLATSampling", new Date().toString(), rootEl, doc); + addValue("lastOpenOLATSampling", format.format(new Date()), rootEl, doc); // Use a Transformer for output try(OutputStream out = new FileOutputStream(xmlFile)) {