Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java,v diff -u -r1.13 -r1.14 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 14 Apr 2005 06:19:29 -0000 1.13 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 14 Apr 2005 07:56:57 -0000 1.14 @@ -28,6 +28,7 @@ import java.util.Set; import java.util.Vector; +import org.apache.log4j.Logger; import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ComplexActivity; @@ -60,6 +61,12 @@ import org.lamsfoundation.lams.util.wddx.FlashMessage; import org.quartz.JobDetail; import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.SimpleTrigger; +import org.quartz.Trigger; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; /** *

This is the major service facade for all monitoring functionalities. It is @@ -72,12 +79,14 @@ * @author Jacky Fang 2/02/2005 * @author Manpreet Minhas */ -public class MonitoringService implements IMonitoringService +public class MonitoringService implements IMonitoringService,ApplicationContextAware { //--------------------------------------------------------------------- // Instance variables //--------------------------------------------------------------------- + private static Logger log = Logger.getLogger(MonitoringService.class); + private ILessonDAO lessonDAO; private ILessonClassDAO lessonClassDAO; private IOrganisationDAO organisationDAO; @@ -86,16 +95,15 @@ private IUserDAO userDAO; private IWorkspaceFolderDAO workspaceFolderDAO; private ILearningDesignDAO learningDesignDAO; - + private FlashMessage flashMessage; private IAuthoringService authoringService; private ILamsCoreToolService lamsCoreToolService; private IUserManagementService userManagementService; - - private JobDetail openScheduleGateJob; - private JobDetail closeScheduleGateJob; private Scheduler scheduler; - - private FlashMessage flashMessage; + private ApplicationContext applicationContext; + //--------------------------------------------------------------------- + // Inversion of Control Methods - Method injection + //--------------------------------------------------------------------- /** * @param userManagementService The userManagementService to set. */ @@ -115,34 +123,20 @@ public void setWorkspaceFolderDAO(IWorkspaceFolderDAO workspaceFolderDAO) { this.workspaceFolderDAO = workspaceFolderDAO; } + /** - * @param activityDAO The activityDAO to set. - */ - public void setActivityDAO(IActivityDAO activityDAO) { - this.activityDAO = activityDAO; - } - /** * @param transitionDAO The transitionDAO to set. */ public void setTransitionDAO(ITransitionDAO transitionDAO) { this.transitionDAO = transitionDAO; } + /** - * @param lamsCoreToolService The lamsCoreToolService to set. - */ - public void setLamsCoreToolService(ILamsCoreToolService lamsCoreToolService) { - this.lamsCoreToolService = lamsCoreToolService; - } - /** * @param userDAO The userDAO to set. */ public void setUserDAO(IUserDAO userDAO) { this.userDAO = userDAO; } - - //--------------------------------------------------------------------- - // Inversion of Control Methods - Method injection - //--------------------------------------------------------------------- /** * @param authoringService The authoringService to set. */ @@ -166,25 +160,34 @@ { this.lessonDAO = lessonDAO; } - public void setOrganisationDAO(IOrganisationDAO organisationDAO) { - this.organisationDAO = organisationDAO; - } - /** - * @param openScheduleGateJob The openScheduleGateJob to set. + + /** + * @param lamsToolService The lamsToolService to set. */ - public void setOpenScheduleGateJob(JobDetail openScheduleGateJob) + public void setLamsCoreToolService(ILamsCoreToolService lamsToolService) { - this.openScheduleGateJob = openScheduleGateJob; + this.lamsCoreToolService = lamsToolService; } - + /** - * @param closeScheduleGateJob The closeScheduleGateJob to set. + * @param activityDAO The activityDAO to set. */ - public void setCloseScheduleGateJob(JobDetail closeScheduleGateJob) + public void setActivityDAO(IActivityDAO activityDAO) { - this.closeScheduleGateJob = closeScheduleGateJob; + this.activityDAO = activityDAO; } /** + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext=applicationContext; + } + public void setOrganisationDAO(IOrganisationDAO organisationDAO) { + this.organisationDAO = organisationDAO; + } + + /** * @param scheduler The scheduler to set. */ public void setScheduler(Scheduler scheduler) @@ -278,9 +281,9 @@ initToolSessionFor((ToolActivity) activity, requestedLesson.getAllLearners(), requestedLesson); - //if it is schedule gate, we need to initialize sheduler for it. + //if it is schedule gate, we need to initialize the sheduler for it. if(activity.getActivityTypeId().intValue()==Activity.SCHEDULE_GATE_ACTIVITY_TYPE) - initGateScheduler((ScheduleGateActivity)activity); + runGateScheduler((ScheduleGateActivity)activity); } //update lesson status requestedLesson.setLessonStateId(Lesson.STARTED_STATE); @@ -289,11 +292,43 @@ } /** - * @param activity + *

Runs the system scheduler to start the scheduling for opening gate and + * closing gate. It invlovs a couple of steps to start the scheduler:

+ *
  • 1. Initialize the resource needed by scheduling job by setting + * them into the job data map. + *
  • + *
  • 2. Create customized triggers for the scheduling.
  • + *
  • 3. start the scheduling job
  • + * + * @param scheduleGate the gate that needs to be scheduled. */ - private void initGateScheduler(ScheduleGateActivity scheduleGate) + private void runGateScheduler(ScheduleGateActivity scheduleGate) { - + JobDetail openScheduleGateJob = getOpenScheduleGateJob(); + JobDetail closeScheduleGateJob = getCloseScheduleGateJob(); + //setup the message for scheduling job + openScheduleGateJob.setName("openGate"); + openScheduleGateJob.getJobDataMap().put("gateId",scheduleGate.getActivityId()); + closeScheduleGateJob.setName("closeGate"); + closeScheduleGateJob.getJobDataMap().put("gateId",scheduleGate.getActivityId()); + //create customized triggers + Trigger openGateTrigger = new SimpleTrigger("openGateTrigger", + Scheduler.DEFAULT_GROUP, + scheduleGate.getRealGateOpenTime()); + Trigger closeGateTrigger = new SimpleTrigger("closeGateTrigger", + Scheduler.DEFAULT_GROUP, + scheduleGate.getRealGateCloseTime()); + //start the scheduling job + try + { + scheduler.scheduleJob(openScheduleGateJob, openGateTrigger); + scheduler.scheduleJob(closeScheduleGateJob, closeGateTrigger); + } + catch (SchedulerException e) + { + throw new MonitoringServiceException("Error occurred at " + + "[runGateScheduler]- fail to start scheduling",e); + } } /** @@ -356,6 +391,7 @@ return newLessonClass; } + /** * Setup a new lesson object without class and insert it into the database. * @@ -375,7 +411,7 @@ lessonDAO.saveLesson(newLesson); return newLesson; } - + /** * Setup the empty lesson class according to the run-time learning design * copy. @@ -443,7 +479,7 @@ && !((ToolActivity) activity).getApplyGrouping().booleanValue(); } - /** + /** * (non-Javadoc) * @see org.lamsfoundation.lams.monitoring.service.IMonitoringService#getAllLessons() */ @@ -696,4 +732,20 @@ FlashMessage.ERROR); return flashMessage.serializeMessage(); } + + /** + * + */ + private JobDetail getOpenScheduleGateJob() + { + return (JobDetail)applicationContext.getBean("openScheduleGateJob"); + } + + /** + * + */ + private JobDetail getCloseScheduleGateJob() + { + return (JobDetail)applicationContext.getBean("closeScheduleGateJob"); + } } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringServiceException.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringServiceException.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringServiceException.java 14 Apr 2005 07:56:20 -0000 1.1 @@ -0,0 +1,70 @@ +/*************************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * ***********************************************************************/ + +package org.lamsfoundation.lams.monitoring.service; + + +/** + * Runtime exception that wraps the error condition occurred at monitoring + * side. + * @author Jacky Fang + * @since 2005-4-14 + * @version 1.1 + * + */ +public class MonitoringServiceException extends RuntimeException +{ + + /** + * + */ + public MonitoringServiceException() + { + super(); + } + + /** + * @param message + */ + public MonitoringServiceException(String message) + { + super(message); + } + + /** + * @param cause + */ + public MonitoringServiceException(Throwable cause) + { + super(cause); + } + + /** + * @param message + * @param cause + */ + public MonitoringServiceException(String message, Throwable cause) + { + super(message, cause); + } + +} Index: lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/Attic/monitoringApplicationContext.xml,v diff -u -r1.6 -r1.7 --- lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml 12 Apr 2005 08:09:48 -0000 1.6 +++ lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml 14 Apr 2005 07:56:20 -0000 1.7 @@ -43,9 +43,15 @@ > - - - + + + + + + + + + Index: lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/Attic/TestMonitoringService.java,v diff -u -r1.12 -r1.13 --- lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java 14 Apr 2005 06:20:39 -0000 1.12 +++ lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java 14 Apr 2005 07:56:20 -0000 1.13 @@ -108,14 +108,14 @@ */ protected String[] getContextConfigLocation() { - return new String[] { "WEB-INF/spring/applicationContext.xml", - "/org/lamsfoundation/lams/tool/toolApplicationContext.xml", - "WEB-INF/spring/monitoringApplicationContext.xml", - "/org/lamsfoundation/lams/lesson/lessonApplicationContext.xml", - "/org/lamsfoundation/lams/learningdesign/learningDesignApplicationContext.xml", - "WEB-INF/spring/authoringApplicationContext.xml", - "/org/lamsfoundation/lams/tool/survey/dataAccessContext.xml", - "/org/lamsfoundation/lams/tool/survey/surveyApplicationContext.xml"}; + return new String[] { "/org/lamsfoundation/lams/tool/toolApplicationContext.xml", + "/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml", + "/org/lamsfoundation/lams/lesson/lessonApplicationContext.xml", + "/org/lamsfoundation/lams/learningdesign/learningDesignApplicationContext.xml", + "/WEB-INF/authoringApplicationContext.xml", + "/org/lamsfoundation/lams/tool/survey/dataAccessContext.xml", + "/org/lamsfoundation/lams/tool/survey/surveyApplicationContext.xml", + "applicationContext.xml"}; } /** * @see org.lamsfoundation.lams.AbstractLamsTestCase#getHibernateSessionFactoryName() Index: lams_monitoring/web/WEB-INF/spring/monitoringApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/web/WEB-INF/spring/Attic/monitoringApplicationContext.xml,v diff -u -r1.2 -r1.3 --- lams_monitoring/web/WEB-INF/spring/monitoringApplicationContext.xml 14 Apr 2005 05:29:17 -0000 1.2 +++ lams_monitoring/web/WEB-INF/spring/monitoringApplicationContext.xml 14 Apr 2005 07:56:20 -0000 1.3 @@ -51,6 +51,7 @@ + @@ -66,8 +67,8 @@ - - + + org.lamsfoundation.lams.monitoring.service.OpenScheduleGateJob @@ -95,5 +96,4 @@ -