1 22 package com.scalagent.scheduler.event; 23 24 import java.util.*; 25 26 import fr.dyade.aaa.agent.*; 27 import com.scalagent.scheduler.*; 28 29 42 public class CronEvent extends ScheduleEvent { 43 44 private static final int CRON_MN = 0; 45 46 private static final int CRON_H = 1; 47 48 private static final int CRON_DOM = 2; 49 50 private static final int CRON_MOY = 3; 51 52 private static final int CRON_DOW = 4; 53 54 private static final int CRON_MAX = 5; 55 56 57 private static final String [] values = { 58 "minutes", "hours", "days of month", "months of year", "days of week" 59 }; 60 61 private static final int[] min = { 0, 0, 1, 0, 0 }; 62 63 private static final int[] max = { 59, 23, 31, 11, 6 }; 64 65 66 private BitSet ranges[] = new BitSet[CRON_MAX]; 67 68 69 76 public CronEvent(String name, String date) throws IllegalArgumentException { 77 super(name, new Date()); 78 79 StringTokenizer st = new StringTokenizer(date, " ", false); 80 if (st.countTokens() != CRON_MAX) 81 throw new IllegalArgumentException ("Bad number of tokens in cron date"); 82 83 String sched[] = new String [CRON_MAX]; 84 for (int i = 0; i < CRON_MAX; i ++) { 85 sched[i] = st.nextToken(); 86 } 87 88 for (int i = 0; i < CRON_MAX; i ++) { 89 String tok = null; 90 try { 91 ranges[i] = new BitSet(max[i] + 1); 92 st = new StringTokenizer(sched[i], ",", false); 93 while (st.countTokens() > 0) { 94 tok = st.nextToken(); 96 if (tok.compareTo("*") == 0) { 97 for (int j = max[i]+1; j-- > 0;) 98 ranges[i].set(j); 99 } else { 100 int j = Integer.parseInt(tok); 101 if (j < min[i] || j > max[i]) 102 throw new IllegalArgumentException ("Bad " + values[i] + " (" + tok + ") in cron date"); 103 ranges[i].set(j); 104 } 105 } 106 } catch (NumberFormatException exc) { 107 throw new IllegalArgumentException ("Bad " + values[i] + " (" + tok + ") in cron date"); 108 } 109 } 110 } 111 112 113 118 public StringBuffer toString(StringBuffer output) { 119 output.append('('); 120 output.append(super.toString(output)); 121 for (int i = 0; i < CRON_MAX; i ++) { 122 output.append(","); 123 output.append(values[i]); 124 output.append("="); 125 output.append(ranges[i]); 126 } 127 output.append(")"); 128 return output; 129 } 130 131 139 Date nextDate(Date now) { 140 long start = now.getTime() + 60000; 142 Calendar calendar = Calendar.getInstance(); 143 calendar.clear(); 144 calendar.setTime(new Date(start)); 145 146 int idx_h = calendar.get(Calendar.HOUR_OF_DAY); 147 int idx_mn = calendar.get(Calendar.MINUTE); 148 149 date_loop: 150 while (true) { 151 while (! ranges[CRON_MOY].get(calendar.get(Calendar.MONTH))) { 152 calendar.set(Calendar.DAY_OF_MONTH, 1); 153 calendar.add(Calendar.MONTH, 1); 154 idx_h = 0; 155 idx_mn = 0; 156 } 157 month_block: 158 while (true) { 160 day_block: 161 if (ranges[CRON_DOM].get(calendar.get(Calendar.DAY_OF_MONTH)) && 162 ranges[CRON_DOW].get(calendar.get(Calendar.DAY_OF_WEEK))) { 163 while (true){ 165 hour_block: 166 if (ranges[CRON_H].get(idx_h)) { 167 while (true) { 169 if (ranges[CRON_MN].get(idx_mn)) { 170 calendar.set(Calendar.HOUR_OF_DAY, idx_h); 172 calendar.set(Calendar.MINUTE, idx_mn); 173 break date_loop; 174 } 175 idx_mn ++; 176 if (idx_mn > max[CRON_MN]) 177 break hour_block; 178 } 179 } 180 idx_h ++; 181 idx_mn = 0; 182 if (idx_h > max[CRON_H]) 183 break day_block; 184 } 185 } 186 calendar.add(Calendar.DAY_OF_MONTH, 1); 187 idx_h = 0; 188 if (calendar.get(Calendar.DAY_OF_MONTH) == 1) 189 break month_block; 190 } 191 } 192 193 date = calendar.getTime(); 195 return date; 196 } 197 } 198
| Popular Tags
|