in utils/src/main/java/com/google/borg/borgcron/GrocTimeSpecification.java [117:196]
public static GrocTimeSpecification create(String spec, TimeZone timezone) {
GrocLexer lexer = new GrocLexer(new ANTLRStringStream(spec));
CommonTokenStream tokens = new CommonTokenStream(lexer);
GrocParser parser = new GrocParser(tokens);
parser.init();
try {
parser.timespec();
} catch (RecognitionException e) {
throw new IllegalArgumentException("Specification '" + spec + "' is invalid.", e);
}
if (timezone == null) {
timezone = UTC_ZONE;
}
// Data needed by the timespec constructors.
String period = parser.getIntervalPeriod();
boolean hasPeriod = !parser.getIntervalPeriod().isEmpty();
boolean synchronised = parser.getSynchronized();
String startTime = parser.getStartTime();
String endTime = parser.getEndTime();
Integer interval = parser.getInterval();
if (hasPeriod && (interval == null)) {
throw new IllegalArgumentException(
"Specification '"
+ spec
+ "', appears to be periodic ('every...')"
+ " but is missing an interval ('seconds', 'minutes), period='"
+ period
+ "'");
}
checkEntriesAreInRange(parser.getOrdinals(), 1, 5, spec, "ordinals");
checkEntriesAreInRange(parser.getWeekdays(), 0, 6, spec, "weekdays");
checkEntriesAreInRange(parser.getMonths(), 1, 12, spec, "months");
checkEntriesAreInRange(parser.getMonthdays(), 1, 31, spec, "days of month");
if (!parser.getMonths().isEmpty() && !parser.getMonthdays().isEmpty()) {
boolean validDays = false;
int lastMonth = -1;
int minDayOfMonth = 32;
for (Integer day : parser.getMonthdays()) {
if (day < minDayOfMonth) {
minDayOfMonth = day;
}
}
for (Integer month : parser.getMonths()) {
lastMonth = month;
if (minDayOfMonth <= getLastDayOfMonth(month)) {
validDays = true;
break; // The specification is valid if at least one day is valid.
}
}
if (!validDays) {
throw new IllegalArgumentException(
"Specification '"
+ spec
+ "': "
+ "invalid day of month, got day "
+ minDayOfMonth
+ " of month "
+ lastMonth);
}
}
if (interval != null) {
GrocTimeSpecification gts =
new GrocTimeSpecification(
interval, parser.getIntervalPeriod(), startTime, endTime, synchronised, timezone);
return gts;
} else {
GrocTimeSpecification gts =
new GrocTimeSpecification(
parser.getOrdinals(),
parser.getMonths(),
parser.getWeekdays(),
parser.getMonthdays(),
parser.getTime(),
timezone);
return gts;
}
}