private String getSchedulerName(final ScheduledJobDetail scheduledJobDetail) {
   final StringBuilder sb = new StringBuilder(20);
   final MifosPlatformTenant tenant = ThreadLocalContextUtil.getTenant();
   sb.append(SchedulerServiceConstants.SCHEDULER).append(tenant.getId());
   if (scheduledJobDetail.getSchedulerGroup() > 0) {
     sb.append(SchedulerServiceConstants.SCHEDULER_GROUP)
         .append(scheduledJobDetail.getSchedulerGroup());
   }
   return sb.toString();
 }
 private JobDetail createJobDetail(final ScheduledJobDetail scheduledJobDetail) throws Exception {
   final MifosPlatformTenant tenant = ThreadLocalContextUtil.getTenant();
   final ClassMethodNamesPair jobDetails =
       CronMethodParser.findTargetMethodDetails(scheduledJobDetail.getJobName());
   if (jobDetails == null) {
     throw new IllegalArgumentException(
         "Code has no @CronTarget with this job name (@see JobName); seems like DB/code are not in line: "
             + scheduledJobDetail.getJobName());
   }
   final Object targetObject = getBeanObject(Class.forName(jobDetails.className));
   final MethodInvokingJobDetailFactoryBean jobDetailFactoryBean =
       new MethodInvokingJobDetailFactoryBean();
   jobDetailFactoryBean.setName(scheduledJobDetail.getJobName() + "JobDetail" + tenant.getId());
   jobDetailFactoryBean.setTargetObject(targetObject);
   jobDetailFactoryBean.setTargetMethod(jobDetails.methodName);
   jobDetailFactoryBean.setGroup(scheduledJobDetail.getGroupName());
   jobDetailFactoryBean.setConcurrent(false);
   jobDetailFactoryBean.afterPropertiesSet();
   return jobDetailFactoryBean.getObject();
 }
 private Trigger createTrigger(
     final ScheduledJobDetail scheduledJobDetails, final JobDetail jobDetail) {
   try {
     final MifosPlatformTenant tenant = ThreadLocalContextUtil.getTenant();
     final CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
     cronTriggerFactoryBean.setName(scheduledJobDetails.getJobName() + "Trigger" + tenant.getId());
     cronTriggerFactoryBean.setJobDetail(jobDetail);
     final JobDataMap jobDataMap = new JobDataMap();
     jobDataMap.put(SchedulerServiceConstants.TENANT_IDENTIFIER, tenant.getTenantIdentifier());
     cronTriggerFactoryBean.setJobDataMap(jobDataMap);
     final TimeZone timeZone = TimeZone.getTimeZone(tenant.getTimezoneId());
     cronTriggerFactoryBean.setTimeZone(timeZone);
     cronTriggerFactoryBean.setGroup(scheduledJobDetails.getGroupName());
     cronTriggerFactoryBean.setCronExpression(scheduledJobDetails.getCronExpression());
     cronTriggerFactoryBean.setPriority(scheduledJobDetails.getTaskPriority());
     cronTriggerFactoryBean.afterPropertiesSet();
     return cronTriggerFactoryBean.getObject();
   } catch (ParseException e) {
     throw new RuntimeException(e);
   }
 }