1 package com.atlassian.core.cron.parser;
2
3 import com.atlassian.core.util.collection.EasyList;
4 import org.apache.log4j.Logger;
5
6 import java.util.List;
7
8
9
10
11
12
13
14
15
16
17
18 public class CronHoursEntry
19 {
20 private static final Logger log = Logger.getLogger(CronHoursEntry.class);
21
22
23
24
25 private static final String REGEX_VALID = "[\\d*/-]+";
26
27
28
29
30 private static final int NO_INCREMENT_PART = -1;
31
32
33
34
35 private static final List ACCEPTED_HOUR_INCREMENTS = EasyList.build(new Integer(NO_INCREMENT_PART), new Integer(1), new Integer(2), new Integer(3));
36
37 static final String INCREMENT_DELIMITER = "/";
38 static final String RANGE_DELIMITER = "-";
39
40 private static final MeridianHour NULL_MERIDIAN_HOUR = new MeridianHour(NO_INCREMENT_PART, null);
41
42 private MeridianHour fromMeridianHour = NULL_MERIDIAN_HOUR;
43 private MeridianHour toMeridianHour = NULL_MERIDIAN_HOUR;
44
45 private MeridianHour runOnceMeridianHour = NULL_MERIDIAN_HOUR;
46
47 private int increment = NO_INCREMENT_PART;
48 private boolean valid = true;
49
50
51
52
53
54 public CronHoursEntry(String cronEntry)
55 {
56 if (cronEntry == null)
57 {
58 throw new IllegalArgumentException("Can not create a cron entry from a null value.");
59 }
60 parseEntry(cronEntry);
61 }
62
63
64
65
66
67 public boolean isValid()
68 {
69 return valid && ACCEPTED_HOUR_INCREMENTS.contains(new Integer(increment));
70 }
71
72
73
74
75
76
77
78
79
80 public int getFrom()
81 {
82 return fromMeridianHour.getHour();
83 }
84
85
86
87
88
89
90
91
92
93 public int getTo()
94 {
95 return toMeridianHour.getHour();
96 }
97
98
99
100
101
102
103 public String getFromMeridian()
104 {
105 return fromMeridianHour.getMeridian();
106 }
107
108
109
110
111
112
113 public String getToMeridian()
114 {
115 return toMeridianHour.getMeridian();
116 }
117
118
119
120
121
122
123 public int getRunOnce()
124 {
125 return runOnceMeridianHour.getHour();
126 }
127
128
129
130
131
132
133 public String getRunOnceMeridian()
134 {
135 return runOnceMeridianHour.getMeridian();
136 }
137
138
139
140
141
142
143 public int getIncrement()
144 {
145 return increment;
146 }
147
148
149
150
151
152
153 public boolean hasIncrement()
154 {
155 return increment != NO_INCREMENT_PART;
156 }
157
158 public boolean isRunOnce()
159 {
160 return !NULL_MERIDIAN_HOUR.equals(runOnceMeridianHour);
161 }
162
163
164
165
166
167
168 private void parseEntry(String cronEntry)
169 {
170 if (!cronEntry.matches(REGEX_VALID))
171 {
172 valid = false;
173 }
174 else
175 {
176
177 if ("*".equals(cronEntry))
178 {
179 this.increment = 1;
180 this.fromMeridianHour = parseMeridianHour("0");
181 this.toMeridianHour = this.fromMeridianHour;
182 return;
183 }
184
185 int slashIndex = cronEntry.indexOf(INCREMENT_DELIMITER);
186 if (slashIndex >= 0)
187 {
188 String incrementStr = cronEntry.substring(slashIndex + 1, cronEntry.length());
189 try
190 {
191 this.increment = Integer.parseInt(incrementStr);
192 }
193 catch (NumberFormatException nfe)
194 {
195 log.debug("The increment portion of the hour cron entry must be an integer.");
196 valid = false;
197 }
198
199 cronEntry = cronEntry.substring(0, slashIndex);
200 }
201
202 int dashIndex = cronEntry.indexOf(RANGE_DELIMITER);
203 if (dashIndex >= 0)
204 {
205 String fromStr = cronEntry.substring(0, dashIndex);
206 this.fromMeridianHour = parseMeridianHour(fromStr);
207
208 String toStr = cronEntry.substring(dashIndex + 1, cronEntry.length());
209
210
211 this.toMeridianHour = parseMeridianHour(incrementHourByOne(toStr));
212 }
213
214
215 else if (hasIncrement())
216 {
217 this.fromMeridianHour = parseMeridianHour(cronEntry);
218 this.toMeridianHour = parseMeridianHour(cronEntry);
219 }
220 else
221 {
222 runOnceMeridianHour = parseMeridianHour(cronEntry);
223 }
224 }
225 }
226
227 private MeridianHour parseMeridianHour(String twentyFourHour)
228 {
229 MeridianHour meridianHour;
230
231 if ("*".equals(twentyFourHour))
232 {
233 twentyFourHour = "0";
234 }
235 meridianHour = MeridianHour.parseMeridianHour(twentyFourHour);
236 if (meridianHour == null)
237 {
238 valid = false;
239 meridianHour = NULL_MERIDIAN_HOUR;
240 }
241 return meridianHour;
242 }
243
244 private String incrementHourByOne(String hour)
245 {
246
247
248 int h = Integer.parseInt(hour);
249 h = (h == 23) ? 0 : h + 1;
250 return "" + h;
251 }
252
253 }