public static GrocTimeSpecification create()

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;
    }
  }