All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.dromara.hutool.cron.pattern.parser.PatternParser Maven / Gradle / Ivy

There is a newer version: 6.0.0.M3
Show newest version
/*
 * Copyright (c) 2013-2024 Hutool Team and hutool.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.dromara.hutool.cron.pattern.parser;

import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.cron.CronException;
import org.dromara.hutool.cron.pattern.Part;
import org.dromara.hutool.cron.pattern.matcher.AlwaysTrueMatcher;
import org.dromara.hutool.cron.pattern.matcher.PartMatcher;
import org.dromara.hutool.cron.pattern.matcher.PatternMatcher;

import java.util.ArrayList;
import java.util.List;

/**
 * 定时任务表达式解析器,用于将表达式字符串解析为{@link PatternMatcher}的列表
 *
 * @author looly
 * @since 5.8.0
 */
public class PatternParser {

	private static final PartParser SECOND_VALUE_PARSER = PartParser.of(Part.SECOND);
	private static final PartParser MINUTE_VALUE_PARSER = PartParser.of(Part.MINUTE);
	private static final PartParser HOUR_VALUE_PARSER = PartParser.of(Part.HOUR);
	private static final PartParser DAY_OF_MONTH_VALUE_PARSER = PartParser.of(Part.DAY_OF_MONTH);
	private static final PartParser MONTH_VALUE_PARSER = PartParser.of(Part.MONTH);
	private static final PartParser DAY_OF_WEEK_VALUE_PARSER = PartParser.of(Part.DAY_OF_WEEK);
	private static final PartParser YEAR_VALUE_PARSER = PartParser.of(Part.YEAR);

	/**
	 * 解析表达式到匹配列表中
	 *
	 * @param cronPattern 复合表达式
	 * @return {@link List}
	 */
	public static List parse(final String cronPattern) {
		return parseGroupPattern(cronPattern);
	}

	/**
	 * 解析复合任务表达式,格式为:
	 * 
	 *     cronA | cronB | ...
	 * 
* * @param groupPattern 复合表达式 * @return {@link List} */ private static List parseGroupPattern(final String groupPattern) { final List patternList = SplitUtil.splitTrim(groupPattern, "|"); final List patternMatchers = new ArrayList<>(patternList.size()); for (final String pattern : patternList) { patternMatchers.add(parseSingle(pattern)); } return patternMatchers; } /** * 解析单一定时任务表达式 * * @param pattern 表达式 * @return {@link PatternMatcher} */ private static PatternMatcher parseSingle(final String pattern) { final String[] parts = pattern.split("\\s+"); Assert.checkBetween(parts.length, 5, 7, () -> new CronException("Pattern [{}] is invalid, it must be 5-7 parts!", pattern)); // 偏移量用于兼容Quartz表达式,当表达式有6或7项时,第一项为秒 int offset = 0; if (parts.length == 6 || parts.length == 7) { offset = 1; } // 秒,如果不支持秒的表达式,则第一位赋值0,表示整分匹配 final String secondPart = (1 == offset) ? parts[0] : "0"; // 年 final PartMatcher yearMatcher; if (parts.length == 7) {// 支持年的表达式 yearMatcher = YEAR_VALUE_PARSER.parse(parts[6]); } else {// 不支持年的表达式,全部匹配 yearMatcher = AlwaysTrueMatcher.INSTANCE; } return new PatternMatcher( // 秒 SECOND_VALUE_PARSER.parse(secondPart), // 分 MINUTE_VALUE_PARSER.parse(parts[offset]), // 时 HOUR_VALUE_PARSER.parse(parts[1 + offset]), // 天 DAY_OF_MONTH_VALUE_PARSER.parse(parts[2 + offset]), // 月 MONTH_VALUE_PARSER.parse(parts[3 + offset]), // 周 DAY_OF_WEEK_VALUE_PARSER.parse(parts[4 + offset]), // 年 yearMatcher ); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy