Source code: org/media/mn8/util/cron/CronMultiplier.java
1 /*
2 * $COPYRIGHT$
3 * $Id: CronMultiplier.java,v 1.1 2002/10/25 20:40:49 atech Exp $
4 *
5 * Date Author Changes
6 * May 16 2002 Antal Attila Created
7 */
8
9 package org.media.mn8.util.cron;
10
11 import java.util.Vector;
12 import java.util.StringTokenizer;
13
14 /**
15 * This is the multiplier for crons to make crons with (*), intervals (3-12),
16 * selectors (2-8/2) and lists (3,4,8).
17 *
18 * @author <a href="mailto:atech@nolimits.ro">Antal Attila</a>
19 */
20 public class CronMultiplier {
21
22 CronElement ce = new CronElement();
23 private Vector avalonCrons = new Vector();
24 private Vector repMins = new Vector();
25 private Vector repHours = new Vector();
26 private Vector repDays = new Vector();
27 private Vector repMonths = new Vector();
28 private Vector repWeekDays = new Vector();
29 private boolean weekDaysFound = true;
30 private boolean mnthDaysFound = true;
31 private byte paramNr = 1;
32 private String errMsg;
33 public boolean ignored = false;
34
35 public CronMultiplier() {}
36
37 public void setMaker( String cron ) {
38 StringTokenizer st = new StringTokenizer( cron, " " );
39 while (st.hasMoreTokens() && paramNr <= 5 ) {
40 comaParser( st.nextToken() );
41 paramNr++;
42 }
43 wormCollector();
44 }
45
46 public void wormCollector() {
47 if ( weekDaysFound ) makeCronElements( repWeekDays, true );
48 if ( mnthDaysFound ) makeCronElements( repDays, false );
49 if ( !weekDaysFound && !mnthDaysFound )
50 makeCronElements( repDays, false );
51 }
52
53 public void makeCronElements( Vector days, boolean week) {
54 byte min, hour, day, month;
55 for ( int i = 0; i < repMins.size(); i++ ) {
56 min = ((Integer)repMins.get(i)).byteValue();
57 for ( int j = 0; j < repHours.size(); j++ ) {
58 hour = ((Integer)repHours.get(j)).byteValue();
59 for ( int k = 0; k < days.size(); k++ ) {
60 day = ((Integer)days.get(k)).byteValue();
61 for ( int l = 0; l < repMonths.size(); l++ ) {
62 month = ((Integer)repMonths.get(l)).byteValue();
63 CronElement newCE = new CronElement();
64 newCE.min = min;
65 newCE.hour = hour;
66 newCE.day = day;
67 newCE.month = month;
68 newCE.week = week;
69 avalonCrons.addElement( newCE );
70 }
71 }
72 }
73 }
74 }
75
76 public void setCurrent( int current ) {
77 ce = ( CronElement )avalonCrons.elementAt( current );
78 }
79
80
81 public int getSize() {
82 return avalonCrons.size();
83 }
84
85
86 public int getMin() {
87 return ce.min;
88 }
89
90
91 public int getHour() {
92 return ce.hour;
93 }
94
95
96 public int getDay() {
97 return ce.day;
98 }
99
100
101 public int getMonth() {
102 return ce.month;
103 }
104
105
106 public boolean getIsDayOfWeek() {
107 return ce.week;
108 }
109
110
111 public String getErrMsg() {
112 return errMsg;
113 }
114
115
116 private byte paramLow( byte par ) {
117 if ( par == 1 || par == 2 || par == 5 ) return 0;
118 else return 1;
119 }
120
121
122 private byte paramHigh( byte par ) {
123 if ( par == 1 ) return 59;
124 else if ( par == 2 ) return 23;
125 else if ( par == 3 ) return 31;
126 else if ( par == 4 ) return 12;
127 else return 7;
128 }
129
130
131 private void comaParser( String worm ) {
132 byte avalonTypeOfAll = -1;
133 StringTokenizer coma = new StringTokenizer( worm, ",");
134 while ( coma.hasMoreTokens() ) {
135 String _coma = coma.nextToken();
136 if ( _coma.equals("*") ) {
137 wormMaker( avalonTypeOfAll );
138 if ( paramNr == 5 ) weekDaysFound = false;
139 if ( paramNr == 3 ) mnthDaysFound = false;
140 break;
141 }
142 else if ( convert(_coma) >= 0 ) {
143 wormMaker( convert(_coma) );
144 }
145 else {
146 slashParser(_coma);
147 }
148 }
149 }
150
151
152 private void slashParser ( String slash ) {
153 StringTokenizer _slash =
154 new StringTokenizer( slash, "/");
155 String interval = "";
156 byte count = 1;
157 int step = 1;
158 while ( _slash.hasMoreTokens() ) {
159 if ( count == 1 ) interval = _slash.nextToken();
160 if ( count == 2 ) {
161 step = convert(_slash.nextToken());
162 break;
163 }
164 count++;
165 }
166 if ( interval.equals("*") ) {
167 for ( byte cx = paramLow(paramNr);
168 cx <= paramHigh(paramNr);
169 cx += step ) {
170 wormMaker( cx );
171 }
172 }
173 else if ( convert( interval ) >= 0 ) {
174 wormMaker( convert(interval) );
175 }
176 else {
177 minusParser ( interval, step );
178 }
179 }
180
181
182 private void minusParser ( String interval, int step ) {
183 StringTokenizer minus =
184 new StringTokenizer( interval, "-");
185 int first = 0, last = 0;
186 byte count = 1;
187 while ( minus.hasMoreTokens() ) {
188 if ( count == 1 ) first = convert( minus.nextToken() );
189 if ( count == 2 ) {
190 last = convert( minus.nextToken() );
191 break;
192 }
193 count++;
194 }
195 for ( int cx = first; cx <= last; cx += step ) {
196 wormMaker( cx );
197 }
198 }
199
200
201 private void wormMaker( int worm ) {
202 if (!ignored) {
203 switch ( paramNr ) {
204 case 1 : repMins.add( new Integer(worm) ); break;
205 case 2 : repHours.add( new Integer(worm) ); break;
206 case 3 : repDays.add( new Integer(worm) ); break;
207 case 4 : repMonths.add( new Integer(worm) ); break;
208 case 5 : repWeekDays.add( new Integer(worm) ); break;
209 }
210 }
211 }
212
213
214 private int convert( String conv ) {
215 int retValue = -1;
216 try {
217 retValue = new Integer( conv ).intValue();
218 if ( (retValue < paramLow(paramNr) ||
219 retValue > paramHigh(paramNr)) && !ignored ) {
220 ignoreCron( conv );
221 }
222 }
223 catch ( Exception e ) {
224 if ( conv.indexOf(',') == -1 &&
225 conv.indexOf('-') == -1 &&
226 conv.indexOf('/') == -1 && !ignored ) {
227 ignoreCron( conv );
228 }
229 }
230 return retValue;
231 }
232
233
234 private void ignoreCron( String ignoredParam ) {
235 String paramWord = "";
236 switch(paramNr) {
237 case 1: paramWord = "MINUTE"; break;
238 case 2: paramWord = "HOUR"; break;
239 case 3: paramWord = "DAY"; break;
240 case 4: paramWord = "MONTH"; break;
241 case 5: paramWord = "DAY OF WEEK"; break;
242 }
243 errMsg = "Bad " +paramWord+ " parameter:" + ignoredParam;
244 ignored = true;
245 }
246
247
248 class CronElement {
249 public int min;
250 public int hour;
251 public int day;
252 public int month;
253 public boolean week;
254 private CronElement() {
255 }
256 }
257
258
259 class CronCollector {
260 public String targetName = "";
261 public String cronString = "";
262 public String targetClass = "";
263 private CronCollector() {
264 }
265 }
266 }