View Javadoc

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   * @since v1.0
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  }