Initial source code
[oam/tr069-adapter.git] / common / src / main / java / org / commscope / tr069adapter / common / scheduler / impl / QuartzSchedulerManager.java
diff --git a/common/src/main/java/org/commscope/tr069adapter/common/scheduler/impl/QuartzSchedulerManager.java b/common/src/main/java/org/commscope/tr069adapter/common/scheduler/impl/QuartzSchedulerManager.java
new file mode 100644 (file)
index 0000000..93f3f8a
--- /dev/null
@@ -0,0 +1,813 @@
+/*\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