|
1 |
| |
|
2 |
| package org.objectledge.scheduler.cron; |
|
3 |
| |
|
4 |
| import java.io.StringReader; |
|
5 |
| import java.io.FileInputStream; |
|
6 |
| import java.io.InputStreamReader; |
|
7 |
| import java.io.PrintWriter; |
|
8 |
| import java.io.Reader; |
|
9 |
| |
|
10 |
| import java.util.ArrayList; |
|
11 |
| import java.util.List; |
|
12 |
| import java.util.Iterator; |
|
13 |
| import java.util.Collections; |
|
14 |
| |
|
15 |
| public class CronParser implements CronParserConstants { |
|
16 |
| |
|
17 |
| |
|
18 |
| private static final String[] monthName = new String[] { |
|
19 |
| "", |
|
20 |
| "jan" , "feb" , "mar" , "apr" , "may" , "jun" , |
|
21 |
| "jul" , "aug" , "sep" , "oct" , "nov" , "dec" }; |
|
22 |
| |
|
23 |
| private static final String[] weekdayName = new String[] { |
|
24 |
| "sun", "mon" , "tue" , "wed" , "thu" , "fri" , "sat" }; |
|
25 |
| |
|
26 |
| private static final int[][] spec_reboot = new int[][] {}; |
|
27 |
| |
|
28 |
| private static final int[][] spec_yearly = new int[][] |
|
29 |
| { { 0 }, { 0 }, { 1 }, { 1 }, { } }; |
|
30 |
| |
|
31 |
| private static final int[][] spec_monthly = new int[][] |
|
32 |
| { { 0 }, { 0 }, { 1 }, { }, { } }; |
|
33 |
| |
|
34 |
| private static final int[][] spec_weekly = new int[][] |
|
35 |
| { { 0 }, { 0 }, { }, { }, { 0 } }; |
|
36 |
| |
|
37 |
| private static final int[][] spec_daily = new int[][] |
|
38 |
| { { 0 }, { 0 }, { }, { }, { } }; |
|
39 |
| |
|
40 |
| private static final int[][] spec_hourly = new int[][] |
|
41 |
| { { 0 }, { }, { }, { }, { } }; |
|
42 |
| |
|
43 |
736
| public int[][] parse(String config)
|
|
44 |
| throws ParseException, |
|
45 |
| ValueOutOfRangeException |
|
46 |
| { |
|
47 |
736
| StringReader sr = new StringReader(config);
|
|
48 |
736
| ReInit(sr);
|
|
49 |
644
| return cron_config();
|
|
50 |
| } |
|
51 |
| |
|
52 |
| |
|
53 |
| |
|
54 |
0
| public static void main(String[] args)
|
|
55 |
| throws Exception |
|
56 |
| { |
|
57 |
0
| FileInputStream fis = new FileInputStream(args[0]);
|
|
58 |
0
| Reader reader = new InputStreamReader(fis, "ISO-8859-2");
|
|
59 |
0
| CronParser parser = new CronParser(reader);
|
|
60 |
0
| parser.test();
|
|
61 |
| } |
|
62 |
| |
|
63 |
0
| public static void dump(int[][] config)
|
|
64 |
| { |
|
65 |
0
| if(config.length == 0)
|
|
66 |
| { |
|
67 |
0
| System.out.print("@reboot");
|
|
68 |
| } |
|
69 |
| else |
|
70 |
| { |
|
71 |
0
| for(int i=0; i<config.length; i++)
|
|
72 |
| { |
|
73 |
0
| if(config[i].length == 0)
|
|
74 |
| { |
|
75 |
0
| System.out.print("*");
|
|
76 |
| } |
|
77 |
| else |
|
78 |
| { |
|
79 |
0
| for(int j=0; j<config[i].length; j++)
|
|
80 |
| { |
|
81 |
0
| System.out.print(config[i][j]);
|
|
82 |
0
| if(j < config[i].length - 1)
|
|
83 |
| { |
|
84 |
0
| System.out.print(",");
|
|
85 |
| } |
|
86 |
| } |
|
87 |
| } |
|
88 |
0
| if(i < config.length - 1)
|
|
89 |
| { |
|
90 |
0
| System.out.print(" ");
|
|
91 |
| } |
|
92 |
| } |
|
93 |
| } |
|
94 |
0
| System.out.println();
|
|
95 |
| } |
|
96 |
| |
|
97 |
| |
|
98 |
138
| final public int number(int min, int max) throws ParseException {
|
|
99 |
138
| Token t;
|
|
100 |
138
| t = jj_consume_token(NUMBER);
|
|
101 |
138
| int v = Integer.parseInt(t.image);
|
|
102 |
138
| if(min > 0 && max > 0 && (v < min || v > max))
|
|
103 |
| { |
|
104 |
0
| {if (true) throw new ValueOutOfRangeException(t, v, min, max);}
|
|
105 |
| } |
|
106 |
138
| {if (true) return v;}
|
|
107 |
0
| throw new Error("Missing return statement in function");
|
|
108 |
| } |
|
109 |
| |
|
110 |
46
| final public List range(int min, int max) throws ParseException {
|
|
111 |
46
| int start, end;
|
|
112 |
46
| int step = -1;
|
|
113 |
46
| start = number(min,max);
|
|
114 |
46
| jj_consume_token(5);
|
|
115 |
46
| end = number(min,max);
|
|
116 |
46
| switch (jj_nt.kind) {
|
|
117 |
46
| case 6:
|
|
118 |
46
| jj_consume_token(6);
|
|
119 |
46
| step = number(-1,-1);
|
|
120 |
46
| break;
|
|
121 |
0
| default:
|
|
122 |
0
| jj_la1[0] = jj_gen;
|
|
123 |
| ; |
|
124 |
| } |
|
125 |
46
| List result = new ArrayList();
|
|
126 |
46
| if(step < 0)
|
|
127 |
| { |
|
128 |
0
| step = 1;
|
|
129 |
| } |
|
130 |
46
| for(int i=start; i<=end; i+=step)
|
|
131 |
| { |
|
132 |
46
| result.add(new Integer(i));
|
|
133 |
| } |
|
134 |
46
| {if (true) return result;}
|
|
135 |
0
| throw new Error("Missing return statement in function");
|
|
136 |
| } |
|
137 |
| |
|
138 |
46
| final public List value_or_range(int min, int max) throws ParseException {
|
|
139 |
46
| Token value = null;
|
|
140 |
46
| List range = null;
|
|
141 |
46
| if (jj_2_1(2)) {
|
|
142 |
46
| range = range(min, max);
|
|
143 |
| } else { |
|
144 |
0
| switch (jj_nt.kind) {
|
|
145 |
0
| case NUMBER:
|
|
146 |
0
| value = jj_consume_token(NUMBER);
|
|
147 |
0
| break;
|
|
148 |
0
| default:
|
|
149 |
0
| jj_la1[1] = jj_gen;
|
|
150 |
0
| jj_consume_token(-1);
|
|
151 |
0
| throw new ParseException();
|
|
152 |
| } |
|
153 |
| } |
|
154 |
46
| if(value != null)
|
|
155 |
| { |
|
156 |
0
| List result = new ArrayList();
|
|
157 |
0
| result.add(new Integer(value.image));
|
|
158 |
0
| {if (true) return result;}
|
|
159 |
| } |
|
160 |
| else |
|
161 |
| { |
|
162 |
46
| {if (true) return range;}
|
|
163 |
| } |
|
164 |
0
| throw new Error("Missing return statement in function");
|
|
165 |
| } |
|
166 |
| |
|
167 |
46
| final public List list_of_values(int min, int max) throws ParseException {
|
|
168 |
46
| List temp = new ArrayList();
|
|
169 |
46
| List var;
|
|
170 |
46
| var = value_or_range(min, max);
|
|
171 |
46
| temp.add(var);
|
|
172 |
46
| label_1:
|
|
173 |
| while (true) { |
|
174 |
46
| switch (jj_nt.kind) {
|
|
175 |
0
| case 7:
|
|
176 |
| ; |
|
177 |
0
| break;
|
|
178 |
46
| default:
|
|
179 |
46
| jj_la1[2] = jj_gen;
|
|
180 |
46
| break label_1;
|
|
181 |
| } |
|
182 |
0
| jj_consume_token(7);
|
|
183 |
0
| var = value_or_range(min, max);
|
|
184 |
0
| temp.add(var);
|
|
185 |
| } |
|
186 |
46
| List result = new ArrayList();
|
|
187 |
46
| Iterator i = temp.iterator();
|
|
188 |
46
| while(i.hasNext())
|
|
189 |
| { |
|
190 |
46
| result.addAll((List)i.next());
|
|
191 |
| } |
|
192 |
46
| Collections.sort(result);
|
|
193 |
46
| {if (true) return result;}
|
|
194 |
0
| throw new Error("Missing return statement in function");
|
|
195 |
| } |
|
196 |
| |
|
197 |
2806
| final public int[] value_spec(int min, int max) throws ParseException {
|
|
198 |
2806
| List list=null;
|
|
199 |
2806
| switch (jj_nt.kind) {
|
|
200 |
2760
| case 8:
|
|
201 |
2760
| jj_consume_token(8);
|
|
202 |
2760
| break;
|
|
203 |
46
| case NUMBER:
|
|
204 |
46
| list = list_of_values(min, max);
|
|
205 |
46
| break;
|
|
206 |
0
| default:
|
|
207 |
0
| jj_la1[3] = jj_gen;
|
|
208 |
0
| jj_consume_token(-1);
|
|
209 |
0
| throw new ParseException();
|
|
210 |
| } |
|
211 |
2806
| if(list == null)
|
|
212 |
| { |
|
213 |
2760
| {if (true) return new int[0];}
|
|
214 |
| } |
|
215 |
| else |
|
216 |
| { |
|
217 |
46
| int[] result = new int[list.size()];
|
|
218 |
46
| for(int i=0; i < list.size(); i++)
|
|
219 |
| { |
|
220 |
46
| result[i] = ((Integer)list.get(i)).intValue();
|
|
221 |
| } |
|
222 |
46
| {if (true) return result;}
|
|
223 |
| } |
|
224 |
0
| throw new Error("Missing return statement in function");
|
|
225 |
| } |
|
226 |
| |
|
227 |
92
| final public int[] month_name() throws ParseException {
|
|
228 |
92
| switch (jj_nt.kind) {
|
|
229 |
92
| case 9:
|
|
230 |
92
| jj_consume_token(9);
|
|
231 |
92
| break;
|
|
232 |
0
| case 10:
|
|
233 |
0
| jj_consume_token(10);
|
|
234 |
0
| break;
|
|
235 |
0
| case 11:
|
|
236 |
0
| jj_consume_token(11);
|
|
237 |
0
| break;
|
|
238 |
0
| case 12:
|
|
239 |
0
| jj_consume_token(12);
|
|
240 |
0
| break;
|
|
241 |
0
| case 13:
|
|
242 |
0
| jj_consume_token(13);
|
|
243 |
0
| break;
|
|
244 |
0
| case 14:
|
|
245 |
0
| jj_consume_token(14);
|
|
246 |
0
| break;
|
|
247 |
0
| case 15:
|
|
248 |
0
| jj_consume_token(15);
|
|
249 |
0
| break;
|
|
250 |
0
| case 16:
|
|
251 |
0
| jj_consume_token(16);
|
|
252 |
0
| break;
|
|
253 |
0
| case 17:
|
|
254 |
0
| jj_consume_token(17);
|
|
255 |
0
| break;
|
|
256 |
0
| case 18:
|
|
257 |
0
| jj_consume_token(18);
|
|
258 |
0
| break;
|
|
259 |
0
| case 19:
|
|
260 |
0
| jj_consume_token(19);
|
|
261 |
0
| break;
|
|
262 |
0
| case 20:
|
|
263 |
0
| jj_consume_token(20);
|
|
264 |
0
| break;
|
|
265 |
0
| default:
|
|
266 |
0
| jj_la1[4] = jj_gen;
|
|
267 |
0
| jj_consume_token(-1);
|
|
268 |
0
| throw new ParseException();
|
|
269 |
| } |
|
270 |
92
| String t = getToken(0).image;
|
|
271 |
184
| for(int i=0; i<12; i++)
|
|
272 |
184
| if(monthName[i].equals(t))
|
|
273 |
| { |
|
274 |
92
| {if (true) return new int[] { i };}
|
|
275 |
| } |
|
276 |
0
| {if (true) throw new InternalError();}
|
|
277 |
0
| throw new Error("Missing return statement in function");
|
|
278 |
| } |
|
279 |
| |
|
280 |
92
| final public int[] weekday_name() throws ParseException {
|
|
281 |
92
| switch (jj_nt.kind) {
|
|
282 |
92
| case 21:
|
|
283 |
92
| jj_consume_token(21);
|
|
284 |
92
| break;
|
|
285 |
0
| case 22:
|
|
286 |
0
| jj_consume_token(22);
|
|
287 |
0
| break;
|
|
288 |
0
| case 23:
|
|
289 |
0
| jj_consume_token(23);
|
|
290 |
0
| break;
|
|
291 |
0
| case 24:
|
|
292 |
0
| jj_consume_token(24);
|
|
293 |
0
| break;
|
|
294 |
0
| case 25:
|
|
295 |
0
| jj_consume_token(25);
|
|
296 |
0
| break;
|
|
297 |
0
| case 26:
|
|
298 |
0
| jj_consume_token(26);
|
|
299 |
0
| break;
|
|
300 |
0
| case 27:
|
|
301 |
0
| jj_consume_token(27);
|
|
302 |
0
| break;
|
|
303 |
0
| default:
|
|
304 |
0
| jj_la1[5] = jj_gen;
|
|
305 |
0
| jj_consume_token(-1);
|
|
306 |
0
| throw new ParseException();
|
|
307 |
| } |
|
308 |
92
| String t = getToken(0).image;
|
|
309 |
184
| for(int i=0; i<7; i++)
|
|
310 |
184
| if(weekdayName[i].equals(t))
|
|
311 |
| { |
|
312 |
92
| {if (true) return new int[] { i };}
|
|
313 |
| } |
|
314 |
0
| {if (true) throw new InternalError();}
|
|
315 |
0
| throw new Error("Missing return statement in function");
|
|
316 |
| } |
|
317 |
| |
|
318 |
46
| final public int[][] special_config() throws ParseException {
|
|
319 |
46
| switch (jj_nt.kind) {
|
|
320 |
0
| case 28:
|
|
321 |
0
| jj_consume_token(28);
|
|
322 |
0
| {if (true) return spec_reboot;}
|
|
323 |
0
| break;
|
|
324 |
46
| case 29:
|
|
325 |
46
| jj_consume_token(29);
|
|
326 |
46
| {if (true) return spec_yearly;}
|
|
327 |
0
| break;
|
|
328 |
0
| case 30:
|
|
329 |
0
| jj_consume_token(30);
|
|
330 |
0
| {if (true) return spec_yearly;}
|
|
331 |
0
| break;
|
|
332 |
0
| case 31:
|
|
333 |
0
| jj_consume_token(31);
|
|
334 |
0
| {if (true) return spec_monthly;}
|
|
335 |
0
| break;
|
|
336 |
0
| case 32:
|
|
337 |
0
| jj_consume_token(32);
|
|
338 |
0
| {if (true) return spec_daily;}
|
|
339 |
0
| break;
|
|
340 |
0
| case 33:
|
|
341 |
0
| jj_consume_token(33);
|
|
342 |
0
| {if (true) return spec_daily;}
|
|
343 |
0
| break;
|
|
344 |
0
| case 34:
|
|
345 |
0
| jj_consume_token(34);
|
|
346 |
0
| {if (true) return spec_hourly;}
|
|
347 |
0
| break;
|
|
348 |
0
| default:
|
|
349 |
0
| jj_la1[6] = jj_gen;
|
|
350 |
0
| jj_consume_token(-1);
|
|
351 |
0
| throw new ParseException();
|
|
352 |
| } |
|
353 |
0
| throw new Error("Missing return statement in function");
|
|
354 |
| } |
|
355 |
| |
|
356 |
644
| final public int[][] cron_config() throws ParseException {
|
|
357 |
644
| int[] minute = null;
|
|
358 |
644
| int[] hour = null;
|
|
359 |
644
| int[] day = null;
|
|
360 |
644
| int[] month = null;
|
|
361 |
644
| int[] weekday = null;
|
|
362 |
644
| int[][] special = null;
|
|
363 |
644
| switch (jj_nt.kind) {
|
|
364 |
0
| case 28:
|
|
365 |
46
| case 29:
|
|
366 |
0
| case 30:
|
|
367 |
0
| case 31:
|
|
368 |
0
| case 32:
|
|
369 |
0
| case 33:
|
|
370 |
0
| case 34:
|
|
371 |
46
| special = special_config();
|
|
372 |
46
| break;
|
|
373 |
46
| case NUMBER:
|
|
374 |
552
| case 8:
|
|
375 |
598
| minute = value_spec(0,59);
|
|
376 |
598
| hour = value_spec(0,23);
|
|
377 |
598
| day = value_spec(1,31);
|
|
378 |
598
| switch (jj_nt.kind) {
|
|
379 |
92
| case 9:
|
|
380 |
0
| case 10:
|
|
381 |
0
| case 11:
|
|
382 |
0
| case 12:
|
|
383 |
0
| case 13:
|
|
384 |
0
| case 14:
|
|
385 |
0
| case 15:
|
|
386 |
0
| case 16:
|
|
387 |
0
| case 17:
|
|
388 |
0
| case 18:
|
|
389 |
0
| case 19:
|
|
390 |
0
| case 20:
|
|
391 |
92
| month = month_name();
|
|
392 |
92
| break;
|
|
393 |
0
| case NUMBER:
|
|
394 |
506
| case 8:
|
|
395 |
506
| month = value_spec(1,12);
|
|
396 |
506
| break;
|
|
397 |
0
| default:
|
|
398 |
0
| jj_la1[7] = jj_gen;
|
|
399 |
0
| jj_consume_token(-1);
|
|
400 |
0
| throw new ParseException();
|
|
401 |
| } |
|
402 |
598
| switch (jj_nt.kind) {
|
|
403 |
92
| case 21:
|
|
404 |
0
| case 22:
|
|
405 |
0
| case 23:
|
|
406 |
0
| case 24:
|
|
407 |
0
| case 25:
|
|
408 |
0
| case 26:
|
|
409 |
0
| case 27:
|
|
410 |
92
| weekday = weekday_name();
| <