private long calculateNextExecutionTime(InMemoryJob job, long currentTime, int repeat) throws MessageFormatException { long result = currentTime; String cron = job.getCronEntry(); if (cron != null && cron.length() > 0) { result = CronParser.getNextScheduledTime(cron, result); } else if (job.getRepeat() != 0) { result += job.getPeriod(); } return result; }
List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); Calendar working = Calendar.getInstance(); working.setTimeInMillis(currentTime); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes, working); working.add(Calendar.MINUTE, nextMinutes); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours, working); working.add(Calendar.HOUR_OF_DAY, nextHour); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); doUpdateCurrentMonth(working, month); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours, working); working.add(Calendar.HOUR_OF_DAY, nextHour); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes, working); working.add(Calendar.MINUTE, nextMinutes);
protected static List<Integer> calculateValues(final CronEntry entry) { List<Integer> result = new ArrayList<Integer>(); if (isAll(entry.token)) { for (int i = entry.start; i <= entry.end; i++) { result.add(i); } else if (isAStep(entry.token)) { int denominator = getDenominator(entry.token); String numerator = getNumerator(entry.token); CronEntry ce = new CronEntry(entry.name, numerator, entry.start, entry.end); List<Integer> list = calculateValues(ce); for (Integer i : list) { if (i.intValue() % denominator == 0) { } else if (isAList(entry.token)) { StringTokenizer tokenizer = new StringTokenizer(entry.token, ","); while (tokenizer.hasMoreTokens()) { String str = tokenizer.nextToken(); CronEntry ce = new CronEntry(entry.name, str, entry.start, entry.end); List<Integer> list = calculateValues(ce); result.addAll(list); } else if (isARange(entry.token)) { int index = entry.token.indexOf('-'); int first = Integer.parseInt(entry.token.substring(0, index));
public static void validate(final String cronEntry) throws MessageFormatException { List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); for (CronEntry e : entries) { validate(e); } }
protected static long doUpdateCurrentMonth(Calendar working, CronEntry month) throws MessageFormatException { int currentMonth = working.get(Calendar.MONTH) + 1; if (!isCurrent(month, currentMonth)) { int nextMonth = getNext(month, currentMonth, working); working.add(Calendar.MONTH, nextMonth); // Reset to start of month. resetToStartOfDay(working, 1); return working.getTimeInMillis(); } return 0L; }
static List<CronEntry> buildCronEntries(List<String> tokens) { List<CronEntry> result = new ArrayList<CronEntry>(); CronEntry minutes = new CronEntry("Minutes", tokens.get(MINUTES), 0, 60); minutes.currentWhen = calculateValues(minutes); result.add(minutes); CronEntry hours = new CronEntry("Hours", tokens.get(HOURS), 0, 24); hours.currentWhen = calculateValues(hours); result.add(hours); CronEntry dayOfMonth = new CronEntry("DayOfMonth", tokens.get(DAY_OF_MONTH), 1, 32); dayOfMonth.currentWhen = calculateValues(dayOfMonth); result.add(dayOfMonth); CronEntry month = new CronEntry("Month", tokens.get(MONTH), 1, 12); month.currentWhen = calculateValues(month); result.add(month); CronEntry dayOfWeek = new CronEntry("DayOfWeek", tokens.get(DAY_OF_WEEK), 0, 6); dayOfWeek.currentWhen = calculateValues(dayOfWeek); result.add(dayOfWeek); return result; }
protected static long doUpdateCurrentDay(Calendar working, CronEntry dayOfMonth, CronEntry dayOfWeek) throws MessageFormatException { int currentDayOfWeek = working.get(Calendar.DAY_OF_WEEK) - 1; int currentDayOfMonth = working.get(Calendar.DAY_OF_MONTH); // Simplest case, both are unrestricted or both match today otherwise // result must be the closer of the two if both are set, or the next // match to the one that is. if (!isCurrent(dayOfWeek, currentDayOfWeek) || !isCurrent(dayOfMonth, currentDayOfMonth) ) { int nextWeekDay = Integer.MAX_VALUE; int nextCalendarDay = Integer.MAX_VALUE; if (!isCurrent(dayOfWeek, currentDayOfWeek)) { nextWeekDay = getNext(dayOfWeek, currentDayOfWeek, working); } if (!isCurrent(dayOfMonth, currentDayOfMonth)) { nextCalendarDay = getNext(dayOfMonth, currentDayOfMonth, working); } if( nextWeekDay < nextCalendarDay ) { working.add(Calendar.DAY_OF_WEEK, nextWeekDay); } else { working.add(Calendar.DAY_OF_MONTH, nextCalendarDay); } // Since the day changed, we restart the clock at the start of the day // so that the next time will either be at 12am + value of hours and // minutes pattern. resetToStartOfDay(working, working.get(Calendar.DAY_OF_MONTH)); return working.getTimeInMillis(); } return 0L; }
public static void validate(final String cronEntry) throws MessageFormatException { List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); for (CronEntry e : entries) { validate(e); } }
static int getNext(final CronEntry entry, final int current, final Calendar working) throws MessageFormatException { int result = 0; if (entry.currentWhen == null) { entry.currentWhen = calculateValues(entry); } List<Integer> list = entry.currentWhen; int next = -1; for (Integer i : list) { if (i.intValue() > current) { next = i.intValue(); break; } } if (next != -1) { result = next - current; } else { int first = list.get(0).intValue(); int fixedEnd = entry.end; //months have different max values if("DayOfMonth".equals(entry.name)) { fixedEnd = working.getActualMaximum(Calendar.DAY_OF_MONTH)+1; } result = fixedEnd + first - entry.start - current; // Account for difference of one vs zero based indices. if (entry.name.equals("DayOfWeek") || entry.name.equals("Month")) { result++; } } return result; }
protected static List<Integer> calculateValues(final CronEntry entry) { List<Integer> result = new ArrayList<Integer>(); if (isAll(entry.token)) { for (int i = entry.start; i <= entry.end; i++) { result.add(i); } else if (isAStep(entry.token)) { int denominator = getDenominator(entry.token); String numerator = getNumerator(entry.token); CronEntry ce = new CronEntry(entry.name, numerator, entry.start, entry.end); List<Integer> list = calculateValues(ce); for (Integer i : list) { if (i.intValue() % denominator == 0) { } else if (isAList(entry.token)) { StringTokenizer tokenizer = new StringTokenizer(entry.token, ","); while (tokenizer.hasMoreTokens()) { String str = tokenizer.nextToken(); CronEntry ce = new CronEntry(entry.name, str, entry.start, entry.end); List<Integer> list = calculateValues(ce); result.addAll(list); } else if (isARange(entry.token)) { int index = entry.token.indexOf('-'); int first = Integer.parseInt(entry.token.substring(0, index));
List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); Calendar working = Calendar.getInstance(); working.setTimeInMillis(currentTime); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes, working); working.add(Calendar.MINUTE, nextMinutes); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours, working); working.add(Calendar.HOUR_OF_DAY, nextHour); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); doUpdateCurrentMonth(working, month); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours, working); working.add(Calendar.HOUR_OF_DAY, nextHour); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes, working); working.add(Calendar.MINUTE, nextMinutes);
protected static long doUpdateCurrentMonth(Calendar working, CronEntry month) throws MessageFormatException { int currentMonth = working.get(Calendar.MONTH) + 1; if (!isCurrent(month, currentMonth)) { int nextMonth = getNext(month, currentMonth, working); working.add(Calendar.MONTH, nextMonth); // Reset to start of month. resetToStartOfDay(working, 1); return working.getTimeInMillis(); } return 0L; }
public static void validate(final String cronEntry) throws MessageFormatException { List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); for (CronEntry e : entries) { validate(e); } }
long calculateNextExecutionTime(final JobLocation job, long currentTime, int repeat) throws MessageFormatException { long result = currentTime; String cron = job.getCronEntry(); if (cron != null && cron.length() > 0) { result = CronParser.getNextScheduledTime(cron, result); } else if (job.getRepeat() != 0) { result += job.getPeriod(); } return result; }
static List<CronEntry> buildCronEntries(List<String> tokens) { List<CronEntry> result = new ArrayList<CronEntry>(); CronEntry minutes = new CronEntry("Minutes", tokens.get(MINUTES), 0, 60); minutes.currentWhen = calculateValues(minutes); result.add(minutes); CronEntry hours = new CronEntry("Hours", tokens.get(HOURS), 0, 24); hours.currentWhen = calculateValues(hours); result.add(hours); CronEntry dayOfMonth = new CronEntry("DayOfMonth", tokens.get(DAY_OF_MONTH), 1, 32); dayOfMonth.currentWhen = calculateValues(dayOfMonth); result.add(dayOfMonth); CronEntry month = new CronEntry("Month", tokens.get(MONTH), 1, 12); month.currentWhen = calculateValues(month); result.add(month); CronEntry dayOfWeek = new CronEntry("DayOfWeek", tokens.get(DAY_OF_WEEK), 0, 6); dayOfWeek.currentWhen = calculateValues(dayOfWeek); result.add(dayOfWeek); return result; }
protected static List<Integer> calculateValues(final CronEntry entry) { List<Integer> result = new ArrayList<Integer>(); if (isAll(entry.token)) { for (int i = entry.start; i <= entry.end; i++) { result.add(i); } else if (isAStep(entry.token)) { int denominator = getDenominator(entry.token); String numerator = getNumerator(entry.token); CronEntry ce = new CronEntry(entry.name, numerator, entry.start, entry.end); List<Integer> list = calculateValues(ce); for (Integer i : list) { if (i.intValue() % denominator == 0) { } else if (isAList(entry.token)) { StringTokenizer tokenizer = new StringTokenizer(entry.token, ","); while (tokenizer.hasMoreTokens()) { String str = tokenizer.nextToken(); CronEntry ce = new CronEntry(entry.name, str, entry.start, entry.end); List<Integer> list = calculateValues(ce); result.addAll(list); } else if (isARange(entry.token)) { int index = entry.token.indexOf('-'); int first = Integer.parseInt(entry.token.substring(0, index));
List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); Calendar working = Calendar.getInstance(); working.setTimeInMillis(currentTime); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes); working.add(Calendar.MINUTE, nextMinutes); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours); working.add(Calendar.HOUR_OF_DAY, nextHour); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); doUpdateCurrentMonth(working, month); doUpdateCurrentDay(working, dayOfMonth, dayOfWeek); if (!isCurrent(hours, currentHours)) { int nextHour = getNext(hours, currentHours); working.add(Calendar.HOUR_OF_DAY, nextHour); if (!isCurrent(minutes, currentMinutes)) { int nextMinutes = getNext(minutes, currentMinutes); working.add(Calendar.MINUTE, nextMinutes);
protected static long doUpdateCurrentMonth(Calendar working, CronEntry month) throws MessageFormatException { int currentMonth = working.get(Calendar.MONTH) + 1; if (!isCurrent(month, currentMonth)) { int nextMonth = getNext(month, currentMonth, working); working.add(Calendar.MONTH, nextMonth); // Reset to start of month. resetToStartOfDay(working, 1); return working.getTimeInMillis(); } return 0L; }
public static void validate(final String cronEntry) throws MessageFormatException { List<String> list = tokenize(cronEntry); List<CronEntry> entries = buildCronEntries(list); for (CronEntry e : entries) { validate(e); } }
executionTime = CronParser.getNextScheduledTime(cronEntry, startTime); } catch (MessageFormatException e) { throw new IOException(e.getMessage());