mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add test
This commit is contained in:
parent
eff60f0c86
commit
ec1edde42c
@ -8,6 +8,7 @@
|
|||||||
### ❌不兼容特性
|
### ❌不兼容特性
|
||||||
* 【core 】 StreamProgress#progress方法参数变更为2个(pr#594@Gitee)
|
* 【core 】 StreamProgress#progress方法参数变更为2个(pr#594@Gitee)
|
||||||
* 【core 】 SimpleCache的raw key使用Mutable
|
* 【core 】 SimpleCache的raw key使用Mutable
|
||||||
|
* 【core 】 ArrayUtil.join删除已经弃用的无用原始类型重载
|
||||||
|
|
||||||
### 🐣新特性
|
### 🐣新特性
|
||||||
* 【core 】 CopyOptions支持以Lambda方式设置忽略属性列表(pr#590@Gitee)
|
* 【core 】 CopyOptions支持以Lambda方式设置忽略属性列表(pr#590@Gitee)
|
||||||
|
@ -1586,224 +1586,6 @@ public class PrimitiveArrayUtil {
|
|||||||
return Arrays.copyOfRange(array, start, end);
|
return Arrays.copyOfRange(array, start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------- join
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(int[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (int item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(long[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (long item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(short[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (short item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(char[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (char item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(byte[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (byte item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(boolean[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (boolean item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(float[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (float item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 以 conjunction 为分隔符将数组转换为字符串
|
|
||||||
*
|
|
||||||
* @param array 数组
|
|
||||||
* @param conjunction 分隔符
|
|
||||||
* @return 连接后的字符串
|
|
||||||
* @deprecated 请使用 {@link ArrayUtil#join(Object, CharSequence)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String join(double[] array, CharSequence conjunction) {
|
|
||||||
if (null == array) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
boolean isFirst = true;
|
|
||||||
for (double item : array) {
|
|
||||||
if (isFirst) {
|
|
||||||
isFirst = false;
|
|
||||||
} else {
|
|
||||||
sb.append(conjunction);
|
|
||||||
}
|
|
||||||
sb.append(item);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------- remove
|
// ------------------------------------------------------------------- remove
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,24 +1,84 @@
|
|||||||
package cn.hutool.cron.pattern;
|
package cn.hutool.cron.pattern;
|
||||||
|
|
||||||
import cn.hutool.core.builder.Builder;
|
import cn.hutool.core.builder.Builder;
|
||||||
|
import cn.hutool.core.lang.Assert;
|
||||||
|
import cn.hutool.core.text.StrJoiner;
|
||||||
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时任务表达式构建器
|
||||||
|
*
|
||||||
|
* @author looly
|
||||||
|
* @since 5.8.0
|
||||||
|
*/
|
||||||
public class CronPatternBuilder implements Builder<String> {
|
public class CronPatternBuilder implements Builder<String> {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
final String[] parts = new String[7];
|
final String[] parts = new String[7];
|
||||||
|
|
||||||
public static CronPatternBuilder of(){
|
/**
|
||||||
|
* 创建构建器
|
||||||
|
* @return CronPatternBuilder
|
||||||
|
*/
|
||||||
|
public static CronPatternBuilder of() {
|
||||||
return new CronPatternBuilder();
|
return new CronPatternBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CronPatternBuilder set(Part part, String value){
|
/**
|
||||||
|
* 设置值
|
||||||
|
*
|
||||||
|
* @param part 部分,如秒、分、时等
|
||||||
|
* @param values 时间值列表
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
public CronPatternBuilder setValues(Part part, int... values) {
|
||||||
|
for (int value : values) {
|
||||||
|
part.checkValue(value);
|
||||||
|
}
|
||||||
|
return set(part, ArrayUtil.join(values, ","));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置区间
|
||||||
|
*
|
||||||
|
* @param part 部分,如秒、分、时等
|
||||||
|
* @param begin 起始值
|
||||||
|
* @param end 结束值
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
public CronPatternBuilder setRange(Part part, int begin, int end) {
|
||||||
|
Assert.notNull(part );
|
||||||
|
part.checkValue(begin);
|
||||||
|
part.checkValue(end);
|
||||||
|
return set(part, StrUtil.format("{}-{}", begin, end));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置对应部分的定时任务值
|
||||||
|
*
|
||||||
|
* @param part 部分,如秒、分、时等
|
||||||
|
* @param value 表达式值,如"*"、"1,2"、"5-12"等
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
public CronPatternBuilder set(Part part, String value) {
|
||||||
parts[part.ordinal()] = value;
|
parts[part.ordinal()] = value;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String build() {
|
public String build() {
|
||||||
return StrUtil.join(StrUtil.SPACE, (Object[]) parts);
|
for (int i = Part.MINUTE.ordinal(); i < Part.YEAR.ordinal(); i++) {
|
||||||
|
// 从分到周,用户未设置使用默认值
|
||||||
|
// 秒和年如果不设置,忽略之
|
||||||
|
if(StrUtil.isBlank(parts[i])){
|
||||||
|
parts[i] = "*";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return StrJoiner.of(StrUtil.SPACE)
|
||||||
|
.setNullMode(StrJoiner.NullMode.IGNORE)
|
||||||
|
.append(this.parts)
|
||||||
|
.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ public class PatternParser {
|
|||||||
final List<String> patternList = StrUtil.splitTrim(groupPattern, '|');
|
final List<String> patternList = StrUtil.splitTrim(groupPattern, '|');
|
||||||
final List<PatternMatcher> patternMatchers = new ArrayList<>(patternList.size());
|
final List<PatternMatcher> patternMatchers = new ArrayList<>(patternList.size());
|
||||||
for (String pattern : patternList) {
|
for (String pattern : patternList) {
|
||||||
patternMatchers.add(parseSinglePattern(pattern));
|
patternMatchers.add(parseSingle(pattern));
|
||||||
}
|
}
|
||||||
return patternMatchers;
|
return patternMatchers;
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ public class PatternParser {
|
|||||||
* @param pattern 表达式
|
* @param pattern 表达式
|
||||||
* @return {@link PatternMatcher}
|
* @return {@link PatternMatcher}
|
||||||
*/
|
*/
|
||||||
private static PatternMatcher parseSinglePattern(String pattern) {
|
private static PatternMatcher parseSingle(String pattern) {
|
||||||
final String[] parts = pattern.split("\\s+");
|
final String[] parts = pattern.split("\\s+");
|
||||||
Assert.checkBetween(parts.length, 5, 7,
|
Assert.checkBetween(parts.length, 5, 7,
|
||||||
() -> new CronException("Pattern [{}] is invalid, it must be 5-7 parts!", pattern));
|
() -> new CronException("Pattern [{}] is invalid, it must be 5-7 parts!", pattern));
|
||||||
|
44
hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternBuilderTest.java
Executable file
44
hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternBuilderTest.java
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
package cn.hutool.cron.pattern;
|
||||||
|
|
||||||
|
import cn.hutool.cron.CronException;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CronPatternBuilderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void buildMatchAllTest(){
|
||||||
|
String build = CronPatternBuilder.of().build();
|
||||||
|
Assert.assertEquals("* * * * *", build);
|
||||||
|
|
||||||
|
build = CronPatternBuilder.of()
|
||||||
|
.set(Part.SECOND, "*")
|
||||||
|
.build();
|
||||||
|
Assert.assertEquals("* * * * * *", build);
|
||||||
|
|
||||||
|
build = CronPatternBuilder.of()
|
||||||
|
.set(Part.SECOND, "*")
|
||||||
|
.set(Part.YEAR, "*")
|
||||||
|
.build();
|
||||||
|
Assert.assertEquals("* * * * * * *", build);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void buildRangeTest(){
|
||||||
|
String build = CronPatternBuilder.of()
|
||||||
|
.set(Part.SECOND, "*")
|
||||||
|
.setRange(Part.HOUR, 2, 9)
|
||||||
|
.build();
|
||||||
|
Assert.assertEquals("* * 2-9 * * *", build);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = CronException.class)
|
||||||
|
public void buildRangeErrorTest(){
|
||||||
|
String build = CronPatternBuilder.of()
|
||||||
|
.set(Part.SECOND, "*")
|
||||||
|
// 55无效值
|
||||||
|
.setRange(Part.HOUR, 2, 55)
|
||||||
|
.build();
|
||||||
|
Assert.assertEquals("* * 2-9 * * *", build);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user