diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java index ed8fbbb35d76cf33acb7092b14bd7cb51674fdc9..3ecadd214ff47bb413611e893e4e91c69acbc755 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java +++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java @@ -667,6 +667,8 @@ public class BaseFullWebappController extends BasicController implements ChiefCo removeAsListenerAndDispose(assessmentGuardCtrl); assessmentGuardCtrl = null; } else if("continue".equals(event.getCommand())) { + //unlock session + ureq.getUserSession().unlockResource(); initializeDefaultSite(ureq); removeAsListenerAndDispose(assessmentGuardCtrl); assessmentGuardCtrl = null; @@ -1482,39 +1484,47 @@ public class BaseFullWebappController extends BasicController implements ChiefCo private void updateBusinessPath(UserRequest ureq, SiteInstance site) { if(site == null) return; - String businessPath = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getAsString(); - HistoryPoint point = ureq.getUserSession().getLastHistoryPoint(); - int index = businessPath.indexOf(':'); - if(index > 0 && point != null && point.getBusinessPath() != null) { - String start = businessPath.substring(0, index); - if(!point.getBusinessPath().startsWith(start)) { - //if a controller has not set its business path, don't pollute the mapping - List<ContextEntry> entries = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getEntries(); - siteToBusinessPath.put(site, new HistoryPointImpl(ureq.getUuid(), businessPath, entries)); - return; + try { + String businessPath = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getAsString(); + HistoryPoint point = ureq.getUserSession().getLastHistoryPoint(); + int index = businessPath.indexOf(':'); + if(index > 0 && point != null && point.getBusinessPath() != null) { + String start = businessPath.substring(0, index); + if(!point.getBusinessPath().startsWith(start)) { + //if a controller has not set its business path, don't pollute the mapping + List<ContextEntry> entries = siteToBornSite.get(site).getController().getWindowControlForDebug().getBusinessControl().getEntries(); + siteToBusinessPath.put(site, new HistoryPointImpl(ureq.getUuid(), businessPath, entries)); + return; + } } + + siteToBusinessPath.put(site, point); + } catch (Exception e) { + logError("", e); } - - siteToBusinessPath.put(site, point); } private void updateBusinessPath(UserRequest ureq, DTab tab) { //dtabToBusinessPath is null if the controller is disposed if(tab == null || dtabToBusinessPath == null) return; - String businessPath = tab.getController().getWindowControlForDebug().getBusinessControl().getAsString(); - HistoryPoint point = ureq.getUserSession().getLastHistoryPoint(); - int index = businessPath.indexOf(']'); - if(index > 0 && point != null && point.getBusinessPath() != null) { - String start = businessPath.substring(0, index); - if(!point.getBusinessPath().startsWith(start)) { - //if a controller has not set its business path, don't pollute the mapping - List<ContextEntry> entries = tab.getController().getWindowControlForDebug().getBusinessControl().getEntries(); - dtabToBusinessPath.put(tab, new HistoryPointImpl(ureq.getUuid(), businessPath, entries)); - return; + try { + String businessPath = tab.getController().getWindowControlForDebug().getBusinessControl().getAsString(); + HistoryPoint point = ureq.getUserSession().getLastHistoryPoint(); + int index = businessPath.indexOf(']'); + if(index > 0 && point != null && point.getBusinessPath() != null) { + String start = businessPath.substring(0, index); + if(!point.getBusinessPath().startsWith(start)) { + //if a controller has not set its business path, don't pollute the mapping + List<ContextEntry> entries = tab.getController().getWindowControlForDebug().getBusinessControl().getEntries(); + dtabToBusinessPath.put(tab, new HistoryPointImpl(ureq.getUuid(), businessPath, entries)); + return; + } } + dtabToBusinessPath.put(tab, point); + } catch (Exception e) { + logError("", e); } - dtabToBusinessPath.put(tab, point); } private static class TabState { diff --git a/src/main/java/org/olat/core/util/UserSession.java b/src/main/java/org/olat/core/util/UserSession.java index a320ee35b7e76583d62b8bc538bd7d0fac969fd5..6abc731345d37ef58bdd5a88ebdfe868850458c7 100644 --- a/src/main/java/org/olat/core/util/UserSession.java +++ b/src/main/java/org/olat/core/util/UserSession.java @@ -304,6 +304,11 @@ public class UserSession implements HttpSessionBindingListener, GenericEventList this.lockMode = mode; this.lockResource = lockResource; } + + public void unlockResource() { + lockMode = null; + lockResource = null; + } public List<TransientAssessmentMode> getAssessmentModes() { return assessmentModes; diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java index b6ec61df1b0b99e927f387b1660ef8f8fd27850d..43210bb610f8cacb275b5a80dbbae81048430f88 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java @@ -182,17 +182,17 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor Date endWithFollowupTime = assessmentModeManager.evaluateFollowupTime(end, followup); if(beginWithLeadTime.compareTo(now) > 0) { status = Status.none; - } else if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) >= 0 && !beginWithLeadTime.equals(begin)) { + } else if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) > 0 && !beginWithLeadTime.equals(begin)) { status = Status.leadtime; - } else if(begin.compareTo(now) <= 0 && end.compareTo(now) >= 0) { + } else if(begin.compareTo(now) <= 0 && end.compareTo(now) > 0) { status = Status.assessment; - } else if(end.compareTo(now) <= 0 && endWithFollowupTime.compareTo(now) >= 0) { + } else if(end.compareTo(now) <= 0 && endWithFollowupTime.compareTo(now) > 0) { if(followup > 0) { status = Status.followup; } else { status = Status.end; } - } else if(endWithFollowupTime.compareTo(now) < 0) { + } else if(endWithFollowupTime.compareTo(now) <= 0) { status = Status.end; } else { status = null; @@ -203,14 +203,16 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor private AssessmentMode sendEvent(AssessmentMode mode, Date now, boolean forceStatus) { if(mode.getBeginWithLeadTime().compareTo(now) > 0) { + //none mode = ensureStatusOfMode(mode, Status.none); sendEvent(AssessmentModeNotificationEvent.BEFORE, mode, assessmentModeManager.getAssessedIdentityKeys(mode)); - } else if(mode.getBeginWithLeadTime().compareTo(now) <= 0 && mode.getBegin().compareTo(now) >= 0 + } else if(mode.getBeginWithLeadTime().compareTo(now) <= 0 && mode.getBegin().compareTo(now) > 0 && mode.getBeginWithLeadTime().compareTo(mode.getBegin()) != 0) { + //leading time mode = ensureStatusOfMode(mode, Status.leadtime); sendEvent(AssessmentModeNotificationEvent.LEADTIME, mode, - assessmentModeManager.getAssessedIdentityKeys(mode)); + assessmentModeManager.getAssessedIdentityKeys(mode)); } else if(mode.isManualBeginEnd() && !forceStatus) { //what to do in manual mode if(mode.getStatus() == Status.followup) { @@ -221,7 +223,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor } } } else { - if(mode.getBegin().compareTo(now) <= 0 && mode.getEnd().compareTo(now) >= 0) { + if(mode.getBegin().compareTo(now) <= 0 && mode.getEnd().compareTo(now) > 0) { mode = ensureStatusOfMode(mode, Status.assessment); sendEvent(AssessmentModeNotificationEvent.START_ASSESSMENT, mode, assessmentModeManager.getAssessedIdentityKeys(mode)); @@ -235,7 +237,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor if(now.after(cal.getTime())) { sendEvent(AssessmentModeNotificationEvent.STOP_WARNING, mode, null); } - } else if(mode.getEnd().compareTo(now) <= 0 && mode.getEndWithFollowupTime().compareTo(now) >= 0) { + } else if(mode.getEnd().compareTo(now) <= 0 && mode.getEndWithFollowupTime().compareTo(now) > 0) { if(mode.getFollowupTime() > 0) { mode = ensureStatusOfMode(mode, Status.followup); sendEvent(AssessmentModeNotificationEvent.STOP_ASSESSMENT, mode, @@ -245,7 +247,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor sendEvent(AssessmentModeNotificationEvent.END, mode, assessmentModeManager.getAssessedIdentityKeys(mode)); } - } else if(mode.getEndWithFollowupTime().compareTo(now) < 0) { + } else if(mode.getEndWithFollowupTime().compareTo(now) <= 0) { mode = ensureStatusOfMode(mode, Status.end); sendEvent(AssessmentModeNotificationEvent.END, mode, assessmentModeManager.getAssessedIdentityKeys(mode)); @@ -276,7 +278,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor public boolean canStart(AssessmentMode assessmentMode) { boolean canStart; Status status = assessmentMode.getStatus(); - if(status == Status.end || status == Status.assessment) { + if(status == Status.assessment || status == Status.followup || status == Status.end) { canStart = false; } else { canStart = true; diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java index 54aa783d45bc4829650cfe18d2e4ed6a9d87392b..cba82ba651dc321d10e85be2b45077181647d5d2 100644 --- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java +++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java @@ -237,6 +237,7 @@ public class AssessmentModeGuardController extends BasicController implements Ge Date beginWithLeadTime = mode.getBeginWithLeadTime(); Date end = mode.getEnd(); Date endWithLeadTime = mode.getEndWithFollowupTime(); + if(beginWithLeadTime.compareTo(now) <= 0 && begin.compareTo(now) > 0) { state = Status.leadtime.name(); go.setEnabled(false); @@ -249,13 +250,13 @@ public class AssessmentModeGuardController extends BasicController implements Ge go.setVisible(true); cont.setEnabled(false); cont.setVisible(false); - } else if(end.compareTo(now) <= 0 && endWithLeadTime.compareTo(now) >= 0) { + } else if(end.compareTo(now) <= 0 && endWithLeadTime.compareTo(now) > 0) { state = Status.followup.name(); go.setEnabled(false); go.setVisible(false); cont.setEnabled(false); cont.setVisible(false); - } else if(endWithLeadTime.before(now) || Status.end == mode.getStatus()) { + } else if(endWithLeadTime.compareTo(now) <= 0 || Status.end == mode.getStatus()) { state = Status.end.name(); go.setEnabled(false); go.setVisible(false); diff --git a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties index 5db6fec786f07925b2afc4327c207c6c523fd42f..4d2bc9f616765cb022a0345770173a43909b54c9 100644 --- a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_en.properties @@ -25,6 +25,7 @@ current.mode.datetimes=From {0} until / to {1} current.mode.desc=You currently have an exam scheduled in the course listed below. While this assessment is in effect, no other OpenOLAT functions can be accessed. current.mode.end.info=The exam is finished. You can now continue to work normally with OpenOLAT. current.mode.followuptime=For {0} minute(s) after the exam is finished, all access to other courses is equally disabled. +current.mode.followuptime.info=General access to OpenOLAT is still disabled. Please wait for the end of the follow-up. current.mode.in=The exam starts in {0} minute(s) current.mode.leadtime={0} minute(s) before the exam starts, all access to other courses is disabled. current.mode.start=Start the exam