package io.robe.quartz.info; import org.quartz.*; import java.util.Date; import java.util.LinkedList; import java.util.List; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; public abstract class JobInfoProvider { public abstract JobInfo getJob(Class<? extends Job> clazz); /** * Creates an identical JobDetail instance from the given parameters. * * @param info job annotation * @return */ public static JobDetail convert2JobDetail(JobInfo info) { JobKey jobKey = JobKey.jobKey(info.getName()); JobDetail jobDetail = newJob(info.getJobClass()). withIdentity(jobKey). build(); return jobDetail; } public List<Trigger> convert2Triggers(JobInfo dto) { List<Trigger> triggers = new LinkedList<>(); for (TriggerInfo trigDto : dto.getTriggers()) { triggers.add(convert2Trigger(trigDto, dto)); } return triggers; } /** * Creates an identical Trigger instance from the given annotation. * * @param trig * @return */ public static Trigger convert2Trigger(TriggerInfo trig, JobInfo job) { TriggerBuilder<Trigger> builder = newTrigger(); builder.withIdentity(trig.getName(), trig.getGroup()); builder.forJob(job.getName(), job.getGroup()); switch (trig.getType()) { case CRON: setStartEndTime(trig, builder); if (!trig.getCron().isEmpty()) builder.withSchedule(CronScheduleBuilder.cronSchedule(trig.getCron())); break; case SIMPLE: setStartEndTime(trig, builder); setCountIntervalValues(trig, builder); break; } return builder.build(); } /** * Helps to set count and intervals * * @param dto * @param builder */ private static void setCountIntervalValues(TriggerInfo dto, TriggerBuilder<org.quartz.Trigger> builder) { SimpleScheduleBuilder builderSc = SimpleScheduleBuilder.simpleSchedule(); if (dto.getRepeatCount() != 0) builderSc.withRepeatCount(dto.getRepeatCount()); if (dto.getRepeatInterval() > 0) builderSc.withIntervalInMilliseconds(dto.getRepeatInterval()); builder.withSchedule(builderSc); } /** * Helps to set start and end times * * @param dto * @param builder */ private static void setStartEndTime(TriggerInfo dto, TriggerBuilder<org.quartz.Trigger> builder) { if (dto.getStartTime() > -1) builder.startAt(new Date(dto.getStartTime())); else builder.startNow(); if (dto.getEndTime() > -1) builder.endAt(new Date(dto.getEndTime())); } }