1 package com.atlassian.scheduler.quartz1;
2
3 import com.atlassian.scheduler.SchedulerServiceException;
4 import com.atlassian.scheduler.config.CronScheduleInfo;
5 import com.atlassian.scheduler.config.IntervalScheduleInfo;
6 import com.atlassian.scheduler.config.JobConfig;
7 import com.atlassian.scheduler.config.JobId;
8 import com.atlassian.scheduler.config.Schedule;
9 import com.atlassian.scheduler.core.spi.SchedulerServiceConfiguration;
10 import com.atlassian.scheduler.core.util.ParameterMapSerializer;
11 import com.atlassian.scheduler.cron.CronSyntaxException;
12 import org.quartz.CronTrigger;
13 import org.quartz.SimpleTrigger;
14 import org.quartz.Trigger;
15
16 import javax.annotation.Nonnull;
17 import java.text.ParseException;
18 import java.util.Date;
19 import java.util.Locale;
20 import java.util.TimeZone;
21
22 import static com.atlassian.scheduler.core.util.CronExpressionQuantizer.quantizeSecondsField;
23 import static com.atlassian.scheduler.core.util.QuartzParseExceptionMapper.mapException;
24 import static com.atlassian.scheduler.core.util.TimeIntervalQuantizer.quantizeToMinutes;
25 import static com.atlassian.scheduler.quartz1.Quartz1SchedulerFacade.QUARTZ_PARAMETERS_KEY;
26 import static com.atlassian.scheduler.quartz1.Quartz1SchedulerFacade.QUARTZ_TRIGGER_GROUP;
27 import static org.quartz.SimpleTrigger.REPEAT_INDEFINITELY;
28
29
30
31
32 class Quartz1TriggerFactory {
33 private final SchedulerServiceConfiguration config;
34 private final ParameterMapSerializer parameterMapSerializer;
35
36 Quartz1TriggerFactory(SchedulerServiceConfiguration config, ParameterMapSerializer parameterMapSerializer) {
37 this.config = config;
38 this.parameterMapSerializer = parameterMapSerializer;
39 }
40
41
42 public Trigger buildTrigger(final JobId jobId, final JobConfig jobConfig)
43 throws SchedulerServiceException {
44 final byte[] parameters = parameterMapSerializer.serializeParameters(jobConfig.getParameters());
45 final Trigger trigger = buildTrigger(jobConfig.getSchedule());
46 trigger.setGroup(QUARTZ_TRIGGER_GROUP);
47 trigger.setName(jobId.toString());
48 trigger.getJobDataMap().put(QUARTZ_PARAMETERS_KEY, parameters);
49 return trigger;
50 }
51
52 public Trigger buildTrigger(Schedule schedule) throws SchedulerServiceException {
53 switch (schedule.getType()) {
54 case INTERVAL:
55 return getSimpleTrigger(schedule.getIntervalScheduleInfo());
56 case CRON_EXPRESSION:
57 return getCronTrigger(schedule.getCronScheduleInfo());
58 }
59 throw new IllegalStateException("type=" + schedule.getType());
60 }
61
62 private static Trigger getSimpleTrigger(final IntervalScheduleInfo info) {
63 final Date startTime = (info.getFirstRunTime() != null) ? info.getFirstRunTime() : new Date();
64 final SimpleTrigger trigger = new SimpleTrigger();
65 trigger.setStartTime(startTime);
66 if (info.getIntervalInMillis() == 0L) {
67 trigger.setRepeatCount(0);
68 } else {
69 trigger.setRepeatCount(REPEAT_INDEFINITELY);
70 trigger.setRepeatInterval(quantizeToMinutes(info.getIntervalInMillis()));
71 }
72 return trigger;
73 }
74
75 private Trigger getCronTrigger(final CronScheduleInfo info) throws CronSyntaxException {
76 try {
77 final CronTrigger trigger = new CronTrigger();
78 trigger.setCronExpression(quantizeSecondsField(info.getCronExpression()));
79 trigger.setTimeZone(getTimeZone(info));
80 return trigger;
81 } catch (ParseException pe) {
82 throw mapException(info.getCronExpression().toUpperCase(Locale.US), pe);
83 }
84 }
85
86 @Nonnull
87 private TimeZone getTimeZone(CronScheduleInfo info) {
88 TimeZone timeZone = info.getTimeZone();
89 if (timeZone == null) {
90 timeZone = config.getDefaultTimeZone();
91 if (timeZone == null) {
92 timeZone = TimeZone.getDefault();
93 }
94 }
95 return timeZone;
96 }
97 }