--- /dev/null
+/*\r
+ * ============LICENSE_START========================================================================\r
+ * ONAP : tr-069-adapter\r
+ * =================================================================================================\r
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+ * =================================================================================================\r
+ * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
+ * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
+ * may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
+ * either express or implied. See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ===============LICENSE_END=======================================================================\r
+ */\r
+\r
+\r
+package org.commscope.tr069adapter.common.scheduler.impl;\r
+\r
+import static org.commscope.tr069adapter.common.scheduler.impl.QuartzSchedulerConstants.END_TIME_APPENDER;\r
+import static org.commscope.tr069adapter.common.scheduler.impl.QuartzSchedulerConstants.JOB_APPENDER;\r
+import static org.commscope.tr069adapter.common.scheduler.impl.QuartzSchedulerConstants.TRIGGER_APPENDER;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Map.Entry;\r
+import java.util.Set;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.annotation.PreDestroy;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.commscope.tr069adapter.common.scheduler.ExecutionContext;\r
+import org.commscope.tr069adapter.common.scheduler.JobInfo;\r
+import org.commscope.tr069adapter.common.scheduler.SchedulerError;\r
+import org.commscope.tr069adapter.common.scheduler.SchedulerException;\r
+import org.commscope.tr069adapter.common.scheduler.SchedulerManager;\r
+import org.commscope.tr069adapter.common.scheduler.TriggerInfo;\r
+import org.quartz.JobDetail;\r
+import org.quartz.JobExecutionException;\r
+import org.quartz.JobKey;\r
+import org.quartz.JobPersistenceException;\r
+import org.quartz.Scheduler;\r
+import org.quartz.SchedulerConfigException;\r
+import org.quartz.Trigger;\r
+import org.quartz.Trigger.TriggerState;\r
+import org.quartz.TriggerKey;\r
+import org.quartz.UnableToInterruptJobException;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class QuartzSchedulerManager implements SchedulerManager {\r
+\r
+ private static final String EXCEPTION_WHILE_GETTING_GET_JOB_INFO =\r
+ "Exception while getting getJobInfo : ";\r
+\r
+ private static final String ENABLE_JOB_DISABLE_SCHEDULE_FOR_JOB =\r
+ "enableJob : Disable schedule for job ";\r
+\r
+ private static final String METHOD_STARTED = " method started";\r
+\r
+ private static final String EXCEPTION_WHILE_DISABLING_JOB = "Exception while disabling job : ";\r
+\r
+ private static final String EXCEPTION_WHILE_CHECKING_JOB_ENABLE_STATE =\r
+ "Exception while checking job enable state : ";\r
+\r
+ private static final String ENABLE_JOB_ENABLE_SCHEDULE_FOR_JOB =\r
+ "enableJob : Enable schedule for job ";\r
+\r
+ private static final String EXCEPTION_WHILE_GETTING_JOB_LIST =\r
+ "Exception while getting JobList : ";\r
+\r
+ private static final String GET_JOB_LIST_METHOD_ENDED = "getJobList : method ended";\r
+\r
+ private static final String EXCEPTION_WHILE_MODIFYING_SCHEDULE =\r
+ "Exception while modifying schedule : ";\r
+\r
+ private static final String MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB =\r
+ "modifySchedule : Modify schedule for job ";\r
+\r
+ private static final String EXCEPTION_WHILE_DELETING_SCHEDULE =\r
+ "Exception while deleting schedule : ";\r
+\r
+ private static final String DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB =\r
+ "deleteSchedule : Deleting schedule for job ";\r
+\r
+ private static final String EXCEPTION_WHILE_SCHEDULING_JOB_EXCEPTION =\r
+ "Exception while scheduling job. Exception : ";\r
+\r
+ private static final String SUCCESSFULLY_COMPLETED = " successfully completed";\r
+\r
+ private static final String STARTED = " started";\r
+\r
+ private static final String SCHEDULE_JOB_SCHEDUING_JOB = "scheduleJob : Scheduing job ";\r
+\r
+ private static final String QUATZ_SCHEUDLER_FAILED_TO_START_CAUGHT_EXCEPTION =\r
+ "Quatz scheudler failed to start: Caught Exception: ";\r
+\r
+ @Autowired\r
+ private Scheduler quartzScheduler;\r
+\r
+ @Autowired\r
+ QuartzSchedulerProducer quartzSchedulerProducer;\r
+\r
+ private static final Log logger = LogFactory.getLog(QuartzSchedulerManager.class);\r
+\r
+ public void setScheduler(Scheduler scheduler) {\r
+ this.quartzScheduler = scheduler;\r
+ }\r
+\r
+ @Autowired\r
+ QuartzSchedulerUtil schdulerUtil;\r
+\r
+ public void setSchedulerUtil(QuartzSchedulerUtil schedulerUtil) {\r
+ this.schdulerUtil = schedulerUtil;\r
+ }\r
+\r
+ @PostConstruct\r
+ public void init() throws org.quartz.SchedulerException {\r
+ logger.debug("init started");\r
+ try {\r
+ if (!quartzScheduler.isStarted()) {\r
+ logger.debug("Running on active server; hence marking quartz as active service");\r
+ quartzScheduler.start();\r
+ }\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error(QUATZ_SCHEUDLER_FAILED_TO_START_CAUGHT_EXCEPTION + e.getMessage());\r
+ throw e;\r
+ }\r
+\r
+ logger.debug("init complete");\r
+ }\r
+\r
+ @PreDestroy\r
+ public void shutDown() throws org.quartz.SchedulerException {\r
+ try {\r
+ if (!quartzScheduler.isShutdown()) {\r
+ quartzScheduler.shutdown();\r
+ }\r
+\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.debug("Quatz scheudler failed to stop: Caught Exception: " + e.getMessage());\r
+ throw e;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void scheduleJob(String jobName, TriggerInfo triggerInfo, ExecutionContext jobContext)\r
+ throws SchedulerException {\r
+\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName);\r
+ if (null != trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_EXIST_ALREADY);\r
+ try {\r
+ if (quartzScheduler.isInStandbyMode()) {\r
+ logger.debug(\r
+ "scheduleJob : Server running on stand by mode; hence ignore Scheduing job " + jobName);\r
+ return;\r
+ }\r
+\r
+ JobDetail jobDetail = schdulerUtil.getJobDetail(jobContext, jobName);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName);\r
+ quartzScheduler.scheduleJob(jobDetail, trigger);\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_SCHEDULING_JOB_EXCEPTION + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void scheduleJob(String jobName, String jobGroup, TriggerInfo triggerInfo,\r
+ ExecutionContext jobContext) throws SchedulerException {\r
+\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ if (null != trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_EXIST_ALREADY);\r
+ try {\r
+ if (quartzScheduler.isInStandbyMode()) {\r
+ logger.debug("scheduleJob : Server is running on stand by mode; hence ignore Scheduing job "\r
+ + jobName);\r
+ return;\r
+ }\r
+\r
+ JobDetail jobDetail = schdulerUtil.getJobDetail(jobContext, jobName, jobGroup);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName, jobGroup);\r
+ quartzScheduler.scheduleJob(jobDetail, trigger);\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_SCHEDULING_JOB_EXCEPTION + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void scheduleJob(String jobName, String jobGroup, TriggerInfo triggerInfo,\r
+ ExecutionContext jobContext, TriggerInfo expiredTriggerInfo,\r
+ ExecutionContext expiredExecutionContext) throws SchedulerException {\r
+\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName);\r
+ if (null != trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_EXIST_ALREADY);\r
+ try {\r
+ if (quartzScheduler.isInStandbyMode()) {\r
+ logger.debug("scheduleJob : Server is running on stand by mode; hence ignore Scheduing job "\r
+ + jobName);\r
+ return;\r
+ }\r
+\r
+ JobDetail jobDetail = schdulerUtil.getJobDetail(jobContext, jobName, jobGroup);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName, jobGroup);\r
+ quartzScheduler.scheduleJob(jobDetail, trigger);\r
+ if (expiredTriggerInfo != null && expiredExecutionContext != null) {\r
+ if (isJobScheduleExist(jobName + END_TIME_APPENDER, jobGroup)) {\r
+ deleteSchedule(jobName + END_TIME_APPENDER, jobGroup);\r
+ }\r
+ JobDetail expiredJobDetail = schdulerUtil.getJobDetail(expiredExecutionContext,\r
+ jobName + END_TIME_APPENDER, jobGroup);\r
+ Trigger expiredTrigger =\r
+ schdulerUtil.createTrigger(expiredTriggerInfo, jobName + END_TIME_APPENDER, jobGroup);\r
+ quartzScheduler.scheduleJob(expiredJobDetail, expiredTrigger);\r
+ }\r
+ logger.debug(SCHEDULE_JOB_SCHEDUING_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_SCHEDULING_JOB_EXCEPTION + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void deleteSchedule(String jobName) throws SchedulerException {\r
+ try {\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ quartzScheduler.unscheduleJob(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName));\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DELETING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void modifySchedule(String jobName, TriggerInfo triggerInfo) throws SchedulerException {\r
+\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName);\r
+ try {\r
+ if (quartzScheduler.isInStandbyMode()) {\r
+ logger.debug(\r
+ "modifySchedule : Server is running on stand by mode; hence ignore modifySchedule job "\r
+ + jobName);\r
+ }\r
+\r
+ quartzScheduler.rescheduleJob(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName),\r
+ trigger);\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_MODIFYING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void modifySchedule(String jobName, String jobGroup, TriggerInfo triggerInfo,\r
+ TriggerInfo expiredTriggerInfo, ExecutionContext expiredExecutionContext)\r
+ throws SchedulerException {\r
+\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName, jobGroup);\r
+ try {\r
+ quartzScheduler.rescheduleJob(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup),\r
+ trigger);\r
+ Trigger previousExpiredTrig = this.getTrigger(jobName + END_TIME_APPENDER, jobGroup);\r
+ Trigger curExpiredTrigger =\r
+ schdulerUtil.createTrigger(expiredTriggerInfo, jobName + END_TIME_APPENDER, jobGroup);\r
+\r
+ if (previousExpiredTrig != null && expiredTriggerInfo != null) {\r
+ quartzScheduler.rescheduleJob(\r
+ TriggerKey.triggerKey(jobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup),\r
+ curExpiredTrigger);\r
+ } else if (previousExpiredTrig != null) {\r
+ quartzScheduler.unscheduleJob(\r
+ TriggerKey.triggerKey(jobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup));\r
+ } else if (expiredTriggerInfo != null) {\r
+ JobDetail expiredJobDetail = schdulerUtil.getJobDetail(expiredExecutionContext,\r
+ jobName + END_TIME_APPENDER, jobGroup);\r
+ quartzScheduler.scheduleJob(expiredJobDetail, curExpiredTrigger);\r
+ }\r
+\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_MODIFYING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public List<JobInfo> getJobList() {\r
+ final String methodName = "getJobList";\r
+ logger.debug(methodName + " : " + METHOD_STARTED);\r
+ List<String> triggerGroups = null;\r
+ List<JobInfo> jobInfoList = new ArrayList<>();\r
+ try {\r
+ triggerGroups = quartzScheduler.getTriggerGroupNames();\r
+ for (String triggerGroup : triggerGroups) {\r
+ Trigger trigger = quartzScheduler\r
+ .getTrigger(TriggerKey.triggerKey(triggerGroup + TRIGGER_APPENDER, triggerGroup));\r
+ JobInfo jobInfo = new JobInfo();\r
+\r
+ jobInfo.setEnabled(isJobEnabled(triggerGroup));\r
+ jobInfo.setJobName(triggerGroup);\r
+ jobInfo.setTriggerInfo(schdulerUtil.getTriggerInfo(trigger));\r
+ jobInfoList.add(jobInfo);\r
+ logger.debug(GET_JOB_LIST_METHOD_ENDED);\r
+ }\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ logger.error(EXCEPTION_WHILE_GETTING_JOB_LIST + exception.getLocalizedMessage());\r
+ }\r
+ return jobInfoList;\r
+ }\r
+\r
+ @Override\r
+ public JobInfo getJobInfo(String jobId) {\r
+ final String methodName = "getJobInfo";\r
+ logger.debug(methodName + " : " + METHOD_STARTED);\r
+ List<String> triggerGroups = null;\r
+ try {\r
+ triggerGroups = quartzScheduler.getTriggerGroupNames();\r
+ for (String triggerGroup : triggerGroups) {\r
+ Trigger trigger = quartzScheduler\r
+ .getTrigger(TriggerKey.triggerKey(triggerGroup + TRIGGER_APPENDER, triggerGroup));\r
+ JobInfo jobInfo = new JobInfo();\r
+\r
+ jobInfo.setEnabled(isJobEnabled(triggerGroup));\r
+ jobInfo.setJobName(triggerGroup);\r
+ jobInfo.setTriggerInfo(schdulerUtil.getTriggerInfo(trigger));\r
+ if (jobId.equals(triggerGroup)) {\r
+ logger.debug(methodName + " : " + "method ended");\r
+ return jobInfo;\r
+ }\r
+ }\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ logger.error(EXCEPTION_WHILE_GETTING_GET_JOB_INFO + exception.getLocalizedMessage());\r
+ }\r
+ logger.debug(methodName + " : " + "method ended");\r
+ return null;\r
+ }\r
+\r
+ Trigger getTrigger(String jobName) {\r
+ Trigger trigger = null;\r
+ try {\r
+ trigger =\r
+ quartzScheduler.getTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName));\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error(e.getLocalizedMessage());\r
+ }\r
+ return trigger;\r
+ }\r
+\r
+ Trigger getTrigger(String jobName, String jobGroup) {\r
+ Trigger trigger = null;\r
+ try {\r
+ trigger =\r
+ quartzScheduler.getTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup));\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error(e.getLocalizedMessage());\r
+ }\r
+ return trigger;\r
+ }\r
+\r
+ @Override\r
+ public boolean isJobEnabled(String jobName) {\r
+ boolean retVal = true;\r
+\r
+ try {\r
+ Trigger trigger = getTrigger(jobName);\r
+ if (null == trigger)\r
+ return false;\r
+ retVal = quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName))\r
+ .equals(TriggerState.PAUSED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ logger.error(EXCEPTION_WHILE_CHECKING_JOB_ENABLE_STATE + exception.getMessage());\r
+ }\r
+ return !retVal;\r
+ }\r
+\r
+ @Override\r
+ public void enableJob(String jobName) throws SchedulerException {\r
+ logger.debug(ENABLE_JOB_ENABLE_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ try {\r
+ Trigger trigger = getTrigger(jobName);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ if (quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName))\r
+ .equals(TriggerState.PAUSED))\r
+ quartzScheduler.resumeTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName));\r
+\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DISABLING_JOB + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ logger.debug(ENABLE_JOB_ENABLE_SCHEDULE_FOR_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ }\r
+\r
+ @Override\r
+ public void disableJob(String jobName) throws SchedulerException {\r
+ logger.debug(ENABLE_JOB_DISABLE_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ try {\r
+ Trigger trigger = getTrigger(jobName);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ if (!quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName))\r
+ .equals(TriggerState.PAUSED))\r
+ quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobName));\r
+\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DISABLING_JOB + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ logger.debug(ENABLE_JOB_DISABLE_SCHEDULE_FOR_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ }\r
+\r
+ private SchedulerException resolveError(org.quartz.SchedulerException excep) {\r
+ SchedulerException schedulerExcep = new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ try {\r
+ throw excep;\r
+ } catch (JobExecutionException jobExec) {\r
+ logger.error("JobExecutionException : " + jobExec.getMessage());\r
+ schedulerExcep = new SchedulerException(SchedulerError.JOB_EXECUTION_ERROR);\r
+ } catch (JobPersistenceException persistenExcep) {\r
+ schedulerExcep = new SchedulerException(SchedulerError.DATABASE_ERROR);\r
+ } catch (SchedulerConfigException configExcep) {\r
+ schedulerExcep = new SchedulerException(SchedulerError.INVALID_CONFIG);\r
+ } catch (UnableToInterruptJobException interruExcep) {\r
+ schedulerExcep = new SchedulerException(SchedulerError.INTERRUPT_ERROR);\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("SchedulerException : " + e.getMessage());\r
+ }\r
+ return schedulerExcep;\r
+ }\r
+\r
+ @Override\r
+ public boolean isJobExist(String jobName) throws SchedulerException {\r
+ Trigger trigger = this.getTrigger(jobName);\r
+ return (null != trigger);\r
+ }\r
+\r
+ @Override\r
+ public void modifySchedule(String jobName, String jobGroup, TriggerInfo triggerInfo)\r
+ throws SchedulerException {\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ trigger = schdulerUtil.createTrigger(triggerInfo, jobName, jobGroup);\r
+ try {\r
+ quartzScheduler.rescheduleJob(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup),\r
+ trigger);\r
+ logger.debug(MODIFY_SCHEDULE_MODIFY_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ logger.error(EXCEPTION_WHILE_MODIFYING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public void deleteSchedule(String jobName, String jobGroup) throws SchedulerException {\r
+ try {\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ Trigger endTimeTrigger =\r
+ this.getTrigger(jobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup);\r
+ if (null != endTimeTrigger) {\r
+ quartzScheduler.unscheduleJob(\r
+ TriggerKey.triggerKey(jobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ quartzScheduler.unscheduleJob(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup));\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DELETING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ // Delete all jobs together or nothing.\r
+ // TODO- This need to be taken care by Container-Managed Transactions later\r
+\r
+ @Override\r
+ public void deleteSchedule(String startJobName, String endJobName, String monitorJobName,\r
+ String jobGroup) throws SchedulerException {\r
+ try {\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + startJobName + STARTED);\r
+ Trigger trigger1 = this.getTrigger(startJobName, jobGroup);\r
+ Trigger trigger2 = this.getTrigger(endJobName, jobGroup);\r
+ Trigger trigger3 = this.getTrigger(monitorJobName, jobGroup);\r
+\r
+ Trigger endTimeTrigger1 =\r
+ this.getTrigger(startJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup);\r
+ Trigger endTimeTrigger2 =\r
+ this.getTrigger(endJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup);\r
+ Trigger endTimeTrigger3 =\r
+ this.getTrigger(monitorJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup);\r
+\r
+ logger.debug(DELETE_SCHEDULE_DELETING_SCHEDULE_FOR_JOB + startJobName + ", " + endJobName\r
+ + ", " + monitorJobName + SUCCESSFULLY_COMPLETED);\r
+ if (null != endTimeTrigger1) {\r
+ quartzScheduler.unscheduleJob(\r
+ TriggerKey.triggerKey(startJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ if (null != endTimeTrigger2) {\r
+ quartzScheduler.unscheduleJob(\r
+ TriggerKey.triggerKey(endJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ if (null != endTimeTrigger3) {\r
+ quartzScheduler.unscheduleJob(\r
+ TriggerKey.triggerKey(monitorJobName + END_TIME_APPENDER + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ if (null != trigger1) {\r
+ quartzScheduler\r
+ .unscheduleJob(TriggerKey.triggerKey(startJobName + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ if (null != trigger2) {\r
+ quartzScheduler\r
+ .unscheduleJob(TriggerKey.triggerKey(endJobName + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+ if (null != trigger3) {\r
+ quartzScheduler\r
+ .unscheduleJob(TriggerKey.triggerKey(monitorJobName + TRIGGER_APPENDER, jobGroup));\r
+ }\r
+\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DELETING_SCHEDULE + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public boolean isJobEnabled(String jobName, String jobGroup) {\r
+ boolean retVal = true;\r
+\r
+ try {\r
+ Trigger trigger = getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ return false;\r
+ retVal = quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup))\r
+ .equals(TriggerState.PAUSED);\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ logger.error(EXCEPTION_WHILE_CHECKING_JOB_ENABLE_STATE + exception.getMessage());\r
+ }\r
+ return !retVal;\r
+ }\r
+\r
+ @Override\r
+ public void enableJob(String jobName, String jobGroup) throws SchedulerException {\r
+ logger.debug(ENABLE_JOB_ENABLE_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ try {\r
+ Trigger trigger = getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ if (quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup))\r
+ .equals(TriggerState.PAUSED))\r
+ quartzScheduler.resumeTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup));\r
+\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DISABLING_JOB + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ logger.debug(ENABLE_JOB_ENABLE_SCHEDULE_FOR_JOB + jobName + SUCCESSFULLY_COMPLETED);\r
+\r
+ }\r
+\r
+ @Override\r
+ public void disableJob(String jobName, String jobGroup) throws SchedulerException {\r
+ logger.debug(ENABLE_JOB_DISABLE_SCHEDULE_FOR_JOB + jobName + STARTED);\r
+ try {\r
+ Trigger trigger = getTrigger(jobName, jobGroup);\r
+ if (null == trigger)\r
+ throw new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ if (!quartzScheduler\r
+ .getTriggerState(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup))\r
+ .equals(TriggerState.PAUSED))\r
+ quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName + TRIGGER_APPENDER, jobGroup));\r
+\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ SchedulerException scheduleExcep = resolveError(exception);\r
+ if (scheduleExcep.getScheduleError() == SchedulerError.UNKNOWN_ERROR)\r
+ scheduleExcep = new SchedulerException(SchedulerError.SCHEDULE_DOES_NOT_EXIST);\r
+ logger.error(EXCEPTION_WHILE_DISABLING_JOB + exception.getMessage());\r
+ throw scheduleExcep;\r
+ }\r
+ logger.debug(ENABLE_JOB_DISABLE_SCHEDULE_FOR_JOB + jobName + " completed");\r
+\r
+ }\r
+\r
+ @Override\r
+ public boolean isJobExist(String jobName, String jobGroup) throws SchedulerException {\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ return (null != trigger);\r
+ }\r
+\r
+ @Override\r
+ public JobInfo getJobInfo(String jobId, String jobGroup) {\r
+ final String methodName = "getJobInfo";\r
+ logger.debug(methodName + " : " + METHOD_STARTED);\r
+ try {\r
+ TriggerKey triggerKey = TriggerKey.triggerKey(jobId + TRIGGER_APPENDER, jobGroup);\r
+ Trigger trigger = quartzScheduler.getTrigger(triggerKey);\r
+ if (null != trigger) {\r
+ JobInfo jobInfo = new JobInfo();\r
+ TriggerState triggerState = quartzScheduler.getTriggerState(triggerKey);\r
+ jobInfo.setEnabled(TriggerState.PAUSED.equals(triggerState));\r
+ jobInfo.setJobName(jobId);\r
+ jobInfo.setTriggerInfo(schdulerUtil.getTriggerInfo(trigger));\r
+ logger.debug(methodName + " : method ended");\r
+ return jobInfo;\r
+ }\r
+ } catch (org.quartz.SchedulerException exception) {\r
+ logger.error(EXCEPTION_WHILE_GETTING_GET_JOB_INFO + exception.getLocalizedMessage());\r
+ }\r
+ logger.debug(methodName + " : method ended");\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public boolean isJobScheduleExist(String jobName, String jobGroup) throws SchedulerException {\r
+ Trigger trigger = this.getTrigger(jobName, jobGroup);\r
+ return null != trigger;\r
+ }\r
+\r
+ @Override\r
+ public void updateJobData(String jobName, String jobGroup, Map<String, Object> jobData)\r
+ throws SchedulerException {\r
+ try {\r
+ JobDetail jobDetail =\r
+ quartzScheduler.getJobDetail(new JobKey(jobName + JOB_APPENDER, jobGroup));\r
+ if (null != jobDetail) {\r
+ for (Entry<String, Object> job : jobData.entrySet()) {\r
+ jobDetail.getJobDataMap().put(job.getKey(), job.getValue());\r
+ }\r
+ quartzScheduler.addJob(jobDetail, true, true);\r
+ }\r
+\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("Failed to update job data", e);\r
+ throw new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public Map<String, Object> getJobData(String jobName, String jobGroup) throws SchedulerException {\r
+\r
+ Map<String, Object> jobData = new HashMap<>();\r
+ try {\r
+ JobDetail jobDetail =\r
+ quartzScheduler.getJobDetail(new JobKey(jobName + JOB_APPENDER, jobGroup));\r
+ if (null == jobDetail)\r
+ return jobData;\r
+ for (String key : jobDetail.getJobDataMap().keySet()) {\r
+ jobData.put(key, jobDetail.getJobDataMap().get(key));\r
+ }\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("Failed to get job data", e);\r
+ throw new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ }\r
+ return jobData;\r
+ }\r
+\r
+ @Override\r
+ public void deleteJobData(String jobName, String jobGroup, Set<String> keys)\r
+ throws SchedulerException {\r
+ try {\r
+ JobDetail jobDetail =\r
+ quartzScheduler.getJobDetail(new JobKey(jobName + JOB_APPENDER, jobGroup));\r
+ for (String key : keys) {\r
+ jobDetail.getJobDataMap().remove(key);\r
+ }\r
+ quartzScheduler.addJob(jobDetail, true, true);\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("Failed to update job data", e);\r
+ throw new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public boolean resumeQuartzSchedulars() throws SchedulerException {\r
+\r
+ try {\r
+ if (quartzScheduler.isInStandbyMode()) {\r
+ logger.debug("Server is running on active server; hence marking quartz as active service");\r
+ quartzScheduler.start();\r
+ } else if (quartzScheduler.isStarted()) {\r
+ logger.debug("Server is running on active server and quartz already running;");\r
+ }\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error(QUATZ_SCHEUDLER_FAILED_TO_START_CAUGHT_EXCEPTION + e.getMessage());\r
+ throw new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public boolean stopQuartzSchedulars() throws SchedulerException {\r
+ try {\r
+\r
+ if (quartzScheduler.isStarted()) {\r
+ logger.debug("DM is running on stand-by server; hence marking quartz as stand-by service");\r
+ quartzScheduler.standby();\r
+ } else {\r
+ logger.debug("DM is running on active server/quartz already running in standby mode;");\r
+ }\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error(QUATZ_SCHEUDLER_FAILED_TO_START_CAUGHT_EXCEPTION + e.getMessage());\r
+ throw new SchedulerException(SchedulerError.UNKNOWN_ERROR);\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public void switchToStandby() throws SchedulerException {\r
+ try {\r
+ if (null != quartzScheduler) {\r
+ quartzScheduler.shutdown();\r
+ }\r
+ quartzScheduler = quartzSchedulerProducer.getStdScheduler();\r
+ if (null != quartzScheduler)\r
+ quartzScheduler.standby();\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("while switchToStandby SchedulerException : " + e.getMessage());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void switchToActive() throws SchedulerException {\r
+\r
+ try {\r
+ if (null != quartzScheduler) {\r
+ quartzScheduler.shutdown();\r
+ }\r
+\r
+ quartzScheduler = quartzSchedulerProducer.getStdScheduler();\r
+ if (null != quartzScheduler)\r
+ quartzScheduler.start();\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("while switchToActive SchedulerException : " + e.getMessage());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public boolean isQuartzRunninginActiveMode() {\r
+ try {\r
+ if (!quartzScheduler.getSchedulerInstanceId().endsWith("_standby")\r
+ && quartzScheduler.isStarted())\r
+ return true;\r
+ } catch (org.quartz.SchedulerException e) {\r
+ logger.error("Quatz scheudler failed to retrive mode: Caught Exception: " + e.getMessage());\r
+ }\r
+ return false;\r
+ }\r
+}\r