Parse string with cron expression. @param expression - cron expression, never null @return Cron instance, corresponding to cron expression received @throws java.lang.IllegalArgumentException if expression does not match cron definition
(final String expression)
| 92 | * @throws java.lang.IllegalArgumentException if expression does not match cron definition |
| 93 | */ |
| 94 | public Cron parse(final String expression) { |
| 95 | Preconditions.checkNotNull(expression, "Expression must not be null"); |
| 96 | final String replaced = expression.replaceAll("\\s+", " ").trim(); |
| 97 | if (StringUtils.isEmpty(replaced)) { |
| 98 | throw new IllegalArgumentException("Empty expression!"); |
| 99 | } |
| 100 | |
| 101 | Set<CronNicknames> cronNicknames = cronDefinition.getCronNicknames(); |
| 102 | if(expression.startsWith("@")){ |
| 103 | if(cronNicknames.isEmpty()){ |
| 104 | throw new IllegalArgumentException("Nicknames not supported!"); |
| 105 | } |
| 106 | switch (expression){ |
| 107 | case "@yearly": |
| 108 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.YEARLY, CronBuilder.yearly(cronDefinition)); |
| 109 | case "@annually": |
| 110 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.ANNUALLY, CronBuilder.annually(cronDefinition)); |
| 111 | case "@monthly": |
| 112 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.MONTHLY, CronBuilder.monthly(cronDefinition)); |
| 113 | case "@weekly": |
| 114 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.WEEKLY, CronBuilder.weekly(cronDefinition)); |
| 115 | case "@daily": |
| 116 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.DAILY, CronBuilder.daily(cronDefinition)); |
| 117 | case "@midnight": |
| 118 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.MIDNIGHT, CronBuilder.midnight(cronDefinition)); |
| 119 | case "@hourly": |
| 120 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.HOURLY, CronBuilder.hourly(cronDefinition)); |
| 121 | case "@reboot": |
| 122 | return validateAndReturnSupportedCronNickname(expression, cronNicknames, CronNicknames.REBOOT, CronBuilder.reboot(cronDefinition)); |
| 123 | } |
| 124 | } |
| 125 | |
| 126 | if(expression.contains("||")) { |
| 127 | List<Cron> crons = Arrays.stream(expression.split("\\|\\|")).map(this::parse).collect(Collectors.toList()); |
| 128 | return new CompositeCron(crons); |
| 129 | } |
| 130 | if(expression.contains("|")){ |
| 131 | List<String> crons = new ArrayList<>(); |
| 132 | int cronscount = Arrays.stream(expression.split("\\s+")).mapToInt(s->s.split("\\|").length).max().orElse(0); |
| 133 | for(int j=0; j<cronscount; j++){ |
| 134 | StringBuilder builder = new StringBuilder(); |
| 135 | for(String s : expression.split("\\s+")){ |
| 136 | if(s.contains("|")){ |
| 137 | builder.append(String.format("%s ", s.split("\\|")[j])); |
| 138 | }else{ |
| 139 | builder.append(String.format("%s ", s)); |
| 140 | } |
| 141 | } |
| 142 | crons.add(builder.toString().trim()); |
| 143 | } |
| 144 | return new CompositeCron(crons.stream().map(this::parse).collect(Collectors.toList())); |
| 145 | }else{ |
| 146 | final String[] expressionParts = replaced.toUpperCase().split(" "); |
| 147 | final int expressionLength = expressionParts.length; |
| 148 | String fieldWithTrailingCommas = Arrays.stream(expressionParts).filter(x -> x.endsWith(",")).findAny().orElse(null); |
| 149 | if(fieldWithTrailingCommas!=null){ |
| 150 | throw new IllegalArgumentException(String.format("Invalid field value! Trailing commas not permitted! '%s'", fieldWithTrailingCommas)); |
| 151 | } |