Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r66f472a982a10227afd93740142320f4be590c8a -rbaeb14be8e4c423b2e9ebe3a253c73499051f765 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 66f472a982a10227afd93740142320f4be590c8a) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision baeb14be8e4c423b2e9ebe3a253c73499051f765) @@ -812,30 +812,56 @@ .withDescription(scheduleGate.getTitle() + ":" + lessonName) .usingJobData("gateId", scheduleGate.getActivityId()).build(); - // create customized triggers - Trigger openGateTrigger = TriggerBuilder.newTrigger() - .withIdentity("openGateTrigger:" + scheduleGate.getActivityId()) - .startAt(scheduleGate.getGateOpenTime(schedulingStartTime)).build(); + // start the scheduling job + boolean startGateOnly = ((scheduleGate.getGateStartTimeOffset() == null) + && (scheduleGate.getGateEndTimeOffset() == null)) + || ((scheduleGate.getGateStartTimeOffset() != null) && (scheduleGate.getGateEndTimeOffset() == null)); + String openGateTriggerName = "openGateTrigger:" + scheduleGate.getActivityId(); + String closeGateTriggerName = "closeGateTrigger:" + scheduleGate.getActivityId(); - Trigger closeGateTrigger = TriggerBuilder.newTrigger() - .withIdentity("closeGateTrigger:" + scheduleGate.getActivityId()) - .startAt(scheduleGate.getGateCloseTime(schedulingStartTime)).build(); + Trigger openGateTrigger = null; + Trigger closeGateTrigger = null; + try { + openGateTrigger = scheduler.getTrigger(TriggerKey.triggerKey(openGateTriggerName)); + closeGateTrigger = scheduler.getTrigger(TriggerKey.triggerKey(closeGateTriggerName)); + } catch (SchedulerException e) { + MonitoringService.log.error( + "Error occurred at [runGateScheduler] - fail to start scheduling. Error while fetching Quartz trigger \"" + + openGateTriggerName + "\"", + e); + } - // start the scheduling job try { - if (((scheduleGate.getGateStartTimeOffset() == null) && (scheduleGate.getGateEndTimeOffset() == null)) - || ((scheduleGate.getGateStartTimeOffset() != null) - && (scheduleGate.getGateEndTimeOffset() == null))) { + if (openGateTrigger != null) { + openGateTrigger = openGateTrigger.getTriggerBuilder() + .startAt(scheduleGate.getGateOpenTime(schedulingStartTime)).build(); + scheduler.rescheduleJob(openGateTrigger.getKey(), openGateTrigger); + } else { + // create customized triggers + openGateTrigger = TriggerBuilder.newTrigger().withIdentity(openGateTriggerName) + .startAt(scheduleGate.getGateOpenTime(schedulingStartTime)).build(); scheduler.scheduleJob(openScheduleGateJob, openGateTrigger); - } else if (openGateTrigger.getStartTime().before(closeGateTrigger.getStartTime())) { - scheduler.scheduleJob(openScheduleGateJob, openGateTrigger); - scheduler.scheduleJob(closeScheduleGateJob, closeGateTrigger); } + if (!startGateOnly) { + if (closeGateTrigger != null) { + closeGateTrigger = closeGateTrigger.getTriggerBuilder() + .startAt(scheduleGate.getGateCloseTime(schedulingStartTime)).build(); + scheduler.rescheduleJob(openGateTrigger.getKey(), closeGateTrigger); + } else { + // create customized triggers + closeGateTrigger = TriggerBuilder.newTrigger() + .withIdentity("closeGateTrigger:" + scheduleGate.getActivityId()) + .startAt(scheduleGate.getGateCloseTime(schedulingStartTime)).build(); + scheduler.scheduleJob(closeScheduleGateJob, closeGateTrigger); + } + } } catch (SchedulerException e) { - throw new MonitoringServiceException("Error occurred at [runGateScheduler] - fail to start scheduling", e); + MonitoringService.log.error( + "Error occurred at [runGateScheduler] - fail to start scheduling. Error while setting up gate open/close triggers. Open Gate Trigger name \"" + + openGateTriggerName + "\"", + e); } - if (MonitoringService.log.isDebugEnabled()) { MonitoringService.log.debug("Scheduler for Gate " + scheduleGate.getActivityId() + " started..."); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/GateController.java =================================================================== diff -u -rf2ad75cef0c507a64877942631fee13efbc6ed50 -rbaeb14be8e4c423b2e9ebe3a253c73499051f765 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/GateController.java (.../GateController.java) (revision f2ad75cef0c507a64877942631fee13efbc6ed50) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/GateController.java (.../GateController.java) (revision baeb14be8e4c423b2e9ebe3a253c73499051f765) @@ -29,6 +29,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Collection; +import java.util.Date; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.LinkedList; @@ -257,10 +258,15 @@ } else { gateForm.setActivityCompletionBased(false); Lesson lesson = learnerService.getLessonByActivity(scheduleGate); - Calendar startingTime = new GregorianCalendar(TimeZone.getDefault()); - startingTime.setTime(lesson.getStartDateTime()); - startingTime.add(Calendar.MINUTE, scheduleGate.getGateStartTimeOffset().intValue()); - gateForm.setStartingTime(startingTime.getTime()); + Date lessonStartingTime = lesson.getStartDateTime(); + if (lessonStartingTime == null && Lesson.NOT_STARTED_STATE.equals(lesson.getLessonStateId())) { + // Assume the lesson will start at the scheduled time + lessonStartingTime = lesson.getScheduleStartDate(); + } + Calendar gateStartingTime = new GregorianCalendar(TimeZone.getDefault()); + gateStartingTime.setTime(lessonStartingTime); + gateStartingTime.add(Calendar.MINUTE, scheduleGate.getGateStartTimeOffset().intValue()); + gateForm.setStartingTime(gateStartingTime.getTime()); } return "gate/scheduleGateContent"; Index: lams_monitoring/web/gate/scheduleGateContent.jsp =================================================================== diff -u -r54007f98ca71e0073f19c5db78536437123287c6 -rbaeb14be8e4c423b2e9ebe3a253c73499051f765 --- lams_monitoring/web/gate/scheduleGateContent.jsp (.../scheduleGateContent.jsp) (revision 54007f98ca71e0073f19c5db78536437123287c6) +++ lams_monitoring/web/gate/scheduleGateContent.jsp (.../scheduleGateContent.jsp) (revision baeb14be8e4c423b2e9ebe3a253c73499051f765) @@ -54,26 +54,7 @@ shown = true; } } - /* - function applyDate() { - var date = $('#scheduleDatetimeField').val(); - if (date) { - $.ajax({ - url : LAMS_URL + 'monitoring/gate.do', - cache : false, - data : { - 'method' : ??, - 'openDate' : date - }, - success : function() { - refreshMonitor('lesson'); - } - }); - } else { - alert(''); - } - } - */ + @@ -99,7 +80,7 @@ <%-- padding keeps the inputs the same height as the buttons. No flicking when shown/hidden --%> - " /> + " />