diff --git a/README.md b/README.md index f237a0dd97..b914a6c930 100755 --- a/README.md +++ b/README.md @@ -6,16 +6,16 @@

- + - + - + @@ -39,7 +39,7 @@ ## 项目说明 -Bus (应用/服务总线) 是一个基础框架、服务套件,它基于Java8编写,参考、借鉴了大量已有框架、组件的设计,可以作为后端服务的开发基础中间件。代码简洁,架构清晰,非常适合学习使用。 +Bus (应用/服务总线) 是一个基础框架、服务套件,它基于Java17+编写,参考、借鉴了大量已有框架、组件的设计,可以作为后端服务的开发基础中间件。代码简洁,架构清晰,非常适合学习使用。 很开心地告诉大家这套组件上手和学习难度非常小。如果是以学会使用为目的,只要你会Java语言即可。之前做项目的时候,往往会遇到各种各样的问题,这些问题有可能是会遇到很多次,不善于总结沉淀,这是很多人的一个通病,包括我自己也是。 @@ -97,7 +97,7 @@ Bus (应用/服务总线) 是一个基础框架、服务套件,它基于Java8 org.aoju bus-all - 6.5.0 + 6.5.1 ``` diff --git a/bus-all/pom.xml b/bus-all/pom.xml index 79aaedfc10..7eea4f2766 100755 --- a/bus-all/pom.xml +++ b/bus-all/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-all - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -147,6 +147,12 @@ ${project.version} true + + ${project.groupId} + bus-pay + ${project.version} + true + ${project.groupId} bus-proxy diff --git a/bus-all/src/main/java/org/aoju/bus/Bus.java b/bus-all/src/main/java/org/aoju/bus/Bus.java index ebb5be50b9..91cadebe17 100644 --- a/bus-all/src/main/java/org/aoju/bus/Bus.java +++ b/bus-all/src/main/java/org/aoju/bus/Bus.java @@ -43,7 +43,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Bus extends Version { diff --git a/bus-all/src/main/java/org/aoju/bus/package-info.java b/bus-all/src/main/java/org/aoju/bus/package-info.java index aee99a0b2e..6a574ab732 100644 --- a/bus-all/src/main/java/org/aoju/bus/package-info.java +++ b/bus-all/src/main/java/org/aoju/bus/package-info.java @@ -2,7 +2,6 @@ * Bus (应用/服务总线) 是一个基础框架、服务套件 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus; \ No newline at end of file diff --git a/bus-base/pom.xml b/bus-base/pom.xml index 55c6c693c3..ecabc4b586 100755 --- a/bus-base/pom.xml +++ b/bus-base/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-base - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -42,8 +42,8 @@ UTF-8 UTF-8 17 - 2.6.3 - 1.18.22 + 2.7.0 + 1.18.24 2.2 diff --git a/bus-base/src/main/java/org/aoju/bus/base/advice/BaseAdvice.java b/bus-base/src/main/java/org/aoju/bus/base/advice/BaseAdvice.java index aa0f701838..7d3d754a8a 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/advice/BaseAdvice.java +++ b/bus-base/src/main/java/org/aoju/bus/base/advice/BaseAdvice.java @@ -27,10 +27,10 @@ import org.aoju.bus.base.consts.ErrorCode; import org.aoju.bus.base.spring.Controller; -import org.aoju.bus.core.lang.exception.BusinessException; -import org.aoju.bus.core.lang.exception.CrontabException; -import org.aoju.bus.core.lang.exception.InstrumentException; -import org.aoju.bus.core.lang.exception.ValidateException; +import org.aoju.bus.core.exception.BusinessException; +import org.aoju.bus.core.exception.CrontabException; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.exception.ValidateException; import org.aoju.bus.core.toolkit.RuntimeKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.logger.Logger; @@ -49,7 +49,6 @@ * 异常信息拦截处理 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ControllerAdvice diff --git a/bus-base/src/main/java/org/aoju/bus/base/advice/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/advice/package-info.java index 4a410ae8d4..a264a6d54a 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/advice/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/advice/package-info.java @@ -2,7 +2,6 @@ * 异常信息处理 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.advice; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/consts/Consts.java b/bus-base/src/main/java/org/aoju/bus/base/consts/Consts.java index b3a1195e9d..9cafad2b09 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/consts/Consts.java +++ b/bus-base/src/main/java/org/aoju/bus/base/consts/Consts.java @@ -32,7 +32,6 @@ * 公共常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Consts extends Normal { diff --git a/bus-base/src/main/java/org/aoju/bus/base/consts/ErrorCode.java b/bus-base/src/main/java/org/aoju/bus/base/consts/ErrorCode.java index b776a23104..bbf6a73a76 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/consts/ErrorCode.java +++ b/bus-base/src/main/java/org/aoju/bus/base/consts/ErrorCode.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.base.consts; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -35,7 +35,6 @@ * 系统响应码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ErrorCode { diff --git a/bus-base/src/main/java/org/aoju/bus/base/consts/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/consts/package-info.java index dafa569d80..939acce60d 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/consts/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/consts/package-info.java @@ -2,7 +2,6 @@ * 基础常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.consts; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/BaseEntity.java b/bus-base/src/main/java/org/aoju/bus/base/entity/BaseEntity.java index 3676dcd554..be71994423 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/BaseEntity.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/BaseEntity.java @@ -40,7 +40,6 @@ * Entity 基本信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/Entity.java b/bus-base/src/main/java/org/aoju/bus/base/entity/Entity.java index cb2fd17896..308089c32a 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/Entity.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/Entity.java @@ -34,7 +34,6 @@ * Entity 实体 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/Message.java b/bus-base/src/main/java/org/aoju/bus/base/entity/Message.java index 074477244f..a5507989ba 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/Message.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/Message.java @@ -34,7 +34,6 @@ * 返回值公用类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/OAuth2.java b/bus-base/src/main/java/org/aoju/bus/base/entity/OAuth2.java index 16425d0eb3..e485080e53 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/OAuth2.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/OAuth2.java @@ -34,7 +34,6 @@ * 授权公用类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/Result.java b/bus-base/src/main/java/org/aoju/bus/base/entity/Result.java index e6936c88d0..f22da28548 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/Result.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/Result.java @@ -35,7 +35,6 @@ * 返回结果公用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/Tracer.java b/bus-base/src/main/java/org/aoju/bus/base/entity/Tracer.java index 2f7b6a609c..cf8034d898 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/Tracer.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/Tracer.java @@ -34,7 +34,6 @@ * 访问链路跟踪 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-base/src/main/java/org/aoju/bus/base/entity/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/entity/package-info.java index 0b7923cc97..8238a4ab29 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/entity/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/entity/package-info.java @@ -2,7 +2,6 @@ * 基础实体类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.entity; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/mapper/BaseMapper.java b/bus-base/src/main/java/org/aoju/bus/base/mapper/BaseMapper.java index b5b593f6fd..1ddcc41657 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/mapper/BaseMapper.java +++ b/bus-base/src/main/java/org/aoju/bus/base/mapper/BaseMapper.java @@ -29,7 +29,6 @@ * BaseMapper 接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BaseMapper extends Mapper { diff --git a/bus-base/src/main/java/org/aoju/bus/base/mapper/Mapper.java b/bus-base/src/main/java/org/aoju/bus/base/mapper/Mapper.java index c5cfcb6e0b..909027b125 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/mapper/Mapper.java +++ b/bus-base/src/main/java/org/aoju/bus/base/mapper/Mapper.java @@ -29,7 +29,6 @@ * Core Mapper 接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Mapper extends org.aoju.bus.mapper.Mapper { diff --git a/bus-base/src/main/java/org/aoju/bus/base/mapper/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/mapper/package-info.java index 5f160ec8d6..e1922b24b0 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/mapper/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/mapper/package-info.java @@ -2,7 +2,6 @@ * 基础持久化支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.mapper; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/package-info.java index d18ba6c150..c1789dd2f3 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/package-info.java @@ -2,7 +2,6 @@ * 基础功能实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/service/BaseService.java b/bus-base/src/main/java/org/aoju/bus/base/service/BaseService.java index f7faba0ba9..6af26ec522 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/service/BaseService.java +++ b/bus-base/src/main/java/org/aoju/bus/base/service/BaseService.java @@ -33,7 +33,6 @@ * BaseService 接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BaseService extends Service { diff --git a/bus-base/src/main/java/org/aoju/bus/base/service/Service.java b/bus-base/src/main/java/org/aoju/bus/base/service/Service.java index 97d1e9e346..d806164e5a 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/service/Service.java +++ b/bus-base/src/main/java/org/aoju/bus/base/service/Service.java @@ -28,7 +28,6 @@ * Service 接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Service { diff --git a/bus-base/src/main/java/org/aoju/bus/base/service/impl/BaseServiceImpl.java b/bus-base/src/main/java/org/aoju/bus/base/service/impl/BaseServiceImpl.java index c79b5aabbc..e446bf80c7 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/service/impl/BaseServiceImpl.java +++ b/bus-base/src/main/java/org/aoju/bus/base/service/impl/BaseServiceImpl.java @@ -46,7 +46,6 @@ * 重写此类及{@link BaseEntity} 业务类继承新类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BaseServiceImpl, T extends BaseEntity> diff --git a/bus-base/src/main/java/org/aoju/bus/base/service/impl/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/service/impl/package-info.java index e72d80af6c..bb051cfc45 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/service/impl/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/service/impl/package-info.java @@ -2,7 +2,6 @@ * 基础业务实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.service.impl; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/service/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/service/package-info.java index b7b8e09125..e6a2f2aaf3 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/service/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/service/package-info.java @@ -2,7 +2,6 @@ * 基础业务接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.service; \ No newline at end of file diff --git a/bus-base/src/main/java/org/aoju/bus/base/spring/BaseController.java b/bus-base/src/main/java/org/aoju/bus/base/spring/BaseController.java index c570a2a54c..88dd4a8786 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/spring/BaseController.java +++ b/bus-base/src/main/java/org/aoju/bus/base/spring/BaseController.java @@ -36,7 +36,6 @@ * 基础请求封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BaseController, T> extends Controller { diff --git a/bus-base/src/main/java/org/aoju/bus/base/spring/Controller.java b/bus-base/src/main/java/org/aoju/bus/base/spring/Controller.java index e265c09264..9bc8bfe5be 100755 --- a/bus-base/src/main/java/org/aoju/bus/base/spring/Controller.java +++ b/bus-base/src/main/java/org/aoju/bus/base/spring/Controller.java @@ -33,7 +33,6 @@ * 基础输出封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Controller { diff --git a/bus-base/src/main/java/org/aoju/bus/base/spring/package-info.java b/bus-base/src/main/java/org/aoju/bus/base/spring/package-info.java index 920b8c2146..0853bf4ead 100644 --- a/bus-base/src/main/java/org/aoju/bus/base/spring/package-info.java +++ b/bus-base/src/main/java/org/aoju/bus/base/spring/package-info.java @@ -2,7 +2,6 @@ * 基础API功能 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.base.spring; \ No newline at end of file diff --git a/bus-bom/pom.xml b/bus-bom/pom.xml index ad671f6d2c..80d3810092 100755 --- a/bus-bom/pom.xml +++ b/bus-bom/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-bom - 6.5.0 + 6.5.1 pom ${project.artifactId} diff --git a/bus-cache/README.md b/bus-cache/README.md index 5814db1c8c..87d3a49c62 100755 --- a/bus-cache/README.md +++ b/bus-cache/README.md @@ -69,7 +69,7 @@ Object func(@CacheKey("#arg0[#i]") List ids){ org.aoju.bus bus-cache - 6.5.0 + x.x.x ``` @@ -282,4 +282,5 @@ public @interface CachedGet { 对于`@CacheKey`内的`value`属性(SpEL), CacheX在将方法的参数组装为key时, 会将整个方法的参数导入到SpEL的执行环境内, 所以在任一参数的`@CacheKey`的`value` 属性内都可以自由的引用这些变量, 尽管在`arg0`我们可以引用整个方法的任意参数, 但为了可读性, 我们仍然建议对某个参数的引用放在该参数自己的`@CacheKey` -> 注意: 在Java8环境中, 如果编译时没有指定`-parameters`参数, 则参数名默认为`arg0`、`arg1`、...、`argN`, 如果指定了该参数, 则在`spel`中使用实际的参数名即可, 如:`#source.name()`; 为了兼容这两种方式, CacheX提供了自己的命名方式`args0`、`args1`、...、`argsN`, 使用户可以不用区分是否开启编译参数. +> 注意: 在Java8环境中, 如果编译时没有指定`-parameters`参数, 则参数名默认为`arg0`、`arg1`、...、`argN`, 如果指定了该参数, 则在`spel`中使用实际的参数名即可, +> 如:`#source.name()`; 为了兼容这两种方式, CacheX提供了自己的命名方式`args0`、`args1`、...、`argsN`, 使用户可以不用区分是否开启编译参数. diff --git a/bus-cache/pom.xml b/bus-cache/pom.xml index 699e8cdfda..8a4513bdad 100755 --- a/bus-cache/pom.xml +++ b/bus-cache/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-cache - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -42,10 +42,10 @@ UTF-8 UTF-8 17 - 2.6.3 - 1.18.22 + 2.7.0 + 1.18.24 5.0.1 - 3.6.1 + 4.2.2 2.4.7 3.9.4 4.3.0 diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/CacheX.java b/bus-cache/src/main/java/org/aoju/bus/cache/CacheX.java index b952ccb7aa..02fc189099 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/CacheX.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/CacheX.java @@ -32,7 +32,6 @@ * 缓存接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/Complex.java b/bus-cache/src/main/java/org/aoju/bus/cache/Complex.java index 45aa4854a2..a229fc0f06 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/Complex.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/Complex.java @@ -45,7 +45,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Singleton diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/Context.java b/bus-cache/src/main/java/org/aoju/bus/cache/Context.java index a360cb9028..f45e95af07 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/Context.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/Context.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Context { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/Hitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/Hitting.java index c1a7e325e8..16e88dfddd 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/Hitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/Hitting.java @@ -33,7 +33,6 @@ * 缓存命中策略 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Hitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/Manage.java b/bus-cache/src/main/java/org/aoju/bus/cache/Manage.java index 59f0beb03e..b696026f26 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/Manage.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/Manage.java @@ -29,7 +29,7 @@ import org.aoju.bus.cache.magic.CachePair; import org.aoju.bus.core.annotation.Inject; import org.aoju.bus.core.annotation.Singleton; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.logger.Logger; @@ -38,7 +38,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Singleton diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/Module.java b/bus-cache/src/main/java/org/aoju/bus/cache/Module.java index 6b9a2c7dde..70e5c0399d 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/Module.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/Module.java @@ -41,7 +41,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Module extends AbstractModule { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CacheKey.java b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CacheKey.java index ae7d77fbf5..32779f191b 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CacheKey.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CacheKey.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Cached.java b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Cached.java index 0c68996e50..0455483f2b 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Cached.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Cached.java @@ -32,7 +32,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CachedGet.java b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CachedGet.java index cc812e92ac..8959926161 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CachedGet.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/CachedGet.java @@ -32,7 +32,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Invalid.java b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Invalid.java index ed3e097960..539770122e 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Invalid.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/Invalid.java @@ -32,7 +32,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/package-info.java index 6de6c7379f..f0b85313d6 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/annotation/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/annotation/package-info.java @@ -2,7 +2,6 @@ * 缓存注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.annotation; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/AbstractReader.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/AbstractReader.java index ded69aad1f..bbf63232c8 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/AbstractReader.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/AbstractReader.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractReader { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/AnnoHolder.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/AnnoHolder.java index a07dcda38b..2a70aa8e62 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/AnnoHolder.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/AnnoHolder.java @@ -32,7 +32,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AnnoHolder { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheExpire.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheExpire.java index 7b90e9edb6..5396f12642 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheExpire.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheExpire.java @@ -29,7 +29,6 @@ * 缓存过期时间 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface CacheExpire { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheKeys.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheKeys.java index f73da18b90..780f27fde8 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheKeys.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CacheKeys.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CacheKeys { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CachePair.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CachePair.java index d617756c74..085e206c9e 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/CachePair.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/CachePair.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CachePair { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/MethodHolder.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/MethodHolder.java index 7c67358ff2..0d44874fac 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/MethodHolder.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/MethodHolder.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/MultiCacheReader.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/MultiCacheReader.java index 1f374b7131..4c9b0312a9 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/MultiCacheReader.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/MultiCacheReader.java @@ -39,7 +39,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Singleton diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/SingleCacheReader.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/SingleCacheReader.java index 34b5f8ef94..0e4975fd23 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/SingleCacheReader.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/SingleCacheReader.java @@ -38,7 +38,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Singleton diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/magic/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/magic/package-info.java index be31197358..ebf7c25737 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/magic/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/magic/package-info.java @@ -2,7 +2,6 @@ * 缓存时间等实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.magic; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/EhCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/EhCache.java index 5074140bc4..6e90afb6ad 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/EhCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/EhCache.java @@ -47,7 +47,6 @@ * 具有快速、精干等特点 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EhCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/ExtendCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/ExtendCache.java index e763b6951b..8d847cefb1 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/ExtendCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/ExtendCache.java @@ -29,7 +29,6 @@ * 缓存接口,方便用户扩展 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface ExtendCache { @@ -40,7 +39,9 @@ public interface ExtendCache { * @param key 缓存key * @param value 缓存内容 */ - void cache(String key, String value); + default void cache(String key, Object value) { + + } /** * 存入缓存 @@ -49,7 +50,9 @@ public interface ExtendCache { * @param value 缓存内容 * @param timeout 指定缓存过期时间(毫秒) */ - void cache(String key, String value, long timeout); + default void cache(String key, Object value, long timeout) { + + } /** * 获取缓存内容 @@ -57,6 +60,17 @@ public interface ExtendCache { * @param key 缓存key * @return 缓存内容 */ - Object get(String key); + default Object get(String key) { + return null; + } + + /** + * 清理缓存内容 + * + * @param key 缓存key + */ + default void remove(String key) { + + } } diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/GuavaCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/GuavaCache.java index 483bf23302..ed1d1db5fa 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/GuavaCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/GuavaCache.java @@ -39,7 +39,6 @@ * Guava 缓存支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GuavaCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemcachedCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemcachedCache.java index 5fc0a76fcf..32e3844d57 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemcachedCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemcachedCache.java @@ -44,7 +44,6 @@ * Memcached 缓存支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MemcachedCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemoryCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemoryCache.java index 5bc12be95e..9398d49d95 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemoryCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/MemoryCache.java @@ -47,7 +47,6 @@ * 内存缓存支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MemoryCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/NoOpCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/NoOpCache.java index c681d25e75..e7b96eae6d 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/NoOpCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/NoOpCache.java @@ -35,7 +35,6 @@ * 无缓存实现,用于快速关闭缓存 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NoOpCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisCache.java index 7345b8c95b..da3c95a442 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisCache.java @@ -43,7 +43,6 @@ * Redis 单机缓存支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RedisCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisClusterCache.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisClusterCache.java index e99575d233..2dfaa9826c 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisClusterCache.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/RedisClusterCache.java @@ -38,7 +38,6 @@ * Redis 集群缓存支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RedisClusterCache implements CacheX { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/metric/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/metric/package-info.java index 3f20b4f08c..329399436a 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/metric/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/metric/package-info.java @@ -2,7 +2,6 @@ * 缓存基本信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.metric; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/package-info.java index 40bceaed95..142e89c538 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/package-info.java @@ -2,7 +2,6 @@ * 工业级缓存解决方案 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/AbstractHitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/AbstractHitting.java index a1a5c0ca2b..24bfdd8e53 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/AbstractHitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/AbstractHitting.java @@ -44,7 +44,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractHitting implements Hitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/H2Hitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/H2Hitting.java index 88aeb44b0a..99da66d860 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/H2Hitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/H2Hitting.java @@ -38,7 +38,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class H2Hitting extends AbstractHitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/MemoryHitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/MemoryHitting.java index 5dcad0f60a..8b7dc8cbc0 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/MemoryHitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/MemoryHitting.java @@ -35,7 +35,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MemoryHitting implements Hitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/MySQLHitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/MySQLHitting.java index 031994ced0..bea715228f 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/MySQLHitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/MySQLHitting.java @@ -27,7 +27,7 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.JdbcTemplate; @@ -39,7 +39,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MySQLHitting extends AbstractHitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/SqliteHitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/SqliteHitting.java index 500ca425f4..68de2eda80 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/SqliteHitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/SqliteHitting.java @@ -36,7 +36,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SqliteHitting extends AbstractHitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/ZookeeperHitting.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/ZookeeperHitting.java index fe6cf9e53b..9d77c22fdb 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/ZookeeperHitting.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/ZookeeperHitting.java @@ -45,7 +45,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZookeeperHitting implements Hitting { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/provider/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/provider/package-info.java index 828330e5c4..d08f4b7baf 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/provider/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/provider/package-info.java @@ -2,7 +2,6 @@ * 缓存方案实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.provider; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/AbstractSerializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/AbstractSerializer.java index a1586f2a1e..bc22e20f24 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/AbstractSerializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/AbstractSerializer.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractSerializer implements BaseSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/BaseSerializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/BaseSerializer.java index 282dc27c2a..379e063add 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/BaseSerializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/BaseSerializer.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BaseSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/FastJsonSerializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/FastJsonSerializer.java index 8d7b6a86c0..6ce2cb998e 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/FastJsonSerializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/FastJsonSerializer.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FastJsonSerializer extends AbstractSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/Hessian2Serializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/Hessian2Serializer.java index 79e26d093c..64801f59a9 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/Hessian2Serializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/Hessian2Serializer.java @@ -33,7 +33,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Hessian2Serializer extends AbstractSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkGzipSerializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkGzipSerializer.java index 603209f6d9..f45f9e66a2 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkGzipSerializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkGzipSerializer.java @@ -34,7 +34,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JdkGzipSerializer extends AbstractSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkSerializer.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkSerializer.java index 537930a0f8..712ce37f71 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkSerializer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/JdkSerializer.java @@ -25,15 +25,14 @@ ********************************************************************************/ package org.aoju.bus.cache.serialize; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.logger.Logger; import java.io.*; /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JdkSerializer extends AbstractSerializer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/package-info.java index 67986a08e5..079593fead 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/serialize/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/serialize/package-info.java @@ -2,7 +2,6 @@ * 序列化支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.serialize; \ No newline at end of file diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/Addables.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/Addables.java index 8d6024c104..dfc56299c4 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/Addables.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/Addables.java @@ -33,7 +33,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Addables { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/ArgNameGenerator.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/ArgNameGenerator.java index 37886b6ced..3e1287e025 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/ArgNameGenerator.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/ArgNameGenerator.java @@ -36,7 +36,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ArgNameGenerator { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/CacheInfoContainer.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/CacheInfoContainer.java index b7e783e117..0e720805af 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/CacheInfoContainer.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/CacheInfoContainer.java @@ -49,7 +49,6 @@ * 定位: 将@Cached、@Invalid、@CachedGet、(@CachedPut未来)以及将@CacheKey整体融合到一起 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CacheInfoContainer { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyGenerator.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyGenerator.java index 08d0106ca3..6299b977fb 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyGenerator.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyGenerator.java @@ -33,7 +33,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class KeyGenerator { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyValue.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyValue.java index 88bd51f804..c4e81896b5 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyValue.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/KeyValue.java @@ -35,7 +35,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class KeyValue { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/PatternGenerator.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/PatternGenerator.java index f9e7367f1b..aaaf724a52 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/PatternGenerator.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/PatternGenerator.java @@ -35,7 +35,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PatternGenerator { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/PreventObjects.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/PreventObjects.java index 2bec64e5ab..e3a5cc9953 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/PreventObjects.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/PreventObjects.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PreventObjects { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/SpelCalculator.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/SpelCalculator.java index 6afc154971..57a53c871e 100755 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/SpelCalculator.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/SpelCalculator.java @@ -36,7 +36,6 @@ * Spel表达式的计算功能(@Cached内的condition、@CacheKey内的spel只是作为一个增值服务, 并不作为核心功能, 只是作为key拼装的一个亮点, 并不是必须功能) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SpelCalculator { diff --git a/bus-cache/src/main/java/org/aoju/bus/cache/support/package-info.java b/bus-cache/src/main/java/org/aoju/bus/cache/support/package-info.java index 2fda5df8b4..57abd27be2 100644 --- a/bus-cache/src/main/java/org/aoju/bus/cache/support/package-info.java +++ b/bus-cache/src/main/java/org/aoju/bus/cache/support/package-info.java @@ -2,7 +2,6 @@ * 表达式等计算功能支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cache.support; \ No newline at end of file diff --git a/bus-core/README.md b/bus-core/README.md index e7bf1e4f33..9a2992f2dc 100755 --- a/bus-core/README.md +++ b/bus-core/README.md @@ -14,7 +14,7 @@ org.aoju bus-core - 6.5.0 + 6.5.1 ``` diff --git a/bus-core/pom.xml b/bus-core/pom.xml index a808fc9bd1..e3b9143df9 100755 --- a/bus-core/pom.xml +++ b/bus-core/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-core - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -42,7 +42,7 @@ UTF-8 UTF-8 17 - 1.18.22 + 1.18.24 diff --git a/bus-core/src/main/java/org/aoju/bus/core/Binder.java b/bus-core/src/main/java/org/aoju/bus/core/Binder.java index 42787dfd88..6ca0ce5550 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/Binder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/Binder.java @@ -29,10 +29,10 @@ import org.aoju.bus.core.annotation.Ignore; import org.aoju.bus.core.annotation.Values; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.resource.PropertySource; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.StringKit; @@ -43,7 +43,6 @@ * 属性绑定器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @RequiredArgsConstructor diff --git a/bus-core/src/main/java/org/aoju/bus/core/Order.java b/bus-core/src/main/java/org/aoju/bus/core/Order.java index ff19bc8250..51db016977 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/Order.java +++ b/bus-core/src/main/java/org/aoju/bus/core/Order.java @@ -29,7 +29,6 @@ * 排序 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Order extends Comparable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/Plugin.java b/bus-core/src/main/java/org/aoju/bus/core/Plugin.java index 958fc24766..3d9fb1f0c9 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/Plugin.java +++ b/bus-core/src/main/java/org/aoju/bus/core/Plugin.java @@ -29,7 +29,6 @@ * 插件 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Plugin extends Order { diff --git a/bus-core/src/main/java/org/aoju/bus/core/Version.java b/bus-core/src/main/java/org/aoju/bus/core/Version.java index 061bdc4c9f..a4757cd0d1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/Version.java +++ b/bus-core/src/main/java/org/aoju/bus/core/Version.java @@ -34,7 +34,6 @@ * Version is Licensed under the MIT License, Version 3.0.0 (the "License") * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Version { @@ -61,7 +60,7 @@ public class Version { * @return 项目的版本号 */ public static String get() { - return "6.3.1.RELEASE"; + return "6.5.1.RELEASE"; } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Alias.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Alias.java index e4646388f1..6b1c643f7c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Alias.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Alias.java @@ -34,7 +34,6 @@ * 用于字段、方法、参数等提供别名 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/AnnoProxy.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/AnnoProxy.java index b249920341..1a44e38f2b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/AnnoProxy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/AnnoProxy.java @@ -1,3 +1,28 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ package org.aoju.bus.core.annotation; import org.aoju.bus.core.toolkit.ReflectKit; @@ -15,6 +40,8 @@ * 通过代理指定注解,可以自定义调用注解的方法逻辑,如支持{@link Alias} 注解 * * @param 注解类型 + * @author Kimi Liu + * @since Java 17+ */ public class AnnoProxy implements Annotation, InvocationHandler, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Element.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Annotated.java similarity index 67% rename from bus-core/src/main/java/org/aoju/bus/core/annotation/Element.java rename to bus-core/src/main/java/org/aoju/bus/core/annotation/Annotated.java index 93accd26ad..14daef205a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Element.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Annotated.java @@ -25,29 +25,30 @@ ********************************************************************************/ package org.aoju.bus.core.annotation; +import org.aoju.bus.core.map.TableMap; import org.aoju.bus.core.toolkit.CollKit; import java.lang.annotation.*; import java.lang.reflect.AnnotatedElement; +import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.function.Predicate; /** * 组合注解 对JDK的原生注解机制做一个增强,支持类似Spring的组合注解 * 核心实现使用了递归获取指定元素上的注解以及注解的注解,以实现复合注解的获取 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class Element implements AnnotatedElement { +public class Annotated implements AnnotatedElement { /** * 元注解 */ - private static final Set> META_ANNOTATIONS = CollKit.newHashSet(Target.class, // + private static final Set> META_ANNOTATIONS = CollKit.newHashSet(Target.class, Retention.class, Inherited.class, Documented.class, @@ -55,7 +56,10 @@ public class Element implements AnnotatedElement { Override.class, Deprecated.class ); - + /** + * 过滤器 + */ + private final Predicate predicate; /** * 注解类型与注解对象对应表 */ @@ -70,10 +74,33 @@ public class Element implements AnnotatedElement { * * @param element 需要解析注解的元素:可以是Class、Method、Field、Constructor、ReflectPermission */ - public Element(AnnotatedElement element) { + public Annotated(AnnotatedElement element) { + this(element, null); + } + + /** + * 构造 + * + * @param element 需要解析注解的元素:可以是Class、Method、Field、Constructor、ReflectPermission + * @param predicate 过滤器,{@link Predicate#test(Object)}返回{@code true}保留,否则不保留 + */ + public Annotated(AnnotatedElement element, Predicate predicate) { + this.predicate = predicate; init(element); } + /** + * 创建Annotated + * + * @param element 需要解析注解的元素:可以是Class、Method、Field、Constructor、ReflectPermission + * @param predicate 过滤器,{@link Predicate#test(Object)}返回{@code true}保留,否则不保留 + * @return this + */ + public static Annotated of(AnnotatedElement element, Predicate predicate) { + return new Annotated(element, predicate); + } + + @Override public boolean isAnnotationPresent(Class annotationClass) { return annotationMap.containsKey(annotationClass); @@ -82,19 +109,19 @@ public boolean isAnnotationPresent(Class annotationClass) @Override public T getAnnotation(Class annotationClass) { Annotation annotation = annotationMap.get(annotationClass); - return null == annotation ? null : (T) annotation; + return (annotation == null) ? null : (T) annotation; } @Override public Annotation[] getAnnotations() { final Collection annotations = this.annotationMap.values(); - return annotations.toArray(new Annotation[annotations.size()]); + return annotations.toArray(new Annotation[0]); } @Override public Annotation[] getDeclaredAnnotations() { final Collection annotations = this.declaredAnnotationMap.values(); - return annotations.toArray(new Annotation[annotations.size()]); + return annotations.toArray(new Annotation[0]); } /** @@ -103,21 +130,21 @@ public Annotation[] getDeclaredAnnotations() { * @param element 元素 */ private void init(AnnotatedElement element) { - Annotation[] declaredAnnotations = element.getDeclaredAnnotations(); - this.declaredAnnotationMap = new HashMap<>(); + final Annotation[] declaredAnnotations = element.getDeclaredAnnotations(); + this.declaredAnnotationMap = new TableMap<>(); parseDeclared(declaredAnnotations); - Annotation[] annotations = element.getAnnotations(); - if (declaredAnnotations == annotations) { + final Annotation[] annotations = element.getAnnotations(); + if (Arrays.equals(declaredAnnotations, annotations)) { this.annotationMap = this.declaredAnnotationMap; } else { - this.annotationMap = new HashMap<>(); + this.annotationMap = new TableMap<>(); parse(annotations); } } /** - * 进行递归解析注解,直到全部都是元注解为止 + * 进行递归解析注解,直到全部都是元注解为止 * * @param annotations Class, Method, Field等 */ @@ -127,14 +154,17 @@ private void parseDeclared(Annotation[] annotations) { for (Annotation annotation : annotations) { annotationType = annotation.annotationType(); if (false == META_ANNOTATIONS.contains(annotationType)) { - declaredAnnotationMap.put(annotationType, annotation); + if (test(annotation)) { + declaredAnnotationMap.put(annotationType, annotation); + } + // 测试不通过的注解,不影响继续递归 parseDeclared(annotationType.getDeclaredAnnotations()); } } } /** - * 进行递归解析注解,直到全部都是元注解为止 + * 进行递归解析注解,直到全部都是元注解为止 * * @param annotations Class, Method, Field等 */ @@ -143,10 +173,23 @@ private void parse(Annotation[] annotations) { for (Annotation annotation : annotations) { annotationType = annotation.annotationType(); if (false == META_ANNOTATIONS.contains(annotationType)) { - annotationMap.put(annotationType, annotation); + if (test(annotation)) { + annotationMap.put(annotationType, annotation); + } + // 测试不通过的注解,不影响继续递归 parse(annotationType.getAnnotations()); } } } + /** + * 检查给定的注解是否符合过滤条件 + * + * @param annotation 注解对象 + * @return 是否符合条件 + */ + private boolean test(Annotation annotation) { + return null == this.predicate || this.predicate.test(annotation); + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Async.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Async.java index c20f4829d2..ee083495a3 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Async.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Async.java @@ -36,7 +36,6 @@ * 将类或方法标记为异步 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Binding.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Binding.java index 72bccbb320..c31edc2d84 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Binding.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Binding.java @@ -34,7 +34,6 @@ * 用于绑定的注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target(ElementType.ANNOTATION_TYPE) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Copyable.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Copyable.java index 29a8869cc9..5460fa28db 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Copyable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Copyable.java @@ -29,7 +29,6 @@ * 设置返回元素的类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/GuardeBy.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/GuardeBy.java index 67c3c45830..989914d204 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/GuardeBy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/GuardeBy.java @@ -34,7 +34,6 @@ * 有助于代码的维护与审查,以及一些自动化的分析工具找到潜在的安全性错误 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Ignore.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Ignore.java index 3834e9fed3..a6676b10b0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Ignore.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Ignore.java @@ -31,7 +31,6 @@ * 忽略该属性 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Immutable.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Immutable.java index 7a951c7290..4e78dabb65 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Immutable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Immutable.java @@ -31,7 +31,6 @@ * 不可变类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Inject.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Inject.java index 735d34ff6c..638b126bf2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Inject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Inject.java @@ -31,7 +31,6 @@ * 注释实现类的成员(构造函数、方法和字段) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Label.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Label.java index 99bf7b6c08..4839582538 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Label.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Label.java @@ -34,7 +34,6 @@ * 用于在输出到CLI表或Excel/CSV等时为字段/getter提供标签. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Lazy.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Lazy.java index f1a6d40445..78f63c70c0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Lazy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Lazy.java @@ -35,7 +35,6 @@ * 或者标记为不受立即加载影响的方法(例如,AppConfig中的方法) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target({ElementType.TYPE, ElementType.METHOD}) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Metadata.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Metadata.java index 623b1db58e..21b2a47640 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Metadata.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Metadata.java @@ -31,7 +31,6 @@ * 元注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Named.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Named.java index 704bb2cca8..b49e05400e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Named.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Named.java @@ -34,7 +34,6 @@ * 注解命名 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Binding diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/NotThreadSafe.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/NotThreadSafe.java index bec569dea2..ce6f3a9a85 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/NotThreadSafe.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/NotThreadSafe.java @@ -31,7 +31,6 @@ * 线程不安全安全注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Qualifier.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Qualifier.java index cad15bd907..43e9c54029 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Qualifier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Qualifier.java @@ -32,7 +32,6 @@ * 标识qualifier注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target(ElementType.ANNOTATION_TYPE) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/SPI.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/SPI.java index b1ef18796f..7e3084265d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/SPI.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/SPI.java @@ -48,7 +48,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Scheduled.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Scheduled.java index 183edfbe8d..bfa773aba5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Scheduled.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Scheduled.java @@ -33,7 +33,6 @@ * 定时任务注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Scope.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Scope.java index 5b753d27ab..08c51ab196 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Scope.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Scope.java @@ -35,7 +35,6 @@ * 注释用于确定作用域的注释. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target(ElementType.ANNOTATION_TYPE) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Singleton.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Singleton.java index 3d92cb1ad8..f65adc8bac 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Singleton.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Singleton.java @@ -34,7 +34,6 @@ * 当您希望仅对该绑定的所有注入重用一个实例时,将此应用于实现类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Scope diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/ThreadSafe.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/ThreadSafe.java index b16754f36f..476e3efcc8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/ThreadSafe.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/ThreadSafe.java @@ -37,7 +37,6 @@ * 后期用途:可能会直接基于 class 进行反射创建,要求有些类需要显示指定这个注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Documented diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Trace.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Trace.java index 8bb61cd406..32ef169f96 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Trace.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Trace.java @@ -33,7 +33,6 @@ * 日志追溯 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target({ElementType.PARAMETER, ElementType.METHOD}) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/Values.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/Values.java index b1e46881e1..4fbe01d983 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/Values.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/Values.java @@ -33,7 +33,6 @@ * 配置注解,用于添加前缀 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target({ElementType.METHOD, ElementType.TYPE}) diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Dev.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Dev.java index ef1a33bca4..7019fb6827 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Dev.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Dev.java @@ -32,7 +32,6 @@ * 表示当前方法禁止用于生产环境,仅可用于开发测试 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Inherited diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Prod.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Prod.java index bb6e726f44..2af58b2c98 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Prod.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/Prod.java @@ -32,7 +32,6 @@ * 表示当前方法性能安全性各方面达标,可以用于生产环境 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Inherited diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/package-info.java index 1d81b44f1a..f7b499fe56 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/env/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/env/package-info.java @@ -2,7 +2,6 @@ * 注解包,提供项目环境增强 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.annotation.env; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/annotation/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/annotation/package-info.java index 17ce872d5e..bcb585cd8f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/annotation/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/annotation/package-info.java @@ -2,7 +2,6 @@ * 注解包,提供增强型注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.annotation; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/BeanCache.java b/bus-core/src/main/java/org/aoju/bus/core/beans/BeanCache.java index 5878fe734c..05fb724078 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/BeanCache.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/BeanCache.java @@ -25,15 +25,14 @@ ********************************************************************************/ package org.aoju.bus.core.beans; -import org.aoju.bus.core.lang.SimpleCache; import org.aoju.bus.core.lang.function.Func0; +import org.aoju.bus.core.map.WeakMap; /** * Bean属性缓存 * 缓存用于防止多次反射造成的性能问题 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum BeanCache { @@ -45,7 +44,7 @@ public enum BeanCache { /** * 缓存 */ - private final SimpleCache, BeanDesc> bdCache = new SimpleCache<>(); + private final WeakMap, BeanDesc> bdCache = new WeakMap<>(); /** * 获得属性名和{@link BeanDesc}Map映射 @@ -55,7 +54,7 @@ public enum BeanCache { * @return 属性名和{@link BeanDesc}映射 */ public BeanDesc getBeanDesc(Class beanClass, Func0 supplier) { - return bdCache.get(beanClass, supplier); + return bdCache.computeIfAbsent(beanClass, supplier); } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/BeanDesc.java b/bus-core/src/main/java/org/aoju/bus/core/beans/BeanDesc.java index 0ebdc3e31e..a73013d1b9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/BeanDesc.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/BeanDesc.java @@ -52,7 +52,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanDesc implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/DynamicBean.java b/bus-core/src/main/java/org/aoju/bus/core/beans/DynamicBean.java index 2ccdee1de6..1702c14a35 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/DynamicBean.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/DynamicBean.java @@ -26,8 +26,8 @@ package org.aoju.bus.core.beans; import org.aoju.bus.core.clone.Cloning; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.BeanKit; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.ReflectKit; @@ -40,7 +40,6 @@ * 支持Map和普通Bean * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DynamicBean extends Cloning implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/NullWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/beans/NullWrapper.java index 88c47d1a37..2a07252c36 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/NullWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/NullWrapper.java @@ -30,7 +30,6 @@ * * @param Null值对应的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NullWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/PathExpression.java b/bus-core/src/main/java/org/aoju/bus/core/beans/PathExpression.java index e82a7d9ff1..3e09a144a6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/PathExpression.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/PathExpression.java @@ -41,7 +41,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PathExpression implements Serializable { @@ -60,7 +59,7 @@ public class PathExpression implements Serializable { * * @param expression 表达式 */ - public PathExpression(String expression) { + public PathExpression(final String expression) { init(expression); } @@ -86,11 +85,11 @@ public PathExpression(String expression) { * @param expression 表达式 * @return {@link PathExpression} */ - public static PathExpression create(String expression) { + public static PathExpression create(final String expression) { return new PathExpression(expression); } - private static Object getFieldValue(Object bean, String expression) { + private static Object getFieldValue(final Object bean, final String expression) { if (StringKit.isBlank(expression)) { return null; } @@ -98,8 +97,8 @@ private static Object getFieldValue(Object bean, String expression) { if (StringKit.contains(expression, Symbol.C_COLON)) { // [start:end:step] 模式 final List parts = StringKit.splitTrim(expression, Symbol.C_COLON); - int start = Integer.parseInt(parts.get(0)); - int end = Integer.parseInt(parts.get(1)); + final int start = Integer.parseInt(parts.get(0)); + final int end = Integer.parseInt(parts.get(1)); int step = 1; if (3 == parts.size()) { step = Integer.parseInt(parts.get(2)); @@ -149,13 +148,22 @@ private static String unWrapIfPossible(CharSequence expression) { return StringKit.unWrap(expression, Symbol.C_SINGLE_QUOTE); } + /** + * 获取表达式解析后的分段列表 + * + * @return 表达式分段列表 + */ + public List getPatternParts() { + return this.patternParts; + } + /** * 获取Bean中对应表达式的值 * * @param bean Bean对象或Map或List等 * @return 值, 如果对应值不存在, 则返回null */ - public Object get(Object bean) { + public Object get(final Object bean) { return get(this.patternParts, bean, false); } @@ -172,10 +180,15 @@ public Object get(Object bean) { * @param bean Bean、Map或List * @param value 值 */ - public void set(Object bean, Object value) { + public void set(final Object bean, final Object value) { set(bean, this.patternParts, value); } + @Override + public String toString() { + return this.patternParts.toString(); + } + /** * 设置表达式指定位置(或filed对应)的值 * 若表达式指向一个List则设置其坐标对应位置的值,若指向Map则put对应key的值,Bean则设置字段的值 @@ -190,7 +203,7 @@ public void set(Object bean, Object value) { * @param patternParts 表达式块列表 * @param value 值 */ - private void set(Object bean, List patternParts, Object value) { + private void set(final Object bean, final List patternParts, final Object value) { Object subBean = get(patternParts, bean, true); if (null == subBean) { set(bean, patternParts.subList(0, patternParts.size() - 1), new HashMap<>()); @@ -208,7 +221,7 @@ private void set(Object bean, List patternParts, Object value) { * @param ignoreLast 是否忽略最后一个值,忽略最后一个值则用于set,否则用于read * @return 值, 如果对应值不存在, 则返回null */ - private Object get(List patternParts, Object bean, boolean ignoreLast) { + private Object get(final List patternParts, final Object bean, final boolean ignoreLast) { int length = patternParts.size(); if (ignoreLast) { length--; @@ -237,45 +250,53 @@ private Object get(List patternParts, Object bean, boolean ignoreLast) { * * @param expression 表达式 */ - private void init(String expression) { - List localPatternParts = new ArrayList<>(); - int length = expression.length(); + private void init(final String expression) { + final List localPatternParts = new ArrayList<>(); + final int length = expression.length(); - final TextKit builder = new TextKit(); + final StringBuilder builder = new StringBuilder(); char c; boolean isNumStart = false;// 下标标识符开始 + boolean isInWrap = false; //标识是否在引号内 for (int i = 0; i < length; i++) { c = expression.charAt(i); - if (0 == i && Symbol.C_DOLLAR == c) { - // 忽略开头的$符,表示当前对象 + if (0 == i && '$' == c) { + // 忽略开头的$符,表示当前对象 isStartWith = true; continue; } - if (ArrayKit.contains(EXP_CHARS, c)) { + if ('\'' == c) { + // 结束 + isInWrap = (false == isInWrap); + continue; + } + + if (false == isInWrap && ArrayKit.contains(EXP_CHARS, c)) { // 处理边界符号 if (Symbol.C_BRACKET_RIGHT == c) { - // 中括号(数字下标)结束 + // 中括号(数字下标)结束 if (false == isNumStart) { throw new IllegalArgumentException(StringKit.format("Bad expression '{}':{}, we find ']' but no '[' !", expression, i)); } isNumStart = false; + // 中括号结束加入下标 } else { if (isNumStart) { - // 非结束中括号情况下发现起始中括号报错(中括号未关闭) + // 非结束中括号情况下发现起始中括号报错(中括号未关闭) throw new IllegalArgumentException(StringKit.format("Bad expression '{}':{}, we find '[' but no ']' !", expression, i)); } else if (Symbol.C_BRACKET_LEFT == c) { // 数字下标开始 isNumStart = true; } + // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY } - // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } - builder.reset(); + builder.setLength(0); } else { - // 非边界符号,追加字符 + // 非边界符号,追加字符 builder.append(c); } } @@ -285,12 +306,12 @@ private void init(String expression) { throw new IllegalArgumentException(StringKit.format("Bad expression '{}':{}, we find '[' but no ']' !", expression, length - 1)); } else { if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } } // 不可变List - this.patternParts = Collections.unmodifiableList(localPatternParts); + this.patternParts = CollKit.unmodifiable(localPatternParts); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyCache.java b/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyCache.java index 42d2bc32b4..a09f351ac4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyCache.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyCache.java @@ -25,8 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.beans; -import org.aoju.bus.core.lang.SimpleCache; import org.aoju.bus.core.lang.function.Func0; +import org.aoju.bus.core.map.ReferenceMap; +import org.aoju.bus.core.map.WeakMap; import java.beans.PropertyDescriptor; import java.util.Map; @@ -36,15 +37,14 @@ * 缓存用于防止多次反射造成的性能问题 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum PropertyCache { INSTANCE; - private final SimpleCache, Map> pdCache = new SimpleCache<>(); - private final SimpleCache, Map> ignoreCasePdCache = new SimpleCache<>(); + private final WeakMap, Map> pdCache = new WeakMap<>(); + private final WeakMap, Map> ignoreCasePdCache = new WeakMap<>(); /** * 获得属性名和{@link PropertyDescriptor}Map映射 @@ -69,7 +69,7 @@ public Map getPropertyDescriptorMap( Class beanClass, boolean ignoreCase, Func0> supplier) { - return getCache(ignoreCase).get(beanClass, supplier); + return getCache(ignoreCase).computeIfAbsent(beanClass, (key) -> supplier.callWithRuntimeException()); } /** @@ -83,16 +83,6 @@ public void putPropertyDescriptorMap(Class beanClass, Map, Map> getCache(boolean ignoreCase) { - return ignoreCase ? ignoreCasePdCache : pdCache; - } - /** * 清空缓存 */ @@ -101,4 +91,14 @@ public void clear() { this.ignoreCasePdCache.clear(); } + /** + * 根据是否忽略字段名的大小写,返回不用Cache对象 + * + * @param ignoreCase 是否忽略大小写 + * @return {@link ReferenceMap} + */ + private ReferenceMap, Map> getCache(boolean ignoreCase) { + return ignoreCase ? ignoreCasePdCache : pdCache; + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyDesc.java b/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyDesc.java index d477d7a74d..c00541371a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyDesc.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/PropertyDesc.java @@ -28,7 +28,7 @@ import org.aoju.bus.core.annotation.Alias; import org.aoju.bus.core.annotation.Ignore; import org.aoju.bus.core.convert.Convert; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import java.beans.Transient; @@ -40,7 +40,6 @@ * 属性描述 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PropertyDesc { @@ -268,7 +267,7 @@ public PropertyDesc setValue(Object bean, Object value, boolean ignoreNull, bool * @param value 属性值,可以为任意类型 * @param ignoreNull 是否忽略{@code null}值,true表示忽略 * @param ignoreError 是否忽略错误,包括转换错误和注入错误 - * @param override 是否覆盖目标值,如果不覆盖,会先读取bean的值,非{@code null}则写,否则忽略。如果覆盖,则不判断直接写 + * @param override 是否覆盖目标值,如果不覆盖,会先读取bean的值,{@code null}则写,否则忽略。如果覆盖,则不判断直接写 * @return this */ public PropertyDesc setValue(Object bean, Object value, boolean ignoreNull, boolean ignoreError, boolean override) { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/AbstractCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/AbstractCopier.java index 4094530cb5..b71d78d921 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/AbstractCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/AbstractCopier.java @@ -34,7 +34,6 @@ * @param 来源对象类型 * @param 目标对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractCopier implements Copier { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanCopier.java index 6720b3be0c..0c2bb54cb7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanCopier.java @@ -25,6 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.beans.copier; +import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.copier.Copier; import java.io.Serializable; @@ -43,7 +44,6 @@ * * @param 目标对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanCopier implements Copier, Serializable { @@ -61,6 +61,8 @@ public class BeanCopier implements Copier, Serializable { * @param copyOptions 拷贝属性选项 */ public BeanCopier(Object source, T target, Type targetType, CopyOptions copyOptions) { + Assert.notNull(source, "Source bean must be not null!"); + Assert.notNull(target, "Target bean must be not null!"); Copier copier; if (source instanceof Map) { if (target instanceof Map) { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToBeanCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToBeanCopier.java index c63ce87dc1..c7db31f328 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToBeanCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToBeanCopier.java @@ -26,7 +26,6 @@ package org.aoju.bus.core.beans.copier; import org.aoju.bus.core.beans.PropertyDesc; -import org.aoju.bus.core.convert.Convert; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.toolkit.BeanKit; import org.aoju.bus.core.toolkit.TypeKit; @@ -40,7 +39,6 @@ * @param 源Bean类型 * @param 目标Bean类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanToBeanCopier extends AbstractCopier { @@ -102,7 +100,7 @@ public T copy() { // 获取目标字段真实类型并转换源值 final Type fieldType = TypeKit.getActualType(this.targetType, tDesc.getFieldType()); - sValue = Convert.convertWithCheck(fieldType, sValue, null, this.copyOptions.ignoreError); + sValue = this.copyOptions.convertField(fieldType, sValue); sValue = copyOptions.editFieldValue(sFieldName, sValue); // 目标赋值 diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToMapCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToMapCopier.java index ddd3b6e8ee..3002b772ad 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToMapCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/BeanToMapCopier.java @@ -26,7 +26,6 @@ package org.aoju.bus.core.beans.copier; import org.aoju.bus.core.beans.PropertyDesc; -import org.aoju.bus.core.convert.Convert; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.toolkit.BeanKit; import org.aoju.bus.core.toolkit.TypeKit; @@ -38,7 +37,6 @@ * Bean属性拷贝到Map中的拷贝器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanToMapCopier extends AbstractCopier { @@ -93,13 +91,12 @@ public Map copy() { // 获取目标值真实类型并转换源值 final Type[] typeArguments = TypeKit.getTypeArguments(this.targetType); if (null != typeArguments) { - sValue = Convert.convertWithCheck(typeArguments[1], sValue, null, this.copyOptions.ignoreError); + sValue = this.copyOptions.convertField(typeArguments[1], sValue); sValue = copyOptions.editFieldValue(sFieldName, sValue); } // 目标赋值 if (null != sValue || false == copyOptions.ignoreNullValue) { - //noinspection unchecked target.put(sFieldName, sValue); } }); diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/CopyOptions.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/CopyOptions.java index 94376a9e7a..cbcec10f73 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/CopyOptions.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/CopyOptions.java @@ -25,12 +25,18 @@ ********************************************************************************/ package org.aoju.bus.core.beans.copier; +import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.convert.TypeConverter; import org.aoju.bus.core.lang.Editor; +import org.aoju.bus.core.lang.function.Func1; import org.aoju.bus.core.toolkit.ArrayKit; +import org.aoju.bus.core.toolkit.LambdaKit; import java.io.Serializable; import java.lang.reflect.Field; +import java.lang.reflect.Type; import java.util.Map; +import java.util.Set; import java.util.function.BiFunction; import java.util.function.BiPredicate; @@ -42,7 +48,6 @@ * 3、忽略的属性列表,设置一个属性列表,不拷贝这些属性值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CopyOptions implements Serializable { @@ -71,13 +76,18 @@ public class CopyOptions implements Serializable { */ protected BiFunction fieldValueEditor; /** - * 是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略。 + * 是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略 */ protected boolean transientSupport = true; /** - * 是否覆盖目标值,如果不覆盖,会先读取目标对象的值,非{@code null}则写,否则忽略。如果覆盖,则不判断直接写 + * 是否覆盖目标值,如果不覆盖,会先读取目标对象的值,非{@code null}则写,否则忽略如果覆盖,则不判断直接写 */ protected boolean override = true; + /** + * 自定义类型转换器,默认使用全局万能转换器转换 + */ + protected TypeConverter converter = (type, value) -> + Convert.convertWithCheck(type, value, null, ignoreError); /** * 属性过滤器,断言通过的属性才会被复制 * 断言参数中Field为源对象的字段对象,如果源对象为Map,使用目标对象,Object为源对象的对应值 @@ -89,8 +99,6 @@ public class CopyOptions implements Serializable { */ private Editor fieldNameEditor; - //region create - /** * 构造拷贝选项 */ @@ -186,6 +194,19 @@ public CopyOptions setIgnoreProperties(String... ignoreProperties) { return setPropertiesFilter((field, o) -> false == ArrayKit.contains(ignoreProperties, field.getName())); } + /** + * 设置忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值,Lambda方式 + * + * @param

参数类型 + * @param 返回值类型 + * @param funcs 忽略的目标对象中属性列表,设置一个属性列表,不拷贝这些属性值 + * @return this + */ + public CopyOptions setIgnoreProperties(Func1... funcs) { + final Set ignoreProperties = ArrayKit.mapToSet(funcs, LambdaKit::getFieldName); + return setPropertiesFilter((field, o) -> false == ignoreProperties.contains(field.getName())); + } + /** * 设置是否忽略字段的注入错误 * @@ -273,7 +294,7 @@ protected Object editFieldValue(String fieldName, Object fieldValue) { } /** - * 设置是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略。 + * 设置是否支持transient关键字修饰和@Transient注解,如果支持,被修饰的字段或方法对应的字段将被忽略 * * @param transientSupport 是否支持 * @return this @@ -284,7 +305,7 @@ public CopyOptions setTransientSupport(boolean transientSupport) { } /** - * 设置是否覆盖目标值,如果不覆盖,会先读取目标对象的值,非{@code null}则写,否则忽略。如果覆盖,则不判断直接写 + * 设置是否覆盖目标值,如果不覆盖,会先读取目标对象的值,非{@code null}则写,否则忽略如果覆盖,则不判断直接写 * * @param override 是否覆盖目标值 * @return this @@ -294,6 +315,30 @@ public CopyOptions setOverride(boolean override) { return this; } + /** + * 设置自定义类型转换器,默认使用全局万能转换器转换 + * + * @param converter 转换器 + * @return this + */ + public CopyOptions setConverter(TypeConverter converter) { + this.converter = converter; + return this; + } + + /** + * 使用自定义转换器转换字段值 + * 如果自定义转换器为{@code null},则返回原值 + * + * @param targetType 目标类型 + * @param fieldValue 字段值 + * @return 编辑后的字段值 + */ + protected Object convertField(Type targetType, Object fieldValue) { + return (null != this.converter) ? + this.converter.convert(targetType, fieldValue) : fieldValue; + } + /** * 转换字段名为编辑后的字段名 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToBeanCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToBeanCopier.java index 6195d0c979..c81737223c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToBeanCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToBeanCopier.java @@ -26,7 +26,6 @@ package org.aoju.bus.core.beans.copier; import org.aoju.bus.core.beans.PropertyDesc; -import org.aoju.bus.core.convert.Convert; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.map.CaseInsensitiveMap; import org.aoju.bus.core.map.MapWrapper; @@ -42,7 +41,6 @@ * * @param 目标Bean类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapToBeanCopier extends AbstractCopier, T> { @@ -110,7 +108,7 @@ public T copy() { // 获取目标字段真实类型并转换源值 final Type fieldType = TypeKit.getActualType(this.targetType, tDesc.getFieldType()); - Object newValue = Convert.convertWithCheck(fieldType, sValue, null, this.copyOptions.ignoreError); + Object newValue = this.copyOptions.convertField(fieldType, sValue); newValue = copyOptions.editFieldValue(sKeyStr, newValue); // 目标赋值 @@ -120,7 +118,7 @@ public T copy() { } /** - * 查找Map对应Bean的名称
+ * 查找Map对应Bean的名称 * 尝试原名称、转驼峰名称、isXxx去掉is的名称 * * @param targetPropertyDescMap 目标bean的属性描述Map diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToMapCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToMapCopier.java index 70bd537525..93a1b046fc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToMapCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/MapToMapCopier.java @@ -25,7 +25,6 @@ ********************************************************************************/ package org.aoju.bus.core.beans.copier; -import org.aoju.bus.core.convert.Convert; import org.aoju.bus.core.toolkit.TypeKit; import java.lang.reflect.Type; @@ -35,7 +34,6 @@ * Map属性拷贝到Map中的拷贝器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapToMapCopier extends AbstractCopier { @@ -79,7 +77,7 @@ public Map copy() { // 获取目标值真实类型并转换源值 final Type[] typeArguments = TypeKit.getTypeArguments(this.targetType); if (null != typeArguments) { - sValue = Convert.convertWithCheck(typeArguments[1], sValue, null, this.copyOptions.ignoreError); + sValue = this.copyOptions.convertField(typeArguments[1], sValue); sValue = copyOptions.editFieldValue(sKeyStr, sValue); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProvider.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProvider.java index 2ce382e4d6..d39b832657 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProvider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProvider.java @@ -34,7 +34,6 @@ * * @param KEY类型,一般情况下为 {@link String} * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface ValueProvider { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProviderToBeanCopier.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProviderToBeanCopier.java index f9148ff4ba..e3dc5aed28 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProviderToBeanCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/ValueProviderToBeanCopier.java @@ -38,7 +38,6 @@ * * @param 目标Bean类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ValueProviderToBeanCopier extends AbstractCopier, T> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/package-info.java index 2841d74815..060c2b7c03 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/package-info.java @@ -2,7 +2,6 @@ * Bean拷贝实现,包括拷贝选项等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.beans.copier; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/DynamicBeanValueProvider.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/DynamicBeanValueProvider.java index dc4b5fd9b3..57d757c686 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/DynamicBeanValueProvider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/DynamicBeanValueProvider.java @@ -35,7 +35,6 @@ * DynaBean值提供者 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DynamicBeanValueProvider implements ValueProvider { diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/package-info.java index 9d7083332f..9054a20882 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/copier/provider/package-info.java @@ -2,7 +2,6 @@ * Bean值提供者方式封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.beans.copier.provider; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/beans/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/beans/package-info.java index a55d57eb64..c22b4f0298 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/beans/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/beans/package-info.java @@ -2,7 +2,6 @@ * Bean相关操作,包括Bean信息描述,Bean路径表达式、动态Bean等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.beans; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/BitMapBloomFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/BitMapBloomFilter.java index 9d5dd0561f..c0fd66671f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/BitMapBloomFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/BitMapBloomFilter.java @@ -37,7 +37,6 @@ * 此实现方式可以指定Hash算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BitMapBloomFilter implements BloomFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/BitSetBloomFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/BitSetBloomFilter.java index af02f4775a..d925c1a944 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/BitSetBloomFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/BitSetBloomFilter.java @@ -38,7 +38,6 @@ * Hash算法的使用使用固定顺序,只需指定个数即可 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BitSetBloomFilter implements BloomFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/BloomFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/BloomFilter.java index db0d725c22..17eebc8e7d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/BloomFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/BloomFilter.java @@ -33,7 +33,6 @@ * 这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BloomFilter extends Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/BitMap.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/BitMap.java index 8a567bc407..999bb4d5fa 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/BitMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/BitMap.java @@ -31,7 +31,6 @@ * BitMap接口,用于将某个int或long值映射到一个数组中,从而判定某个值是否存在 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BitMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/IntMap.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/IntMap.java index de98e21ad1..132994e0d9 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/IntMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/IntMap.java @@ -31,7 +31,6 @@ * 过滤器BitMap在32位机器上.这个类能发生更好的效果.一般情况下建议使用此类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IntMap implements BitMap, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/LongMap.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/LongMap.java index 3e744135d9..385a99a9b4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/LongMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/LongMap.java @@ -31,7 +31,6 @@ * 过滤器BitMap在64位机器上.这个类能发生更好的效果.一般机器不建议使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LongMap implements BitMap, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/package-info.java index f69c9e06d8..8078bc02c5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/bitmap/package-info.java @@ -2,7 +2,6 @@ * BitMap实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.bloom.bitmap; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/AbstractFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/AbstractFilter.java index 7ad9bb0b0c..91f14d939b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/AbstractFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/AbstractFilter.java @@ -34,7 +34,6 @@ * 抽象Bloom过滤器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractFilter implements BloomFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/DefaultFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/DefaultFilter.java index cbec828e3e..763236e927 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/DefaultFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/DefaultFilter.java @@ -31,7 +31,6 @@ * 默认Bloom过滤器,使用Java自带的Hash算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DefaultFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/ELFFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/ELFFilter.java index b52ecf12ae..174887c259 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/ELFFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/ELFFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ELFFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/FNVFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/FNVFilter.java index cb3781b103..8c88f82f1e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/FNVFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/FNVFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FNVFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfFilter.java index 8d206158bb..7ad3ceda86 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfFilter.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HfFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfIpFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfIpFilter.java index a351852180..b98a03b900 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfIpFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/HfIpFilter.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HfIpFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/JSFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/JSFilter.java index 60bf09b734..f0ad74ee9d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/JSFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/JSFilter.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JSFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/PJWFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/PJWFilter.java index 74ad5f4cb8..4fbe21fe29 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/PJWFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/PJWFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PJWFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/RSFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/RSFilter.java index 52eb07e438..f7256b00b8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/RSFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/RSFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RSFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/SDBMFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/SDBMFilter.java index ddb100d9ea..0a90f6ef26 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/SDBMFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/SDBMFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SDBMFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/TianlFilter.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/TianlFilter.java index 3227f38882..58499242b4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/TianlFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/TianlFilter.java @@ -29,7 +29,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TianlFilter extends AbstractFilter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/package-info.java index 12ebf21758..d9c6f561b3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/filter/package-info.java @@ -2,7 +2,6 @@ * 各种Hash算法的过滤器实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.bloom.filter; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/bloom/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/bloom/package-info.java index a41e0c60a0..d21a31c0e7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/bloom/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/bloom/package-info.java @@ -2,7 +2,6 @@ * 布隆过滤,提供一些Hash算法的布隆过滤 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.bloom; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/Builder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/Builder.java index c0b14dac1e..a0acced7c1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/Builder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/Builder.java @@ -32,7 +32,6 @@ * * @param 建造对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Builder extends Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/CompareBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/CompareBuilder.java index 230a385c83..7ae4924e33 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/CompareBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/CompareBuilder.java @@ -70,7 +70,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CompareBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/Different.java b/bus-core/src/main/java/org/aoju/bus/core/builder/Different.java index 5c0845fa81..21ed143bc6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/Different.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/Different.java @@ -38,7 +38,6 @@ * * @param 这个{@code Diff}中包含的对象类型. * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Different extends Pair { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentBuilder.java index 39186938e6..0effd6ea40 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentBuilder.java @@ -59,7 +59,6 @@ * {@link DifferentResult#toString(ToStringStyle)}覆盖此样式选择。. * * @author Kimi Liu - * @version 6.5.0 * @see Differentable * @see Different * @see DifferentResult diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentResult.java b/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentResult.java index 8b5df8955a..2d0df264f2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentResult.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/DifferentResult.java @@ -38,7 +38,6 @@ * 该方法返回一个字符串,该字符串描述对象之间不同的字段. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DifferentResult implements Iterable> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/Differentable.java b/bus-core/src/main/java/org/aoju/bus/core/builder/Differentable.java index b5e5c2cf3b..a3bb2ddf21 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/Differentable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/Differentable.java @@ -41,7 +41,6 @@ * * @param 这个对象可能被区分的对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Differentable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsBuilder.java index ca7d5ef084..d06379877a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsBuilder.java @@ -63,7 +63,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EqualsBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsExclude.java b/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsExclude.java index 73688bedef..438bf09a4d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsExclude.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/EqualsExclude.java @@ -35,7 +35,6 @@ * 上的各种reflectionEquals方法使用. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/GenericBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/GenericBuilder.java index ca998cf58e..b5100368c8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/GenericBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/GenericBuilder.java @@ -37,11 +37,12 @@ * 通用Builder * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GenericBuilder implements Builder { + private static final long serialVersionUID = 1L; + /** * 实例化器 */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeBuilder.java index 7ebf26e1d7..3025a06e0e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeBuilder.java @@ -65,7 +65,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HashCodeBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeExclude.java b/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeExclude.java index 979cd6dbc1..24153515d6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeExclude.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/HashCodeExclude.java @@ -35,7 +35,6 @@ * 上的各种reflectionHashcode方法使用. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/MultilineToStringStyle.java b/bus-core/src/main/java/org/aoju/bus/core/builder/MultilineToStringStyle.java index 063cb0aea7..113c061a32 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/MultilineToStringStyle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/MultilineToStringStyle.java @@ -54,7 +54,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MultilineToStringStyle extends RecursiveToStringStyle { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/RecursiveToStringStyle.java b/bus-core/src/main/java/org/aoju/bus/core/builder/RecursiveToStringStyle.java index fc05891a09..6aa872849f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/RecursiveToStringStyle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/RecursiveToStringStyle.java @@ -54,7 +54,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RecursiveToStringStyle extends ToStringStyle { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionBuilder.java index 118b7a5d6a..217adc0719 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionBuilder.java @@ -59,7 +59,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReflectionBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionToStringBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionToStringBuilder.java index 5850100482..f8c74458f0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionToStringBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ReflectionToStringBuilder.java @@ -55,7 +55,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReflectionToStringBuilder extends ToStringBuilder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/StandardToStringStyle.java b/bus-core/src/main/java/org/aoju/bus/core/builder/StandardToStringStyle.java index 052e2c0050..cec78738e6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/StandardToStringStyle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/StandardToStringStyle.java @@ -34,7 +34,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StandardToStringStyle extends ToStringStyle { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringBuilder.java index 6f96079138..aac645bfca 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringBuilder.java @@ -65,7 +65,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ToStringBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringExclude.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringExclude.java index 0c254ce2c0..dce68fccac 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringExclude.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringExclude.java @@ -34,7 +34,6 @@ * 使用这个注释来排除字段被{@link ReflectionToStringBuilder}使用. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringStyle.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringStyle.java index 4228942cb0..c52ec4a131 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringStyle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringStyle.java @@ -63,7 +63,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class ToStringStyle implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringSummary.java b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringSummary.java index ec8a339952..1ce5e788b1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringSummary.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/ToStringSummary.java @@ -35,7 +35,6 @@ * 在字段上使用这个注释来获得摘要,而不是详细信息. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Retention(RetentionPolicy.RUNTIME) diff --git a/bus-core/src/main/java/org/aoju/bus/core/builder/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/builder/package-info.java index 2e3ff818df..15599c2037 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/builder/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/builder/package-info.java @@ -3,7 +3,6 @@ * 用于建造特定对象或结果 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.builder; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/clone/Cloneable.java b/bus-core/src/main/java/org/aoju/bus/core/clone/Cloneable.java index 513eb9db89..dab607c4b4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/clone/Cloneable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/clone/Cloneable.java @@ -30,7 +30,6 @@ * * @param 实现克隆接口的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Cloneable extends java.lang.Cloneable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/clone/Cloning.java b/bus-core/src/main/java/org/aoju/bus/core/clone/Cloning.java index 9889a0cfca..89a5d6c4d6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/clone/Cloning.java +++ b/bus-core/src/main/java/org/aoju/bus/core/clone/Cloning.java @@ -25,14 +25,13 @@ ********************************************************************************/ package org.aoju.bus.core.clone; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; /** * 克隆支持类,提供默认的克隆方法 * * @param 继承类的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Cloning implements Cloneable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/clone/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/clone/package-info.java index 925c970a24..0edb8626df 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/clone/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/clone/package-info.java @@ -2,7 +2,6 @@ * 克隆封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.clone; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/BCD.java b/bus-core/src/main/java/org/aoju/bus/core/codec/BCD.java index 1e806e207f..d8aa6d54d2 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/BCD.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/BCD.java @@ -34,7 +34,6 @@ * 使二进制和十进制之间的转换得以快捷的进行 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BCD { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Base32.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Base32.java index 0f313d1b44..c3b58e3ea3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Base32.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Base32.java @@ -36,7 +36,6 @@ * see http://blog.csdn.net/earbao/article/details/44453937 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base32 { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Base58.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Base58.java index 13ceaa111d..c51274506e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Base58.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Base58.java @@ -26,9 +26,9 @@ package org.aoju.bus.core.codec; import org.aoju.bus.core.codec.provider.Base58Provider; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.exception.ValidateException; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.InstrumentException; -import org.aoju.bus.core.lang.exception.ValidateException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -41,7 +41,6 @@ * 规范见:https://en.bitcoin.it/wiki/Base58Check_encoding * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base58 { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Base62.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Base62.java index 6a61c6d24a..46e5106a7d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Base62.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Base62.java @@ -39,7 +39,6 @@ * Base62工具类,提供Base62的编码和解码方案 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base62 { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Base64.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Base64.java index 8db8df58a8..8264155d4a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Base64.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Base64.java @@ -25,10 +25,10 @@ ********************************************************************************/ package org.aoju.bus.core.codec; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.lang.mutable.MutableInt; import org.aoju.bus.core.toolkit.*; @@ -43,7 +43,6 @@ * 也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base64 { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Caesar.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Caesar.java index b972a797a0..8cdf9f9ba1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Caesar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Caesar.java @@ -31,7 +31,6 @@ * 凯撒密码实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Caesar { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Decoder.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Decoder.java index ca9db54cd3..7a34bd13aa 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Decoder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Decoder.java @@ -31,7 +31,6 @@ * @param 被解码的数据类型 * @param 解码后的数据类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Decoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Encoder.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Encoder.java index 86948dfcb3..dbb0406eee 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Encoder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Encoder.java @@ -31,7 +31,6 @@ * @param 被编码的数据类型 * @param 编码后的数据类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Encoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Hashids.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Hashids.java new file mode 100755 index 0000000000..a194ab48cb --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Hashids.java @@ -0,0 +1,527 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.codec; + +import java.math.BigInteger; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.LongStream; + +/** + *
Hashids 协议实现,以实现: + * + * + *

+ * 来自:https://github.com/davidafsilva/java-hashids + *

+ * + *

+ * {@code Hashids}可以将数字或者16进制字符串转为短且唯一不连续的字符串,采用双向编码实现,比如,它可以将347之类的数字转换为yr8之类的字符串,也可以将yr8之类的字符串重新解码为347之类的数字。
+ * 此编码算法主要是解决爬虫类应用对连续ID爬取问题,将有序的ID转换为无序的Hashids,而且一一对应。 + *

+ * + * @author Kimi Liu + * @since Java 17+ + */ +public class Hashids implements Encoder, Decoder { + + // 默认编解码字符串 + public static final char[] DEFAULT_ALPHABET = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' + }; + private static final int LOTTERY_MOD = 100; + private static final double GUARD_THRESHOLD = 12; + private static final double SEPARATOR_THRESHOLD = 3.5; + // 最小编解码字符串 + private static final int MIN_ALPHABET_LENGTH = 16; + private static final Pattern HEX_VALUES_PATTERN = Pattern.compile("[\\w\\W]{1,12}"); + // 默认分隔符 + private static final char[] DEFAULT_SEPARATORS = { + 'c', 'f', 'h', 'i', 's', 't', 'u', 'C', 'F', 'H', 'I', 'S', 'T', 'U' + }; + + // algorithm properties + private final char[] alphabet; + // 多个数字编解码的分界符 + private final char[] separators; + private final Set separatorsSet; + private final char[] salt; + // 补齐至 minLength 长度添加的字符列表 + private final char[] guards; + // 编码后最小的字符长度 + private final int minLength; + + // region create + + /** + * 构造 + * + * @param salt 加盐值 + * @param alphabet hash字母表 + * @param minLength 限制最小长度,-1表示不限制 + */ + public Hashids(final char[] salt, final char[] alphabet, final int minLength) { + this.minLength = minLength; + this.salt = Arrays.copyOf(salt, salt.length); + + // filter and shuffle separators + char[] tmpSeparators = shuffle(filterSeparators(DEFAULT_SEPARATORS, alphabet), this.salt); + + // validate and filter the alphabet + char[] tmpAlphabet = validateAndFilterAlphabet(alphabet, tmpSeparators); + + // check separator threshold + if (tmpSeparators.length == 0 || + ((double) (tmpAlphabet.length / tmpSeparators.length)) > SEPARATOR_THRESHOLD) { + final int minSeparatorsSize = (int) Math.ceil(tmpAlphabet.length / SEPARATOR_THRESHOLD); + // check minimum size of separators + if (minSeparatorsSize > tmpSeparators.length) { + // fill separators from alphabet + final int missingSeparators = minSeparatorsSize - tmpSeparators.length; + tmpSeparators = Arrays.copyOf(tmpSeparators, tmpSeparators.length + missingSeparators); + System.arraycopy(tmpAlphabet, 0, tmpSeparators, + tmpSeparators.length - missingSeparators, missingSeparators); + System.arraycopy(tmpAlphabet, 0, tmpSeparators, + tmpSeparators.length - missingSeparators, missingSeparators); + tmpAlphabet = Arrays.copyOfRange(tmpAlphabet, missingSeparators, tmpAlphabet.length); + } + } + + // shuffle the current alphabet + shuffle(tmpAlphabet, this.salt); + + // check guards + this.guards = new char[(int) Math.ceil(tmpAlphabet.length / GUARD_THRESHOLD)]; + if (alphabet.length < 3) { + System.arraycopy(tmpSeparators, 0, guards, 0, guards.length); + this.separators = Arrays.copyOfRange(tmpSeparators, guards.length, tmpSeparators.length); + this.alphabet = tmpAlphabet; + } else { + System.arraycopy(tmpAlphabet, 0, guards, 0, guards.length); + this.separators = tmpSeparators; + this.alphabet = Arrays.copyOfRange(tmpAlphabet, guards.length, tmpAlphabet.length); + } + + // create the separators set + separatorsSet = IntStream.range(0, separators.length) + .mapToObj(idx -> separators[idx]) + .collect(Collectors.toSet()); + } + + /** + * 根据参数值,创建{@code Hashids},使用默认{@link #DEFAULT_ALPHABET}作为字母表,不限制最小长度 + * + * @param salt 加盐值 + * @return {@code Hashids} + */ + public static Hashids create(final char[] salt) { + return create(salt, DEFAULT_ALPHABET, -1); + } + + /** + * 根据参数值,创建{@code Hashids},使用默认{@link #DEFAULT_ALPHABET}作为字母表 + * + * @param salt 加盐值 + * @param minLength 限制最小长度,-1表示不限制 + * @return {@code Hashids} + */ + public static Hashids create(final char[] salt, final int minLength) { + return create(salt, DEFAULT_ALPHABET, minLength); + } + // endregion + + /** + * 根据参数值,创建{@code Hashids} + * + * @param salt 加盐值 + * @param alphabet hash字母表 + * @param minLength 限制最小长度,-1表示不限制 + * @return {@code Hashids} + */ + public static Hashids create(final char[] salt, final char[] alphabet, final int minLength) { + return new Hashids(salt, alphabet, minLength); + } + + /** + * 编码给定的16进制数字 + * + * @param hexNumbers 16进制数字 + * @return 编码后的值, {@code null} if {@code numbers} 是 {@code null}. + * @throws IllegalArgumentException 数字不支持抛出此异常 + */ + public String encodeFromHex(final String hexNumbers) { + if (hexNumbers == null) { + return null; + } + + // remove the prefix, if present + final String hex = hexNumbers.startsWith("0x") || hexNumbers.startsWith("0X") ? + hexNumbers.substring(2) : hexNumbers; + + // get the associated long value and encode it + LongStream values = LongStream.empty(); + final Matcher matcher = HEX_VALUES_PATTERN.matcher(hex); + while (matcher.find()) { + final long value = new BigInteger("1" + matcher.group(), 16).longValue(); + values = LongStream.concat(values, LongStream.of(value)); + } + + return encode(values.toArray()); + } + + /** + * 编码给定的数字数组 + * + * @param numbers 数字数组 + * @return 编码后的值, {@code null} if {@code numbers} 是 {@code null}. + * @throws IllegalArgumentException 数字不支持抛出此异常 + */ + @Override + public String encode(final long... numbers) { + if (numbers == null) { + return null; + } + + // copy alphabet + final char[] currentAlphabet = Arrays.copyOf(alphabet, alphabet.length); + + // determine the lottery number + final long lotteryId = LongStream.range(0, numbers.length) + .reduce(0, (state, i) -> { + final long number = numbers[(int) i]; + if (number < 0) { + throw new IllegalArgumentException("invalid number: " + number); + } + return state + number % (i + LOTTERY_MOD); + }); + final char lottery = currentAlphabet[(int) (lotteryId % currentAlphabet.length)]; + + // encode each number + final StringBuilder global = new StringBuilder(); + IntStream.range(0, numbers.length) + .forEach(idx -> { + // derive alphabet + deriveNewAlphabet(currentAlphabet, salt, lottery); + + // encode + final int initialLength = global.length(); + translate(numbers[idx], currentAlphabet, global, initialLength); + + // prepend the lottery + if (idx == 0) { + global.insert(0, lottery); + } + + // append the separator, if more numbers are pending encoding + if (idx + 1 < numbers.length) { + long n = numbers[idx] % (global.charAt(initialLength) + 1); + global.append(separators[(int) (n % separators.length)]); + } + }); + + // add the guards, if there's any space left + if (minLength > global.length()) { + int guardIdx = (int) ((lotteryId + lottery) % guards.length); + global.insert(0, guards[guardIdx]); + if (minLength > global.length()) { + guardIdx = (int) ((lotteryId + global.charAt(2)) % guards.length); + global.append(guards[guardIdx]); + } + } + + // add the necessary padding + int paddingLeft = minLength - global.length(); + while (paddingLeft > 0) { + shuffle(currentAlphabet, Arrays.copyOf(currentAlphabet, currentAlphabet.length)); + + final int alphabetHalfSize = currentAlphabet.length / 2; + final int initialSize = global.length(); + if (paddingLeft > currentAlphabet.length) { + // entire alphabet with the current encoding in the middle of it + int offset = alphabetHalfSize + (currentAlphabet.length % 2 == 0 ? 0 : 1); + + global.insert(0, currentAlphabet, alphabetHalfSize, offset); + global.insert(offset + initialSize, currentAlphabet, 0, alphabetHalfSize); + // decrease the padding left + paddingLeft -= currentAlphabet.length; + } else { + // calculate the excess + final int excess = currentAlphabet.length + global.length() - minLength; + final int secondHalfStartOffset = alphabetHalfSize + Math.floorDiv(excess, 2); + final int secondHalfLength = currentAlphabet.length - secondHalfStartOffset; + final int firstHalfLength = paddingLeft - secondHalfLength; + + global.insert(0, currentAlphabet, secondHalfStartOffset, secondHalfLength); + global.insert(secondHalfLength + initialSize, currentAlphabet, 0, firstHalfLength); + + paddingLeft = 0; + } + } + + return global.toString(); + } + + //------------------------- + // Decode + //------------------------- + + /** + * 解码Hash值为16进制数字 + * + * @param hash hash值 + * @return 解码后的16进制值, {@code null} if {@code numbers} 是 {@code null}. + * @throws IllegalArgumentException if the hash is invalid. + */ + public String decodeToHex(final String hash) { + if (hash == null) { + return null; + } + + final StringBuilder sb = new StringBuilder(); + Arrays.stream(decode(hash)) + .mapToObj(Long::toHexString) + .forEach(hex -> sb.append(hex, 1, hex.length())); + return sb.toString(); + } + + /** + * 解码Hash值为数字数组 + * + * @param hash hash值 + * @return 解码后的16进制值, {@code null} if {@code numbers} 是 {@code null}. + * @throws IllegalArgumentException if the hash is invalid. + */ + @Override + public long[] decode(final String hash) { + if (hash == null) { + return null; + } + + // create a set of the guards + final Set guardsSet = IntStream.range(0, guards.length) + .mapToObj(idx -> guards[idx]) + .collect(Collectors.toSet()); + // count the total guards used + final int[] guardsIdx = IntStream.range(0, hash.length()) + .filter(idx -> guardsSet.contains(hash.charAt(idx))) + .toArray(); + // get the start/end index base on the guards count + final int startIdx, endIdx; + if (guardsIdx.length > 0) { + startIdx = guardsIdx[0] + 1; + endIdx = guardsIdx.length > 1 ? guardsIdx[1] : hash.length(); + } else { + startIdx = 0; + endIdx = hash.length(); + } + + LongStream decoded = LongStream.empty(); + // parse the hash + if (hash.length() > 0) { + final char lottery = hash.charAt(startIdx); + + // create the initial accumulation string + final int length = hash.length() - guardsIdx.length - 1; + StringBuilder block = new StringBuilder(length); + + // create the base salt + final char[] decodeSalt = new char[alphabet.length]; + decodeSalt[0] = lottery; + final int saltLength = salt.length >= alphabet.length ? alphabet.length - 1 : salt.length; + System.arraycopy(salt, 0, decodeSalt, 1, saltLength); + final int saltLeft = alphabet.length - saltLength - 1; + + // copy alphabet + final char[] currentAlphabet = Arrays.copyOf(alphabet, alphabet.length); + + for (int i = startIdx + 1; i < endIdx; i++) { + if (false == separatorsSet.contains(hash.charAt(i))) { + block.append(hash.charAt(i)); + // continue if we have not reached the end, yet + if (i < endIdx - 1) { + continue; + } + } + + if (block.length() > 0) { + // create the salt + if (saltLeft > 0) { + System.arraycopy(currentAlphabet, 0, decodeSalt, + alphabet.length - saltLeft, saltLeft); + } + + // shuffle the alphabet + shuffle(currentAlphabet, decodeSalt); + + // prepend the decoded value + final long n = translate(block.toString().toCharArray(), currentAlphabet); + decoded = LongStream.concat(decoded, LongStream.of(n)); + + // create a new block + block = new StringBuilder(length); + } + } + } + + // validate the hash + final long[] decodedValue = decoded.toArray(); + if (!Objects.equals(hash, encode(decodedValue))) { + throw new IllegalArgumentException("invalid hash: " + hash); + } + + return decodedValue; + } + + private StringBuilder translate(final long n, final char[] alphabet, + final StringBuilder sb, final int start) { + long input = n; + do { + // prepend the chosen char + sb.insert(start, alphabet[(int) (input % alphabet.length)]); + + // trim the input + input = input / alphabet.length; + } while (input > 0); + + return sb; + } + + private long translate(final char[] hash, final char[] alphabet) { + long number = 0; + + final Map alphabetMapping = IntStream.range(0, alphabet.length) + .mapToObj(idx -> new Object[]{alphabet[idx], idx}) + .collect(Collectors.groupingBy(arr -> (Character) arr[0], + Collectors.mapping(arr -> (Integer) arr[1], + Collectors.reducing(null, (a, b) -> a == null ? b : a)))); + + for (int i = 0; i < hash.length; ++i) { + number += alphabetMapping.computeIfAbsent(hash[i], k -> { + throw new IllegalArgumentException("Invalid alphabet for hash"); + }) * (long) Math.pow(alphabet.length, hash.length - i - 1); + } + + return number; + } + + private char[] deriveNewAlphabet(final char[] alphabet, final char[] salt, final char lottery) { + // create the new salt + final char[] newSalt = new char[alphabet.length]; + + // 1. lottery + newSalt[0] = lottery; + int spaceLeft = newSalt.length - 1; + int offset = 1; + // 2. salt + if (salt.length > 0 && spaceLeft > 0) { + int length = Math.min(salt.length, spaceLeft); + System.arraycopy(salt, 0, newSalt, offset, length); + spaceLeft -= length; + offset += length; + } + // 3. alphabet + if (spaceLeft > 0) { + System.arraycopy(alphabet, 0, newSalt, offset, spaceLeft); + } + + // shuffle + return shuffle(alphabet, newSalt); + } + + private char[] validateAndFilterAlphabet(final char[] alphabet, final char[] separators) { + // validate size + if (alphabet.length < MIN_ALPHABET_LENGTH) { + throw new IllegalArgumentException(String.format("alphabet must contain at least %d unique " + + "characters: %d", MIN_ALPHABET_LENGTH, alphabet.length)); + } + + final Set seen = new LinkedHashSet<>(alphabet.length); + final Set invalid = IntStream.range(0, separators.length) + .mapToObj(idx -> separators[idx]) + .collect(Collectors.toSet()); + + // add to seen set (without duplicates) + IntStream.range(0, alphabet.length) + .forEach(i -> { + if (alphabet[i] == ' ') { + throw new IllegalArgumentException(String.format("alphabet must not contain spaces: " + + "index %d", i)); + } + final Character c = alphabet[i]; + if (!invalid.contains(c)) { + seen.add(c); + } + }); + + // create a new alphabet without the duplicates + final char[] uniqueAlphabet = new char[seen.size()]; + int idx = 0; + for (char c : seen) { + uniqueAlphabet[idx++] = c; + } + return uniqueAlphabet; + } + + @SuppressWarnings("SameParameterValue") + private char[] filterSeparators(final char[] separators, final char[] alphabet) { + final Set valid = IntStream.range(0, alphabet.length) + .mapToObj(idx -> alphabet[idx]) + .collect(Collectors.toSet()); + + return IntStream.range(0, separators.length) + .mapToObj(idx -> (separators[idx])) + .filter(valid::contains) + // ugly way to convert back to char[] + .map(c -> Character.toString(c)) + .collect(Collectors.joining()) + .toCharArray(); + } + + private char[] shuffle(final char[] alphabet, final char[] salt) { + for (int i = alphabet.length - 1, v = 0, p = 0, j, z; salt.length > 0 && i > 0; i--, v++) { + v %= salt.length; + p += z = salt[v]; + j = (z + v + p) % i; + final char tmp = alphabet[j]; + alphabet[j] = alphabet[i]; + alphabet[i] = tmp; + } + return alphabet; + } +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Morse.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Morse.java index 70ed6d9a2c..43a70bc271 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Morse.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Morse.java @@ -37,7 +37,6 @@ * 莫尔斯电码的编码和解码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Morse { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/Percent.java b/bus-core/src/main/java/org/aoju/bus/core/codec/Percent.java index 4b89551814..35722e205d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/Percent.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/Percent.java @@ -46,7 +46,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Percent implements Serializable { @@ -152,7 +151,7 @@ public Percent orNew(Percent codec) { /** * 是否将空格编码为+ - * 如果为{@code true},则将空格编码为"+",此项只在"application/x-www-form-urlencoded"中使用
+ * 如果为{@code true},则将空格编码为"+",此项只在"application/x-www-form-urlencoded"中使用 * 如果为{@code false},则空格编码为"%20",此项一般用于URL的Query部分(RFC3986规范) * * @param encodeSpaceAsPlus 是否将空格编码为+ diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/PunyCode.java b/bus-core/src/main/java/org/aoju/bus/core/codec/PunyCode.java index 712a3e2da4..5ed02c5919 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/PunyCode.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/PunyCode.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.codec; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; /** @@ -37,7 +37,6 @@ * 参考:https://blog.csdn.net/a19881029/article/details/18262671 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PunyCode { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/codec/package-info.java index 8076a52665..05bcb658cf 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/package-info.java @@ -2,7 +2,6 @@ * BaseX以及BCD编码封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.codec; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base16Provider.java b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base16Provider.java index e5a7a01a2f..c77169a630 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base16Provider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base16Provider.java @@ -27,7 +27,7 @@ import org.aoju.bus.core.codec.Decoder; import org.aoju.bus.core.codec.Encoder; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; /** @@ -36,7 +36,6 @@ * 例如十进制数57,在二进制写作111001,在16进制写作39 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base16Provider implements Encoder, Decoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base32Provider.java b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base32Provider.java index 4bcaf18bde..912cda01ac 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base32Provider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base32Provider.java @@ -42,7 +42,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base32Provider implements Encoder, Decoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base58Provider.java b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base58Provider.java index 7bcab40dc4..7bfd5cc062 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base58Provider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base58Provider.java @@ -37,7 +37,6 @@ * 此编码器不包括校验码、版本等信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base58Provider implements Encoder, Decoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base62Provider.java b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base62Provider.java index 354b9b20fa..cc902539e6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base62Provider.java +++ b/bus-core/src/main/java/org/aoju/bus/core/codec/provider/Base62Provider.java @@ -37,7 +37,6 @@ * From https://github.com/seruco/base62 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Base62Provider implements Encoder, Decoder, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/ArrayIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/ArrayIterator.java index d50538f1ff..76385f25a6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/ArrayIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/ArrayIterator.java @@ -27,7 +27,6 @@ import java.io.Serializable; import java.lang.reflect.Array; -import java.util.Iterator; import java.util.NoSuchElementException; /** @@ -39,10 +38,9 @@ * * @param 元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class ArrayIterator implements IterableIterator, Serializable { +public class ArrayIterator implements IterableIterator, ResettableIterator, Serializable { private static final long serialVersionUID = 1L; @@ -93,7 +91,7 @@ public ArrayIterator(Object array) { * @throws IllegalArgumentException array对象不为数组抛出此异常 * @throws NullPointerException array对象为null */ - public ArrayIterator(final Object array, final int startIndex) { + public ArrayIterator(Object array, int startIndex) { this(array, startIndex, -1); } @@ -154,13 +152,9 @@ public Object getArray() { /** * 重置数组位置 */ + @Override public void reset() { this.index = this.startIndex; } - @Override - public Iterator iterator() { - return this; - } - } diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/ComputeIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/ComputeIterator.java index 2f5d67de2a..2cb5312b9b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/ComputeIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/ComputeIterator.java @@ -10,7 +10,6 @@ * 当无下一个节点时,须返回{@code null}表示遍历结束 * * @param 节点类型 - * @version 6.5.0 * @since Java 17+ */ public abstract class ComputeIterator implements Iterator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/ConcurrentHashSet.java b/bus-core/src/main/java/org/aoju/bus/core/collection/ConcurrentHashSet.java index 9c51e4e670..ef2f701881 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/ConcurrentHashSet.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/ConcurrentHashSet.java @@ -35,7 +35,6 @@ * * @param 元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ConcurrentHashSet extends AbstractSet implements java.io.Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/CopiedIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/CopiedIterator.java index 2eb3248f25..b6579c39fd 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/CopiedIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/CopiedIterator.java @@ -41,7 +41,6 @@ * * @param 元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CopiedIterator implements IterableIterator, Serializable { @@ -56,11 +55,18 @@ public class CopiedIterator implements IterableIterator, Serializable { * @param iterator 被复制的Iterator */ public CopiedIterator(Iterator iterator) { - final List eleList = CollKit.newArrayList(iterator); + final List eleList = CollKit.toList(iterator); this.listIterator = eleList.iterator(); } - public static CopiedIterator copyOf(Iterator iterator) { + /** + * 根据已有{@link Iterator},返回新的{@code CopiedIter} + * + * @param iterator {@link Iterator} + * @param 元素类型 + * @return {@code CopiedIter} + */ + public static CopiedIterator copyOf(Iterator iterator) { return new CopiedIterator<>(iterator); } @@ -84,9 +90,4 @@ public void remove() throws UnsupportedOperationException { throw new UnsupportedOperationException("This is a read-only iterator."); } - @Override - public Iterator iterator() { - return this; - } - } diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/EnumerationIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/EnumerationIterator.java index 5fcf9fc3f9..02540eebad 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/EnumerationIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/EnumerationIterator.java @@ -34,7 +34,6 @@ * * @param 元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EnumerationIterator implements IterableIterator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/FilterIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/FilterIterator.java new file mode 100644 index 0000000000..d615e0dde6 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/FilterIterator.java @@ -0,0 +1,121 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.collection; + +import org.aoju.bus.core.lang.Assert; + +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.function.Predicate; + +/** + * 包装 {@link Iterator}并根据{@link Predicate}定义,过滤元素输出 + * 类实现来自Apache Commons Collection + * + * @author Kimi Liu + * @since Java 17+ + */ +public class FilterIterator implements Iterator { + + private final Iterator iterator; + private final Predicate filter; + + /** + * 下一个元素 + */ + private E nextObject; + /** + * 标记下一个元素是否被计算 + */ + private boolean nextObjectSet = false; + + /** + * 构造 + * + * @param iterator 被包装的{@link Iterator} + * @param filter 过滤函数,{@code null}表示不过滤 + */ + public FilterIterator(final Iterator iterator, final Predicate filter) { + this.iterator = Assert.notNull(iterator); + this.filter = filter; + } + + @Override + public boolean hasNext() { + return nextObjectSet || setNextObject(); + } + + @Override + public E next() { + if (false == nextObjectSet && false == setNextObject()) { + throw new NoSuchElementException(); + } + nextObjectSet = false; + return nextObject; + } + + @Override + public void remove() { + if (nextObjectSet) { + throw new IllegalStateException("remove() cannot be called"); + } + iterator.remove(); + } + + /** + * 获取被包装的{@link Iterator} + * + * @return {@link Iterator} + */ + public Iterator getIterator() { + return iterator; + } + + /** + * 获取过滤函数 + * + * @return 过滤函数,可能为{@code null} + */ + public Predicate getFilter() { + return filter; + } + + /** + * 设置下一个元素,如果存在返回{@code true},否则{@code false} + */ + private boolean setNextObject() { + while (iterator.hasNext()) { + final E object = iterator.next(); + if (null != filter && filter.test(object)) { + nextObject = object; + nextObjectSet = true; + return true; + } + } + return false; + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/IterableIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/IterableIterator.java index 7d4b5d9bc4..72dfffb0b1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/IterableIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/IterableIterator.java @@ -7,7 +7,6 @@ * * @param 节点类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface IterableIterator extends Iterable, Iterator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/IteratorEnumeration.java b/bus-core/src/main/java/org/aoju/bus/core/collection/IteratorEnumeration.java index 9a4539251b..1138abbcb3 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/IteratorEnumeration.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/IteratorEnumeration.java @@ -33,7 +33,6 @@ * * @param 元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IteratorEnumeration implements Enumeration { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/LineIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/LineIterator.java index 3562b8f44a..ed27cffa04 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/LineIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/LineIterator.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.collection; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.*; @@ -37,7 +37,6 @@ * 此对象遍历结束后,应关闭之,推荐使用方式: * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LineIterator extends ComputeIterator implements IterableIterator, Closeable, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/NodeListIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/NodeListIterator.java new file mode 100644 index 0000000000..05f8a4d13b --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/NodeListIterator.java @@ -0,0 +1,62 @@ +package org.aoju.bus.core.collection; + +import org.aoju.bus.core.lang.Assert; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * 包装 {@link NodeList} 的{@link Iterator} + * 此 iterator 不支持 {@link #remove()} 方法 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class NodeListIterator implements ResettableIterator { + + private final NodeList nodeList; + /** + * 当前位置索引 + */ + private int index = 0; + + /** + * 构造, 根据给定{@link NodeList} 创建{@code NodeListIterator} + * + * @param nodeList {@link NodeList},非空 + */ + public NodeListIterator(final NodeList nodeList) { + this.nodeList = Assert.notNull(nodeList, "NodeList must not be null."); + } + + @Override + public boolean hasNext() { + return nodeList != null && index < nodeList.getLength(); + } + + @Override + public Node next() { + if (nodeList != null && index < nodeList.getLength()) { + return nodeList.item(index++); + } + throw new NoSuchElementException("underlying nodeList has no more elements"); + } + + /** + * Throws {@link UnsupportedOperationException}. + * + * @throws UnsupportedOperationException always + */ + @Override + public void remove() { + throw new UnsupportedOperationException("remove() method not supported for a NodeListIterator."); + } + + @Override + public void reset() { + this.index = 0; + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/PartitionIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/PartitionIterator.java index 765b83c7f3..e86ede8fc0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/PartitionIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/PartitionIterator.java @@ -40,7 +40,6 @@ * * @param 字段类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PartitionIterator implements IterableIterator>, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/PriorityQueue.java b/bus-core/src/main/java/org/aoju/bus/core/collection/PriorityQueue.java index 7c65ec5ede..a9f64676b0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/PriorityQueue.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/PriorityQueue.java @@ -33,7 +33,6 @@ * 按照给定的排序规则淘汰末尾元素 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PriorityQueue extends java.util.PriorityQueue { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/ResettableIterator.java b/bus-core/src/main/java/org/aoju/bus/core/collection/ResettableIterator.java new file mode 100644 index 0000000000..37bc3c8387 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/ResettableIterator.java @@ -0,0 +1,20 @@ +package org.aoju.bus.core.collection; + +import java.util.Iterator; + +/** + * 支持重置的{@link Iterator} 接口 + * 通过实现{@link #reset()},重置此{@link Iterator}后可实现复用重新遍历 + * + * @param 元素类型 + * @author Kimi Liu + * @since Java 17+ + */ +public interface ResettableIterator extends Iterator { + + /** + * 重置,重置后可重新遍历 + */ + void reset(); + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/SimpleCollector.java b/bus-core/src/main/java/org/aoju/bus/core/collection/SimpleCollector.java index e53479ab05..e2cffdc9dd 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/SimpleCollector.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/SimpleCollector.java @@ -39,7 +39,6 @@ * @param 累积结果的容器类型 * @param 数据结果类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SimpleCollector implements Collector { diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/TransitionCollection.java b/bus-core/src/main/java/org/aoju/bus/core/collection/TransitionCollection.java new file mode 100644 index 0000000000..4bdff6aab3 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/TransitionCollection.java @@ -0,0 +1,143 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.collection; + +import org.aoju.bus.core.lang.Assert; + +import java.util.AbstractCollection; +import java.util.Collection; +import java.util.Iterator; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; + +/** + * 使用给定的转换函数,转换源集合为新类型的集合 + * + * @param 源元素类型 + * @param 目标元素类型 + * @author Kimi Liu + * @since Java 17+ + */ +public class TransitionCollection extends AbstractCollection { + + private final Collection fromCollection; + private final Function function; + + /** + * 构造 + * + * @param fromCollection 源集合 + * @param function 转换函数 + */ + public TransitionCollection(Collection fromCollection, Function function) { + this.fromCollection = Assert.notNull(fromCollection); + this.function = Assert.notNull(function); + } + + @Override + public Iterator iterator() { + return new TransitionIterator<>(fromCollection.iterator(), function); + } + + @Override + public void clear() { + fromCollection.clear(); + } + + @Override + public boolean isEmpty() { + return fromCollection.isEmpty(); + } + + @Override + public void forEach(Consumer action) { + Assert.notNull(action); + fromCollection.forEach((f) -> action.accept(function.apply(f))); + } + + @Override + public boolean removeIf(Predicate filter) { + Assert.notNull(filter); + return fromCollection.removeIf(element -> filter.test(function.apply(element))); + } + + @Override + public java.util.Spliterator spliterator() { + return new Spliterator<>(fromCollection.spliterator(), function); + } + + @Override + public int size() { + return fromCollection.size(); + } + + /** + * 使用给定的转换函数,转换源{@link java.util.Spliterator}为新类型的{@link java.util.Spliterator} + * + * @param 源元素类型 + * @param 目标元素类型 + */ + public static class Spliterator implements java.util.Spliterator { + + private final java.util.Spliterator fromSpliterator; + private final Function function; + + public Spliterator(java.util.Spliterator fromSpliterator, Function function) { + this.fromSpliterator = fromSpliterator; + this.function = function; + } + + @Override + public boolean tryAdvance(Consumer action) { + return fromSpliterator.tryAdvance( + fromElement -> action.accept(function.apply(fromElement))); + } + + @Override + public void forEachRemaining(Consumer action) { + fromSpliterator.forEachRemaining(fromElement -> action.accept(function.apply(fromElement))); + } + + @Override + public java.util.Spliterator trySplit() { + java.util.Spliterator fromSplit = fromSpliterator.trySplit(); + return (fromSplit != null) ? new Spliterator<>(fromSplit, function) : null; + } + + @Override + public long estimateSize() { + return fromSpliterator.estimateSize(); + } + + @Override + public int characteristics() { + return fromSpliterator.characteristics() + & ~(java.util.Spliterator.DISTINCT | java.util.Spliterator.NONNULL | java.util.Spliterator.SORTED); + } + } + +} \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/DayOfMonthValueParser.java b/bus-core/src/main/java/org/aoju/bus/core/collection/TransitionIterator.java similarity index 69% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/DayOfMonthValueParser.java rename to bus-core/src/main/java/org/aoju/bus/core/collection/TransitionIterator.java index d8a29fbd6a..e599ba9d01 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/DayOfMonthValueParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/TransitionIterator.java @@ -23,44 +23,50 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; +package org.aoju.bus.core.collection; -import org.aoju.bus.core.lang.exception.CrontabException; -import org.aoju.bus.cron.pattern.matcher.DayOfMonthValueMatcher; -import org.aoju.bus.cron.pattern.matcher.ValueMatcher; +import org.aoju.bus.core.lang.Assert; -import java.util.List; +import java.util.Iterator; +import java.util.function.Function; /** - * 每月的几号值处理 - * 每月最多31天,32和“L”都表示最后一天 + * 转换迭代器 * + * @param 对象 + * @param 对象 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class DayOfMonthValueParser extends AbstractValueParser { +public class TransitionIterator implements Iterator { + + private final Iterator backingIterator; + private final Function func; /** * 构造 + * + * @param backingIterator 源{@link Iterator} + * @param func 转换函数 */ - public DayOfMonthValueParser() { - super(1, 31); + public TransitionIterator(final Iterator backingIterator, final Function func) { + this.backingIterator = Assert.notNull(backingIterator); + this.func = Assert.notNull(func); + } + + @Override + public final boolean hasNext() { + return backingIterator.hasNext(); } @Override - public int parse(String value) throws CrontabException { - if ("L".equalsIgnoreCase(value) || "32".equals(value)) {// 每月最后一天 - return 32; - } else { - return super.parse(value); - } + public final T next() { + return func.apply(backingIterator.next()); } @Override - protected ValueMatcher buildValueMatcher(List values) { - // 考虑每月的天数不同,且存在闰年情况,日匹配单独使用 - return new DayOfMonthValueMatcher(values); + public final void remove() { + backingIterator.remove(); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/UniqueKeySet.java b/bus-core/src/main/java/org/aoju/bus/core/collection/UniqueKeySet.java index c6cb2c1890..d8cd55fdb3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/UniqueKeySet.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/UniqueKeySet.java @@ -44,7 +44,6 @@ * @param 唯一键类型 * @param 值对象 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UniqueKeySet extends AbstractSet implements Serializable { @@ -72,6 +71,16 @@ public UniqueKeySet(boolean isLinked, Function uniqueGenerator) { this(MapBuilder.create(isLinked), uniqueGenerator); } + /** + * 构造 + * + * @param uniqueGenerator 唯一键生成规则函数,用于生成对象对应的唯一键 + * @param c 初始化加入的集合 + */ + public UniqueKeySet(Function uniqueGenerator, Collection c) { + this(false, uniqueGenerator, c); + } + /** * 构造 * @@ -83,6 +92,18 @@ public UniqueKeySet(int initialCapacity, float loadFactor, Function unique this(MapBuilder.create(new HashMap<>(initialCapacity, loadFactor)), uniqueGenerator); } + /** + * 构造 + * + * @param isLinked 是否保持加入顺序 + * @param uniqueGenerator 唯一键生成规则函数,用于生成对象对应的唯一键 + * @param c 初始化加入的集合 + */ + public UniqueKeySet(boolean isLinked, Function uniqueGenerator, Collection c) { + this(isLinked, uniqueGenerator); + addAll(c); + } + /** * 构造 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/collection/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/collection/package-info.java index 6c9d1c1463..2ec3c50528 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/collection/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/collection/package-info.java @@ -2,7 +2,6 @@ * 集合以及Iterator封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.collection; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/CompareChain.java b/bus-core/src/main/java/org/aoju/bus/core/compare/CompareChain.java index 6a3ef71207..a943a1ea97 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/CompareChain.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/CompareChain.java @@ -36,7 +36,6 @@ * 此类copy from Apache-commons-collections * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CompareChain implements Chain, CompareChain>, Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/FieldCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/FieldCompare.java index d948b309aa..b534350f65 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/FieldCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/FieldCompare.java @@ -37,7 +37,6 @@ * * @param 被比较的Bean * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FieldCompare extends FuncCompare { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/FuncCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/FuncCompare.java index eb4358d568..e8ad1191d6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/FuncCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/FuncCompare.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.compare; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.ObjectKit; import java.util.function.Function; @@ -35,7 +35,6 @@ * * @param 被比较的对象 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FuncCompare extends NullCompare { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/IndexedCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/IndexedCompare.java index f1f96da5bc..be6e4c4364 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/IndexedCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/IndexedCompare.java @@ -36,7 +36,6 @@ * * @param 被排序元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IndexedCompare implements Comparator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/InstanceCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/InstanceCompare.java index 57416399a3..4d0eddc440 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/InstanceCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/InstanceCompare.java @@ -34,7 +34,6 @@ * * @param 用于比较的对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InstanceCompare implements Comparator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/NormalCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/NormalCompare.java index eebb8b7053..69a52afadf 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/NormalCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/NormalCompare.java @@ -33,7 +33,6 @@ * * @param 比较对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NormalCompare> implements Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/NullCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/NullCompare.java index 7f3d58f8be..c8705c1d01 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/NullCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/NullCompare.java @@ -38,7 +38,6 @@ * * @param 被比较的对象 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NullCompare implements Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/PinyinCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/PinyinCompare.java index ef60acf859..dc67704c14 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/PinyinCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/PinyinCompare.java @@ -34,7 +34,6 @@ * 按照GBK拼音顺序对给定的汉字字符串排序 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PinyinCompare implements Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/PropertyCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/PropertyCompare.java index 570ea097c7..7d85d3c00f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/PropertyCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/PropertyCompare.java @@ -33,7 +33,6 @@ * * @param 被比较的Bean * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PropertyCompare extends FuncCompare { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/ReverseCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/ReverseCompare.java index 7314ec6767..3e24aa250b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/ReverseCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/ReverseCompare.java @@ -33,7 +33,6 @@ * * @param 被比较对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReverseCompare implements Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/VersionCompare.java b/bus-core/src/main/java/org/aoju/bus/core/compare/VersionCompare.java index 00c7eb3af2..1eeb8b0a11 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/VersionCompare.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/VersionCompare.java @@ -39,7 +39,6 @@ * 支持如:1.3.20.8,6.82.20160101,8.5a/8.5c等版本形式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class VersionCompare implements Comparator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compare/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/compare/package-info.java index e8c6a6e5c1..d2a01f48dd 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compare/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compare/package-info.java @@ -2,7 +2,6 @@ * 各种比较器(Comparator)实现和封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.compare; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/DiagnosticCollectors.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/DiagnosticCollectors.java index 939d827cb7..713c20e46d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/DiagnosticCollectors.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/DiagnosticCollectors.java @@ -8,7 +8,6 @@ * 诊断工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DiagnosticCollectors { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileManager.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileManager.java index 8eeb829e83..43f1563fc6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileManager.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileManager.java @@ -19,7 +19,6 @@ * 我们采取此对象来管理运行时动态编译类生成的字节码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaClassFileManager extends ForwardingJavaFileManager { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileObject.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileObject.java index 7cc207db3c..ebc45140c8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileObject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaClassFileObject.java @@ -14,7 +14,6 @@ * Java 字节码文件对象,用于在内存中暂存class字节码,从而可以在ClassLoader中动态加载 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaClassFileObject extends SimpleJavaFileObject { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaFileObject.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaFileObject.java index e9066e56a3..0c1d69daf0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaFileObject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaFileObject.java @@ -12,7 +12,6 @@ * {@link javax.tools.JavaFileObject} 相关工具类封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaFileObject { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceCompiler.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceCompiler.java index 005b1fa768..189f7b7017 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceCompiler.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceCompiler.java @@ -1,10 +1,10 @@ package org.aoju.bus.core.compiler; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.resource.FileResource; import org.aoju.bus.core.io.resource.Resource; import org.aoju.bus.core.io.resource.StringResource; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import javax.tools.DiagnosticCollector; @@ -36,7 +36,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaSourceCompiler { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceFileObject.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceFileObject.java index 421feede9b..78afd1c20f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceFileObject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/JavaSourceFileObject.java @@ -19,7 +19,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaSourceFileObject extends SimpleJavaFileObject { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compiler/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/compiler/package-info.java index 81cdc3b1f6..21ce21a0dc 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compiler/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compiler/package-info.java @@ -2,7 +2,6 @@ * 运行时编译java源码,动态从字符串或外部文件加载类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.compiler; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/Deflate.java b/bus-core/src/main/java/org/aoju/bus/core/compress/Deflate.java index f1ebb8269e..ffac6a5e31 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/Deflate.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/Deflate.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.compress; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.Closeable; @@ -42,7 +42,6 @@ * Deflate是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Deflate implements Closeable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/Gzip.java b/bus-core/src/main/java/org/aoju/bus/core/compress/Gzip.java index 29a67f63b3..4631e68e71 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/Gzip.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/Gzip.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.compress; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.Closeable; @@ -40,7 +40,6 @@ * gzip的基础是DEFLATE * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Gzip implements Closeable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipCopyVisitor.java b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipCopyVisitor.java index 538a301d8d..3cb5bcb296 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipCopyVisitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipCopyVisitor.java @@ -36,7 +36,6 @@ * 此类在遍历源目录并复制过程中会自动创建目标目录中不存在的上级目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZipCopyVisitor extends SimpleFileVisitor { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipReader.java b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipReader.java index 0add33dbcd..796f5192be 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipReader.java @@ -25,9 +25,11 @@ ********************************************************************************/ package org.aoju.bus.core.compress; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; +import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.core.toolkit.ZipKit; import java.io.Closeable; @@ -45,7 +47,6 @@ * Zip文件或流读取器,一般用于Zip文件解压 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZipReader implements Closeable { @@ -92,22 +93,22 @@ public ZipReader(ZipInputStream zin) { } /** - * 创建{@link ZipReader} + * 创建ZipReader * * @param zipFile 生成的Zip文件 * @param charset 编码 - * @return {@link ZipReader} + * @return this */ public static ZipReader of(File zipFile, Charset charset) { return new ZipReader(zipFile, charset); } /** - * 创建{@link ZipReader} + * 创建ZipReader * * @param in Zip输入的流,一般为输入文件流 * @param charset 编码 - * @return {@link ZipReader} + * @return this */ public static ZipReader of(InputStream in, Charset charset) { return new ZipReader(in, charset); @@ -115,6 +116,7 @@ public static ZipReader of(InputStream in, Charset charset) { /** * 获取指定路径的文件流 + * 如果是文件模式,则直接获取Entry对应的流,如果是流模式,则遍历entry后,找到对应流返回 * * @param path 路径 * @return 文件流 @@ -127,7 +129,17 @@ public InputStream get(String path) { return ZipKit.get(zipFile, entry); } } else { - throw new UnsupportedOperationException("Zip stream mode not support get!"); + try { + this.in.reset(); + ZipEntry zipEntry; + while (null != (zipEntry = in.getNextEntry())) { + if (zipEntry.getName().equals(path)) { + return this.in; + } + } + } catch (IOException e) { + throw new InstrumentException(e); + } } return null; @@ -141,19 +153,37 @@ public InputStream get(String path) { * @throws InstrumentException IO异常 */ public File readTo(File outFile) throws InstrumentException { + return readTo(outFile, null); + } + + /** + * 解压到指定目录中 + * + * @param outFile 解压到的目录 + * @param entryFilter 过滤器,排除不需要的文件 + * @return 解压的目录 + * @throws InstrumentException IO异常 + */ + public File readTo(File outFile, Filter entryFilter) throws InstrumentException { read((zipEntry) -> { - File outItemFile = FileKit.file(outFile, zipEntry.getName()); - if (zipEntry.isDirectory()) { - outItemFile.mkdirs(); - } else { - InputStream in; - if (null != this.zipFile) { - in = ZipKit.get(this.zipFile, zipEntry); + if (null == entryFilter || entryFilter.accept(zipEntry)) { + String path = zipEntry.getName(); + if (FileKit.isWindows()) { + path = StringKit.replace(path, "*", "_"); + } + final File outItemFile = FileKit.file(outFile, path); + if (zipEntry.isDirectory()) { + outItemFile.mkdirs(); } else { - in = this.in; + InputStream in; + if (null != this.zipFile) { + in = ZipKit.get(this.zipFile, zipEntry); + } else { + in = this.in; + } + // 文件 + FileKit.writeFromStream(in, outItemFile, false); } - // 文件 - FileKit.writeFromStream(in, outItemFile, false); } }); return outFile; diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipWriter.java b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipWriter.java index c27df4cfaf..ca1a186ef8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/ZipWriter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/ZipWriter.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.compress; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.resource.Resource; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; @@ -42,7 +42,6 @@ * Zip生成封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZipWriter implements Closeable { @@ -156,34 +155,6 @@ public ZipOutputStream getOut() { return this.out; } - /** - * 对文件或文件目录进行压缩 - * - * @param withSrcDir 是否包含被打包目录,只针对压缩目录有效。若为false,则只压缩目录下的文件或目录,为true则将本目录也压缩 - * @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩),{@code null}表示不过滤 - * @param files 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 - * @return this - * @throws InstrumentException IO异常 - */ - public ZipWriter add(boolean withSrcDir, FileFilter filter, File... files) throws InstrumentException { - for (File file : files) { - // 如果只是压缩一个文件,则需要截取该文件的父目录 - String srcRootDir; - try { - srcRootDir = file.getCanonicalPath(); - if ((false == file.isDirectory()) || withSrcDir) { - // 若是文件,则将父目录完整路径都截取掉;若设置包含目录,则将上级目录全部截取掉,保留本目录名 - srcRootDir = file.getCanonicalFile().getParentFile().getCanonicalPath(); - } - } catch (IOException e) { - throw new InstrumentException(e); - } - - _add(file, srcRootDir, filter); - } - return this; - } - /** * 添加资源到压缩包,添加后关闭资源流 * @@ -222,6 +193,58 @@ public ZipWriter add(String path, InputStream in) throws InstrumentException { return putEntry(path, in); } + /** + * 对流中的数据加入到压缩文件 + * 路径列表和流列表长度必须一致 + * + * @param paths 流数据在压缩文件中的路径或文件名 + * @param ins 要压缩的源,添加完成后自动关闭流 + * @return 压缩文件 + * @throws InstrumentException IO异常 + */ + public ZipWriter add(String[] paths, InputStream[] ins) throws InstrumentException { + if (ArrayKit.isEmpty(paths) || ArrayKit.isEmpty(ins)) { + throw new IllegalArgumentException("Paths or ins is empty !"); + } + if (paths.length != ins.length) { + throw new IllegalArgumentException("Paths length is not equals to ins length !"); + } + + for (int i = 0; i < paths.length; i++) { + add(paths[i], ins[i]); + } + + return this; + } + + /** + * 对文件或文件目录进行压缩 + * + * @param withSrcDir 是否包含被打包目录,只针对压缩目录有效。若为false,则只压缩目录下的文件或目录,为true则将本目录也压缩 + * @param filter 文件过滤器,通过实现此接口,自定义要过滤的文件(过滤掉哪些文件或文件夹不加入压缩),{@code null}表示不过滤 + * @param files 要压缩的源文件或目录。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 + * @return this + * @throws InstrumentException IO异常 + */ + public ZipWriter add(boolean withSrcDir, FileFilter filter, File... files) throws InstrumentException { + for (File file : files) { + // 如果只是压缩一个文件,则需要截取该文件的父目录 + String srcRootDir; + try { + srcRootDir = file.getCanonicalPath(); + if ((false == file.isDirectory()) || withSrcDir) { + // 若是文件,则将父目录完整路径都截取掉;若设置包含目录,则将上级目录全部截取掉,保留本目录名 + srcRootDir = file.getCanonicalFile().getParentFile().getCanonicalPath(); + } + } catch (IOException e) { + throw new InstrumentException(e); + } + + _add(file, srcRootDir, filter); + } + return this; + } + @Override public void close() throws InstrumentException { try { diff --git a/bus-core/src/main/java/org/aoju/bus/core/compress/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/compress/package-info.java index eeb4a862a6..516a640bf4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/compress/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/compress/package-info.java @@ -2,7 +2,6 @@ * 压缩解压封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.compress; diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/AbstractConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/AbstractConverter.java index d4448bdf95..7e3181a16c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/AbstractConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/AbstractConverter.java @@ -38,7 +38,6 @@ * 转换器不会抛出转换异常,转换失败时会返回{@code null} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractConverter implements Converter, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/ArrayConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/ArrayConverter.java index 742fdde81e..9721c2ff87 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/ArrayConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/ArrayConverter.java @@ -38,7 +38,6 @@ * 数组转换器,包括原始类型数组 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ArrayConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicBooleanConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicBooleanConverter.java index ce5c1ecdfc..e93e91b246 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicBooleanConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicBooleanConverter.java @@ -33,7 +33,6 @@ * {@link AtomicBoolean}转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AtomicBooleanConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicIntegerArrayConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicIntegerArrayConverter.java index 0cdb1f5de2..cc6f66dc72 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicIntegerArrayConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicIntegerArrayConverter.java @@ -31,7 +31,6 @@ * {@link AtomicIntegerArray}转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AtomicIntegerArrayConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicLongArrayConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicLongArrayConverter.java index a56130c30b..db30f4033b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicLongArrayConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicLongArrayConverter.java @@ -31,7 +31,6 @@ * {@link AtomicLongArray}转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AtomicLongArrayConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicReferenceConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicReferenceConverter.java index 409d98ef11..e8ab25ced9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicReferenceConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/AtomicReferenceConverter.java @@ -34,7 +34,6 @@ * {@link AtomicReference}转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AtomicReferenceConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/BasicType.java b/bus-core/src/main/java/org/aoju/bus/core/convert/BasicType.java index 5e59f8ba94..41d62f7ec5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/BasicType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/BasicType.java @@ -33,7 +33,6 @@ * 基本类型枚举包括原始类型和包装类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum BasicType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/BeanConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/BeanConverter.java index 4f3ac68929..c876fbeec6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/BeanConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/BeanConverter.java @@ -47,7 +47,6 @@ * * @param Bean类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/BooleanConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/BooleanConverter.java index 0c1ba1d5e6..4c3aaacc74 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/BooleanConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/BooleanConverter.java @@ -31,7 +31,6 @@ * 布尔转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BooleanConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/ByteArrayConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/ByteArrayConverter.java index 1b74e0bdd0..74f8cd2b87 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/ByteArrayConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/ByteArrayConverter.java @@ -31,7 +31,6 @@ * byte 类型数组转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ByteArrayConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CalendarConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CalendarConverter.java index c0bd4116e4..bf8c11417f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CalendarConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CalendarConverter.java @@ -35,7 +35,6 @@ * 日期转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CalendarConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CastConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CastConverter.java index 3d99e72860..84c7024a11 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CastConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CastConverter.java @@ -25,14 +25,13 @@ ********************************************************************************/ package org.aoju.bus.core.convert; -import org.aoju.bus.core.lang.exception.ConvertException; +import org.aoju.bus.core.exception.ConvertException; /** * 强转转换器 * * @param 强制转换到的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CastConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CharacterConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CharacterConverter.java index 8ab13c14ab..9b4203101b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CharacterConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CharacterConverter.java @@ -32,7 +32,6 @@ * 字符转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CharacterConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CharsetConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CharsetConverter.java index 713c5a0d22..7b81a764e1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CharsetConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CharsetConverter.java @@ -31,7 +31,6 @@ * 编码对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CharsetConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/ClassConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/ClassConverter.java index 545d2cf52b..07d18993e4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/ClassConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/ClassConverter.java @@ -32,7 +32,6 @@ * 将类名转换为类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ClassConverter extends AbstractConverter> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CollectionConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CollectionConverter.java index 70ef43fb0d..9152c551bb 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CollectionConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CollectionConverter.java @@ -36,7 +36,6 @@ * 各种集合类转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CollectionConverter implements Converter> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/Convert.java b/bus-core/src/main/java/org/aoju/bus/core/convert/Convert.java index 93395919cb..c55060d684 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/Convert.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/Convert.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.core.convert; +import org.aoju.bus.core.exception.ConvertException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Symbol; import org.aoju.bus.core.lang.Types; -import org.aoju.bus.core.lang.exception.ConvertException; import org.aoju.bus.core.toolkit.ByteKit; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.HexKit; @@ -48,7 +48,6 @@ * 类型转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Convert { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/Converter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/Converter.java index 430b26b86f..958589f7b9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/Converter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/Converter.java @@ -29,7 +29,6 @@ * 转换器接口,实现类型转换 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Converter { @@ -45,4 +44,25 @@ public interface Converter { */ T convert(Object value, T defaultValue) throws IllegalArgumentException; + /** + * 转换值为指定类型,可选是否不抛异常转换 + * 当转换失败时返回默认值 + * + * @param value 值 + * @param defaultValue 默认值 + * @param quietly 是否静默转换,true不抛异常 + * @return 转换后的值 + * @see #convert(Object, Object) + */ + default T convert(Object value, T defaultValue, boolean quietly) { + try { + return convert(value, defaultValue); + } catch (Exception e) { + if (quietly) { + return defaultValue; + } + throw e; + } + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/ConverterRegistry.java b/bus-core/src/main/java/org/aoju/bus/core/convert/ConverterRegistry.java index 88518739ca..d0d6e3da29 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/ConverterRegistry.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/ConverterRegistry.java @@ -26,8 +26,8 @@ package org.aoju.bus.core.convert; import org.aoju.bus.core.date.DateTime; +import org.aoju.bus.core.exception.ConvertException; import org.aoju.bus.core.lang.Types; -import org.aoju.bus.core.lang.exception.ConvertException; import org.aoju.bus.core.toolkit.BeanKit; import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.core.toolkit.ReflectKit; @@ -54,7 +54,6 @@ * 转换器,默认转换器预定义的一些转换器,自定义转换器存放用户自定的转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ConverterRegistry { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/CurrencyConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/CurrencyConverter.java index 8b779f6b26..e07946b44b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/CurrencyConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/CurrencyConverter.java @@ -31,7 +31,6 @@ * 货币{@link Currency} 转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CurrencyConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/DateConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/DateConverter.java index d57301bee2..0a9d479e6b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/DateConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/DateConverter.java @@ -26,7 +26,7 @@ package org.aoju.bus.core.convert; import org.aoju.bus.core.date.DateTime; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.DateKit; import org.aoju.bus.core.toolkit.StringKit; @@ -38,7 +38,6 @@ * 日期转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DateConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/DurationConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/DurationConverter.java index 76aa57aea4..ef1e36c7e3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/DurationConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/DurationConverter.java @@ -32,7 +32,6 @@ * {@link Duration}对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DurationConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/EnumConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/EnumConverter.java index b7fbd640de..ef876519cf 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/EnumConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/EnumConverter.java @@ -25,27 +25,26 @@ ********************************************************************************/ package org.aoju.bus.core.convert; -import org.aoju.bus.core.lang.exception.ConvertException; +import org.aoju.bus.core.exception.ConvertException; +import org.aoju.bus.core.map.WeakMap; import org.aoju.bus.core.toolkit.*; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** * 无泛型检查的枚举转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EnumConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private static final Map, Map, Method>> VALUE_OF_METHOD_CACHE = new ConcurrentHashMap<>(); + private static final WeakMap, Map, Method>> VALUE_OF_METHOD_CACHE = new WeakMap<>(); private final Class enumClass; diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/LocaleConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/LocaleConverter.java index 1dcf597612..3529817452 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/LocaleConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/LocaleConverter.java @@ -35,7 +35,6 @@ * 只提供String转换支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LocaleConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/MapConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/MapConverter.java index e38a3ca170..907b4150c3 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/MapConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/MapConverter.java @@ -38,7 +38,6 @@ * {@link Map} 转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapConverter extends AbstractConverter> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/NumberConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/NumberConverter.java index 4514f255e6..4bb2dbef68 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/NumberConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/NumberConverter.java @@ -53,7 +53,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NumberConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/NumberFormatter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/NumberFormatter.java index 2438dcd9a3..18df951275 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/NumberFormatter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/NumberFormatter.java @@ -43,7 +43,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NumberFormatter { @@ -615,7 +614,7 @@ public static String formatSimple(long value, boolean isTwo) { int index = -1; double res = value; while (res > 10 && (false == isTwo || index < 1)) { - if (res > 1000) { + if (res >= 1000) { res = res / 1000; index++; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/OptionalConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/OptionalConverter.java index 8f523c5856..b675597270 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/OptionalConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/OptionalConverter.java @@ -31,7 +31,6 @@ * {@link Optional}对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class OptionalConverter extends AbstractConverter> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/PathConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/PathConverter.java index 3d4899db0f..a0d39e3718 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/PathConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/PathConverter.java @@ -35,7 +35,6 @@ * 字符串转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PathConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/PeriodConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/PeriodConverter.java index a326785ac1..6600733f9e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/PeriodConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/PeriodConverter.java @@ -32,7 +32,6 @@ * {@link Period}对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PeriodConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/PrimitiveConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/PrimitiveConverter.java index 9c382410d8..07991794dc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/PrimitiveConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/PrimitiveConverter.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.convert; -import org.aoju.bus.core.lang.exception.ConvertException; +import org.aoju.bus.core.exception.ConvertException; import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.core.toolkit.StringKit; @@ -46,7 +46,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PrimitiveConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/ReferenceConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/ReferenceConverter.java index d560dd731b..03b5ac8f0d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/ReferenceConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/ReferenceConverter.java @@ -37,7 +37,6 @@ * {@link Reference}转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReferenceConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/StackTraceConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/StackTraceConverter.java index 2395de8e59..3ec762a1ec 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/StackTraceConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/StackTraceConverter.java @@ -35,7 +35,6 @@ * 只支持Map方式转换 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StackTraceConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/StringConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/StringConverter.java index 62fa36328b..cb5711a45a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/StringConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/StringConverter.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.convert; +import org.aoju.bus.core.exception.ConvertException; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.ConvertException; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.XmlKit; @@ -42,7 +42,6 @@ * 字符串转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/TemporalConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/TemporalConverter.java index 41bfc4e043..a001f701d5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/TemporalConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/TemporalConverter.java @@ -52,7 +52,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TemporalConverter extends AbstractConverter { @@ -106,6 +105,11 @@ public void setFormat(String format) { this.format = format; } + @Override + public Class getTargetType() { + return (Class) this.targetType; + } + @Override protected TemporalAccessor convertInternal(Object value) { if (value instanceof Long) { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/TimeZoneConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/TimeZoneConverter.java index 41c91e50c7..b6595fd294 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/TimeZoneConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/TimeZoneConverter.java @@ -31,7 +31,6 @@ * TimeZone转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TimeZoneConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/TypeConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/TypeConverter.java new file mode 100644 index 0000000000..1083b6c52f --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/TypeConverter.java @@ -0,0 +1,50 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.convert; + +import java.lang.reflect.Type; + +/** + * 类型转换接口函数,根据给定的值和目标类型,由用户自定义转换规则。 + * + * @author Kimi Liu + * @since Java 17+ + */ +@FunctionalInterface +public interface TypeConverter { + + /** + * 转换为指定类型 + * 如果类型无法确定,将读取默认值的类型做为目标类型 + * + * @param targetType 目标Type,非泛型类使用 + * @param value 原始值 + * @return 转换后的值 + * @throws IllegalArgumentException 无法确定目标类型,且默认值为{@code null},无法确定类型 + */ + Object convert(Type targetType, Object value); + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/URIConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/URIConverter.java index 3dc8f3f848..d10d724205 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/URIConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/URIConverter.java @@ -33,7 +33,6 @@ * URI对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class URIConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/URLConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/URLConverter.java index 432d880dbe..d22dc4bea8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/URLConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/URLConverter.java @@ -33,7 +33,6 @@ * URL对象转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class URLConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/UUIDConverter.java b/bus-core/src/main/java/org/aoju/bus/core/convert/UUIDConverter.java index e9e2e06c1a..fbc25077c5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/UUIDConverter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/UUIDConverter.java @@ -31,7 +31,6 @@ * UUID对象转换器转换器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UUIDConverter extends AbstractConverter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/convert/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/convert/package-info.java index 20ddd381d1..3cdcd4018e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/convert/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/convert/package-info.java @@ -2,7 +2,6 @@ * 万能类型转换器以及各种类型转换的实现类,其中Convert为转换器入口,提供各种toXXX方法和convert方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.convert; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Almanac.java b/bus-core/src/main/java/org/aoju/bus/core/date/Almanac.java index b44daad72e..c32133afaf 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Almanac.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Almanac.java @@ -25,10 +25,10 @@ ********************************************************************************/ package org.aoju.bus.core.date; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; import org.aoju.bus.core.toolkit.StringKit; @@ -47,7 +47,6 @@ * 日期计算类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Almanac extends Converter { @@ -5398,10 +5397,19 @@ public static DateTime offset(Date date, Fields.Type type, int offset) { * * @return 当前时间的标准形式字符串 */ - public static String today() { + public static String now() { return Formatter.format(date()); } + /** + * 当前日期,格式 yyyy-MM-dd + * + * @return 当前日期的标准形式字符串 + */ + public static String today() { + return formatDate(date()); + } + /** * 当前时间毫秒数 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Between.java b/bus-core/src/main/java/org/aoju/bus/core/date/Between.java index 99f6b2abb1..cc86cb7d9f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Between.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Between.java @@ -35,7 +35,6 @@ * 日期间隔 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Between { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Boundary.java b/bus-core/src/main/java/org/aoju/bus/core/date/Boundary.java index a85bd2a31c..cdd353353d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Boundary.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Boundary.java @@ -35,7 +35,6 @@ * 日期范围 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Boundary extends Range { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Buddhist.java b/bus-core/src/main/java/org/aoju/bus/core/date/Buddhist.java index d3bbb5e87a..649e565329 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Buddhist.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Buddhist.java @@ -34,7 +34,6 @@ * 佛历 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Buddhist { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Converter.java b/bus-core/src/main/java/org/aoju/bus/core/date/Converter.java index 4c9c05f15b..e07df3098c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Converter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Converter.java @@ -40,7 +40,6 @@ * 日期转换 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Converter extends Formatter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/DateTime.java b/bus-core/src/main/java/org/aoju/bus/core/date/DateTime.java index 59254bb269..924537a0a2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/DateTime.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/DateTime.java @@ -28,10 +28,10 @@ import org.aoju.bus.core.date.formatter.DateParser; import org.aoju.bus.core.date.formatter.DatePrinter; import org.aoju.bus.core.date.formatter.FormatBuilder; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.System; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.core.toolkit.ZoneKit; @@ -53,7 +53,6 @@ * 包装java.util.Date * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DateTime extends Date { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/EightChar.java b/bus-core/src/main/java/org/aoju/bus/core/date/EightChar.java index 77b1e9dc12..25f34c6682 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/EightChar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/EightChar.java @@ -35,7 +35,6 @@ * 八字 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EightChar { @@ -55,7 +54,7 @@ public class EightChar { /** * 长生十二神日干偏移值,五阳干顺推,五阴干逆推 */ - private static final Map CHANG_SHENG_OFFSET = new HashMap() { + private static final Map CHANG_SHENG_OFFSET = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -498,6 +497,26 @@ public String getTaiYuanNaYin() { return Lunar.NAYIN.get(getTaiYuan()); } + /** + * 获取胎息 + * + * @return 胎息 + */ + public String getTaiXi() { + int ganIndex = (2 == sect) ? lunar.getDayGanIndexExact2() : lunar.getDayGanIndexExact(); + int zhiIndex = (2 == sect) ? lunar.getDayZhiIndexExact2() : lunar.getDayZhiIndexExact(); + return Lunar.HE_GAN_5[ganIndex] + Lunar.HE_ZHI_6[zhiIndex]; + } + + /** + * 获取胎息纳音 + * + * @return 纳音 + */ + public String getTaiXiNaYin() { + return Lunar.NAYIN.get(getTaiXi()); + } + /** * 获取命宫 * @@ -555,7 +574,10 @@ public String getShenGong() { timeZhiIndex = i; } } - int zhiIndex = (2 + (monthZhiIndex + timeZhiIndex)) % 12; + int zhiIndex = 2 + monthZhiIndex + timeZhiIndex; + if (zhiIndex > 12) { + zhiIndex -= 12; + } int jiaZiIndex = Lunar.getJiaZiIndex(lunar.getMonthInGanZhiExact()) - (monthZhiIndex - zhiIndex); if (jiaZiIndex >= 60) { jiaZiIndex -= 60; diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Formatter.java b/bus-core/src/main/java/org/aoju/bus/core/date/Formatter.java index af69ea7f0a..6ada848b87 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Formatter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Formatter.java @@ -27,11 +27,11 @@ import org.aoju.bus.core.convert.NumberFormatter; import org.aoju.bus.core.date.formatter.*; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.RegEx; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import java.text.DateFormat; @@ -57,7 +57,6 @@ * yyyy-MM-dd'T'HH:mm:ss.SSSZ等等,支持毫秒、微秒和纳秒等精确时间 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Formatter { @@ -139,6 +138,26 @@ public static String format(Date date, DateTimeFormatter format) { return Formatter.format(date.toInstant(), format); } + /** + * 根据特定格式格式化日期 + * + * @param date 被格式化的日期 + * @param format 日期格式,常用格式见: {@link Fields} + * @param timeZone 时区 + * @return 格式化后的字符串 + */ + public static String format(Date date, String format, String timeZone) { + if (null == date || StringKit.isBlank(format)) { + return null; + } + + final SimpleDateFormat sdf = new SimpleDateFormat(format); + if (null != timeZone) { + sdf.setTimeZone(new SimpleTimeZone(0, timeZone)); + } + return format(date, sdf); + } + /** * 按照给定的通配模式,格式化成相应的时间字符串 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Galaxy.java b/bus-core/src/main/java/org/aoju/bus/core/date/Galaxy.java index c12ddb8062..5f38b69dbb 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Galaxy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Galaxy.java @@ -33,7 +33,6 @@ * 银河系、天文计算 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Galaxy { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Holiday.java b/bus-core/src/main/java/org/aoju/bus/core/date/Holiday.java index 185728379b..4f9a029028 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Holiday.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Holiday.java @@ -38,7 +38,6 @@ * 节假日 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Holiday { @@ -468,9 +467,12 @@ public static void fix(String[] names, String data) { while (data.length() >= SIZE) { String segment = data.substring(0, SIZE); String day = segment.substring(0, 8); + boolean remove = Symbol.TILDE.equals(segment.substring(8, 9)); Holiday holiday = getHoliday(day); if (null == holiday) { - append.append(segment); + if (!remove) { + append.append(segment); + } } else { int nameIndex = -1; for (int i = 0, j = NAMES_IN_HOLIDAY.length; i < j; i++) { @@ -483,7 +485,7 @@ public static void fix(String[] names, String data) { String old = day + (char) (nameIndex + Symbol.C_ZERO) + (holiday.isWork() ? Symbol.C_ZERO : '1') + holiday.getTarget().replace(Symbol.MINUS, Normal.EMPTY); - DATA_IN_HOLIDAY = DATA_IN_HOLIDAY.replace(old, segment); + DATA_IN_HOLIDAY = DATA_IN_HOLIDAY.replace(old, remove ? Normal.EMPTY : segment); } } data = data.substring(SIZE); diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Kalendar.java b/bus-core/src/main/java/org/aoju/bus/core/date/Kalendar.java index 0902f752ec..d82b1fe7e1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Kalendar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Kalendar.java @@ -41,7 +41,6 @@ * 日历类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Kalendar { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Lunar.java b/bus-core/src/main/java/org/aoju/bus/core/date/Lunar.java index b531b592aa..0a4b5d545f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Lunar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Lunar.java @@ -38,7 +38,6 @@ * 农历日期 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Lunar { @@ -123,7 +122,7 @@ public class Lunar { "艮", "艮", "坤", "坤", "坎", "坎", "震", "震", "离", "离" }; /** - * 地支相冲(子午相冲,丑未相冲,寅申相冲,辰戌相冲,卯酉相冲,巳亥相冲) + * 地支相冲(子午相冲,丑未相冲,寅申相冲,辰戌相冲,卯酉相冲,巳亥相冲),由于地支对应十二生肖,也就对应了生肖相冲 */ public static final String[] CHONG = { "午", "未", "申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳" @@ -140,6 +139,24 @@ public class Lunar { public static final String[] CHONG_GAN_TIE = { "己", "戊", "辛", "庚", "癸", "壬", "乙", "甲", "丁", "丙" }; + /** + * 天干四冲(无情之克中克得最严重的4个) + */ + public static final String[] CHONG_GAN_4 = { + "庚", "辛", "壬", "癸", "", "", "甲", "乙", "丙", "丁" + }; + /** + * 天干五合(有情之克中最有情的5个,甲己合,乙庚合,丙辛合,丁壬合,戊癸合) + */ + public static final String[] HE_GAN_5 = { + "己", "庚", "辛", "壬", "癸", "甲", "乙", "丙", "丁", "戊" + }; + /** + * 地支六合(子丑合,寅亥合,卯戌合,辰酉合,巳申合,午未合) + */ + public static final String[] HE_ZHI_6 = { + "丑", "子", "亥", "戌", "酉", "申", "未", "午", "巳", "辰", "卯", "寅" + }; /** * 十二值星 */ @@ -218,7 +235,7 @@ public class Lunar { /** * 地支对应天神偏移下标 */ - public static final Map ZHI_TIAN_SHEN_OFFSET = new HashMap() { + public static final Map ZHI_TIAN_SHEN_OFFSET = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -239,7 +256,7 @@ public class Lunar { /** * 天神类型:黄道,黑道 */ - public static final Map TIAN_SHEN_TYPE = new HashMap() { + public static final Map TIAN_SHEN_TYPE = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -261,7 +278,7 @@ public class Lunar { /** * 天神类型吉凶 */ - public static final Map TIAN_SHEN_TYPE_LUCK = new HashMap() { + public static final Map TIAN_SHEN_TYPE_LUCK = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -272,7 +289,7 @@ public class Lunar { /** * 兽 */ - public static final Map SHOU = new HashMap() { + public static final Map SHOU = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -282,37 +299,10 @@ public class Lunar { put("北", "玄武"); } }; - /** - * 天干四冲(无情之克中克得最严重的4个) - */ - public static final Map CHONG_GAN_BAD = new HashMap() { - private static final long serialVersionUID = 1L; - - { - put("庚", "甲"); - put("辛", "乙"); - put("壬", "丙"); - put("癸", "丁"); - } - }; - /** - * 天干五合(有情之克中最有情的5个) - */ - public static final Map CHONG_GAN_TIE_GOOD = new HashMap() { - private static final long serialVersionUID = 1L; - - { - put("甲", "己"); - put("丙", "辛"); - put("戊", "癸"); - put("庚", "乙"); - put("壬", "丁"); - } - }; /** * 煞(逢巳日、酉日、丑日必煞东;亥日、卯日、未日必煞西;申日、子日、辰日必煞南;寅日、午日、戌日必煞北) */ - public static final Map SHA = new HashMap() { + public static final Map SHA = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -333,7 +323,7 @@ public class Lunar { /** * 方位 */ - public static final Map POSITION_DESC = new HashMap() { + public static final Map POSITION_DESC = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -351,7 +341,7 @@ public class Lunar { /** * 宫 */ - public static final Map GONG = new HashMap() { + public static final Map GONG = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -388,7 +378,7 @@ public class Lunar { /** * 政 */ - public static final Map ZHENG = new HashMap() { + public static final Map ZHENG = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -425,7 +415,7 @@ public class Lunar { /** * 动物 */ - public static final Map ANIMAL = new HashMap() { + public static final Map ANIMAL = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -462,7 +452,7 @@ public class Lunar { /** * 天干五行 */ - public static final Map WU_XING_GAN = new HashMap() { + public static final Map WU_XING_GAN = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -481,7 +471,7 @@ public class Lunar { /** * 地支五行 */ - public static final Map WU_XING_ZHI = new HashMap() { + public static final Map WU_XING_ZHI = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -502,7 +492,7 @@ public class Lunar { /** * 纳音 */ - public static final Map NAYIN = new HashMap() { + public static final Map NAYIN = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -571,7 +561,7 @@ public class Lunar { /** * 天干十神,日主+天干为键 */ - public static final Map SHI_SHEN_GAN = new HashMap() { + public static final Map SHI_SHEN_GAN = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -680,7 +670,7 @@ public class Lunar { /** * 地支十神,日主+地支藏干主气为键 */ - public static final Map SHI_SHEN_ZHI = new HashMap() { + public static final Map SHI_SHEN_ZHI = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -969,7 +959,7 @@ public class Lunar { /** * 地支藏干表,分别为主气、余气、杂气 */ - public static final Map> ZHI_HIDE_GAN = new HashMap>() { + public static final Map> ZHI_HIDE_GAN = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -990,7 +980,7 @@ public class Lunar { /** * 农历日期对应的节日 */ - public static final Map FESTIVAL = new HashMap() { + public static final Map FESTIVAL = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -1008,7 +998,7 @@ public class Lunar { /** * 传统节日 */ - public static final Map> OTHER_FESTIVAL = new HashMap>() { + public static final Map> OTHER_FESTIVAL = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -1022,7 +1012,7 @@ public class Lunar { put("1-25", Collections.nCopies(1, "填仓节")); put("1-30", Collections.nCopies(1, "正月晦")); put("2-1", Collections.nCopies(1, "中和节")); - put("2-2", Collections.nCopies(1, "春社")); + put("2-2", Collections.nCopies(1, "社日节")); put("3-3", Collections.nCopies(1, "上巳节")); put("5-20", Collections.nCopies(1, "分龙节")); put("5-25", Collections.nCopies(1, "会龙节")); @@ -1044,7 +1034,7 @@ public class Lunar { /** * 28星宿对照表,地支+星期 */ - public static final Map XIU = new HashMap() { + public static final Map XIU = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -1148,7 +1138,7 @@ public class Lunar { /** * 星宿对应吉凶 */ - public static final Map XIU_LUCK = new HashMap() { + public static final Map XIU_LUCK = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -1185,7 +1175,7 @@ public class Lunar { /** * 星宿对应吉凶 */ - public static final Map XIU_SONG = new HashMap() { + public static final Map XIU_SONG = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -1258,7 +1248,7 @@ public class Lunar { /** * 禄(甲禄在寅,乙禄在卯,丙戊禄在巳、丁己禄在午、庚禄在申、辛禄在酉、壬禄在亥、癸禄在子) */ - public static final Map LU = new HashMap() { + public static final Map LU = new HashMap<>() { private static final long serialVersionUID = -1L; { @@ -3310,6 +3300,27 @@ public List getOtherFestivals() { if (null != fs) { l.addAll(fs); } + String solarYmd = solar.toYmd(); + if (solarYmd.equals(solarTerm.get("清明").next(-1).build())) { + l.add("寒食节"); + } + Solar jq = solarTerm.get("立春"); + int offset = 4 - jq.getLunar().getDayGanIndex(); + if (offset < 0) { + offset += 10; + } + if (solarYmd.equals(jq.next(offset + 40).toYmd())) { + l.add("春社"); + } + + jq = solarTerm.get("立秋"); + offset = 4 - jq.getLunar().getDayGanIndex(); + if (offset < 0) { + offset += 10; + } + if (solarYmd.equals(jq.next(offset + 40).toYmd())) { + l.add("秋社"); + } return l; } @@ -3531,14 +3542,12 @@ public String getMonthPositionTaiSui() { public String getMonthPositionTaiSui(int sect) { int monthZhiIndex; int monthGanIndex; - switch (sect) { - case 3: - monthZhiIndex = this.monthZhiIndexExact; - monthGanIndex = this.monthGanIndexExact; - break; - default: - monthZhiIndex = this.monthZhiIndex; - monthGanIndex = this.monthGanIndex; + if (sect == 3) { + monthZhiIndex = this.monthZhiIndexExact; + monthGanIndex = this.monthGanIndexExact; + } else { + monthZhiIndex = this.monthZhiIndex; + monthGanIndex = this.monthGanIndex; } return getMonthPositionTaiSui(monthZhiIndex, monthGanIndex); } @@ -3872,21 +3881,41 @@ public String getMonthPositionTai() { } /** - * 获取每日宜,如果没有,返回["无"] + * 使用默认流派1(以节交接当天起算月)获取每日宜,如果没有,返回["无"] * * @return 宜 */ public List getDayYi() { - return getDayYi(getMonthInGanZhiExact(), getDayInGanZhi()); + return getDayYi(1); } /** - * 获取每日忌,如果没有,返回["无"] + * 获取每日宜,如果没有,返回["无"] + * + * @param sect 流派,1以节交接当天起算月,2以节交接时刻起算月 + * @return 宜 + */ + public List getDayYi(int sect) { + return getDayYi(2 == sect ? getMonthInGanZhiExact() : getMonthInGanZhi(), getDayInGanZhi()); + } + + /** + * 使用默认流派1(以节交接当天起算月)获取每日忌,如果没有,返回["无"] * * @return 忌 */ public List getDayJi() { - return getDayJi(getMonthInGanZhiExact(), getDayInGanZhi()); + return getDayJi(1); + } + + /** + * 获取每日忌,如果没有,返回["无"] + * + * @param sect 流派,1以节交接当天起算月,2以节交接时刻起算月 + * @return 忌 + */ + public List getDayJi(int sect) { + return getDayJi(2 == sect ? getMonthInGanZhiExact() : getMonthInGanZhi(), getDayInGanZhi()); } /** @@ -6514,7 +6543,7 @@ public String getTianShenLuck() { * @return 时冲,如申 */ public String getChong() { - return CHONG[zhiIndex + 1]; + return CHONG[zhiIndex]; } /** @@ -6556,7 +6585,7 @@ public String getChongDesc() { * @return 无情之克的时冲天干,如甲 */ public String getChongGan() { - return CHONG_GAN[ganIndex + 1]; + return CHONG_GAN[ganIndex]; } /** @@ -6565,7 +6594,7 @@ public String getChongGan() { * @return 有情之克的时冲天干,如甲 */ public String getChongGanTie() { - return CHONG_GAN_TIE[ganIndex + 1]; + return CHONG_GAN_TIE[ganIndex]; } /** @@ -6595,7 +6624,7 @@ public NineStar getNineStar() { //顺逆 String solarYmd = lunar.getSolar().build(false); Map jieQi = lunar.getSolarTermTable(); - boolean asc = solarYmd.compareTo(jieQi.get("冬至").build(false)) >= 0 && solarYmd.compareTo(jieQi.get("夏至").build(false)) < 0; + boolean asc = solarYmd.compareTo(jieQi.get("冬至").toYmd()) >= 0 && solarYmd.compareTo(jieQi.get("夏至").toYmd()) < 0; int start = asc ? 7 : 3; String dayZhi = lunar.getDayZhi(); if ("子午卯酉".contains(dayZhi)) { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/NineStar.java b/bus-core/src/main/java/org/aoju/bus/core/date/NineStar.java index ea450879b1..b2c3acfc1d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/NineStar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/NineStar.java @@ -34,7 +34,6 @@ * 玄空九星、奇门九星都来源于北斗九星,九数、七色、五行、后天八卦方位都是相通的 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NineStar { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/NonClock.java b/bus-core/src/main/java/org/aoju/bus/core/date/NonClock.java index f26e3054b6..7503b27707 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/NonClock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/NonClock.java @@ -40,7 +40,6 @@ * 后台定时更新时钟,JVM退出时,线程自动回收 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NonClock { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/NonTimer.java b/bus-core/src/main/java/org/aoju/bus/core/date/NonTimer.java index caecca48e1..b24f773f5f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/NonTimer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/NonTimer.java @@ -33,7 +33,6 @@ * 计算某个过程花费的时间,精确到毫秒 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NonTimer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Solar.java b/bus-core/src/main/java/org/aoju/bus/core/date/Solar.java index 617a3c071a..f9cef7e674 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Solar.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Solar.java @@ -37,7 +37,6 @@ * 阳历日期 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Solar { @@ -45,7 +44,7 @@ public class Solar { /** * 日期对应的节日 */ - public static final Map FESTIVAL = new HashMap() { + public static final Map FESTIVAL = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -62,6 +61,8 @@ public class Solar { put("8-1", "建军节"); put("9-10", "教师节"); put("10-1", "国庆节"); + put("10-31", "万圣节前夜"); + put("11-1", "万圣节"); put("12-24", "平安夜"); put("12-25", "圣诞节"); } @@ -69,10 +70,11 @@ public class Solar { /** * 几月第几个星期几对应的节日 */ - public static final Map WEEK_FESTIVAL = new HashMap() { + public static final Map WEEK_FESTIVAL = new HashMap<>() { private static final long serialVersionUID = 1L; { + put("3-0-1", "全国中小学生安全教育日"); put("5-2-0", "母亲节"); put("6-3-0", "父亲节"); put("11-4-4", "感恩节"); @@ -81,7 +83,7 @@ public class Solar { /** * 日期对应的非正式节日 */ - public static final Map> OTHER_FESTIVAL = new HashMap>() { + public static final Map> OTHER_FESTIVAL = new HashMap<>() { private static final long serialVersionUID = 1L; { @@ -117,6 +119,7 @@ public class Solar { put("5-5", Collections.nCopies(1, "马克思诞辰纪念日")); put("5-8", Collections.nCopies(1, "世界红十字日")); put("5-11", Collections.nCopies(1, "世界肥胖日")); + put("5-25", Collections.nCopies(1, "525心理健康节")); put("5-27", Collections.nCopies(1, "上海解放日")); put("5-31", Collections.nCopies(1, "世界无烟日")); put("6-5", Collections.nCopies(1, "世界环境日")); @@ -435,7 +438,8 @@ public static List fromBaZi(String yearGanZhi, String monthGanZhi, String day = 1; Solar solar = new Solar(year, month, day, hour, 0, 0); lunar = solar.getLunar(); - if (lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi)) { + if (lunar.getYearInGanZhiExact().equals(yearGanZhi) + && lunar.getMonthInGanZhiExact().equals(monthGanZhi)) { found = true; break; } @@ -459,7 +463,10 @@ public static List fromBaZi(String yearGanZhi, String monthGanZhi, String while (counter < 61) { lunar = solar.getLunar(); String dgz = (2 == sect) ? lunar.getDayInGanZhiExact2() : lunar.getDayInGanZhiExact(); - if (lunar.getYearInGanZhiExact().equals(yearGanZhi) && lunar.getMonthInGanZhiExact().equals(monthGanZhi) && dgz.equals(dayGanZhi) && lunar.getTimeInGanZhi().equals(timeGanZhi)) { + if (lunar.getYearInGanZhiExact().equals(yearGanZhi) + && lunar.getMonthInGanZhiExact().equals(monthGanZhi) + && dgz.equals(dayGanZhi) + && lunar.getTimeInGanZhi().equals(timeGanZhi)) { list.add(solar); break; } @@ -589,7 +596,12 @@ public static int getDays(int ay, int am, int ad, int by, int bm, int bd) { * @return 天数 */ public static int getDays(Calendar calendar0, Calendar calendar1) { - return getDays(calendar0.get(Calendar.YEAR), calendar0.get(Calendar.MONTH) + 1, calendar0.get(Calendar.DATE), calendar1.get(Calendar.YEAR), calendar1.get(Calendar.MONTH) + 1, calendar1.get(Calendar.DATE)); + return getDays(calendar0.get(Calendar.YEAR) + , calendar0.get(Calendar.MONTH) + 1 + , calendar0.get(Calendar.DATE) + , calendar1.get(Calendar.YEAR) + , calendar1.get(Calendar.MONTH) + 1 + , calendar1.get(Calendar.DATE)); } /** @@ -639,6 +651,12 @@ public List getFestivals() { if (null != festival) { list.add(festival); } + if (day + 7 > Solar.getDaysOfMonth(year, month)) { + festival = Solar.WEEK_FESTIVAL.get(month + "-0-" + week); + if (null != festival) { + list.add(festival); + } + } return list; } @@ -700,10 +718,7 @@ public double getJulianDay() { int m = this.month; double d = this.day + ((this.second * 1D / 60 + this.minute) / 60 + this.hour) / 24; int n = 0; - boolean g = false; - if (y * 372 + m * 31 + (int) d >= 588829) { - g = true; - } + boolean g = y * 372 + m * 31 + (int) d >= 588829; if (m <= 2) { m += 12; y--; @@ -837,6 +852,10 @@ public Calendar getCalendar() { return calendar; } + public String toYmd() { + return String.format("%04d-%02d-%02d", year, month, day); + } + /** * 构建字符串内容 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/StopWatch.java b/bus-core/src/main/java/org/aoju/bus/core/date/StopWatch.java index df0a989c65..7adbb66ca9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/StopWatch.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/StopWatch.java @@ -59,7 +59,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StopWatch { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/Taoist.java b/bus-core/src/main/java/org/aoju/bus/core/date/Taoist.java index ac48e39020..90339bb774 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/Taoist.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/Taoist.java @@ -35,7 +35,6 @@ * 道历 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Taoist { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/DayWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/DayWrapper.java index 3cf36cc7b1..c87683510d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/DayWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/DayWrapper.java @@ -38,7 +38,6 @@ * 天/日/Day * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/MonthWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/MonthWrapper.java index 76d88502af..aa146cc9c2 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/MonthWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/MonthWrapper.java @@ -36,7 +36,6 @@ * 月/Month * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/NonWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/NonWrapper.java index 4cdf581aab..6749d18a11 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/NonWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/NonWrapper.java @@ -37,7 +37,6 @@ * 默认日历 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/YearWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/YearWrapper.java index 145531682b..99edfd95f5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/YearWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/YearWrapper.java @@ -35,7 +35,6 @@ * 年/Year * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/package-info.java index c5243a7e55..c317e36a5f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/calendar/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/calendar/package-info.java @@ -2,7 +2,6 @@ * 提供线日历解析实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.date.calendar; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/AbstractMotd.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/AbstractMotd.java index ea97b85aa3..0ce8d5d221 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/AbstractMotd.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/AbstractMotd.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractMotd implements DateMotd, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateMotd.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateMotd.java index 9264e5442a..24522fad9a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateMotd.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateMotd.java @@ -32,7 +32,6 @@ * 日期基本信息获取接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface DateMotd { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateParser.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateParser.java index 8d88c91321..f380c104c2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DateParser.java @@ -34,7 +34,6 @@ * 日期解析接口,用于解析日期字符串为 {@link Date} 对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface DateParser extends DateMotd { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePeriod.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePeriod.java index 7c0bc9c1f2..3211e4d563 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePeriod.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePeriod.java @@ -32,7 +32,6 @@ * 时长格式化器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DatePeriod { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePrinter.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePrinter.java index c1ecac6d59..1a6dcf70ea 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePrinter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/DatePrinter.java @@ -32,7 +32,6 @@ * 日期格式化输出接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface DatePrinter extends DateMotd { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDateParser.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDateParser.java index 2494e5b793..5ebe18ab3a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDateParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDateParser.java @@ -43,7 +43,6 @@ * 用于解析日期字符串并转换为 {@link Date} 对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FastDateParser extends AbstractMotd implements DateParser { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDatePrinter.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDatePrinter.java index e734000543..153ddaee2e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDatePrinter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FastDatePrinter.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.date.formatter; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.IOException; import java.io.ObjectInputStream; @@ -40,7 +40,6 @@ * {@link java.text.SimpleDateFormat} 的线程安全版本,用于将 {@link Date} 格式化输出 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FastDatePrinter extends AbstractMotd implements DatePrinter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatBuilder.java index 95a2a9ec8c..b78dfaeaff 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatBuilder.java @@ -42,7 +42,6 @@ * {@link #getDateTimeInstance(int, int, TimeZone, Locale)} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FormatBuilder extends Format implements DateParser, DatePrinter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatCache.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatCache.java index 4e9f91cd62..a72e2099df 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatCache.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/FormatCache.java @@ -40,7 +40,6 @@ * 日期格式化器缓存 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class FormatCache { diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/package-info.java index 7fd3fbe7e6..ab6678a381 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/formatter/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/formatter/package-info.java @@ -2,7 +2,6 @@ * 提供线程安全的日期格式的格式化和解析实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.date.formatter; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/date/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/date/package-info.java index d08bfd98ce..f5fe39d035 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/date/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/date/package-info.java @@ -2,7 +2,6 @@ * 日期封装,日期的核心为DateTime类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.date; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/AuthorizedException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/AuthorizedException.java similarity index 98% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/AuthorizedException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/AuthorizedException.java index b88aa13183..68993503af 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/AuthorizedException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/AuthorizedException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 认证异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AuthorizedException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/BusinessException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/BusinessException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/BusinessException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/BusinessException.java index 50dd6264d9..bb79bbc113 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/BusinessException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/BusinessException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 业务异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BusinessException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ConvertException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/ConvertException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/ConvertException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/ConvertException.java index 6f7882e15e..71b7460d34 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ConvertException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/ConvertException.java @@ -23,7 +23,7 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; import org.aoju.bus.core.toolkit.StringKit; @@ -31,7 +31,6 @@ * 转换异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ConvertException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/CrontabException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/CrontabException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/CrontabException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/CrontabException.java index 21147fe6ab..e57aecba20 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/CrontabException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/CrontabException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 定时任务执行异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CrontabException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/CryptoException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/CryptoException.java similarity index 94% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/CryptoException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/CryptoException.java index c11244efd6..dc51f3bb0e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/CryptoException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/CryptoException.java @@ -1,4 +1,4 @@ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; import org.aoju.bus.core.toolkit.StringKit; @@ -6,7 +6,6 @@ * 加解密异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CryptoException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/DisableException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/DisableException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/DisableException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/DisableException.java index c25ffdda38..8c3abbfdd2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/DisableException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/DisableException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 数据被禁用异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DisableException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ExistsException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/ExistsException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/ExistsException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/ExistsException.java index 5942eaa385..6f9171cd1b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ExistsException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/ExistsException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 对象已存在异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ExistsException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ForbiddenException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/ForbiddenException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/ForbiddenException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/ForbiddenException.java index 47f4b4798c..f64a48527a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ForbiddenException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/ForbiddenException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 权限不足异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ForbiddenException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/HttpUncheckException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/HttpUncheckException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/HttpUncheckException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/HttpUncheckException.java index a6bb0492b2..3742b01d33 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/HttpUncheckException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/HttpUncheckException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * HTTP请求异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HttpUncheckException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstanceException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/InstanceException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstanceException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/InstanceException.java index 46a5a89359..f10553fa8b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstanceException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/InstanceException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 实例化异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InstanceException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstrumentException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/InstrumentException.java similarity index 94% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstrumentException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/InstrumentException.java index 198cd38969..c6ae8d310a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InstrumentException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/InstrumentException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 内部处理异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InstrumentException extends UncheckedException { @@ -60,4 +59,8 @@ public InstrumentException(String errcode, String errmsg) { super(errcode, errmsg); } + public InstrumentException(Throwable cause, String format, Object... args) { + super(String.format(format, args), cause); + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidClaimException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/InvalidClaimException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidClaimException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/InvalidClaimException.java index 288f7e7652..f2843b104b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidClaimException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/InvalidClaimException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 无效的范围要求 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InvalidClaimException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidParamsException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/InvalidParamsException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidParamsException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/InvalidParamsException.java index 7b04586bae..98b4891cfd 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/InvalidParamsException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/InvalidParamsException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 无效的参数异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InvalidParamsException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NoSuchException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/NoSuchException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/NoSuchException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/NoSuchException.java index 1a00028599..67f6f729f6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NoSuchException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/NoSuchException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 无法找到方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NoSuchException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotExistsException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/NotExistsException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotExistsException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/NotExistsException.java index dc11d01acb..953b5c8613 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotExistsException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/NotExistsException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 对象不存在 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NotExistsException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotFoundException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/NotFoundException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotFoundException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/NotFoundException.java index d0ad257019..9ae6e5b774 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotFoundException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/NotFoundException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 资源不存在 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NotFoundException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotInitedException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/NotInitedException.java similarity index 98% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotInitedException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/NotInitedException.java index 0e8fac1d48..efaf97cac3 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/NotInitedException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/NotInitedException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 未初始化异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NotInitedException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/PageException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/PageException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/PageException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/PageException.java index 1f19d6b75c..b4d31b62fa 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/PageException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/PageException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 分页插件异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PageException extends RuntimeException { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/YearValueParser.java b/bus-core/src/main/java/org/aoju/bus/core/exception/PayException.java similarity index 77% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/YearValueParser.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/PayException.java index 285cf2e505..335a36245a 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/YearValueParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/PayException.java @@ -23,31 +23,40 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; - -import org.aoju.bus.cron.pattern.matcher.ValueMatcher; -import org.aoju.bus.cron.pattern.matcher.YearValueMatcher; - -import java.util.List; +package org.aoju.bus.core.exception; /** - * 年值处理 - * 年的限定在1970-2099年 + * 自定义异常: 支付异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class YearValueParser extends AbstractValueParser { +public class PayException extends UncheckedException { + + private static final long serialVersionUID = 1L; + + public PayException() { + super(); + } + + public PayException(String errcode) { + this(errcode, (String) null); + } + + public PayException(String format, Object... args) { + super(format, args); + } + + public PayException(String msg, Throwable e) { + super(msg, e); + } - public YearValueParser() { - super(1970, 2099); + public PayException(Throwable e) { + super(e); } - @Override - protected ValueMatcher buildValueMatcher(List values) { - // 考虑年数字太大,不适合boolean数组,单独使用列表遍历匹配 - return new YearValueMatcher(values); + public PayException(String errcode, String errmsg) { + super(errcode, errmsg); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/RelevantException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/RelevantException.java similarity index 98% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/RelevantException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/RelevantException.java index 1c544328c0..dd74f34999 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/RelevantException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/RelevantException.java @@ -23,7 +23,7 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; import lombok.Data; import lombok.EqualsAndHashCode; @@ -35,7 +35,6 @@ * 自定义异常: 未受检异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/RevisedException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/RevisedException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/RevisedException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/RevisedException.java index dbb6040108..1c26b758f2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/RevisedException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/RevisedException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 无法找到方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RevisedException extends RelevantException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/SignatureException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/SignatureException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/SignatureException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/SignatureException.java index 111c912f1c..e560142ad9 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/SignatureException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/SignatureException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 签名异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SignatureException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/SocketException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/SocketException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/SocketException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/SocketException.java index e09afcc562..9cdadecab6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/SocketException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/SocketException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: Socket异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SocketException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/TokenExpiredException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/TokenExpiredException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/TokenExpiredException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/TokenExpiredException.java index 5a7ec3b026..d9ef7aef39 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/TokenExpiredException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/TokenExpiredException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 令牌过期 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TokenExpiredException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/UncheckedException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/UncheckedException.java similarity index 99% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/UncheckedException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/UncheckedException.java index b15a047f45..9743e3179e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/UncheckedException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/UncheckedException.java @@ -23,7 +23,7 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; import lombok.Builder; import lombok.Data; @@ -35,7 +35,6 @@ * 自定义异常: 未受检异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ValidateException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/ValidateException.java similarity index 97% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/ValidateException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/ValidateException.java index 52d80f9a35..ddb6c28936 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/ValidateException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/ValidateException.java @@ -23,13 +23,12 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 验证异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ValidateException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/VersionException.java b/bus-core/src/main/java/org/aoju/bus/core/exception/VersionException.java similarity index 92% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/VersionException.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/VersionException.java index 720051059f..425b59f67c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/VersionException.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/VersionException.java @@ -1,10 +1,9 @@ -package org.aoju.bus.core.lang.exception; +package org.aoju.bus.core.exception; /** * 自定义异常: 版本异常 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class VersionException extends UncheckedException { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/exception/package-info.java similarity index 56% rename from bus-core/src/main/java/org/aoju/bus/core/lang/exception/package-info.java rename to bus-core/src/main/java/org/aoju/bus/core/exception/package-info.java index 4a36a04870..2380cb0f92 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/exception/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/exception/package-info.java @@ -2,7 +2,6 @@ * 异常处理相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -package org.aoju.bus.core.lang.exception; \ No newline at end of file +package org.aoju.bus.core.exception; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/ArrayType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/ArrayType.java index fc350a6103..f1af5b6c96 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/ArrayType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/ArrayType.java @@ -32,7 +32,6 @@ * 数组类型的Get接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface ArrayType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/BasicType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/BasicType.java index 941887b5a0..b89684cd01 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/BasicType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/BasicType.java @@ -34,7 +34,6 @@ * 提供一个统一的接口定义返回不同类型的值(基本类型) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BasicType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/GroupedType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/GroupedType.java index 162e90c1c3..5f4f95b2c4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/GroupedType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/GroupedType.java @@ -32,7 +32,6 @@ * 基于分组的Get接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface GroupedType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/ListType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/ListType.java index a9c59b77ad..6236301a34 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/ListType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/ListType.java @@ -33,7 +33,6 @@ * 列表类型的Get接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface ListType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/OptArrayType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/OptArrayType.java index 7e80cdee70..7e582c0375 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/OptArrayType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/OptArrayType.java @@ -34,7 +34,6 @@ * 如果值不存在或获取错误,返回默认值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface OptArrayType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/OptBasicType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/OptBasicType.java index 26e890ad9f..47f2f3c631 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/OptBasicType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/OptBasicType.java @@ -35,7 +35,6 @@ * 如果值不存在或获取错误,返回默认值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface OptBasicType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullObject.java b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullObject.java index 5a6a566b8b..d71606d605 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullObject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullObject.java @@ -37,7 +37,6 @@ * 在不提供默认值的情况下, 如果值不存在或获取错误,返回null * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface OptNullObject extends OptNullType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullString.java b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullString.java index ca9b7d43fd..86a7b0fc4c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullString.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullString.java @@ -36,7 +36,6 @@ * 用户只需实现getStr方法即可,其他类型将会从String结果中转换 在不提供默认值的情况下, 如果值不存在或获取错误,返回null * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface OptNullString extends OptNullType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullType.java b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullType.java index 484e70b6fc..63d94a8b8d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/OptNullType.java @@ -35,7 +35,6 @@ * 在不提供默认值的情况下, 如果值不存在或获取错误,返回null * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface OptNullType extends BasicType, OptBasicType { diff --git a/bus-core/src/main/java/org/aoju/bus/core/getter/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/getter/package-info.java index e13fd7efde..06448f5790 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/getter/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/getter/package-info.java @@ -2,7 +2,6 @@ * getXXX方法的接口和抽象实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.getter; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/GifDecoder.java b/bus-core/src/main/java/org/aoju/bus/core/image/GifDecoder.java index 6821547317..f6db4ca1b1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/GifDecoder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/GifDecoder.java @@ -55,7 +55,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GifDecoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/GifEncoder.java b/bus-core/src/main/java/org/aoju/bus/core/image/GifEncoder.java index ead2955f13..349fa15e46 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/GifEncoder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/GifEncoder.java @@ -49,7 +49,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GifEncoder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/Images.java b/bus-core/src/main/java/org/aoju/bus/core/image/Images.java index 3ca5321030..2082589d3f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/image/Images.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/Images.java @@ -25,6 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.image; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.image.element.AbstractElement; import org.aoju.bus.core.image.element.ImageElement; import org.aoju.bus.core.image.element.RectangleElement; @@ -35,7 +36,6 @@ import org.aoju.bus.core.io.resource.Resource; import org.aoju.bus.core.lang.Graphics; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import javax.imageio.ImageIO; @@ -59,7 +59,6 @@ * 图像编辑器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Images implements Serializable { @@ -892,41 +891,113 @@ public Images binary() { /** * 给图片添加文字水印 + * 此方法只在给定位置写出一个水印字符串 * * @param pressText 水印文字 * @param color 水印的字体颜色 * @param font {@link Font} 字体相关信息 - * @param x 修正值 默认在中间,偏移量相对于中间偏移 - * @param y 修正值 默认在中间,偏移量相对于中间偏移 - * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 + * @param x 修正值。 默认在中间,偏移量相对于中间偏移 + * @param y 修正值。 默认在中间,偏移量相对于中间偏移 + * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 * @return 处理后的图像 */ public Images pressText(String pressText, Color color, Font font, int x, int y, float alpha) { + return pressText(pressText, color, font, new Point(x, y), alpha); + } + + /** + * 给图片添加文字水印 + * 此方法只在给定位置写出一个水印字符串 + * + * @param pressText 水印文字 + * @param color 水印的字体颜色 + * @param font {@link Font} 字体相关信息 + * @param point 绘制字符串的位置坐标 + * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 + * @return 处理后的图像 + */ + public Images pressText(String pressText, Color color, Font font, Point point, float alpha) { final BufferedImage targetImage = ImageKit.toBufferedImage(getValidSrcImg(), this.fileType); - final Graphics2D g = targetImage.createGraphics(); if (null == font) { // 默认字体 - font = new Font("Courier", Font.PLAIN, (int) (targetImage.getHeight() * 0.75)); + font = Fonts.createSansSerifFont((int) (targetImage.getHeight() * 0.75)); } - // 抗锯齿 - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setColor(color); - g.setFont(font); + final Graphics2D g = targetImage.createGraphics(); // 透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); - // 在指定坐标绘制水印文字 - final FontMetrics metrics = g.getFontMetrics(font); - final int textLength = metrics.stringWidth(pressText); - final int textHeight = metrics.getAscent() - metrics.getLeading() - metrics.getDescent(); - g.drawString(pressText, Math.abs(targetImage.getWidth() - textLength) / 2 + x, Math.abs(targetImage.getHeight() + textHeight) / 2 + y); + + // 绘制 + if (positionBaseCentre) { + // 基于中心绘制 + Graphics.drawString(g, pressText, font, color, + new Rectangle(point.x, point.y, targetImage.getWidth(), targetImage.getHeight())); + } else { + // 基于左上角绘制 + Graphics.drawString(g, pressText, font, color, point); + } + + // 收笔 g.dispose(); this.targetImage = targetImage; return this; } + /** + * 给图片添加全屏文字水印 + * + * @param pressText 水印文字,文件间的间隔使用尾部添加空格方式实现 + * @param color 水印的字体颜色 + * @param font {@link Font} 字体相关信息 + * @param lineHeight 行高 + * @param degree 旋转角度,(单位:弧度),以圆点(0,0)为圆心,正代表顺时针,负代表逆时针 + * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 + * @return 处理后的图像 + */ + public Images pressTextFull(String pressText, Color color, Font font, int lineHeight, int degree, float alpha) { + final BufferedImage targetImage = ImageKit.toBufferedImage(getValidSrcImg(), this.fileType); + + if (null == font) { + // 默认字体 + font = Fonts.createSansSerifFont((int) (targetImage.getHeight() * 0.75)); + } + final int targetHeight = targetImage.getHeight(); + final int targetWidth = targetImage.getWidth(); + + // 创建画笔,并设置透明度和角度 + final Graphics2D g = targetImage.createGraphics(); + g.setColor(color); + // 基于图片中心旋转 + g.rotate(Math.toRadians(degree), targetWidth >> 1, targetHeight >> 1); + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); + + //获取字符串本身的长宽 + Dimension dimension; + try { + dimension = Fonts.getDimension(g.getFontMetrics(font), pressText); + } catch (Exception e) { + // 此处报告bug某些情况下会抛出IndexOutOfBoundsException,在此做容错处理 + dimension = new Dimension(targetWidth / 3, targetHeight / 3); + } + final int intervalHeight = dimension.height * lineHeight; + // 在画笔按照画布中心旋转后,达到45度时,上下左右会出现空白区,此处各延申长款的1.5倍实现全覆盖 + int y = -targetHeight >> 1; + while (y < targetHeight * 1.5) { + int x = -targetWidth >> 1; + while (x < targetWidth * 1.5) { + Graphics.drawString(g, pressText, font, color, new Point(x, y)); + x += dimension.width; + } + y += intervalHeight; + } + g.dispose(); + + this.targetImage = targetImage; + return this; + } + /** * 给图片添加图片水印 * @@ -1386,7 +1457,7 @@ private BufferedImage getValidSrcBufferedImg() { } /** - * 修正矩形框位置,如果{@link Images#setPositionBaseCentre(boolean)} 设为{@code true},
+ * 修正矩形框位置,如果{@link Images#setPositionBaseCentre(boolean)} 设为{@code true}, * 则坐标修正为基于图形中心,否则基于左上角 * * @param rectangle 矩形 diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/NeuQuant.java b/bus-core/src/main/java/org/aoju/bus/core/image/NeuQuant.java index 2be3fdcf8d..27791f9908 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/NeuQuant.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/NeuQuant.java @@ -31,7 +31,6 @@ * NeuQuant Neural-Net Quantization Algorithm * * @author Kimi Liu - * @version 6.5.0 * @since JDK 1.8+ */ public class NeuQuant { @@ -70,9 +69,12 @@ write output image using inxsearch(b,g,r) */ /* defs for freq and bias */ protected static final int INTBIASSHIFT = Normal._16; /* bias for fractions */ protected static final int INTBIAS = (1 << INTBIASSHIFT); + + protected static final int BETASHIFT = 10; + protected static final int GAMMASHIFT = 10; /* gamma = 1024 */ + protected static final int GAMMA = (1 << GAMMASHIFT); - protected static final int BETASHIFT = 10; protected static final int BETA = (INTBIAS >> BETASHIFT); /* beta = 1/1024 */ protected static final int BETAGAMMA = (INTBIAS << (GAMMASHIFT - BETASHIFT)); diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/Removal.java b/bus-core/src/main/java/org/aoju/bus/core/image/Removal.java index ce51207fba..2dc0ebd94a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/Removal.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/Removal.java @@ -25,7 +25,6 @@ * 根据一定规则算出图片背景色的RGB值,进行替换 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Removal { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/element/AbstractElement.java b/bus-core/src/main/java/org/aoju/bus/core/image/element/AbstractElement.java index 9ad649dafa..005ccbe181 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/element/AbstractElement.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/element/AbstractElement.java @@ -29,7 +29,6 @@ * 合并元素抽象类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractElement { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/element/ImageElement.java b/bus-core/src/main/java/org/aoju/bus/core/image/element/ImageElement.java index d8c9d8abcd..51ef101946 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/element/ImageElement.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/element/ImageElement.java @@ -35,7 +35,6 @@ * 图片元素 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ImageElement extends AbstractElement { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/element/RectangleElement.java b/bus-core/src/main/java/org/aoju/bus/core/image/element/RectangleElement.java index 9a25e41e0d..3d7bf4cfdd 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/element/RectangleElement.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/element/RectangleElement.java @@ -33,7 +33,6 @@ * 矩形元素 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RectangleElement extends AbstractElement { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/element/TextElement.java b/bus-core/src/main/java/org/aoju/bus/core/image/element/TextElement.java index f855577e60..69a0a939f4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/element/TextElement.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/element/TextElement.java @@ -33,7 +33,6 @@ * 文本元素 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/element/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/image/element/package-info.java index 0147097486..a34257870c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/element/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/element/package-info.java @@ -2,7 +2,6 @@ * 图像处理元素封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.image.element; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/image/package-info.java index ae0278f572..9667e14346 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/package-info.java @@ -2,7 +2,6 @@ * 图像处理相关类封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.image; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/ImagePainter.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/ImagePainter.java index 656a09b6a8..28ad593aa2 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/ImagePainter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/ImagePainter.java @@ -36,7 +36,6 @@ * 图片绘制器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ImagePainter implements Painter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/Painter.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/Painter.java index c4ce265f21..3cc0bd5962 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/Painter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/Painter.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Painter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/PainterFactory.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/PainterFactory.java index 41ad88275d..f116264c44 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/PainterFactory.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/PainterFactory.java @@ -32,7 +32,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PainterFactory { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/RectanglePainter.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/RectanglePainter.java index 8e9c981263..3cf1e53bc5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/RectanglePainter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/RectanglePainter.java @@ -34,7 +34,6 @@ * 矩形绘制器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RectanglePainter implements Painter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/TextPainter.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/TextPainter.java index c13e47f7cf..4ecf098e19 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/TextPainter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/TextPainter.java @@ -42,7 +42,6 @@ * 文本绘制器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextPainter implements Painter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/image/painter/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/image/painter/package-info.java index c38a6be6db..ac8f17c93d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/image/painter/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/image/painter/package-info.java @@ -2,7 +2,6 @@ * 图像处理绘制器封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.image.painter; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/instance/Instance.java b/bus-core/src/main/java/org/aoju/bus/core/instance/Instance.java index ea8fc8f3d5..6884604e5e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/instance/Instance.java +++ b/bus-core/src/main/java/org/aoju/bus/core/instance/Instance.java @@ -33,7 +33,6 @@ * 2. 当前类出于测试阶段 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Instance { diff --git a/bus-core/src/main/java/org/aoju/bus/core/instance/InstanceFactory.java b/bus-core/src/main/java/org/aoju/bus/core/instance/InstanceFactory.java index d98016fbb2..00efa1872d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/instance/InstanceFactory.java +++ b/bus-core/src/main/java/org/aoju/bus/core/instance/InstanceFactory.java @@ -26,9 +26,9 @@ package org.aoju.bus.core.instance; import org.aoju.bus.core.annotation.ThreadSafe; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ObjectKit; import java.util.Map; @@ -38,7 +38,6 @@ * 实例化工厂类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class InstanceFactory implements Instance { diff --git a/bus-core/src/main/java/org/aoju/bus/core/instance/Instances.java b/bus-core/src/main/java/org/aoju/bus/core/instance/Instances.java index b7fea3e3f9..69c8608907 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/instance/Instances.java +++ b/bus-core/src/main/java/org/aoju/bus/core/instance/Instances.java @@ -27,7 +27,6 @@ import org.aoju.bus.core.annotation.ThreadSafe; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.SimpleCache; import org.aoju.bus.core.lang.Symbol; import org.aoju.bus.core.lang.function.Func0; import org.aoju.bus.core.toolkit.ArrayKit; @@ -35,14 +34,15 @@ import org.aoju.bus.core.toolkit.ReflectKit; import org.aoju.bus.core.toolkit.StringKit; -import java.util.HashMap; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** * 实例化工具类 * 对于 {@link InstanceFactory} 的便于使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ThreadSafe @@ -51,7 +51,8 @@ public final class Instances { /** * 如果对象池中存在此对象 */ - private static final SimpleCache POOL = new SimpleCache<>(new HashMap<>()); + + private static final ConcurrentHashMap POOL = new ConcurrentHashMap<>(); private Instances() { @@ -140,7 +141,12 @@ public static T singletion(Class clazz, Object... params) { * @return 单例对象 */ public static T singletion(String key, Func0 supplier) { - return (T) POOL.get(key, supplier::call); + Object value = POOL.get(key); + if (null == value) { + POOL.putIfAbsent(key, supplier.callWithRuntimeException()); + value = POOL.get(key); + } + return (T) value; } /** @@ -178,6 +184,30 @@ public static void put(String key, Object obj) { POOL.put(key, obj); } + /** + * 判断某个类的对象是否存在 + * + * @param clazz 类 + * @param params 构造参数 + * @return 是否存在 + */ + public static boolean exists(Class clazz, Object... params) { + if (null != clazz) { + final String key = buildKey(clazz.getName(), params); + return POOL.containsKey(key); + } + return false; + } + + /** + * 获取单例池中存在的所有类 + * + * @return 非重复的类集合 + */ + public static Set> getExistClass() { + return POOL.values().stream().map(Object::getClass).collect(Collectors.toSet()); + } + /** * 移除指定Singleton对象 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/instance/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/instance/package-info.java index 596b86371f..c63a57140f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/instance/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/instance/package-info.java @@ -2,7 +2,6 @@ * 提供单例对象的统一管理 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.instance; diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/AbstractBlending.java b/bus-core/src/main/java/org/aoju/bus/core/io/AbstractBlending.java index bf34ee5638..fb47e38b80 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/AbstractBlending.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/AbstractBlending.java @@ -31,7 +31,6 @@ * 可以读取的一组索引值 {@link BufferSource#select}. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AbstractBlending extends AbstractList implements RandomAccess { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/AsyncTimeout.java b/bus-core/src/main/java/org/aoju/bus/core/io/AsyncTimeout.java index 6cad79ef08..092fea7599 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/AsyncTimeout.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/AsyncTimeout.java @@ -37,7 +37,6 @@ * 在本地不支持超时的地方实现超时,例如对阻塞的套接字操作. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AsyncTimeout extends Timeout { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Buffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/Buffer.java index f7cf2de5d7..7c9f949d20 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Buffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Buffer.java @@ -47,7 +47,6 @@ * 内存中字节的集合. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Buffer implements BufferSource, BufferSink, Cloneable, ByteChannel { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/BufferSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/BufferSink.java index 9c239b54f8..c63084b2a8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/BufferSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/BufferSink.java @@ -35,7 +35,6 @@ * 以便调用者可以进行小的写操作没有性能损失 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BufferSink extends Sink, WritableByteChannel { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/BufferSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/BufferSource.java index e37d184c02..1eced001df 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/BufferSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/BufferSource.java @@ -35,7 +35,6 @@ * 它还允许客户端提前读取,在消费之前进行必要的缓冲输入 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface BufferSource extends Source, ReadableByteChannel { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/ByteBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/ByteBuffer.java index a65ffc1513..e6d9a7e950 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/ByteBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/ByteBuffer.java @@ -43,7 +43,6 @@ * 两个半部分,描述段如何组成这个字节字符串 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ByteBuffer extends ByteString { @@ -145,6 +144,11 @@ public ByteString toAsciiUppercase() { return toByteString().toAsciiUppercase(); } + @Override + public ByteString md5() { + return toByteString().md5(); + } + /** * 内存回收任务 */ @@ -167,11 +171,6 @@ public void run() { } }, 500, 1000, TimeUnit.MILLISECONDS); - @Override - public ByteString md5() { - return toByteString().md5(); - } - @Override public ByteString sha1() { return toByteString().sha1(); diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/ByteString.java b/bus-core/src/main/java/org/aoju/bus/core/io/ByteString.java index 5368ec3c91..cd0547c520 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/ByteString.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/ByteString.java @@ -46,7 +46,6 @@ * 不可变的字节序列. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ByteString implements Serializable, Comparable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/DeflaterSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/DeflaterSink.java index d90d51b5ac..ffa69386f4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/DeflaterSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/DeflaterSink.java @@ -37,7 +37,6 @@ * 这种早期压缩可能不如执行的压缩有效 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DeflaterSink implements Sink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Delegate.java b/bus-core/src/main/java/org/aoju/bus/core/io/Delegate.java index a1b28770e3..4ac6fbcd5a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Delegate.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Delegate.java @@ -32,7 +32,6 @@ * 将调用转发给另一个调用的 {@link Timeout}. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Delegate extends Timeout { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSink.java index 2630edef6f..77be3f9f0f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSink.java @@ -33,7 +33,6 @@ * 将调用转发给另一个调用的{@link Sink} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class DelegateSink implements Sink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSource.java index 60bcf95626..6c3bca623e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/DelegateSource.java @@ -33,7 +33,6 @@ * 将调用转发给另一个调用的{@link Source} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class DelegateSource implements Source { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/EventFactory.java b/bus-core/src/main/java/org/aoju/bus/core/io/EventFactory.java index fe4d7a60fb..192f87a5c7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/EventFactory.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/EventFactory.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface EventFactory { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/FastByteBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/FastByteBuffer.java index 835e32e5f9..1a8427fef2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/FastByteBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/FastByteBuffer.java @@ -32,7 +32,6 @@ * 快速缓冲,将数据存放在缓冲集中,取代以往的单一数组 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FastByteBuffer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/FaultHideSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/FaultHideSink.java index 48d819be12..acc5f6e47a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/FaultHideSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/FaultHideSink.java @@ -32,7 +32,6 @@ * 即使底层接收器抛出了IOExceptions * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FaultHideSink extends DelegateSink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/FileOperator.java b/bus-core/src/main/java/org/aoju/bus/core/io/FileOperator.java index af29e26c11..db384809b4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/FileOperator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/FileOperator.java @@ -33,7 +33,6 @@ * 读取和写入目标文件 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class FileOperator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/FileSystem.java b/bus-core/src/main/java/org/aoju/bus/core/io/FileSystem.java index 462e5ea806..aedf571f86 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/FileSystem.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/FileSystem.java @@ -38,7 +38,6 @@ * 例如加密) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface FileSystem { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/GzipSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/GzipSink.java index 0eb2b45e52..a6684df122 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/GzipSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/GzipSink.java @@ -37,7 +37,6 @@ * 只在应用程序行为需要时调用{@link #flush} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class GzipSink implements Sink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/GzipSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/GzipSource.java index f7abf8493c..b9c32541d1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/GzipSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/GzipSource.java @@ -36,7 +36,6 @@ * 解压读取数据 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class GzipSource implements Source { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/HashSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/HashSink.java index 5ef66c4bb2..3e760293c8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/HashSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/HashSink.java @@ -41,7 +41,6 @@ * {@link #hash()}来计算最终的哈希值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class HashSink extends DelegateSink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/HashSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/HashSource.java index ac62e74177..350a374746 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/HashSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/HashSource.java @@ -40,7 +40,6 @@ * 然后调用{@link #hash()}来计算最终的哈希值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class HashSource extends DelegateSource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/InflaterSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/InflaterSource.java index c394e07997..025189a762 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/InflaterSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/InflaterSource.java @@ -37,7 +37,6 @@ * 解压从另一个源读取的数据 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class InflaterSource implements Source { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/LifeCycle.java b/bus-core/src/main/java/org/aoju/bus/core/io/LifeCycle.java index 535b433ab6..980899c2a5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/LifeCycle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/LifeCycle.java @@ -32,7 +32,6 @@ * 这个池是一个线程安全的静态单例 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class LifeCycle { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/LineHandler.java b/bus-core/src/main/java/org/aoju/bus/core/io/LineHandler.java index 9ddd0f692f..9a33e1e481 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/LineHandler.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/LineHandler.java @@ -29,7 +29,6 @@ * 行处理器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface LineHandler { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/PageBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/PageBuffer.java index fdf8523f5a..548667225b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/PageBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/PageBuffer.java @@ -37,7 +37,6 @@ * ByteBuffer内存页 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PageBuffer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/PeekSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/PeekSource.java index 8a7fe2a74f..f1da24bdfb 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/PeekSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/PeekSource.java @@ -36,7 +36,6 @@ * 无效,在以后的读取中抛出{@link IllegalStateException} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ final class PeekSource implements Source { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Pipe.java b/bus-core/src/main/java/org/aoju/bus/core/io/Pipe.java index 16a0259801..4b61cf67d0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Pipe.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Pipe.java @@ -32,7 +32,6 @@ * 通常每个线程都由自己的线程访问:生产者线程向接收器写入数据,消费者线程从源读取数据 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class Pipe { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/RealSink.java b/bus-core/src/main/java/org/aoju/bus/core/io/RealSink.java index 9a468b1701..766f4e1aaf 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/RealSink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/RealSink.java @@ -35,7 +35,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class RealSink implements BufferSink { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/RealSource.java b/bus-core/src/main/java/org/aoju/bus/core/io/RealSource.java index fa02df1e67..103a958d45 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/RealSource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/RealSource.java @@ -37,7 +37,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class RealSource implements BufferSource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/RelayBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/RelayBuffer.java index 7bfc3a33c5..965f607b13 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/RelayBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/RelayBuffer.java @@ -38,7 +38,6 @@ * 这个类保留一个最近从上游读取的字节的小缓冲区。减少文件I/O和数据复制 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ final class RelayBuffer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/RingBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/RingBuffer.java index fa8390f58e..b2d111b3fd 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/RingBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/RingBuffer.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class RingBuffer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Segment.java b/bus-core/src/main/java/org/aoju/bus/core/io/Segment.java index dd20a0c756..aa7045b00e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Segment.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Segment.java @@ -39,7 +39,6 @@ * 限制、prev和next引用不共享 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class Segment { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Sink.java b/bus-core/src/main/java/org/aoju/bus/core/io/Sink.java index 5921fa4dcd..66c36493e9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Sink.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Sink.java @@ -36,7 +36,6 @@ * {@link BufferSink#outputStream}使一个接收器适应{@code outputStream} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Sink extends Closeable, Flushable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Source.java b/bus-core/src/main/java/org/aoju/bus/core/io/Source.java index fb1a3e3b2e..fd482b1446 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Source.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Source.java @@ -34,7 +34,6 @@ * 分层以转换提供的数据,例如解压、解密或移除协议框架 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Source extends Closeable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/StreamProgress.java b/bus-core/src/main/java/org/aoju/bus/core/io/StreamProgress.java index aca4dfa43c..394d38b362 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/StreamProgress.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/StreamProgress.java @@ -29,7 +29,6 @@ * Stream进度条 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface StreamProgress { @@ -42,9 +41,10 @@ public interface StreamProgress { /** * 进行中 * - * @param progressSize 已经进行的大小 + * @param total 总大小,如果未知为 -1或者{@link Long#MAX_VALUE} + * @param size 已经进行的大小 */ - void progress(long progressSize); + void progress(long total, long size); /** * 结束 diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/Timeout.java b/bus-core/src/main/java/org/aoju/bus/core/io/Timeout.java index 674a19c21f..40f3ce594d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/Timeout.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/Timeout.java @@ -37,7 +37,6 @@ * 适用规则:关闭洗涤槽,稍后重试 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Timeout { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/VirtualBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/VirtualBuffer.java index 25257028dc..e4c62c155e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/VirtualBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/VirtualBuffer.java @@ -31,7 +31,6 @@ * 虚拟ByteBuffer缓冲区 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class VirtualBuffer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/WriteBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/WriteBuffer.java index 0f1e3e6856..2bec7d536f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/WriteBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/WriteBuffer.java @@ -34,7 +34,6 @@ * 包装当前会话分配到的虚拟Buffer,提供流式操作方式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class WriteBuffer extends OutputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/copier/ChannelCopier.java b/bus-core/src/main/java/org/aoju/bus/core/io/copier/ChannelCopier.java index cd91cc8be1..e97bfad4da 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/copier/ChannelCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/copier/ChannelCopier.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.copier; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.StreamProgress; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.IOException; @@ -41,7 +41,6 @@ * {@link ReadableByteChannel} 向 {@link WritableByteChannel} 拷贝 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ChannelCopier extends IoCopier { @@ -133,7 +132,7 @@ private long doCopy(ReadableByteChannel source, WritableByteChannel target, Byte numToRead -= read; total += read; if (null != progress) { - progress.progress(total); + progress.progress(this.count, total); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/copier/IoCopier.java b/bus-core/src/main/java/org/aoju/bus/core/io/copier/IoCopier.java index d91ee05501..f722a98cd9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/copier/IoCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/copier/IoCopier.java @@ -35,7 +35,6 @@ * @param 拷贝源类型,如InputStream、Reader等 * @param 拷贝目标类型,如OutputStream、Writer等 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class IoCopier { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/copier/ReaderWriterCopier.java b/bus-core/src/main/java/org/aoju/bus/core/io/copier/ReaderWriterCopier.java index 4d2a4433d4..20338fe95e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/copier/ReaderWriterCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/copier/ReaderWriterCopier.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.copier; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.StreamProgress; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.*; @@ -36,7 +36,6 @@ * {@link Reader} 向 {@link Writer} 拷贝 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReaderWriterCopier extends IoCopier { @@ -130,7 +129,7 @@ private long doCopy(Reader source, Writer target, char[] buffer, StreamProgress numToRead -= read; total += read; if (null != progress) { - progress.progress(total); + progress.progress(this.count, total); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/copier/StreamCopier.java b/bus-core/src/main/java/org/aoju/bus/core/io/copier/StreamCopier.java index 40bd236a25..a6555c0974 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/copier/StreamCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/copier/StreamCopier.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.copier; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.StreamProgress; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.IOException; @@ -38,7 +38,6 @@ * {@link InputStream} 向 {@link OutputStream} 拷贝 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StreamCopier extends IoCopier { @@ -133,7 +132,7 @@ private long doCopy(InputStream source, OutputStream target, byte[] buffer, Stre numToRead -= read; total += read; if (null != progress) { - progress.progress(total); + progress.progress(this.count, total); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/copier/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/copier/package-info.java index 2780298df7..2f4a9227ce 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/copier/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/copier/package-info.java @@ -2,7 +2,6 @@ * IO流拷贝相关封装相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.copier; diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileAppender.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileAppender.java index 5611dee93f..d8c5410202 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileAppender.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileAppender.java @@ -43,7 +43,6 @@ * 在调用append方法后会缓存于内存,只有超过容量后才会一次性写入文件,因此内存中随时有剩余未写入文件的内容,在最后必须调用flush方法将剩余内容刷入文件 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileAppender implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileCopier.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileCopier.java index 17512304f6..fd24d8ad4f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileCopier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileCopier.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.file; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.copier.Duplicate; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.StringKit; @@ -49,7 +49,6 @@ * 4、目录下的文件和目录复制到另一个目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileCopier extends Duplicate { @@ -236,7 +235,7 @@ public File copy() throws InstrumentException { * @throws InstrumentException IO异常 */ private void internalCopyDirContent(File src, File dest) throws InstrumentException { - if (null != copyFilter && false == copyFilter.accept(src)) { + if (null != predicate && false == predicate.test(src)) { //被过滤的目录跳过 return; } @@ -278,7 +277,7 @@ private void internalCopyDirContent(File src, File dest) throws InstrumentExcept * @throws InstrumentException IO异常 */ private void internalCopyFile(File src, File dest) throws InstrumentException { - if (null != copyFilter && false == copyFilter.accept(src)) { + if (null != predicate && false == predicate.test(src)) { // 被过滤的文件跳过 return; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileMode.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileMode.java index fb8299a10a..114f60b734 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileMode.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileMode.java @@ -29,7 +29,6 @@ * 文件读写模式,常用于RandomAccessFile * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum FileMode { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileReader.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileReader.java index fa740d7f33..9ed178812e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileReader.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.file; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.LineHandler; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -41,7 +41,6 @@ * 文件读取器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileReader extends FileWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWrapper.java index 217a93e7dd..b6b18945a0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWrapper.java @@ -34,7 +34,6 @@ * 文件包装器,扩展文件对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWriter.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWriter.java index 83b8de4a5b..c4cd7dd20d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWriter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/FileWriter.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.file; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -40,7 +40,6 @@ * 文件写入器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileWriter extends FileWrapper { @@ -331,7 +330,7 @@ public File write(byte[] data, int off, int len, boolean isAppend) throws Instru } /** - * 将流的内容写入文件
+ * 将流的内容写入文件 * 此方法会自动关闭输入流 * * @param in 输入流,不关闭 diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/LineReadWatcher.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/LineReadWatcher.java index 639c214991..4f665404c1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/LineReadWatcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/LineReadWatcher.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.file; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.LineHandler; import org.aoju.bus.core.io.watchers.SimpleWatcher; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import java.io.IOException; @@ -40,7 +40,6 @@ * 行处理的Watcher实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LineReadWatcher extends SimpleWatcher implements Runnable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/LineSeparator.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/LineSeparator.java index 19491ae61e..5a591fb3a9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/LineSeparator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/LineSeparator.java @@ -37,7 +37,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @see #MAC * @see #LINUX * @see #WINDOWS diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/Tailer.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/Tailer.java index 52debc7a31..95ebed1f33 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/Tailer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/Tailer.java @@ -25,12 +25,12 @@ ********************************************************************************/ package org.aoju.bus.core.io.file; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.LineHandler; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Console; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import java.io.File; @@ -44,7 +44,6 @@ * 文件内容跟随器,实现类似Linux下"tail -f"命令功能 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Tailer implements Serializable { @@ -191,7 +190,7 @@ private void readTail() throws IOException { Stack stack = new Stack<>(); long start = this.randomAccessFile.getFilePointer(); - long nextEnd = len - 1; + long nextEnd = (len - 1) < 0 ? 0 : len - 1; this.randomAccessFile.seek(nextEnd); int c; int currentLine = 0; diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/package-info.java index 319c1ed3a7..d0b2ed997b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/package-info.java @@ -2,7 +2,6 @@ * 对文件读写的封装,包括文件拷贝、文件读取、文件写出、行处理等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.file; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/CopyVisitor.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/CopyVisitor.java index 8493c27ec1..e2557ba371 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/CopyVisitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/CopyVisitor.java @@ -35,7 +35,6 @@ * 文件拷贝的FileVisitor实现,用于递归遍历拷贝目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CopyVisitor extends SimpleFileVisitor { @@ -96,7 +95,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) } /** - * 根据源文件或目录路径,拼接生成目标的文件或目录路径
+ * 根据源文件或目录路径,拼接生成目标的文件或目录路径 * 原理是首先截取源路径,得到相对路径,再和目标路径拼接 * *

diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/DeleteVisitor.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/DeleteVisitor.java index 6bfa1a9b0d..c67ffb07c8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/DeleteVisitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/DeleteVisitor.java @@ -36,7 +36,6 @@ * 删除操作的FileVisitor实现,用于递归遍历删除文件夹 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DeleteVisitor extends SimpleFileVisitor { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/MoveVisitor.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/MoveVisitor.java index a8b05c53f7..1b420e333a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/MoveVisitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/MoveVisitor.java @@ -36,7 +36,6 @@ * 此类在遍历源目录并移动过程中会自动创建目标目录中不存在的上级目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MoveVisitor extends SimpleFileVisitor { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/package-info.java index f73db10fbf..f763debfa6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/file/visitor/package-info.java @@ -2,7 +2,6 @@ * FileVisitor功能性实现,包括递归删除、拷贝等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.file.visitor; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/package-info.java index 0c9f435c29..8c399fa9d6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/package-info.java @@ -2,7 +2,6 @@ * IO相关封装和工具类,包括Inputstream和OutputStream实现类和Buffer处理等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/BytesResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/BytesResource.java index 5630e7ed3e..e0f382dabb 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/BytesResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/BytesResource.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import java.io.ByteArrayInputStream; @@ -38,7 +38,6 @@ * 注意:此对象中getUrl方法始终返回null * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BytesResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/CharSequenceResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/CharSequenceResource.java index dac161c2b0..1dc7778fbd 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/CharSequenceResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/CharSequenceResource.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -40,7 +40,6 @@ * {@link CharSequence}资源,字符串做为资源 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CharSequenceResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/ClassPathResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/ClassPathResource.java index 6158176be9..c8901228fa 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/ClassPathResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/ClassPathResource.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; /** @@ -36,7 +36,6 @@ * 传入的path所指向的资源必须存在,否则报错 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ClassPathResource extends UriResource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileObjectResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileObjectResource.java index f8797024dd..63401215c6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileObjectResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileObjectResource.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import javax.tools.FileObject; @@ -40,7 +40,6 @@ * {@link FileObject} 资源包装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileObjectResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileResource.java index 68a1337ec4..9083f5b39f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/FileResource.java @@ -40,7 +40,6 @@ * 文件资源访问对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileResource implements Resource, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/InputStreamResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/InputStreamResource.java index cfc8b52fb7..1ad7cfea70 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/InputStreamResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/InputStreamResource.java @@ -33,7 +33,6 @@ * 注意:此对象中getUrl方法始终返回null * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InputStreamResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiFileResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiFileResource.java index 475b58e928..902c51908e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiFileResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiFileResource.java @@ -33,7 +33,6 @@ * 此资源为一个利用游标自循环资源,只有调用{@link #next()} 方法才会获取下一个资源,使用完毕后调用{@link #reset()}方法重置游标 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MultiFileResource extends MultiResource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiResource.java index d2e0af10b7..bd9956f681 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/MultiResource.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.CollKit; import java.io.BufferedReader; @@ -42,7 +42,6 @@ * 此资源为一个利用游标自循环资源,只有调用{@link #next()} 方法才会获取下一个资源,使用完毕后调用{@link #reset()}方法重置游标 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MultiResource implements Resource, Iterable, Iterator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/PropertySource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/PropertySource.java index 36fb60336d..3c3a10de7d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/PropertySource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/PropertySource.java @@ -33,7 +33,6 @@ * 配置文件源 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/Resource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/Resource.java index a1f32d20df..250da37325 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/Resource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/Resource.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.BufferedReader; @@ -40,7 +40,6 @@ * 资源可以是文件、URL、ClassPath中的文件亦或者jar包中的文件 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/StringResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/StringResource.java index 35b213ad26..1446b9eeb2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/StringResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/StringResource.java @@ -31,7 +31,6 @@ * 字符串资源,字符串做为资源 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringResource extends CharSequenceResource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/UriResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/UriResource.java index ecf72cda16..5dbf22254a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/UriResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/UriResource.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.io.resource; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.core.toolkit.UriKit; @@ -40,7 +40,6 @@ * URL资源访问类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UriResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/VfsResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/VfsResource.java index 61f5a7f5d3..4df1734478 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/VfsResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/VfsResource.java @@ -38,7 +38,6 @@ * 参考:org.springframework.core.io.VfsUtils * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class VfsResource implements Resource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/WebAppResource.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/WebAppResource.java index a1e4017554..db57ee74e7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/WebAppResource.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/WebAppResource.java @@ -33,7 +33,6 @@ * Web root资源访问对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class WebAppResource extends FileResource { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/resource/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/resource/package-info.java index 9213797fec..6ddb08cbe1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/resource/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/resource/package-info.java @@ -2,7 +2,6 @@ * 针对ClassPath和文件中资源读取的封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.resource; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMInputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMInputStream.java index adc39d6e64..7b0a14456b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMInputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMInputStream.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.io.streams; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.IOException; import java.io.InputStream; @@ -50,7 +50,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BOMInputStream extends InputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMReader.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMReader.java index 5fc8916b90..3e5afd951d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/BOMReader.java @@ -22,7 +22,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BOMReader extends Reader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/ByteArrayOutputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/FastByteOutputStream.java similarity index 95% rename from bus-core/src/main/java/org/aoju/bus/core/io/streams/ByteArrayOutputStream.java rename to bus-core/src/main/java/org/aoju/bus/core/io/streams/FastByteOutputStream.java index c3fcf29e98..99963c9935 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/ByteArrayOutputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/FastByteOutputStream.java @@ -25,10 +25,10 @@ ********************************************************************************/ package org.aoju.bus.core.io.streams; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.FastByteBuffer; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ObjectKit; import java.io.IOException; @@ -40,14 +40,13 @@ * 避免重新分配内存块而是分配新增的缓冲区,缓冲区不会被GC,数据也不会被拷贝到其他缓冲区 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class ByteArrayOutputStream extends OutputStream { +public class FastByteOutputStream extends OutputStream { private final FastByteBuffer buffer; - public ByteArrayOutputStream() { + public FastByteOutputStream() { this(Normal._1024); } @@ -56,7 +55,7 @@ public ByteArrayOutputStream() { * * @param size 预估大小 */ - public ByteArrayOutputStream(int size) { + public FastByteOutputStream(int size) { buffer = new FastByteBuffer(size); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/NullOutputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/NullOutputStream.java index dbf3cbe7a7..f9827ed19f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/NullOutputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/NullOutputStream.java @@ -33,7 +33,6 @@ * 来自 Apache Commons io * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NullOutputStream extends OutputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueInputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueInputStream.java index dafa94f8b1..37740b2946 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueInputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueInputStream.java @@ -33,7 +33,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class QueueInputStream extends InputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueReader.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueReader.java index 6c1ec80030..791d8b63be 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/QueueReader.java @@ -35,7 +35,6 @@ * 队列InputStream * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class QueueReader extends Reader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileInputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileInputStream.java index 2bf7a09942..7111320076 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileInputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileInputStream.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RandomFileInputStream extends InputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileOutputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileOutputStream.java index 6063912900..765beb3fa1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileOutputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/RandomFileOutputStream.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RandomFileOutputStream extends OutputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StreamBuffer.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StreamBuffer.java index 2ba9feee70..8977c61f8b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StreamBuffer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StreamBuffer.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.io.streams; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import java.io.IOException; @@ -38,7 +38,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StreamBuffer extends InputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringInputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringInputStream.java index 3880d89501..c8470f432b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringInputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringInputStream.java @@ -25,15 +25,14 @@ ********************************************************************************/ package org.aoju.bus.core.io.streams; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringInputStream extends ByteArrayInputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringOutputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringOutputStream.java index b345b4f489..55e8942790 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringOutputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringOutputStream.java @@ -33,7 +33,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringOutputStream extends OutputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringReader.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringReader.java index a4f8a77033..8f52d51ca8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringReader.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringReader extends Reader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringWriter.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringWriter.java index 530a4bda62..392374f4d6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringWriter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/StringWriter.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringWriter extends Writer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidInputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidInputStream.java index 88394ba880..097d1748a8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidInputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidInputStream.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class VoidInputStream extends InputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidOutputStream.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidOutputStream.java index dfc326c763..31184826b2 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidOutputStream.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/VoidOutputStream.java @@ -30,7 +30,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class VoidOutputStream extends OutputStream { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/streams/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/streams/package-info.java index 107d0f5203..35cee1af78 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/streams/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/streams/package-info.java @@ -2,7 +2,6 @@ * Java8的stream相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.streams; diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/DelayWatcher.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/DelayWatcher.java index a75d7eaca8..aaaad912e4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/DelayWatcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/DelayWatcher.java @@ -42,7 +42,6 @@ * 此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发,从而避免以上问题 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DelayWatcher implements Watcher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/IgnoreWatcher.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/IgnoreWatcher.java index 1258c662d7..affbab6b7f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/IgnoreWatcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/IgnoreWatcher.java @@ -33,7 +33,6 @@ * 用户继承此类后实现需要监听的方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IgnoreWatcher implements Watcher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/SimpleWatcher.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/SimpleWatcher.java index 716d327aee..d4d514b545 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/SimpleWatcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/SimpleWatcher.java @@ -30,7 +30,6 @@ * 用户继承此类后实现需要监听的方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SimpleWatcher extends IgnoreWatcher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchMonitor.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchMonitor.java index 1da6b1daae..a43b332fc4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchMonitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchMonitor.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.io.watchers; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.core.toolkit.UriKit; @@ -45,7 +45,6 @@ * 递归监听目录时,并不会监听新创建的目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class WatchMonitor extends WatchServer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchServer.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchServer.java index 079c3bc787..56d39cd74d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchServer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatchServer.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.io.watchers; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Filter; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; import org.aoju.bus.core.toolkit.IoKit; @@ -42,7 +42,6 @@ * 文件监听服务,此服务可以同时监听多个路径 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class WatchServer extends Thread implements Closeable, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/Watcher.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/Watcher.java index 0d699fa49c..fafc787293 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/Watcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/Watcher.java @@ -32,7 +32,6 @@ * 观察者(监视器) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Watcher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatcherChain.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatcherChain.java index 7e99bc5f44..227752c2d0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatcherChain.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/WatcherChain.java @@ -38,7 +38,6 @@ * 用于加入多个观察者 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class WatcherChain implements Watcher, Chain { diff --git a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/package-info.java index d45db109cd..70572d647d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/io/watchers/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/io/watchers/package-info.java @@ -2,7 +2,6 @@ * 基于JDK7+ WatchService的文件和目录监听封装,支持多级目录 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.io.watchers; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/HashID.java b/bus-core/src/main/java/org/aoju/bus/core/key/HashID.java index dc9eda5649..a6e9a3c3ed 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/HashID.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/HashID.java @@ -40,7 +40,6 @@ * 数据库id,将它们用作忘记密码散列、邀请码、存储碎片号 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HashID { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/ID.java b/bus-core/src/main/java/org/aoju/bus/core/key/ID.java index b3cbc0a68f..229f6efffb 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/key/ID.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/ID.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.key; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.instance.Instances; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.NetKit; import org.aoju.bus.core.toolkit.RuntimeKit; @@ -39,7 +39,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ID { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/LongID.java b/bus-core/src/main/java/org/aoju/bus/core/key/LongID.java index 8044982db0..2d2dfae813 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/LongID.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/LongID.java @@ -49,7 +49,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LongID { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/NanoId.java b/bus-core/src/main/java/org/aoju/bus/core/key/NanoId.java index 92730f4a9c..49063e7eef 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/key/NanoId.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/NanoId.java @@ -45,7 +45,6 @@ * * @author David Klebanoff * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NanoId { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/ObjectID.java b/bus-core/src/main/java/org/aoju/bus/core/key/ObjectID.java index da19f3ede5..b0e049a895 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/ObjectID.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/ObjectID.java @@ -42,7 +42,6 @@ * 由12个字节组成,分割如下: * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ObjectID implements Comparable, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/Snowflake.java b/bus-core/src/main/java/org/aoju/bus/core/key/Snowflake.java index f9f499c659..9938ae4eef 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/Snowflake.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/Snowflake.java @@ -48,7 +48,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Snowflake implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/UUID.java b/bus-core/src/main/java/org/aoju/bus/core/key/UUID.java index 04fd6c34a9..ceba5f6a72 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/UUID.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/UUID.java @@ -62,7 +62,6 @@ * 这些类型的 version 值分别为 1、2、3 和 4 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UUID implements java.io.Serializable, Comparable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/key/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/key/package-info.java index e7e2ad0f1f..47edfec037 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/key/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/key/package-info.java @@ -2,7 +2,6 @@ * 提供各种ID支持,ObjectID、UUID、Snowflake等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.key; diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Algorithm.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Algorithm.java index 6d8832a80a..9088c7ee7c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Algorithm.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Algorithm.java @@ -29,7 +29,6 @@ * 加解密算法类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Algorithm { @@ -192,6 +191,10 @@ public enum Algorithm { * HmacSM3算法实现,需要BouncyCastle库支持 */ HMACSM3("HmacSM3"), + /** + * SM4 CMAC模式实现,需要BouncyCastle库支持 + */ + SM4CMAC("SM4CMAC"), /***************************** 对称-算法类型 *****************************/ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Align.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Align.java index 78fb73babd..6a051747ca 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Align.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Align.java @@ -29,7 +29,6 @@ * 对齐方式枚举 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Align { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Ansi.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Ansi.java deleted file mode 100755 index b9a24780b6..0000000000 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Ansi.java +++ /dev/null @@ -1,146 +0,0 @@ -/********************************************************************************* - * * - * The MIT License (MIT) * - * * - * Copyright (c) 2015-2022 aoju.org and other contributors. * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * - * THE SOFTWARE. * - * * - ********************************************************************************/ -package org.aoju.bus.core.lang; - -import java.lang.System; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * * - * 使用方法: - * String msg = Ansi.Red.and(Ansi.BgYellow).format("Hello %s", name) - * String msg = Ansi.Blink.colorize("BOOM!") - * 或者,可以直接使用常数: - * String msg = new Ansi(Ansi.ITALIC, Ansi.GREEN).format("Green money") - * Or, even: - * String msg = Ansi.BLUE + "scientific" - * 注意:同时出现多种组合FG颜色或BG颜色,只有最后一个会显示 - * - * @author Kimi Liu - * @version 6.5.0 - * @since Java 17+ - */ -public class Ansi { - - public static final String SANE = "\u001B[0m"; - - public static final String HIGH_INTENSITY = "\u001B[1m"; - public static final String LOW_INTENSITY = "\u001B[2m"; - - public static final String ITALIC = "\u001B[3m"; - public static final String UNDERLINE = "\u001B[4m"; - public static final String BLINK = "\u001B[5m"; - public static final String RAPID_BLINK = "\u001B[6m"; - public static final String REVERSE_VIDEO = "\u001B[7m"; - public static final String INVISIBLE_TEXT = "\u001B[8m"; - - public static final String BLACK = "\u001B[30m"; - public static final String RED = "\u001B[31m"; - public static final String GREEN = "\u001B[32m"; - public static final String YELLOW = "\u001B[33m"; - public static final String BLUE = "\u001B[34m"; - public static final String MAGENTA = "\u001B[35m"; - public static final String CYAN = "\u001B[36m"; - public static final String WHITE = "\u001B[37m"; - - public static final String BACKGROUND_BLACK = "\u001B[40m"; - public static final String BACKGROUND_RED = "\u001B[41m"; - public static final String BACKGROUND_GREEN = "\u001B[42m"; - public static final String BACKGROUND_YELLOW = "\u001B[43m"; - public static final String BACKGROUND_BLUE = "\u001B[44m"; - public static final String BACKGROUND_MAGENTA = "\u001B[45m"; - public static final String BACKGROUND_CYAN = "\u001B[46m"; - public static final String BACKGROUND_WHITE = "\u001B[47m"; - - public static final Ansi HighIntensity = new Ansi(HIGH_INTENSITY); - public static final Ansi Bold = HighIntensity; - public static final Ansi LowIntensity = new Ansi(LOW_INTENSITY); - - public static final Ansi Italic = new Ansi(ITALIC); - public static final Ansi Underline = new Ansi(UNDERLINE); - public static final Ansi Blink = new Ansi(BLINK); - public static final Ansi RapidBlink = new Ansi(RAPID_BLINK); - - public static final Ansi Black = new Ansi(BLACK); - public static final Ansi Red = new Ansi(RED); - public static final Ansi Green = new Ansi(GREEN); - public static final Ansi Yellow = new Ansi(YELLOW); - public static final Ansi Blue = new Ansi(BLUE); - public static final Ansi Magenta = new Ansi(MAGENTA); - public static final Ansi Cyan = new Ansi(CYAN); - public static final Ansi White = new Ansi(WHITE); - - public static final Ansi BgBlack = new Ansi(BACKGROUND_BLACK); - public static final Ansi BgRed = new Ansi(BACKGROUND_RED); - public static final Ansi BgGreen = new Ansi(BACKGROUND_GREEN); - public static final Ansi BgYellow = new Ansi(BACKGROUND_YELLOW); - public static final Ansi BgBlue = new Ansi(BACKGROUND_BLUE); - public static final Ansi BgMagenta = new Ansi(BACKGROUND_MAGENTA); - public static final Ansi BgCyan = new Ansi(BACKGROUND_CYAN); - public static final Ansi BgWhite = new Ansi(BACKGROUND_WHITE); - public static boolean isWindows; - - static { - isWindows = System.getProperties().getProperty("os.name").toLowerCase().contains("win"); - } - - final private String[] codes; - final private String codes_str; - - public Ansi(String... codes) { - this.codes = codes; - String _codes_str = Normal.EMPTY; - for (String code : codes) { - _codes_str += code; - } - codes_str = _codes_str; - } - - public Ansi and(Ansi other) { - List both = new ArrayList<>(); - Collections.addAll(both, codes); - Collections.addAll(both, other.codes); - return new Ansi(both.toArray(new String[]{})); - } - - public String colorize(String original) { - return codes_str + original + SANE; - } - - public String format(String template, Object... args) { - if (isWindows) { - if (null == args || args.length == 0) { - return template; - } - return String.format(template, args); - } - String text = (null == args || args.length == 0) ? template : String.format(template, args); - return colorize(text); - } - -} diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Assert.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Assert.java index 06516e9292..a2ed0b059b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Assert.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Assert.java @@ -40,7 +40,6 @@ * 断言某些对象或值是否符合规定,否则抛出异常 经常用于做变量检查 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Assert { @@ -693,6 +692,96 @@ public static Map notEmpty(Map map) throws IllegalArgumentExc return notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least first entry"); } + /** + * 断言两个对象是否不相等,如果两个对象相等 抛出IllegalArgumentException 异常 + *

+     *   Assert.notEquals(obj1,obj2);
+     * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @throws IllegalArgumentException obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2) { + notEquals(obj1, obj2, "({}) must be not equals ({})", obj1, obj2); + } + + /** + * 断言两个对象是否不相等,如果两个对象相等 抛出IllegalArgumentException 异常 + *
+     *   Assert.notEquals(obj1,obj2,"obj1 must be not equals obj2");
+     * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorMsgTemplate 异常信息模板,类似于"aa{}bb{}cc" + * @param params 异常信息参数,用于替换"{}"占位符 + * @throws IllegalArgumentException obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { + notEquals(obj1, obj2, () -> new IllegalArgumentException(StringKit.format(errorMsgTemplate, params))); + } + + /** + * 断言两个对象是否不相等,如果两个对象相等,抛出指定类型异常,并使用指定的函数获取错误信息返回 + * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorSupplier 错误抛出异常附带的消息生产接口 + * @param 异常类型 + * @throws X obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2, Supplier errorSupplier) throws X { + if (ObjectKit.equals(obj1, obj2)) { + throw errorSupplier.get(); + } + } + + /** + * 断言两个对象是否相等,如果两个对象不相等 抛出IllegalArgumentException 异常 + *
+     *   Assert.isEquals(obj1,obj2);
+     * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @throws IllegalArgumentException obj1 must be equals obj2 + */ + public static void equals(Object obj1, Object obj2) { + equals(obj1, obj2, "({}) must be equals ({})", obj1, obj2); + } + + /** + * 断言两个对象是否相等,如果两个对象不相等 抛出IllegalArgumentException 异常 + *
+     *   Assert.isEquals(obj1,obj2,"obj1 must be equals obj2");
+     * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorMsgTemplate 异常信息模板,类似于"aa{}bb{}cc" + * @param params 异常信息参数,用于替换"{}"占位符 + * @throws IllegalArgumentException obj1 must be equals obj2 + */ + public static void equals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { + equals(obj1, obj2, () -> new IllegalArgumentException(StringKit.format(errorMsgTemplate, params))); + } + + /** + * 断言两个对象是否相等,如果两个对象不相等,抛出指定类型异常,并使用指定的函数获取错误信息返回 + * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorSupplier 错误抛出异常附带的消息生产接口 + * @param 异常类型 + * @throws X obj1 must be equals obj2 + */ + public static void equals(Object obj1, Object obj2, Supplier errorSupplier) throws X { + if (ObjectKit.notEqual(obj1, obj2)) { + throw errorSupplier.get(); + } + } + /** * 断言给定对象是否是给定类的实例 * @@ -895,7 +984,6 @@ public static int checkIndex(int index, int size, String errorMsgTemplate, Objec return index; } - /** * 检查值是否在指定范围内 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Chain.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Chain.java index 0b42bdc9ef..6a9b687951 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Chain.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Chain.java @@ -31,7 +31,6 @@ * @param 元素类型 * @param 目标类类型,用于返回this对象 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Chain extends Iterable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Charset.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Charset.java index bfea6a0fdc..04d2be0bc2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Charset.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Charset.java @@ -37,7 +37,6 @@ * 编码常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Charset { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Console.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Console.java index e0157bbecf..843698a631 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Console.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Console.java @@ -40,7 +40,6 @@ * 此类主要针对{@link java.lang.System#out} 和 {@link java.lang.System#err} 做封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Console { @@ -437,12 +436,6 @@ private void border(StringBuilder sb) { public static class Table { - private static final char ROW_LINE = Symbol.C_MINUS; - private static final char COLUMN_LINE = Symbol.C_OR; - private static final char CORNER = Symbol.C_PLUS; - private static final char SPACE = '\u3000'; - private static final char LF = Symbol.C_LF; - /** * 表格头信息 */ @@ -505,7 +498,7 @@ private void fillColumns(List l, String[] columns) { String column = columns[i]; String col = Convert.toSBC(column); l.add(col); - int width = col.length(); + int width = column.length(); if (width > columnCharNumber.get(i)) { columnCharNumber.set(i, width); } @@ -521,39 +514,49 @@ private void fillColumns(List l, String[] columns) { public String toString() { StringBuilder sb = new StringBuilder(); fillBorder(sb); - fillRow(sb, HEADER_LIST); + fillRows(sb, HEADER_LIST); fillBorder(sb); - fillRow(sb, BODY_LIST); + fillRows(sb, BODY_LIST); fillBorder(sb); return sb.toString(); } /** - * 填充表头或者表体信息 + * 填充表头或者表体信息(多行) * * @param sb 内容 * @param list 表头列表或者表体列表 */ - private void fillRow(StringBuilder sb, List> list) { - for (List r : list) { - for (int i = 0; i < r.size(); i++) { - if (i == 0) { - sb.append(COLUMN_LINE); - } - String header = r.get(i); - sb.append(SPACE); - sb.append(header); - sb.append(SPACE); - int l = header.length(); - int lw = columnCharNumber.get(i); - if (lw > l) { - for (int j = 0; j < (lw - l); j++) { - sb.append(SPACE); - } + private void fillRows(StringBuilder sb, List> list) { + for (List row : list) { + sb.append(Symbol.C_OR); + fillRow(sb, row); + sb.append(Symbol.C_LF); + } + } + + /** + * 填充一行数据 + * + * @param sb 内容 + * @param row 一行数据 + */ + private void fillRow(StringBuilder sb, List row) { + final int size = row.size(); + String value; + for (int i = 0; i < size; i++) { + value = row.get(i); + sb.append(Symbol.C_SPACE); + sb.append(value); + sb.append(Symbol.C_SPACE); + int length = value.length(); + int maxLength = columnCharNumber.get(i); + if (maxLength > length) { + for (int j = 0; j < (maxLength - length); j++) { + sb.append(Symbol.C_SPACE); } - sb.append(COLUMN_LINE); } - sb.append(LF); + sb.append(Symbol.C_OR); } } @@ -563,12 +566,12 @@ private void fillRow(StringBuilder sb, List> list) { * @param sb StringBuilder */ private void fillBorder(StringBuilder sb) { - sb.append(CORNER); + sb.append(Symbol.C_PLUS); for (Integer width : columnCharNumber) { - sb.append(Convert.toSBC(StringKit.fillAfter(Normal.EMPTY, ROW_LINE, width + 2))); - sb.append(CORNER); + sb.append(StringKit.repeat(Symbol.C_MINUS, width + 2)); + sb.append(Symbol.C_PLUS); } - sb.append(LF); + sb.append(Symbol.C_LF); } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Dict.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Dict.java index fee3ab9e83..f5bdb0fdf4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Dict.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Dict.java @@ -44,7 +44,6 @@ * 字典对象,扩充了HashMap中的方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Dict extends LinkedHashMap implements BasicType { @@ -375,17 +374,6 @@ public T toBean(T bean) { return toBean(bean, false); } - /** - * 填充Value Object对象 - * - * @param Bean类型 - * @param clazz Value Object(或者POJO)的类 - * @return vo - */ - public T toBean(Class clazz) { - return BeanKit.mapToBean(this, clazz, false); - } - /** * 转换为Bean对象 * @@ -431,7 +419,7 @@ public T toBeanWithCamelCase(T bean) { * @return vo */ public T toBeanIgnoreCase(Class clazz) { - return BeanKit.mapToBeanIgnoreCase(this, clazz, false); + return BeanKit.toBeanIgnoreCase(this, clazz, false); } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Editor.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Editor.java index ef2949a590..90532a9ae2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Editor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Editor.java @@ -36,7 +36,6 @@ * * @param 被编辑对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Editor { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Fields.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Fields.java index 7c4077ce8c..c5180a11f0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Fields.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Fields.java @@ -38,7 +38,6 @@ * 日期场景属性 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Fields { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/FileType.java b/bus-core/src/main/java/org/aoju/bus/core/lang/FileType.java index f43bbdb0ce..578ce81d54 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/FileType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/FileType.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.lang; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -41,7 +41,6 @@ * 文件类型(扩展名) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileType { @@ -973,6 +972,8 @@ public static String getType(InputStream in, String filename) { typeName = "xlsx"; } else if ("docx".equalsIgnoreCase(extName)) { typeName = "docx"; + } else if ("pptx".equalsIgnoreCase(extName)) { + typeName = "pptx"; } } return typeName; diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Filter.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Filter.java index bd5000a4ec..68feea14bc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Filter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Filter.java @@ -29,7 +29,6 @@ * 过滤器接口 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Fonts.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Fonts.java index af92d3c366..9be76f68d2 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Fonts.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Fonts.java @@ -1,6 +1,6 @@ package org.aoju.bus.core.lang; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import java.awt.*; import java.io.File; @@ -11,7 +11,6 @@ * AWT中字体相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Fonts { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Graphics.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Graphics.java index 882896fa16..be02c8caf5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Graphics.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Graphics.java @@ -35,7 +35,6 @@ * {@link java.awt.Graphics}相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Graphics { @@ -60,7 +59,7 @@ public static Graphics2D createGraphics(BufferedImage image, Color color) { } /** - * 获取文字居中高度的Y坐标(距离上边距距离)
+ * 获取文字居中高度的Y坐标(距离上边距距离) * 此方法依赖FontMetrics,如果获取失败,默认为背景高度的1/3 * * @param g {@link Graphics2D}画笔 @@ -136,7 +135,7 @@ public static java.awt.Graphics drawString(java.awt.Graphics g, String text, Fon } /** - * 绘制字符串,默认抗锯齿。
+ * 绘制字符串,默认抗锯齿。 * 此方法定义一个矩形区域和坐标,文字基于这个区域中间偏移x,y绘制。 * * @param g {@link java.awt.Graphics}画笔 diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Header.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Header.java index ac3a5718f7..3ecb6711b4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Header.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Header.java @@ -29,7 +29,6 @@ * Header 常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Header { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Http.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Http.java index ed8ec9babb..6306e3744e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Http.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Http.java @@ -31,7 +31,6 @@ * HTTP 相关常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Http { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Job.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Job.java index ead41c4ca7..65ff388503 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Job.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Job.java @@ -34,7 +34,6 @@ * 任务类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Job implements Runnable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Locale.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Locale.java index 6ff93e773b..4a604eaa69 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Locale.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Locale.java @@ -29,7 +29,6 @@ * 翻译语言枚举 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Locale { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Matcher.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Matcher.java index 52ccf250a8..8778ac9ae9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Matcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Matcher.java @@ -30,7 +30,6 @@ * * @param 匹配的对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Matcher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/MediaType.java b/bus-core/src/main/java/org/aoju/bus/core/lang/MediaType.java index d28be6d09e..ec4e2ad083 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/MediaType.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/MediaType.java @@ -38,7 +38,6 @@ * HTTP 媒体类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Data diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Murmur.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Murmur.java index ff519b97dc..a216d8662d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Murmur.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Murmur.java @@ -33,7 +33,6 @@ * Murmur3 32bit、64bit、128bit 哈希算法实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Murmur implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Normal.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Normal.java index 850c2c251c..fb598be888 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Normal.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Normal.java @@ -34,7 +34,6 @@ * 默认常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Normal { @@ -453,8 +452,14 @@ public class Normal { * 表示为真的字符串 */ public static final String[] TRUE_ARRAY = { - "true", "t", "yes", "y", "ok", "是", "对", "真", "正确", "對", - "√" + "true", "t", "yes", "y", "ok", "是", "对", "真", "正确", "對", "√" + }; + + /** + * 表示为假的字符串 + */ + public static final String[] FALSE_ARRAY = { + "false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×" }; /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Optional.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Optional.java index 2827e0011f..7b5075886f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Optional.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Optional.java @@ -19,7 +19,6 @@ * * @param 包裹里元素的类型 * @author Kimi Liu - * @version 6.5.0 * @see java.util.Optional * @since Java 17+ */ @@ -144,7 +143,7 @@ public boolean isEmpty() { } /** - * 获取异常
+ * 获取异常 * 当调用 {@link #ofTry(Func0)}时,异常信息不会抛出,而是保存,调用此方法获取抛出的异常 * * @return 异常 @@ -154,7 +153,7 @@ public Exception getException() { } /** - * 是否失败
+ * 是否失败 * 当调用 {@link #ofTry(Func0)}时,抛出异常则表示失败 * * @return 是否失败 diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Pid.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Pid.java new file mode 100755 index 0000000000..56bd97935e --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Pid.java @@ -0,0 +1,78 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.lang; + +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.toolkit.StringKit; + +import java.lang.management.ManagementFactory; + +/** + * 进程ID单例封装 + * 第一次访问时调用{@link ManagementFactory#getRuntimeMXBean()}获取PID信息,之后直接使用缓存值 + * + * @author Kimi Liu + * @since Java 17+ + */ +public enum Pid { + + INSTANCE; + + private final int pid; + + Pid() { + this.pid = getPid(); + } + + /** + * 获取当前进程ID,首先获取进程名称,读取@前的ID值,如果不存在,则读取进程名的hash值 + * + * @return 进程ID + * @throws InstrumentException 进程名称为空 + */ + private static int getPid() throws InstrumentException { + final String processName = ManagementFactory.getRuntimeMXBean().getName(); + if (StringKit.isBlank(processName)) { + throw new InstrumentException("Process name is blank!"); + } + final int atIndex = processName.indexOf('@'); + if (atIndex > 0) { + return Integer.parseInt(processName.substring(0, atIndex)); + } else { + return processName.hashCode(); + } + } + + /** + * 获取PID值 + * + * @return pid + */ + public int get() { + return this.pid; + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Range.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Range.java index 14d2908e56..0504a7cad7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Range.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Range.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.lang; -import org.aoju.bus.core.thread.AtomicNoLock; +import org.aoju.bus.core.lock.AtomicNoLock; import java.io.Serializable; import java.util.Iterator; @@ -45,7 +45,6 @@ * * @param 生成范围对象的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Range implements Iterable, Iterator, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/References.java b/bus-core/src/main/java/org/aoju/bus/core/lang/References.java new file mode 100644 index 0000000000..f51e0d1cae --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/References.java @@ -0,0 +1,98 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.lang; + +import java.lang.ref.*; + +/** + * 主要针对{@link Reference} 工具化封装 + * 主要封装包括: + *
+ * 1. {@link SoftReference} 软引用,在GC报告内存不足时会被GC回收
+ * 2. {@link WeakReference} 弱引用,在GC时发现弱引用会回收其对象
+ * 3. {@link PhantomReference} 虚引用,在GC时发现虚引用对象,会将{@link PhantomReference}插入{@link ReferenceQueue}
+ *    此时对象未被真正回收,要等到{@link ReferenceQueue}被真正处理后才会被回收
+ * 
+ * + * @author Kimi Liu + * @since Java 17+ + */ +public class References { + + /** + * 获得引用 + * + * @param 被引用对象类型 + * @param type 引用类型枚举 + * @param referent 被引用对象 + * @return {@link Reference} + */ + public static Reference create(Type type, T referent) { + return create(type, referent, null); + } + + /** + * 获得引用 + * + * @param 被引用对象类型 + * @param type 引用类型枚举 + * @param referent 被引用对象 + * @param queue 引用队列 + * @return {@link Reference} + */ + public static Reference create(Type type, T referent, ReferenceQueue queue) { + switch (type) { + case SOFT: + return new SoftReference<>(referent, queue); + case WEAK: + return new WeakReference<>(referent, queue); + case PHANTOM: + return new PhantomReference<>(referent, queue); + default: + return null; + } + } + + /** + * 引用类型 + */ + public enum Type { + /** + * 软引用,在GC报告内存不足时会被GC回收 + */ + SOFT, + /** + * 弱引用,在GC时发现弱引用会回收其对象 + */ + WEAK, + /** + * 虚引用,在GC时发现虚引用对象,会将{@link PhantomReference}插入{@link ReferenceQueue}。
+ * 此时对象未被真正回收,要等到{@link ReferenceQueue}被真正处理后才会被回收。 + */ + PHANTOM + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/RegEx.java b/bus-core/src/main/java/org/aoju/bus/core/lang/RegEx.java index 494b1d0e67..1177effcb4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/RegEx.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/RegEx.java @@ -34,7 +34,6 @@ * 正则表达式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RegEx { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Replacer.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Replacer.java index ac8c8ab419..a4bbdda446 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Replacer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Replacer.java @@ -31,7 +31,6 @@ * * @param 被替换操作的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Replacer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Scale.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Scale.java index 6a117fa327..94e01e52dd 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Scale.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Scale.java @@ -31,7 +31,6 @@ * 缩放常量信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Scale { @@ -62,7 +61,6 @@ public enum Mode { * 图片缩略类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Type { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Scaner.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Scaner.java index fc6a10921c..d38e936d92 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Scaner.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Scaner.java @@ -26,7 +26,7 @@ package org.aoju.bus.core.lang; import org.aoju.bus.core.collection.EnumerationIterator; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import java.io.File; @@ -36,6 +36,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.function.Predicate; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -43,7 +44,6 @@ * 类扫描器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Scaner { @@ -67,7 +67,7 @@ public class Scaner { /** * 过滤器 */ - private final Filter> classFilter; + private final Predicate> predicate; /** * 编码 */ @@ -98,26 +98,26 @@ public Scaner(String packageName) { * 构造,默认UTF-8编码 * * @param packageName 包名,所有包传入""或者null - * @param classFilter 过滤器,无需传入null + * @param predicate 过滤器,无需传入null */ - public Scaner(String packageName, Filter> classFilter) { - this(packageName, classFilter, Charset.UTF_8); + public Scaner(String packageName, Predicate> predicate) { + this(packageName, predicate, Charset.UTF_8); } /** * 构造 * * @param packageName 包名,所有包传入""或者null - * @param classFilter 过滤器,无需传入null + * @param predicate 过滤器,无需传入null * @param charset 编码 */ - public Scaner(String packageName, Filter> classFilter, java.nio.charset.Charset charset) { + public Scaner(String packageName, Predicate> predicate, java.nio.charset.Charset charset) { packageName = StringKit.nullToEmpty(packageName); this.packageName = packageName; this.packageNameWithDot = StringKit.addSuffixIfNot(packageName, Symbol.DOT); this.packageDirName = packageName.replace(Symbol.C_DOT, File.separatorChar); this.packagePath = packageName.replace(Symbol.C_DOT, Symbol.C_SLASH); - this.classFilter = classFilter; + this.predicate = predicate; this.charset = charset; } @@ -132,15 +132,15 @@ public static Set> scanAllPackage() { } /** - * 扫描包路径下和所有在classpath中加载的类,满足class过滤器条件的所有class文件,
- * 如果包路径为 com.abs + A.class 但是输入 abs会产生classNotFoundException
- * 因为className 应该为 com.abs.A 现在却成为abs.A,此工具类对该异常进行忽略处理
+ * 扫描包路径下和所有在classpath中加载的类,满足class过滤器条件的所有class文件, + * 如果包路径为 com.abs + A.class 但是输入 abs会产生classNotFoundException + * 因为className 应该为 com.abs.A 现在却成为abs.A,此工具类对该异常进行忽略处理 * * @param packageName 包路径 com | com. | com.abs | com.abs. * @param classFilter class过滤器,过滤掉不需要的class * @return 类集合 */ - public static Set> scanAllPackage(String packageName, Filter> classFilter) { + public static Set> scanAllPackage(String packageName, Predicate> classFilter) { return new Scaner(packageName, classFilter).scan(true); } @@ -169,11 +169,11 @@ public static Set> scanPackage(String packageName) { * 因为className 应该为 com.abs.A 现在却成为abs.A,此工具类对该异常进行忽略处理 * * @param packageName 包路径 com | com. | com.abs | com.abs. - * @param classFilter class过滤器,过滤掉不需要的class + * @param predicate class过滤器,过滤掉不需要的class * @return 类集合 */ - public static Set> scanPackage(String packageName, Filter> classFilter) { - return new Scaner(packageName, classFilter).scan(); + public static Set> scanPackage(String packageName, Predicate> predicate) { + return new Scaner(packageName, predicate).scan(); } /** @@ -385,8 +385,8 @@ private void addIfAccept(String className) { */ private void addIfAccept(Class clazz) { if (null != clazz) { - Filter> classFilter = this.classFilter; - if (null == classFilter || classFilter.accept(clazz)) { + Predicate> classFilter = this.predicate; + if (null == classFilter || classFilter.test(clazz)) { this.classes.add(clazz); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/SimpleCache.java b/bus-core/src/main/java/org/aoju/bus/core/lang/SimpleCache.java index d2254a3618..cac5753d5e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/SimpleCache.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/SimpleCache.java @@ -26,6 +26,8 @@ package org.aoju.bus.core.lang; import org.aoju.bus.core.lang.function.Func0; +import org.aoju.bus.core.lang.mutable.MutableObject; +import org.aoju.bus.core.map.WeakMap; import java.io.Serializable; import java.util.Iterator; @@ -33,17 +35,17 @@ import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; /** - * 简单缓存,无超时实现,使用{@link WeakHashMap}实现缓存自动清理 + * 简单缓存,无超时实现,使用{@link WeakMap}实现缓存自动清理 * * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SimpleCache implements Iterable>, Serializable { @@ -61,13 +63,13 @@ public class SimpleCache implements Iterable>, Serializabl /** * 乐观读写锁 */ - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); /** * 构造,默认使用{@link WeakHashMap}实现缓存自动清理 */ public SimpleCache() { - this(new WeakHashMap<>()); + this(new WeakMap<>()); } /** @@ -90,7 +92,7 @@ public SimpleCache(Map initMap) { public V get(K key) { lock.readLock().lock(); try { - return cache.get(key); + return cache.get(MutableObject.of(key)); } finally { lock.readLock().unlock(); } @@ -117,13 +119,16 @@ public V get(K key, Func0 supplier) { */ public V get(K key, Predicate validPredicate, Func0 supplier) { V v = get(key); + if ((null != validPredicate && false == validPredicate.test(v))) { + v = null; + } if (null == v && null != supplier) { // 每个key单独获取一把锁,降低锁的粒度提高并发能力,see pr#1385@Github final Lock keyLock = keyLockMap.computeIfAbsent(key, k -> new ReentrantLock()); keyLock.lock(); try { // 双重检查,防止在竞争锁的过程中已经有其它线程写入 - v = cache.get(key); + v = get(key); if (null == v || (null != validPredicate && false == validPredicate.test(v))) { try { v = supplier.call(); diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Symbol.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Symbol.java index 3ac64c6cfb..3ad0ffeb38 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Symbol.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Symbol.java @@ -29,7 +29,6 @@ * 标点符号常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Symbol { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/System.java b/bus-core/src/main/java/org/aoju/bus/core/lang/System.java index fc09b760de..8f3dc5ad8b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/System.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/System.java @@ -34,7 +34,6 @@ * 系统常量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class System { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Typed.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Typed.java index e19617562c..e9ab2cf4cf 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Typed.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Typed.java @@ -36,7 +36,6 @@ * {@link ParameterizedType} 接口实现,用于重新定义泛型类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Typed implements ParameterizedType, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Types.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Types.java index c854501315..8647d0e8cb 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Types.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Types.java @@ -39,7 +39,6 @@ * * @param 需要自定义的参考类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Types implements Type { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Validator.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Validator.java index 16f2ae309e..d81acc4b5c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Validator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Validator.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.lang; -import org.aoju.bus.core.lang.exception.ValidateException; +import org.aoju.bus.core.exception.ValidateException; import org.aoju.bus.core.toolkit.*; import java.net.MalformedURLException; @@ -36,7 +36,6 @@ * 字段验证器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Validator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Weighing.java b/bus-core/src/main/java/org/aoju/bus/core/lang/Weighing.java index bbd664b94e..7b446d5789 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Weighing.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/Weighing.java @@ -47,7 +47,6 @@ * * @param 权重随机获取的对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Weighing implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/ZoneId.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ZoneId.java index 65ca22bf00..4197472a56 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/ZoneId.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ZoneId.java @@ -29,7 +29,6 @@ * 时区计算 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum ZoneId { @@ -38,6 +37,10 @@ public enum ZoneId { * "Worldwide","世界标准时间" */ UTC("Worldwide", "世界标准时间"), + /** + * "Universal Time","世界时" + */ + GMT("Universal Time", "世界时"), /** * "Australia/Darwin","澳洲/达尔文" */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/Ansi8BitColor.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/Ansi8BitColor.java new file mode 100755 index 0000000000..75e09220a2 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/Ansi8BitColor.java @@ -0,0 +1,107 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.lang.ansi; + +import org.aoju.bus.core.lang.Assert; + +/** + * ANSI 8-bit前景或背景色(即8位编码,共256种颜色(2^8) ) + *
    + *
  • 0-7: 标准颜色(同ESC [ 30–37 m)
  • + *
  • 8-15: 高强度颜色(同ESC [ 90–97 m)
  • + *
  • 16-231(6 × 6 × 6 共 216色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
  • + *
  • 232-255: 从黑到白的24阶灰度色
  • + *
+ * + *

来自Spring Boot

+ * + * @author Kimi Liu + * @since Java 17+ + */ +public final class Ansi8BitColor implements AnsiElement { + + private static final String PREFIX_FORE = "38;5;"; + private static final String PREFIX_BACK = "48;5;"; + + private final String prefix; + private final int code; + + /** + * 构造 + * + * @param prefix 前缀 + * @param code 颜色代码(0-255) + * @throws IllegalArgumentException 颜色代码不在0~255范围内 + */ + private Ansi8BitColor(String prefix, int code) { + Assert.isTrue(code >= 0 && code <= 255, "Code must be between 0 and 255"); + this.prefix = prefix; + this.code = code; + } + + /** + * 前景色ANSI颜色实例 + * + * @param code 颜色代码(0-255) + * @return 前景色ANSI颜色实例 + */ + public static Ansi8BitColor foreground(int code) { + return new Ansi8BitColor(PREFIX_FORE, code); + } + + /** + * 背景色ANSI颜色实例 + * + * @param code 颜色代码(0-255) + * @return 背景色ANSI颜色实例 + */ + public static Ansi8BitColor background(int code) { + return new Ansi8BitColor(PREFIX_BACK, code); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + Ansi8BitColor other = (Ansi8BitColor) obj; + return this.prefix.equals(other.prefix) && this.code == other.code; + } + + @Override + public int hashCode() { + return this.prefix.hashCode() * 31 + this.code; + } + + @Override + public String toString() { + return this.prefix + this.code; + } + +} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MonthValueParser.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiBackground.java old mode 100644 new mode 100755 similarity index 65% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MonthValueParser.java rename to bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiBackground.java index 9c7823ec56..419d6322f1 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MonthValueParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiBackground.java @@ -23,52 +23,112 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; - -import org.aoju.bus.core.lang.exception.CrontabException; +package org.aoju.bus.core.lang.ansi; /** - * 月份值处理 - * 限定于1-12,1表示一月,支持别名(忽略大小写),如一月是{@code jan} + * ANSI背景颜色枚举 + * + *

来自Spring Boot

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class MonthValueParser extends AbstractValueParser { +public enum AnsiBackground implements AnsiElement { /** - * Months aliases. + * 默认背景色 */ - private static final String[] ALIASES = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; + DEFAULT("49"), - public MonthValueParser() { - super(1, 12); - } + /** + * 黑色 + */ + BLACK("40"), - @Override - public int parse(String value) throws CrontabException { - try { - return super.parse(value); - } catch (Exception e) { - return parseAlias(value); - } - } + /** + * 红 + */ + RED("41"), + + /** + * 绿 + */ + GREEN("42"), + + /** + * 黄 + */ + YELLOW("43"), + + /** + * 蓝 + */ + BLUE("44"), + + /** + * 品红 + */ + MAGENTA("45"), + + /** + * 青 + */ + CYAN("46"), + + /** + * 白 + */ + WHITE("47"), /** - * 解析别名 - * - * @param value 别名值 - * @return 月份int值 - * @throws CrontabException 无效月别名抛出此异常 + * 亮黑 */ - private int parseAlias(String value) throws CrontabException { - for (int i = 0; i < ALIASES.length; i++) { - if (ALIASES[i].equalsIgnoreCase(value)) { - return i + 1; - } - } - throw new CrontabException("Invalid month alias: {}", value); + BRIGHT_BLACK("100"), + + /** + * 亮红 + */ + BRIGHT_RED("101"), + + /** + * 亮绿 + */ + BRIGHT_GREEN("102"), + + /** + * 亮黄 + */ + BRIGHT_YELLOW("103"), + + /** + * 亮蓝 + */ + BRIGHT_BLUE("104"), + + /** + * 亮品红 + */ + BRIGHT_MAGENTA("105"), + + /** + * 亮青 + */ + BRIGHT_CYAN("106"), + + /** + * 亮白 + */ + BRIGHT_WHITE("107"); + + private final String code; + + AnsiBackground(String code) { + this.code = code; + } + + @Override + public String toString() { + return this.code; } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/Holder.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiColor.java similarity index 66% rename from bus-core/src/main/java/org/aoju/bus/core/lang/Holder.java rename to bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiColor.java index 1bc8e47669..bd438c1f44 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/Holder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiColor.java @@ -23,48 +23,112 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.lang; - -import org.aoju.bus.core.lang.mutable.MutableObject; +package org.aoju.bus.core.lang.ansi; /** - * 为不可变的对象引用提供一个可变的包装,在java中支持引用传递 + * ANSI标准颜色 + * + *

来自Spring Boot

* - * @param 所持有值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public final class Holder extends MutableObject { +public enum AnsiColor implements AnsiElement { /** - * 构造 + * 默认前景色 */ - public Holder() { + DEFAULT("39"), - } + /** + * 黑 + */ + BLACK("30"), /** - * 构造 - * - * @param value 被包装的对象 + * 红 */ - public Holder(T value) { - super(value); - } + RED("31"), /** - * 新建Holder类,持有指定值,当值为空时抛出空指针异常 - * - * @param 被持有的对象类型 - * @param value 值,不能为空 - * @return Holder + * 绿 */ - public static Holder of(T value) throws NullPointerException { - if (null == value) { - throw new NullPointerException("Holder can not hold a null value!"); - } - return new Holder<>(value); + GREEN("32"), + + /** + * 黄 + */ + YELLOW("33"), + + /** + * 蓝 + */ + BLUE("34"), + + /** + * 品红 + */ + MAGENTA("35"), + + /** + * 青 + */ + CYAN("36"), + + /** + * 白 + */ + WHITE("37"), + + /** + * 亮黑 + */ + BRIGHT_BLACK("90"), + + /** + * 亮红 + */ + BRIGHT_RED("91"), + + /** + * 亮绿 + */ + BRIGHT_GREEN("92"), + + /** + * 亮黄 + */ + BRIGHT_YELLOW("93"), + + /** + * 亮蓝 + */ + BRIGHT_BLUE("94"), + + /** + * 亮品红 + */ + BRIGHT_MAGENTA("95"), + + /** + * 亮青 + */ + BRIGHT_CYAN("96"), + + /** + * 亮白 + */ + BRIGHT_WHITE("97"); + + private final String code; + + AnsiColor(String code) { + this.code = code; + } + + @Override + public String toString() { + return this.code; } } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MinuteValueParser.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiElement.java old mode 100644 new mode 100755 similarity index 90% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MinuteValueParser.java rename to bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiElement.java index 1c86ba9322..48281717ba --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/MinuteValueParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiElement.java @@ -23,23 +23,22 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; +package org.aoju.bus.core.lang.ansi; /** - * 分钟值处理 - * 限定于0-59 + * ANSI可转义节点接口,实现为ANSI颜色等 + * + *

来自Spring Boot

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class MinuteValueParser extends AbstractValueParser { +public interface AnsiElement { /** - * 构造 + * @return ANSI转义编码 */ - public MinuteValueParser() { - super(0, 59); - } + @Override + String toString(); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiEncoder.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiEncoder.java new file mode 100755 index 0000000000..e232579524 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiEncoder.java @@ -0,0 +1,91 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.lang.ansi; + +/** + * 生成ANSI格式的编码输出 + * + * @author Kimi Liu + * @since Java 17+ + */ +public abstract class AnsiEncoder { + + private static final String ENCODE_JOIN = ";"; + private static final String ENCODE_START = "\033["; + private static final String ENCODE_END = "m"; + private static final String RESET = "0;" + AnsiColor.DEFAULT; + + /** + * 创建ANSI字符串,参数中的{@link AnsiElement}会被转换为编码形式。 + * + * @param args 节点数组 + * @return ANSI字符串 + */ + public static String encode(Object... args) { + final StringBuilder sb = new StringBuilder(); + buildEnabled(sb, args); + return sb.toString(); + } + + /** + * 追加需要需转义的节点 + * + * @param sb {@link StringBuilder} + * @param args 节点列表 + */ + private static void buildEnabled(StringBuilder sb, Object[] args) { + boolean writingAnsi = false; + boolean containsEncoding = false; + for (Object element : args) { + if (null == element) { + continue; + } + if (element instanceof AnsiElement) { + containsEncoding = true; + if (writingAnsi) { + sb.append(ENCODE_JOIN); + } else { + sb.append(ENCODE_START); + writingAnsi = true; + } + } else { + if (writingAnsi) { + sb.append(ENCODE_END); + writingAnsi = false; + } + } + sb.append(element); + } + + // 恢复默认 + if (containsEncoding) { + sb.append(writingAnsi ? ENCODE_JOIN : ENCODE_START); + sb.append(RESET); + sb.append(ENCODE_END); + } + } + +} diff --git a/bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunVmsProperty.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiStyle.java old mode 100644 new mode 100755 similarity index 79% rename from bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunVmsProperty.java rename to bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiStyle.java index f8b002bc30..a18b62a01a --- a/bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunVmsProperty.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/AnsiStyle.java @@ -23,38 +23,52 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.notify.provider.aliyun; - -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.SuperBuilder; -import org.aoju.bus.notify.magic.Property; +package org.aoju.bus.core.lang.ansi; /** - * 阿里云语音通知模版 + * ANSI文本样式风格枚举 + * + *

来自Spring Boot

* - * @author Justubborn - * @version 6.5.0 + * @author Kimi Liu * @since Java 17+ */ -@Getter -@Setter -@SuperBuilder -public class AliyunVmsProperty extends Property { +public enum AnsiStyle implements AnsiElement { + + /** + * 重置/正常 + */ + NORMAL("0"), /** - * 语音模版参数 + * 粗体或增加强度 */ - private String ttsParam; + BOLD("1"), /** - * 语音模版id + * 弱化(降低强度) */ - private String ttsCode; + FAINT("2"), /** - * 播放次数 + * 斜体 */ - private String playTimes; + ITALIC("3"), + + /** + * 下划线 + */ + UNDERLINE("4"); + + private final String code; + + AnsiStyle(String code) { + this.code = code; + } + + @Override + public String toString() { + return this.code; + } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/package-info.java new file mode 100755 index 0000000000..6ee6493c2d --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/ansi/package-info.java @@ -0,0 +1,7 @@ +/** + * 命令行终端中ANSI 转义序列相关封装,如ANSI颜色等 + * + * @author Kimi Liu + * @since Java 17+ + */ +package org.aoju.bus.core.lang.ansi; diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/Caller.java b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/Caller.java index b0abebf9e0..012ef61931 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/Caller.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/Caller.java @@ -32,7 +32,6 @@ * 可以通过此接口的实现类方法获取调用者、多级调用者以及判断是否被调用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Caller { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/SecurityCaller.java b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/SecurityCaller.java index e7bac1c3fe..f4b6e89787 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/SecurityCaller.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/SecurityCaller.java @@ -31,7 +31,6 @@ * 方式获取调用者 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SecurityCaller extends SecurityManager implements Caller { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/StackTraceCaller.java b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/StackTraceCaller.java index b0a4f41ba4..2368842eb1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/StackTraceCaller.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/StackTraceCaller.java @@ -25,13 +25,12 @@ ********************************************************************************/ package org.aoju.bus.core.lang.caller; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; /** * 通过StackTrace方式获取调用者 此方式效率最低,不推荐使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StackTraceCaller implements Caller { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/package-info.java index d5f4b1abbf..cda076a742 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/caller/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/caller/package-info.java @@ -2,7 +2,6 @@ * 调用者接口及实现。可以通过此类的方法获取调用者、多级调用者以及判断是否被调用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.caller; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Copier.java b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Copier.java index abd0ce31c9..4dda61d12b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Copier.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Copier.java @@ -30,7 +30,6 @@ * * @param 拷贝目标类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Copier { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Duplicate.java b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Duplicate.java index 5e3cb802e2..059412e245 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Duplicate.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/Duplicate.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.lang.copier; -import org.aoju.bus.core.lang.Filter; +import java.util.function.Predicate; /** * 复制器抽象类 @@ -34,7 +34,6 @@ * @param 拷贝的对象 * @param 本类的类型 用于set方法返回本对象,方便流式编程 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Duplicate> implements Copier { @@ -50,7 +49,7 @@ public abstract class Duplicate> implements Copier< /** * 拷贝过滤器,可以过滤掉不需要拷贝的源 */ - protected Filter copyFilter; + protected Predicate predicate; /** * 获取源 @@ -97,18 +96,18 @@ public C setDest(T dest) { * * @return 过滤器 */ - public Filter getCopyFilter() { - return copyFilter; + public Predicate getPredicate() { + return predicate; } /** * 设置过滤器 * - * @param copyFilter 过滤器 + * @param predicate 过滤器 * @return this */ - public C setCopyFilter(Filter copyFilter) { - this.copyFilter = copyFilter; + public C setPredicate(Predicate predicate) { + this.predicate = predicate; return (C) this; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/package-info.java index 9fcc31031c..ee962ac6e3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/copier/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/copier/package-info.java @@ -2,7 +2,6 @@ * 拷贝抽象实现,通过抽象拷贝,可以实现文件、流、Buffer之间的拷贝实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.copier; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer1.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer1.java index 040b44bd1c..ed4ec2e05a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer1.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer1.java @@ -30,7 +30,6 @@ * * @param 参数一类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer2.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer2.java index 2843e82040..148143f02c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer2.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer2.java @@ -31,7 +31,6 @@ * @param 参数一类型 * @param 参数二类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer3.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer3.java index 721d833875..ee4ae55b35 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer3.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Consumer3.java @@ -32,7 +32,6 @@ * @param 参数二类型 * @param 参数三类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Fn.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Fn.java index 5d643e5a5e..a2da70a732 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Fn.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Fn.java @@ -37,7 +37,6 @@ * @param 参数类型 * @param 返回值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func.java index 213435d516..41b5c87519 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func.java @@ -34,7 +34,6 @@ * 此接口用于将一个函数包装成为一个对象,从而传递对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func0.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func0.java index b797af1cb6..bfede7aa44 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func0.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func0.java @@ -35,7 +35,6 @@ * * @param 返回值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func1.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func1.java index b2fe74a65f..706f7766f1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func1.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Func1.java @@ -36,7 +36,6 @@ * @param

参数类型 * @param 返回值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier1.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier1.java index 0273559167..374f39b0e2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier1.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier1.java @@ -33,7 +33,6 @@ * @param 目标 类型 * @param 参数一 类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier2.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier2.java index bc8e1574c1..e7a187fd3b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier2.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier2.java @@ -34,7 +34,6 @@ * @param 参数一 类型 * @param 参数二 类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier3.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier3.java index aa14eee0bd..5b3f483faa 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier3.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier3.java @@ -35,7 +35,6 @@ * @param 参数二类型 * @param 参数三类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier4.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier4.java index b9e0334fcd..217bf95542 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier4.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier4.java @@ -36,7 +36,6 @@ * @param 参数三 类型 * @param 参数四 类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier5.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier5.java index 7e5ccc91f5..02c9c83ed2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier5.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/Supplier5.java @@ -37,7 +37,6 @@ * @param 参数四 类型 * @param 参数五 类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc.java index 87bbb1d769..e240e3543d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc.java @@ -35,7 +35,6 @@ * * @param

参数类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc0.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc0.java index b9626cd191..5d9110cdf7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc0.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc0.java @@ -34,7 +34,6 @@ * 此接口用于将一个函数包装成为一个对象,从而传递对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc1.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc1.java index e0672edc85..abe8f3d531 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc1.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/VoidFunc1.java @@ -35,7 +35,6 @@ * * @param

参数类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/function/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/function/package-info.java index 179df95c1e..8aa670cf05 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/function/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/function/package-info.java @@ -4,7 +4,6 @@ * 在JDK8之前,Java的函数并不能作为参数传递,也不能作为返回值存在,此接口用于将一个函数包装成为对象,从而传递对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.function; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/Mutable.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/Mutable.java index fbd17d6df7..be128fbffd 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/Mutable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/Mutable.java @@ -30,7 +30,6 @@ * * @param 值得类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Mutable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableBool.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableBool.java index 3eefc04ba8..3375da6d6a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableBool.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableBool.java @@ -29,7 +29,6 @@ * 可变 boolean 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Boolean * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableByte.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableByte.java index 53298e8666..ffb3bd9bc4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableByte.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableByte.java @@ -31,7 +31,6 @@ * 可变 byte 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Byte * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableDouble.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableDouble.java index b34638010a..f98fc9688b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableDouble.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableDouble.java @@ -32,7 +32,6 @@ * 可变 double 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Double * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableFloat.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableFloat.java index b2ad109c12..d1121ea647 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableFloat.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableFloat.java @@ -31,7 +31,6 @@ * 可变 float 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Float * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableInt.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableInt.java index 18ac76c2a2..92839fe208 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableInt.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableInt.java @@ -31,7 +31,6 @@ * 可变 int 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Integer * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableLong.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableLong.java index 3427e0fb41..dfae0dcd8f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableLong.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableLong.java @@ -32,7 +32,6 @@ * 可变 long 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Long * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableObject.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableObject.java index eb8e765c70..72619005c2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableObject.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableObject.java @@ -34,7 +34,6 @@ * * @param 可变的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MutableObject implements Mutable, Serializable { @@ -59,6 +58,10 @@ public MutableObject(final T value) { this.value = value; } + public static MutableObject of(T value) { + return new MutableObject<>(value); + } + @Override public T get() { return this.value; diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableShort.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableShort.java index cae08a509f..0079daf8e7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableShort.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/MutableShort.java @@ -31,7 +31,6 @@ * 可变 short 类型 * * @author Kimi Liu - * @version 6.5.0 * @see Short * @since Java 17+ */ diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/package-info.java index db4d1ad830..66297a7a4c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/mutable/package-info.java @@ -2,7 +2,6 @@ * 提供可变值对象的封装,用于封装int、long等不可变值,使其可变 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.mutable; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/package-info.java index 0512b8c710..c70601a7f8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/package-info.java @@ -2,7 +2,6 @@ * 语言特性包,包括大量便捷的数据结构,例如验证器Validator,分布式ID生成器Snowflake等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/ActualTypeMapper.java b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/ActualTypeMapper.java index 50ade87abc..7f2844e352 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/ActualTypeMapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/ActualTypeMapper.java @@ -26,7 +26,7 @@ package org.aoju.bus.core.lang.reflect; import org.aoju.bus.core.convert.Convert; -import org.aoju.bus.core.lang.SimpleCache; +import org.aoju.bus.core.map.WeakMap; import org.aoju.bus.core.toolkit.TypeKit; import java.lang.reflect.ParameterizedType; @@ -39,12 +39,11 @@ * 泛型变量和泛型实际类型映射关系缓存 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ActualTypeMapper { - private static final SimpleCache> CACHE = new SimpleCache<>(); + private static final WeakMap> CACHE = new WeakMap<>(); /** * 获取泛型变量和泛型实际类型的对应关系Map @@ -53,7 +52,7 @@ public class ActualTypeMapper { * @return 泛型对应关系Map */ public static Map get(Type type) { - return CACHE.get(type, () -> createTypeMap(type)); + return CACHE.computeIfAbsent(type, () -> createTypeMap(type)); } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/LookupFactory.java b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/LookupFactory.java index d424b5431a..090581a1e5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/LookupFactory.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/LookupFactory.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.lang.reflect; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import java.lang.invoke.MethodHandles; import java.lang.reflect.Constructor; @@ -33,12 +33,11 @@ import java.lang.reflect.Method; /** - * {@link MethodHandles.Lookup}工厂,用于创建{@link MethodHandles.Lookup}对象
+ * {@link MethodHandles.Lookup}工厂,用于创建{@link MethodHandles.Lookup}对象 * jdk8中如果直接调用{@link MethodHandles#lookup()}获取到的{@link MethodHandles.Lookup}在调用findSpecial和unreflectSpecial * 时会出现权限不够问题,抛出"no private access for invokespecial"异常,因此针对JDK8及JDK9+分别封装lookup方法。 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LookupFactory { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/MethodHandle.java b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/MethodHandle.java index 94c3a95c72..a2144548de 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/MethodHandle.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/MethodHandle.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.lang.reflect; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ReflectKit; import org.aoju.bus.core.toolkit.StringKit; @@ -38,7 +38,6 @@ * 方法句柄{@link java.lang.invoke.MethodHandle}封装工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MethodHandle { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/package-info.java index eeb71f29d6..7fbd39970e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/reflect/package-info.java @@ -2,7 +2,6 @@ * 提供反射相关功能对象和类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.reflect; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Node.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Node.java index 5cec7ae744..bc4adab357 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Node.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Node.java @@ -34,7 +34,6 @@ * * @param ID类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Node extends Comparable>, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/NodeConfig.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/NodeConfig.java index 57f503f434..036c3f20f6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/NodeConfig.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/NodeConfig.java @@ -31,7 +31,6 @@ * 树配置属性相关 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NodeConfig implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Tree.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Tree.java index fa3d6adb8e..122f633e7a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Tree.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/Tree.java @@ -42,7 +42,6 @@ * * @param ID类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Tree extends LinkedHashMap implements Node { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeBuilder.java index f1f9aee44f..9c57312d16 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeBuilder.java @@ -42,7 +42,6 @@ * * @param ID类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TreeBuilder implements Builder> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeNode.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeNode.java index 835d690b05..972fbdc9b5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeNode.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/TreeNode.java @@ -35,7 +35,6 @@ * * @param ID类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TreeNode implements Node { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/package-info.java index 64aeac2751..26a2daee32 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/package-info.java @@ -8,7 +8,6 @@ * 6、代码简洁轻量无额外依赖 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.tree; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/DefaultNodeParser.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/DefaultNodeParser.java index 1a6ccf22a5..34ee838020 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/DefaultNodeParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/DefaultNodeParser.java @@ -36,7 +36,6 @@ * * @param ID类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DefaultNodeParser implements NodeParser, T> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/NodeParser.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/NodeParser.java index 547ba6c0dd..48e527c49a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/NodeParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/NodeParser.java @@ -32,7 +32,6 @@ * * @param 转换的实体 为数据源里的对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/package-info.java index 4de773be56..c92f723c38 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tree/parser/package-info.java @@ -2,7 +2,6 @@ * 解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.tree.parser; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutablePair.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutablePair.java index 4f3e9314b5..8f8d58f2af 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutablePair.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutablePair.java @@ -38,7 +38,6 @@ * @param the left element type * @param the right element type * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class ImmutablePair extends Pair { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutableTriple.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutableTriple.java index 10a97fc3ab..4ff3ec2aac 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutableTriple.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/ImmutableTriple.java @@ -39,7 +39,6 @@ * @param the middle element type * @param the right element type * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class ImmutableTriple extends Triple { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutablePair.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutablePair.java index 47c1288bdd..ae89d548d1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutablePair.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutablePair.java @@ -31,7 +31,6 @@ * @param 左元素类型 * @param 左元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MutablePair extends Pair { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutableTriple.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutableTriple.java index f33df321cd..5e3ddafc52 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutableTriple.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/MutableTriple.java @@ -32,7 +32,6 @@ * @param 中间元素类型 * @param 左元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MutableTriple extends Triple { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Pair.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Pair.java index 8f61ff51db..8fb87911d9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Pair.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Pair.java @@ -46,7 +46,6 @@ * @param 左元素类型 * @param 右元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ThreadSafe diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quartet.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quartet.java index 65ac02864e..9ae95b3e3c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quartet.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quartet.java @@ -35,7 +35,6 @@ * @param 第三个元素的类型 * @param 第四个元素的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ThreadSafe diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quintet.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quintet.java index f04bbb7a77..bc14270b31 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quintet.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Quintet.java @@ -36,7 +36,6 @@ * @param 第四个元素的类型 * @param 第五个元素的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ThreadSafe diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Triple.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Triple.java index 6c60a40ab6..6fcd746291 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Triple.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/Triple.java @@ -44,7 +44,6 @@ * @param 中间元素类型 * @param 右元素类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @ThreadSafe diff --git a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/package-info.java index fc2225e018..25eb688ab6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lang/tuple/package-info.java @@ -3,7 +3,6 @@ * 提供封装多个对象的类,目的是作为方法的返回类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lang.tuple; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/AllFilter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/AllFilter.java index 38cfd05ab2..69db6b7609 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/AllFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/AllFilter.java @@ -34,7 +34,6 @@ * 如果没有过滤器的时候则认为所有过滤器都满足 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AllFilter extends MixFilter implements Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/AntFilter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/AntFilter.java index 80822e44ca..ca9108b657 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/AntFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/AntFilter.java @@ -31,7 +31,6 @@ * ANT风格路径过滤器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AntFilter extends RegexFilter implements Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/AntLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/AntLoader.java index 21190c4e22..7ae6bd3b8c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/AntLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/AntLoader.java @@ -35,7 +35,6 @@ * ANT风格路径资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AntLoader extends PatternLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/AnyFilter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/AnyFilter.java index 73023537ca..2c9d5f4db7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/AnyFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/AnyFilter.java @@ -32,7 +32,6 @@ * ANY逻辑复合过滤器,即任意一个过滤器满足时就满足,当没有过滤器的时候则认为没有过滤器满足,也就是不满足 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AnyFilter extends MixFilter implements Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/AtomicLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/AtomicLoader.java index 72b445cd86..303cb89762 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/AtomicLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/AtomicLoader.java @@ -31,7 +31,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AtomicLoader implements Supplier, Serializable { @@ -62,7 +61,7 @@ public T get() { } /** - * 初始化被加载的对象
+ * 初始化被加载的对象 * 如果对象从未被加载过,调用此方法初始化加载对象,此方法只被调用一次 * * @return 被加载的对象 diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/ClazzLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/ClazzLoader.java index 3225f14643..04d92d7e0a 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/ClazzLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/ClazzLoader.java @@ -13,7 +13,6 @@ * * @param {@link Resource}接口实现类 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ClazzLoader extends SecureClassLoader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/DelegateLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/DelegateLoader.java index 878a4840e8..735814ff11 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/DelegateLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/DelegateLoader.java @@ -29,7 +29,6 @@ * 委派的资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class DelegateLoader extends ResourceLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/FileLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/FileLoader.java index b1dd1c95df..25ad1ed19a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/FileLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/FileLoader.java @@ -41,7 +41,6 @@ * 文件资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileLoader extends ResourceLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/Filter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/Filter.java index 7a596ad979..7ecfcb87e7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/Filter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/Filter.java @@ -31,7 +31,6 @@ * 资源过滤器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/Filters.java b/bus-core/src/main/java/org/aoju/bus/core/loader/Filters.java index 0dd50c7657..473303812b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/Filters.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/Filters.java @@ -31,7 +31,6 @@ * 过滤器工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Filters { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoader.java index 6ad125ec0f..402a33d7ba 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoader.java @@ -44,7 +44,6 @@ * Jar包资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JarLoader extends ResourceLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoaders.java b/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoaders.java index 06e81bc44c..2a0b271c9b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoaders.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/JarLoaders.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.loader; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import java.io.File; @@ -40,11 +40,13 @@ * 外部Jar的类加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JarLoaders extends URLClassLoader { + /** + * 构造 + */ public JarLoaders() { this(new URL[]{}); } @@ -58,6 +60,16 @@ public JarLoaders(URL[] urls) { super(urls, ClassKit.getClassLoader()); } + /** + * 构造 + * + * @param urls 被加载的URL + * @param classLoader 类加载器 + */ + public JarLoaders(URL[] urls, ClassLoader classLoader) { + super(urls, classLoader); + } + /** * 加载Jar到ClassPath * diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/LazyFunLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/LazyFunLoader.java index 7f9cb7f74d..53f7e70417 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/LazyFunLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/LazyFunLoader.java @@ -38,7 +38,6 @@ * * @param 被加载对象类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LazyFunLoader extends LazyLoader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/LazyLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/LazyLoader.java index e2dc440d88..d6a42070d1 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/LazyLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/LazyLoader.java @@ -32,7 +32,6 @@ * 持有一个计算延迟的值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class LazyLoader implements Supplier, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/Loader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/Loader.java index 4b73f5c613..930a4400e5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/Loader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/Loader.java @@ -36,7 +36,6 @@ * 调用时,避免无用的提前全部预加载 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/Loaders.java b/bus-core/src/main/java/org/aoju/bus/core/loader/Loaders.java index a1ebff14f9..ea2e74e6c4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/Loaders.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/Loaders.java @@ -34,7 +34,6 @@ * 资源加载器工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Loaders { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/MixFilter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/MixFilter.java index 82c567ba1a..3a2d05ff14 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/MixFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/MixFilter.java @@ -34,7 +34,6 @@ * 复合过滤器,实际上内部维护一个过滤器的{@link LinkedHashSet}集合,提供添加/删除以及链式拼接的方法来混合多个子过滤器,该过滤器的具体逻辑由子类拓展 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class MixFilter implements Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/NatLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/NatLoader.java index ea409d6509..0a56d025f7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/NatLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/NatLoader.java @@ -42,7 +42,6 @@ * Jar包资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NatLoader extends StdLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/PatternLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/PatternLoader.java index 2999cfae73..4379356df7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/PatternLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/PatternLoader.java @@ -34,7 +34,6 @@ * 模式匹配资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class PatternLoader extends DelegateLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/PkgLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/PkgLoader.java index 9b2414a37b..b995f429ed 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/PkgLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/PkgLoader.java @@ -35,7 +35,6 @@ * 包名表达式资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PkgLoader extends DelegateLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/RegexFilter.java b/bus-core/src/main/java/org/aoju/bus/core/loader/RegexFilter.java index f5b0b6a1c6..49b50f0697 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/RegexFilter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/RegexFilter.java @@ -32,7 +32,6 @@ * 正则表达式过滤器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RegexFilter implements Filter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/RegexLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/RegexLoader.java index bcb29c22b3..fa7d4b9a89 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/RegexLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/RegexLoader.java @@ -31,7 +31,6 @@ * 正则表达式资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RegexLoader extends PatternLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/ResourceLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/ResourceLoader.java index f00ef1d214..7974005165 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/ResourceLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/ResourceLoader.java @@ -35,7 +35,6 @@ * 资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class ResourceLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/StdLoader.java b/bus-core/src/main/java/org/aoju/bus/core/loader/StdLoader.java index ccc2c122e2..6612261287 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/StdLoader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/StdLoader.java @@ -45,7 +45,6 @@ * 标准的资源加载器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StdLoader extends ResourceLoader implements Loader { diff --git a/bus-core/src/main/java/org/aoju/bus/core/loader/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/loader/package-info.java index 5fcb120ded..473c48de46 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/loader/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/loader/package-info.java @@ -2,7 +2,6 @@ * 加载器的抽象接口和实现,包括懒加载的实现等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.loader; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/AtomicNoLock.java b/bus-core/src/main/java/org/aoju/bus/core/lock/AtomicNoLock.java similarity index 96% rename from bus-core/src/main/java/org/aoju/bus/core/thread/AtomicNoLock.java rename to bus-core/src/main/java/org/aoju/bus/core/lock/AtomicNoLock.java index 105f3901e9..679b28acba 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/AtomicNoLock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/AtomicNoLock.java @@ -23,7 +23,7 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.core.thread; +package org.aoju.bus.core.lock; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -33,11 +33,12 @@ * 无锁实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AtomicNoLock implements Lock { + public static AtomicNoLock INSTANCE = new AtomicNoLock(); + @Override public void lock() { } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/ListWithLock.java b/bus-core/src/main/java/org/aoju/bus/core/lock/ListWithLock.java index cf184d0db6..7e6e5b1229 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/ListWithLock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/ListWithLock.java @@ -37,7 +37,6 @@ * * @param 所涉及对象的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ListWithLock extends ObjWithLock> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/LockHandler.java b/bus-core/src/main/java/org/aoju/bus/core/lock/LockHandler.java index b8d2ab4b3f..3f809737af 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/LockHandler.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/LockHandler.java @@ -30,7 +30,6 @@ * * @param 所涉及对象的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface LockHandler { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/MapWithLock.java b/bus-core/src/main/java/org/aoju/bus/core/lock/MapWithLock.java index 53006a27bc..1b28e3b9de 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/MapWithLock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/MapWithLock.java @@ -39,7 +39,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapWithLock extends ObjWithLock> { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/HourValueParser.java b/bus-core/src/main/java/org/aoju/bus/core/lock/NoReadWriteLock.java old mode 100644 new mode 100755 similarity index 85% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/HourValueParser.java rename to bus-core/src/main/java/org/aoju/bus/core/lock/NoReadWriteLock.java index 8978ea2d8c..190778c11d --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/HourValueParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/NoReadWriteLock.java @@ -23,20 +23,27 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; +package org.aoju.bus.core.lock; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; /** - * 小时值处理 - * 小时被限定在0-23 + * 无锁的读写锁实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class HourValueParser extends AbstractValueParser { +public class NoReadWriteLock implements ReadWriteLock { + + @Override + public Lock readLock() { + return AtomicNoLock.INSTANCE; + } - public HourValueParser() { - super(0, 23); + @Override + public Lock writeLock() { + return AtomicNoLock.INSTANCE; } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/ObjWithLock.java b/bus-core/src/main/java/org/aoju/bus/core/lock/ObjWithLock.java index 057f470bd6..e8cf0b9223 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/ObjWithLock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/ObjWithLock.java @@ -37,7 +37,6 @@ * * @param 所涉及对象的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ObjWithLock implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/SetWithLock.java b/bus-core/src/main/java/org/aoju/bus/core/lock/SetWithLock.java index 10b21bb3bd..8c08b2245b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/SetWithLock.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/SetWithLock.java @@ -35,7 +35,6 @@ * * @param 所涉及对象的类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SetWithLock extends ObjWithLock> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/lock/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/lock/package-info.java index 62459652ee..16bfdb51db 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/lock/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/lock/package-info.java @@ -2,7 +2,6 @@ * 读写锁,对象Map Set、List等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.lock; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractCollValueMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractCollValueMap.java index 07c2173967..090fa54812 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractCollValueMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractCollValueMap.java @@ -38,7 +38,6 @@ * @param 值类型 * @param 集合类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractCollValueMap> extends MapWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractEntry.java b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractEntry.java index 5bb3a2bc3b..4c2ed843c7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractEntry.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractEntry.java @@ -37,7 +37,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractEntry implements Map.Entry { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractTable.java b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractTable.java index 6bb865b156..3f1d52ba31 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/AbstractTable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/AbstractTable.java @@ -25,13 +25,12 @@ ********************************************************************************/ package org.aoju.bus.core.map; -import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.collection.TransitionIterator; import org.aoju.bus.core.toolkit.IterKit; import org.aoju.bus.core.toolkit.ObjectKit; import java.io.Serializable; import java.util.*; -import java.util.function.Function; /** * 抽象{@link Table}接口实现 @@ -49,7 +48,6 @@ * @param 列类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractTable implements Table { @@ -161,7 +159,7 @@ private class Values extends AbstractCollection { @Override public Iterator iterator() { - return new TransIterator<>(cellSet().iterator(), Cell::getValue); + return new TransitionIterator<>(cellSet().iterator(), Cell::getValue); } @Override @@ -250,42 +248,4 @@ public void remove() { } } - /** - * 转换迭代器 - * - * @param 对象 - * @param 对象 - */ - public class TransIterator implements Iterator { - - private final Iterator backingIterator; - private final Function func; - - /** - * 构造 - * - * @param backingIterator 源{@link Iterator} - * @param func 转换函数 - */ - public TransIterator(Iterator backingIterator, Function func) { - this.backingIterator = Assert.notNull(backingIterator); - this.func = Assert.notNull(func); - } - - @Override - public final boolean hasNext() { - return backingIterator.hasNext(); - } - - @Override - public final T next() { - return func.apply(backingIterator.next()); - } - - @Override - public final void remove() { - backingIterator.remove(); - } - } - } diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseLinkedMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseLinkedMap.java index 7c1170aafb..3f3181e961 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseLinkedMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseLinkedMap.java @@ -35,7 +35,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CamelCaseLinkedMap extends CamelCaseMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseMap.java index 2686060d7c..f47550fcde 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CamelCaseMap.java @@ -37,7 +37,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CamelCaseMap extends FuncKeyMap { @@ -89,7 +88,7 @@ public CamelCaseMap(int initialCapacity, float loadFactor) { } /** - * 构造
+ * 构造 * 注意此构造将传入的Map作为被包装的Map,针对任何修改,传入的Map都会被同样修改 * * @param emptyMapBuilder Map构造器,必须构造空的Map diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveLinkedMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveLinkedMap.java index 5fda4143d0..2fcb2e026c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveLinkedMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveLinkedMap.java @@ -35,7 +35,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CaseInsensitiveLinkedMap extends CaseInsensitiveMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveMap.java index aaa1e19fd2..1a6a8fbc88 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveMap.java @@ -35,7 +35,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CaseInsensitiveMap extends FuncKeyMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveTreeMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveTreeMap.java index 735b2fd3ef..530047f68e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveTreeMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CaseInsensitiveTreeMap.java @@ -37,7 +37,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CaseInsensitiveTreeMap extends CaseInsensitiveMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CollectionValueMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CollectionValueMap.java index 2f909ff065..514098f069 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CollectionValueMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CollectionValueMap.java @@ -38,7 +38,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CollectionValueMap extends AbstractCollValueMap> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/CustomKeyMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/CustomKeyMap.java index 164351b5f3..b0638e9015 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/CustomKeyMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/CustomKeyMap.java @@ -26,7 +26,6 @@ package org.aoju.bus.core.map; import java.util.Map; -import java.util.function.BiFunction; /** * 自定义键的Map,默认HashMap实现 @@ -34,12 +33,9 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public abstract class CustomKeyMap extends MapWrapper { - - private static final long serialVersionUID = 1L; +public abstract class CustomKeyMap extends TransitionMap { /** * 构造 @@ -52,71 +48,8 @@ public CustomKeyMap(Map map) { } @Override - public V get(Object key) { - return super.get(customKey(key)); - } - - @Override - public V put(K key, V value) { - return super.put((K) customKey(key), value); - } - - @Override - public void putAll(Map map) { - map.forEach(this::put); - } - - @Override - public boolean containsKey(Object key) { - return super.containsKey(customKey(key)); - } - - @Override - public V remove(Object key) { - return super.remove(customKey(key)); - } - - @Override - public boolean remove(Object key, Object value) { - return super.remove(customKey(key), value); - } - - @Override - public boolean replace(K key, V oldValue, V newValue) { - return super.replace((K) customKey(key), oldValue, newValue); + protected V customValue(Object value) { + return (V) value; } - @Override - public V replace(K key, V value) { - return super.replace((K) customKey(key), value); - } - - @Override - public V getOrDefault(Object key, V defaultValue) { - return super.getOrDefault(customKey(key), defaultValue); - } - - @Override - public V computeIfPresent(K key, BiFunction remappingFunction) { - return super.computeIfPresent((K) customKey(key), remappingFunction); - } - - @Override - public V compute(K key, BiFunction remappingFunction) { - return super.compute((K) customKey(key), remappingFunction); - } - - @Override - public V merge(K key, V value, BiFunction remappingFunction) { - return super.merge((K) customKey(key), value, remappingFunction); - } - - /** - * 自定义键 - * - * @param key KEY - * @return 自定义KEY - */ - protected abstract Object customKey(Object key); - } diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/DuplexingMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/DuplexingMap.java index ff5b873be3..dbde374a02 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/DuplexingMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/DuplexingMap.java @@ -38,7 +38,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DuplexingMap extends MapWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/FixedLinkedHashMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/FixedLinkedHashMap.java index 3a4f0bd353..325385460f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/FixedLinkedHashMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/FixedLinkedHashMap.java @@ -34,7 +34,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FixedLinkedHashMap extends LinkedHashMap { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/FuncKeyMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/FuncKeyMap.java index 13b129f22c..9a78dfec81 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/FuncKeyMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/FuncKeyMap.java @@ -34,7 +34,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FuncKeyMap extends CustomKeyMap { @@ -62,11 +61,11 @@ public FuncKeyMap(Map emptyMap, Function keyFunc) { * @return 驼峰Key */ @Override - protected Object customKey(Object key) { + protected K customKey(Object key) { if (null != this.keyFunc) { return keyFunc.apply(key); } - return key; + return (K) key; } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/FuncMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/FuncMap.java new file mode 100755 index 0000000000..17407c59af --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/map/FuncMap.java @@ -0,0 +1,95 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.map; + +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * 自定义键值函数风格的Map + * + * @param 键类型 + * @param 值类型 + * @author Kimi Liu + * @since Java 17+ + */ +public class FuncMap extends TransitionMap { + + private static final long serialVersionUID = 1L; + + private final Function keyFunc; + private final Function valueFunc; + + /** + * 构造
+ * 注意提供的Map中不能有键值对,否则可能导致自定义key失效 + * + * @param mapFactory Map,提供的空map + * @param keyFunc 自定义KEY的函数 + * @param valueFunc 自定义value函数 + */ + public FuncMap(Supplier> mapFactory, Function keyFunc, Function valueFunc) { + this(mapFactory.get(), keyFunc, valueFunc); + } + + /** + * 构造
+ * 注意提供的Map中不能有键值对,否则可能导致自定义key失效 + * + * @param emptyMap Map,提供的空map + * @param keyFunc 自定义KEY的函数 + * @param valueFunc 自定义value函数 + */ + public FuncMap(Map emptyMap, Function keyFunc, Function valueFunc) { + super(emptyMap); + this.keyFunc = keyFunc; + this.valueFunc = valueFunc; + } + + /** + * 根据函数自定义键 + * + * @param key KEY + * @return 驼峰Key + */ + @Override + protected K customKey(Object key) { + if (null != this.keyFunc) { + return keyFunc.apply(key); + } + return (K) key; + } + + @Override + protected V customValue(Object value) { + if (null != this.valueFunc) { + return valueFunc.apply(value); + } + return (V) value; + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/ListValueMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/ListValueMap.java index 599bb29ea5..578f5c09d2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/ListValueMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/ListValueMap.java @@ -33,7 +33,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ListValueMap extends AbstractCollValueMap> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/MapBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/map/MapBuilder.java index 2909d4b856..8f9e079f37 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/MapBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/MapBuilder.java @@ -37,7 +37,6 @@ * @param Key类型 * @param Value类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapBuilder implements Builder> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/MapProxy.java b/bus-core/src/main/java/org/aoju/bus/core/map/MapProxy.java index bed28ee2ab..e42db02bca 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/MapProxy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/MapProxy.java @@ -45,7 +45,6 @@ * Map代理,提供各种getXXX方法,并提供默认值支持 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapProxy implements Map, OptNullObject, InvocationHandler, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/MapWrapper.java b/bus-core/src/main/java/org/aoju/bus/core/map/MapWrapper.java index ba3061c09d..f853aa2057 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/MapWrapper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/MapWrapper.java @@ -27,11 +27,15 @@ import org.aoju.bus.core.toolkit.ObjectKit; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; /** * Map包装类,通过包装一个已有Map实现特定功能 例如自定义Key的规则或Value规则 @@ -39,7 +43,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapWrapper implements Map, Iterable>, Serializable, Cloneable { @@ -64,6 +67,16 @@ public MapWrapper(Map raw) { this.raw = raw; } + /** + * 构造 + * 通过传入一个Map从而确定Map的类型,子类需创建一个空的Map,而非传入一个已有Map,否则值可能会被修改 + * + * @param mapFactory 空Map创建工厂 + */ + public MapWrapper(Supplier> mapFactory) { + this(mapFactory.get()); + } + /** * 获取原始的Map * @@ -218,9 +231,19 @@ public V merge(K key, V value, BiFunction rem @Override public MapWrapper clone() throws CloneNotSupportedException { - @SuppressWarnings("unchecked") final MapWrapper clone = (MapWrapper) super.clone(); + final MapWrapper clone = (MapWrapper) super.clone(); clone.raw = ObjectKit.clone(raw); return clone; } + private void writeObject(final ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + out.writeObject(this.raw); + } + + private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + raw = (Map) in.readObject(); + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/ReferenceMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/ReferenceMap.java new file mode 100755 index 0000000000..09d404bd87 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/map/ReferenceMap.java @@ -0,0 +1,334 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.map; + +import org.aoju.bus.core.lang.References; +import org.aoju.bus.core.lang.function.Func0; +import org.aoju.bus.core.toolkit.CollKit; +import org.aoju.bus.core.toolkit.ObjectKit; + +import java.io.Serializable; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; +import java.util.*; +import java.util.concurrent.ConcurrentMap; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 线程安全的ReferenceMap实现 + * 参考:jdk.management.resource.internal.WeakKeyConcurrentHashMap + * + * @param 键类型 + * @param 值类型 + * @author Kimi Liu + * @since Java 17+ + */ +public class ReferenceMap implements ConcurrentMap, Iterable>, Serializable { + + final ConcurrentMap, V> raw; + private final ReferenceQueue lastQueue; + private final References.Type keyType; + /** + * 回收监听 + */ + private BiConsumer, V> purgeListener; + + /** + * 构造 + * + * @param raw {@link ConcurrentMap}实现 + * @param referenceType Reference类型 + */ + public ReferenceMap(ConcurrentMap, V> raw, References.Type referenceType) { + this.raw = raw; + this.keyType = referenceType; + lastQueue = new ReferenceQueue<>(); + } + + /** + * 设置对象回收清除监听 + * + * @param purgeListener 监听函数 + */ + public void setPurgeListener(BiConsumer, V> purgeListener) { + this.purgeListener = purgeListener; + } + + @Override + public int size() { + this.purgeStaleKeys(); + return this.raw.size(); + } + + @Override + public boolean isEmpty() { + return 0 == size(); + } + + @Override + public V get(Object key) { + this.purgeStaleKeys(); + return this.raw.get(ofKey((K) key, null)); + } + + @Override + public boolean containsKey(Object key) { + this.purgeStaleKeys(); + return this.raw.containsKey(ofKey((K) key, null)); + } + + @Override + public boolean containsValue(Object value) { + this.purgeStaleKeys(); + return this.raw.containsValue(value); + } + + @Override + public V put(K key, V value) { + this.purgeStaleKeys(); + return this.raw.put(ofKey(key, this.lastQueue), value); + } + + @Override + public V putIfAbsent(K key, V value) { + this.purgeStaleKeys(); + return this.raw.putIfAbsent(ofKey(key, this.lastQueue), value); + } + + @Override + public void putAll(Map m) { + m.forEach(this::put); + } + + @Override + public V replace(K key, V value) { + this.purgeStaleKeys(); + return this.raw.replace(ofKey(key, this.lastQueue), value); + } + + @Override + public boolean replace(K key, V oldValue, V newValue) { + this.purgeStaleKeys(); + return this.raw.replace(ofKey(key, this.lastQueue), oldValue, newValue); + } + + @Override + public void replaceAll(BiFunction function) { + this.purgeStaleKeys(); + this.raw.replaceAll((kWeakKey, value) -> function.apply(kWeakKey.get(), value)); + } + + @Override + public V computeIfAbsent(K key, Function mappingFunction) { + this.purgeStaleKeys(); + return this.raw.computeIfAbsent(ofKey(key, this.lastQueue), kWeakKey -> mappingFunction.apply(key)); + } + + @Override + public V computeIfPresent(K key, BiFunction remappingFunction) { + this.purgeStaleKeys(); + return this.raw.computeIfPresent(ofKey(key, this.lastQueue), (kWeakKey, value) -> remappingFunction.apply(key, value)); + } + + /** + * 从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象 + * + * @param key 键 + * @param supplier 如果不存在回调方法,用于生产值对象 + * @return 值对象 + */ + public V computeIfAbsent(K key, Func0 supplier) { + return computeIfAbsent(key, (keyParam) -> supplier.callWithRuntimeException()); + } + + @Override + public V remove(Object key) { + this.purgeStaleKeys(); + return this.raw.remove(ofKey((K) key, null)); + } + + @Override + public boolean remove(Object key, Object value) { + this.purgeStaleKeys(); + return this.raw.remove(ofKey((K) key, null), value); + } + + @Override + public void clear() { + this.raw.clear(); + while (lastQueue.poll() != null) ; + } + + @Override + public Set keySet() { + final Collection trans = CollKit.trans(this.raw.keySet(), (reference) -> null == reference ? null : reference.get()); + return new HashSet<>(trans); + } + + @Override + public Collection values() { + this.purgeStaleKeys(); + return this.raw.values(); + } + + @Override + public Set> entrySet() { + this.purgeStaleKeys(); + return this.raw.entrySet().stream() + .map(entry -> new AbstractMap.SimpleImmutableEntry<>(entry.getKey().get(), entry.getValue())) + .collect(Collectors.toSet()); + } + + @Override + public void forEach(BiConsumer action) { + this.purgeStaleKeys(); + this.raw.forEach((key, value) -> action.accept(key.get(), value)); + } + + @Override + public Iterator> iterator() { + return entrySet().iterator(); + } + + @Override + public V compute(K key, BiFunction remappingFunction) { + this.purgeStaleKeys(); + return this.raw.compute(ofKey(key, this.lastQueue), (kWeakKey, value) -> remappingFunction.apply(key, value)); + } + + @Override + public V merge(K key, V value, BiFunction remappingFunction) { + this.purgeStaleKeys(); + return this.raw.merge(ofKey(key, this.lastQueue), value, remappingFunction); + } + + /** + * 清除被回收的键 + */ + private void purgeStaleKeys() { + Reference reference; + V value; + while ((reference = this.lastQueue.poll()) != null) { + value = this.raw.remove(reference); + if (null != purgeListener) { + purgeListener.accept(reference, value); + } + } + } + + /** + * 根据Reference类型构建key对应的{@link Reference} + * + * @param key 键 + * @param queue {@link ReferenceQueue} + * @return {@link Reference} + */ + private Reference ofKey(K key, ReferenceQueue queue) { + switch (keyType) { + case WEAK: + return new WeakKey<>(key, queue); + case SOFT: + return new SoftKey<>(key, queue); + } + throw new IllegalArgumentException("Unsupported key type: " + keyType); + } + + /** + * 弱键 + * + * @param 键类型 + */ + private static class WeakKey extends WeakReference { + private final int hashCode; + + /** + * 构造 + * + * @param key 原始Key,不能为{@code null} + * @param queue {@link ReferenceQueue} + */ + WeakKey(K key, ReferenceQueue queue) { + super(key, queue); + hashCode = key.hashCode(); + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } else if (other instanceof WeakKey) { + return ObjectKit.equals(((WeakKey) other).get(), get()); + } + return false; + } + } + + /** + * 弱键 + * + * @param 键类型 + */ + private static class SoftKey extends SoftReference { + private final int hashCode; + + /** + * 构造 + * + * @param key 原始Key,不能为{@code null} + * @param queue {@link ReferenceQueue} + */ + SoftKey(K key, ReferenceQueue queue) { + super(key, queue); + hashCode = key.hashCode(); + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } else if (other instanceof SoftKey) { + return ObjectKit.equals(((SoftKey) other).get(), get()); + } + return false; + } + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/RowKeyTable.java b/bus-core/src/main/java/org/aoju/bus/core/map/RowKeyTable.java index a6deb99df8..9c23623b59 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/RowKeyTable.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/RowKeyTable.java @@ -27,7 +27,9 @@ import org.aoju.bus.core.builder.Builder; import org.aoju.bus.core.collection.ComputeIterator; +import org.aoju.bus.core.collection.TransitionIterator; import org.aoju.bus.core.toolkit.IterKit; +import org.aoju.bus.core.toolkit.MapKit; import java.util.*; @@ -39,7 +41,6 @@ * @param 列类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RowKeyTable extends AbstractTable { @@ -59,6 +60,15 @@ public RowKeyTable() { this(new HashMap<>()); } + /** + * 构造 + * + * @param isLinked 是否有序,有序则使用{@link java.util.LinkedHashMap}作为原始Map + */ + public RowKeyTable(boolean isLinked) { + this(MapKit.newHashMap(isLinked), () -> MapKit.newHashMap(isLinked)); + } + /** * 构造 * @@ -138,6 +148,18 @@ public Set columnKeySet() { return (result == null) ? columnKeySet = new ColumnKeySet() : result; } + @Override + public List columnKeys() { + final Collection> values = this.raw.values(); + final List result = new ArrayList<>(values.size() * 16); + for (Map map : values) { + map.forEach((key, value) -> { + result.add(key); + }); + } + return result; + } + @Override public Map getColumn(C columnKey) { return new Column(columnKey); @@ -155,8 +177,8 @@ private class ColumnMapEntrySet extends AbstractSet>> { @Override public Iterator>> iterator() { - return new TransIterator<>(columnKeySet.iterator(), - c -> new AbstractMap.SimpleEntry<>(c, getColumn(c))); + return new TransitionIterator<>(columnKeySet.iterator(), + c -> MapKit.entry(c, getColumn(c))); } @Override diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/SetValueMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/SetValueMap.java index 1f169b0197..fc5062f4f5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/SetValueMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/SetValueMap.java @@ -33,7 +33,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SetValueMap extends AbstractCollValueMap> { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/Table.java b/bus-core/src/main/java/org/aoju/bus/core/map/Table.java index a73942c32f..a235e1a0f0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/Table.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/Table.java @@ -29,9 +29,7 @@ import org.aoju.bus.core.lang.function.Consumer3; import org.aoju.bus.core.toolkit.MapKit; -import java.util.Collection; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 表格数据结构定义 @@ -41,7 +39,6 @@ * @param 列键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Table extends Iterable> { @@ -123,6 +120,24 @@ default Set columnKeySet() { return Optional.ofNullable(columnMap()).map(Map::keySet).get(); } + /** + * 返回所有列的key,列的key如果实现Map是可重复key,则返回对应不去重的List。 + * + * @return 列set + */ + default List columnKeys() { + final Map> columnMap = columnMap(); + if (MapKit.isEmpty(columnMap)) { + return Collections.emptyList(); + } + + final List result = new ArrayList<>(columnMap.size()); + for (Map.Entry> cMapEntry : columnMap.entrySet()) { + result.add(cMapEntry.getKey()); + } + return result; + } + /** * 返回列-行对应的map * diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/TableMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/TableMap.java index 64d1f2804f..80de052c86 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/map/TableMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/TableMap.java @@ -26,6 +26,7 @@ package org.aoju.bus.core.map; import org.aoju.bus.core.toolkit.CollKit; +import org.aoju.bus.core.toolkit.MapKit; import org.aoju.bus.core.toolkit.ObjectKit; import java.io.Serializable; @@ -37,7 +38,6 @@ * @param 键类型 * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TableMap implements Map, Iterable>, Serializable { @@ -45,6 +45,13 @@ public class TableMap implements Map, Iterable>, Ser private final List keys; private final List values; + /** + * 构造 + */ + public TableMap() { + this(10); + } + /** * 构造 * @@ -169,7 +176,16 @@ public void clear() { @Override public Set keySet() { - return new HashSet<>(keys); + return new HashSet<>(this.keys); + } + + /** + * 获取所有键,可重复,不可修改 + * + * @return 键列表 + */ + public List keys() { + return Collections.unmodifiableList(this.keys); } @Override @@ -181,14 +197,14 @@ public Collection values() { public Set> entrySet() { final Set> hashSet = new LinkedHashSet<>(); for (int i = 0; i < size(); i++) { - hashSet.add(new SimpleEntry<>(keys.get(i), values.get(i))); + hashSet.add(MapKit.entry(keys.get(i), values.get(i))); } return hashSet; } @Override public Iterator> iterator() { - return new Iterator>() { + return new Iterator<>() { private final Iterator keysIter = keys.iterator(); private final Iterator valuesIter = values.iterator(); @@ -199,7 +215,7 @@ public boolean hasNext() { @Override public Map.Entry next() { - return new SimpleEntry<>(keysIter.next(), valuesIter.next()); + return MapKit.entry(keysIter.next(), valuesIter.next()); } @Override diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/TolerantMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/TolerantMap.java index e709746767..c9c170bde7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/TolerantMap.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/TolerantMap.java @@ -33,7 +33,6 @@ * 提供默认值的Map * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TolerantMap extends MapWrapper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/TransitionMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/TransitionMap.java new file mode 100644 index 0000000000..3e9fcb7c6e --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/map/TransitionMap.java @@ -0,0 +1,141 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.map; + +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Supplier; + +/** + * 自定义键和值转换的的Map + * 继承此类后,通过实现{@link #customKey(Object)}和{@link #customValue(Object)},按照给定规则加入到map或获取值。 + * + * @param 键类型 + * @param 值类型 + * @author Kimi Liu + * @since Java 17+ + */ +public abstract class TransitionMap extends MapWrapper { + + private static final long serialVersionUID = 1L; + + /** + * 构造 + * 通过传入一个Map从而确定Map的类型,子类需创建一个空的Map,而非传入一个已有Map,否则值可能会被修改 + * + * @param mapFactory 空Map创建工厂 + */ + public TransitionMap(Supplier> mapFactory) { + super(mapFactory); + } + + /** + * 构造 + * 通过传入一个Map从而确定Map的类型,子类需创建一个空的Map,而非传入一个已有Map,否则值可能会被修改 + * + * @param emptyMap Map 被包装的Map,必须为空Map,否则自定义key会无效 + */ + public TransitionMap(Map emptyMap) { + super(emptyMap); + } + + @Override + public V get(Object key) { + return super.get(customKey(key)); + } + + @Override + public V put(K key, V value) { + return super.put(customKey(key), customValue(value)); + } + + @Override + public void putAll(Map m) { + m.forEach(this::put); + } + + @Override + public boolean containsKey(Object key) { + return super.containsKey(customKey(key)); + } + + @Override + public V remove(Object key) { + return super.remove(customKey(key)); + } + + @Override + public boolean remove(Object key, Object value) { + return super.remove(customKey(key), customValue(value)); + } + + @Override + public boolean replace(K key, V oldValue, V newValue) { + return super.replace(customKey(key), customValue(oldValue), customValue(values())); + } + + @Override + public V replace(K key, V value) { + return super.replace(customKey(key), customValue(value)); + } + + @Override + public V getOrDefault(Object key, V defaultValue) { + return super.getOrDefault(customKey(key), customValue(defaultValue)); + } + + @Override + public V computeIfPresent(K key, BiFunction remappingFunction) { + return super.computeIfPresent(customKey(key), (k, v) -> remappingFunction.apply(customKey(k), customValue(v))); + } + + @Override + public V compute(K key, BiFunction remappingFunction) { + return super.compute(customKey(key), (k, v) -> remappingFunction.apply(customKey(k), customValue(v))); + } + + @Override + public V merge(K key, V value, BiFunction remappingFunction) { + return super.merge(customKey(key), customValue(value), (v1, v2) -> remappingFunction.apply(customValue(v1), customValue(v2))); + } + + /** + * 自定义键 + * + * @param key KEY + * @return 自定义KEY + */ + protected abstract K customKey(Object key); + + /** + * 自定义值 + * + * @param value 值 + * @return 自定义值 + */ + protected abstract V customValue(Object value); + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/WeakMap.java b/bus-core/src/main/java/org/aoju/bus/core/map/WeakMap.java new file mode 100755 index 0000000000..f62933825b --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/map/WeakMap.java @@ -0,0 +1,61 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.map; + +import org.aoju.bus.core.lang.References; + +import java.lang.ref.Reference; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 线程安全的WeakMap实现 + * 参考:jdk.management.resource.internal.WeakKeyConcurrentHashMap + * + * @param 键类型 + * @param 值类型 + * @author Kimi Liu + * @since Java 17+ + */ +public class WeakMap extends ReferenceMap { + + /** + * 构造 + */ + public WeakMap() { + this(new ConcurrentHashMap<>()); + } + + /** + * 构造 + * + * @param raw {@link ConcurrentMap}实现 + */ + public WeakMap(ConcurrentMap, V> raw) { + super(raw, References.Type.WEAK); + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/map/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/map/package-info.java index df89b3c23b..c191b52712 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/map/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/map/package-info.java @@ -2,7 +2,6 @@ * Map相关封装,提供特殊Map实现以及列表类型值的Map实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.map; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/math/Arrange.java b/bus-core/src/main/java/org/aoju/bus/core/math/Arrange.java index 54db4cffeb..358d6985b0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/math/Arrange.java +++ b/bus-core/src/main/java/org/aoju/bus/core/math/Arrange.java @@ -36,7 +36,6 @@ * 排列相关类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Arrange { diff --git a/bus-core/src/main/java/org/aoju/bus/core/math/Combine.java b/bus-core/src/main/java/org/aoju/bus/core/math/Combine.java index af66f7f4e8..a73c836bb0 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/math/Combine.java +++ b/bus-core/src/main/java/org/aoju/bus/core/math/Combine.java @@ -37,7 +37,6 @@ * 组合相关类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Combine { diff --git a/bus-core/src/main/java/org/aoju/bus/core/math/Formula.java b/bus-core/src/main/java/org/aoju/bus/core/math/Formula.java index 11051b0157..8b0ed9b7c9 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/math/Formula.java +++ b/bus-core/src/main/java/org/aoju/bus/core/math/Formula.java @@ -37,7 +37,6 @@ * 数学表达式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Formula { diff --git a/bus-core/src/main/java/org/aoju/bus/core/math/Money.java b/bus-core/src/main/java/org/aoju/bus/core/math/Money.java index 382f52a94e..4fc288ac96 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/math/Money.java +++ b/bus-core/src/main/java/org/aoju/bus/core/math/Money.java @@ -62,7 +62,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Money implements Serializable, Comparable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/math/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/math/package-info.java index e11f3a9aec..4b170a15fa 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/math/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/math/package-info.java @@ -2,7 +2,6 @@ * 提供数学计算相关封装,包括排列组合等,入口为MathUtil * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.math; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/package-info.java index e16bd5ff9c..3a461bbbfe 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/package-info.java @@ -2,7 +2,6 @@ * Bus核心方法及数据结构包 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardListener.java b/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardListener.java index d52fce03c3..1b9628c7b1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardListener.java +++ b/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardListener.java @@ -33,7 +33,6 @@ * 用户通过实现此接口,实现监听剪贴板内容变化 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface ClipboardListener { diff --git a/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardMonitor.java b/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardMonitor.java index 57f8a50b17..7a71c8633c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardMonitor.java +++ b/bus-core/src/main/java/org/aoju/bus/core/swing/ClipboardMonitor.java @@ -40,7 +40,6 @@ * 剪贴板监听 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/swing/ImageSelection.java b/bus-core/src/main/java/org/aoju/bus/core/swing/ImageSelection.java index df3adb9925..fb240ced9d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/swing/ImageSelection.java +++ b/bus-core/src/main/java/org/aoju/bus/core/swing/ImageSelection.java @@ -37,7 +37,6 @@ * 此对象也用于将图像文件和{@link DataFlavor#imageFlavor} 元信息对应 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ImageSelection implements Transferable, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/swing/StringListener.java b/bus-core/src/main/java/org/aoju/bus/core/swing/StringListener.java index 8193289c4e..ff3cd8eb13 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/swing/StringListener.java +++ b/bus-core/src/main/java/org/aoju/bus/core/swing/StringListener.java @@ -36,7 +36,6 @@ * 剪贴板字符串内容监听 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class StringListener implements ClipboardListener, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/swing/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/swing/package-info.java index 3a752ce5f9..6d44f340a0 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/swing/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/swing/package-info.java @@ -2,7 +2,6 @@ * Swing和awt相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.swing; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/ASCIICache.java b/bus-core/src/main/java/org/aoju/bus/core/text/ASCIICache.java index 0daac4b1f0..1b8a56e182 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/ASCIICache.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/ASCIICache.java @@ -31,7 +31,6 @@ * ASCII字符对应的字符串缓存 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ASCIICache { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/Lookups.java b/bus-core/src/main/java/org/aoju/bus/core/text/Lookups.java index c68c0d7901..922362d1cb 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/Lookups.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/Lookups.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.text; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import java.util.Map; @@ -33,7 +33,6 @@ * 查找字符串值的字符串键. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Lookups { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/Matchers.java b/bus-core/src/main/java/org/aoju/bus/core/text/Matchers.java index 74f2325074..4afce423d5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/Matchers.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/Matchers.java @@ -37,7 +37,6 @@ * 如果这些还不够,您可以子类化并实现自己的匹配器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class Matchers { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/NamingCase.java b/bus-core/src/main/java/org/aoju/bus/core/text/NamingCase.java index a3ab260664..cfbdd7d5d4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/NamingCase.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/NamingCase.java @@ -33,7 +33,6 @@ * 命名规则封装,主要是针对驼峰风格命名、连接符命名等的封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NamingCase { @@ -165,7 +164,7 @@ public static String toPascalCase(CharSequence name) { } /** - * 将下划线方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
+ * 将下划线方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 * 规则为: *
    *
  • 单字之间不以空格或任何连接符断开
  • @@ -182,7 +181,7 @@ public static String toCamelCase(CharSequence name) { } /** - * 将连接符方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。
    + * 将连接符方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 * * @param name 转换前的自定义方式命名的字符串 * @param symbol 连接符 diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/Similarity.java b/bus-core/src/main/java/org/aoju/bus/core/text/Similarity.java index 1709e1bc04..ac2fd54ce6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/Similarity.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/Similarity.java @@ -33,7 +33,6 @@ * 在hash之后,仍然能保持这种相似性,就称之为局部敏感hash * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Similarity { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/SplitIterator.java b/bus-core/src/main/java/org/aoju/bus/core/text/SplitIterator.java index 1917d38d21..382f946519 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/SplitIterator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/SplitIterator.java @@ -41,7 +41,6 @@ * 此迭代器非线程安全 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SplitIterator extends ComputeIterator implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/TextBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/text/TextBuilder.java index 82ddfb99a4..7732665cf8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/TextBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/TextBuilder.java @@ -40,7 +40,6 @@ * 提供比StringBuffer更灵活和更强大的API * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextBuilder implements CharSequence, Appendable, Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/TextFormatter.java b/bus-core/src/main/java/org/aoju/bus/core/text/TextFormatter.java index 5761ef2da7..56d2f6bb57 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/TextFormatter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/TextFormatter.java @@ -35,7 +35,6 @@ * 字符串格式化工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextFormatter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/TextJoiner.java b/bus-core/src/main/java/org/aoju/bus/core/text/TextJoiner.java index d05b593255..ee5223dc4b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/TextJoiner.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/TextJoiner.java @@ -1,9 +1,11 @@ package org.aoju.bus.core.text; import org.aoju.bus.core.collection.ArrayIterator; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; +import org.aoju.bus.core.toolkit.IterKit; +import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.core.toolkit.StringKit; import java.io.IOException; @@ -15,7 +17,6 @@ * 字符连接器(拼接器),通过给定的字符串和多个元素,拼接为一个字符串 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextJoiner implements Appendable, Serializable { @@ -200,11 +201,11 @@ public TextJoiner setNullMode(NullMode nullMode) { /** * 设置当没有任何元素加入时,默认返回的字符串,默认"" * - * @param emptyResult 默认字符串 + * @param text 默认字符串 * @return this */ - public TextJoiner setEmptyResult(String emptyResult) { - this.emptyResult = emptyResult; + public TextJoiner setEmptyResult(String text) { + this.emptyResult = text; return this; } @@ -224,7 +225,7 @@ public TextJoiner append(Object obj) { } else if (obj instanceof Iterable) { append(((Iterable) obj).iterator()); } else { - append(String.valueOf(obj)); + append(ObjectKit.toString(obj)); } return this; } @@ -262,60 +263,60 @@ public TextJoiner append(Iterator iterator) { /** * 追加数组中的元素到拼接器中 * - * @param 元素类型 - * @param array 元素数组 - * @param toStrFunc 元素对象转换为字符串的函数 + * @param 元素类型 + * @param array 元素数组 + * @param func 元素对象转换为字符串的函数 * @return this */ - public TextJoiner append(T[] array, Function toStrFunc) { - return append((Iterator) new ArrayIterator<>(array), toStrFunc); + public TextJoiner append(T[] array, Function func) { + return append((Iterator) new ArrayIterator<>(array), func); } /** * 追加{@link Iterator}中的元素到拼接器中 * - * @param 元素类型 - * @param iterable 元素列表 - * @param toStrFunc 元素对象转换为字符串的函数 + * @param 元素类型 + * @param iterable 元素列表 + * @param func 元素对象转换为字符串的函数 * @return this */ - public TextJoiner append(Iterable iterable, Function toStrFunc) { - return append(null == iterable ? null : iterable.iterator(), toStrFunc); + public TextJoiner append(Iterable iterable, Function func) { + return append(IterKit.get(iterable), func); } /** * 追加{@link Iterator}中的元素到拼接器中 * - * @param 元素类型 - * @param iterator 元素列表 - * @param toStrFunc 元素对象转换为字符串的函数 + * @param 元素类型 + * @param iterator 元素列表 + * @param func 元素对象转换为字符串的函数 * @return this */ - public TextJoiner append(Iterator iterator, Function toStrFunc) { + public TextJoiner append(Iterator iterator, Function func) { if (null != iterator) { while (iterator.hasNext()) { - append(toStrFunc.apply(iterator.next())); + append(func.apply(iterator.next())); } } return this; } @Override - public TextJoiner append(CharSequence csq) { - return append(csq, 0, StringKit.length(csq)); + public TextJoiner append(CharSequence text) { + return append(text, 0, StringKit.length(text)); } @Override - public TextJoiner append(CharSequence csq, int startInclude, int endExclude) { - if (null == csq) { + public TextJoiner append(CharSequence text, int startInclude, int endExclude) { + if (null == text) { switch (this.nullMode) { case IGNORE: return this; case TO_EMPTY: - csq = Normal.EMPTY; + text = Normal.EMPTY; break; case NULL_STRING: - csq = Normal.NULL; + text = Normal.NULL; } } try { @@ -323,7 +324,7 @@ public TextJoiner append(CharSequence csq, int startInclude, int endExclude) { if (wrapElement && StringKit.isNotEmpty(this.prefix)) { appendable.append(prefix); } - appendable.append(csq, startInclude, endExclude); + appendable.append(text, startInclude, endExclude); if (wrapElement && StringKit.isNotEmpty(this.suffix)) { appendable.append(suffix); } @@ -351,19 +352,19 @@ public String toString() { } /** - * 合并一个StrJoiner 到当前的StrJoiner + * 合并一个TextJoiner 到当前的TextJoiner * 合并规则为,在尾部直接追加,当存在{@link #prefix}时,如果{@link #wrapElement}为{@code false},则去除之 * - * @param strJoiner 其他的StrJoiner + * @param joiner 其他的TextJoiner * @return this */ - public TextJoiner merge(TextJoiner strJoiner) { - if (null != strJoiner && null != strJoiner.appendable) { - final String otherStr = strJoiner.toString(); - if (strJoiner.wrapElement) { - this.append(otherStr); + public TextJoiner merge(TextJoiner joiner) { + if (null != joiner && null != joiner.appendable) { + final String val = joiner.toString(); + if (joiner.wrapElement) { + this.append(val); } else { - this.append(otherStr, this.prefix.length(), otherStr.length()); + this.append(val, this.prefix.length(), val.length()); } } return this; diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/TextMatcher.java b/bus-core/src/main/java/org/aoju/bus/core/text/TextMatcher.java index cc8316209d..8406a5a7ea 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/TextMatcher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/TextMatcher.java @@ -19,7 +19,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextMatcher { @@ -47,7 +46,7 @@ private static List parse(String pattern) { char c = 0; char pre; boolean inVar = false; - TextBuilder part = new TextBuilder(); + StringBuilder part = new StringBuilder(); for (int i = 0; i < length; i++) { pre = c; c = pattern.charAt(i); @@ -57,16 +56,17 @@ private static List parse(String pattern) { // 变量结束 inVar = false; patterns.add(part.toString()); - part.clear(); + part.setLength(0); } } else if (Symbol.C_BRACE_LEFT == c && Symbol.C_DOLLAR == pre) { // 变量开始 inVar = true; - final String preText = part.subString(0, part.length() - 1); + final String preText = part.substring(0, part.length() - 1); if (StringKit.isNotEmpty(preText)) { patterns.add(preText); } - part.reset().append(pre).append(c); + part.setLength(0); + part.append(pre).append(c); } else { // 普通字符 part.append(c); diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/TextSplitter.java b/bus-core/src/main/java/org/aoju/bus/core/text/TextSplitter.java index 2b16e1cad7..1ae8cc9c8c 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/TextSplitter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/TextSplitter.java @@ -43,7 +43,6 @@ * 字符串切分器,封装统一的字符串分割静态方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextSplitter { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvConfig.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvConfig.java index a50ca64c6f..973e812b20 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvConfig.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvConfig.java @@ -35,7 +35,6 @@ * CSV基础配置项 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CsvConfig> implements Serializable { @@ -127,7 +126,7 @@ public T removeHeaderAlias(String header) { } /** - * 设置注释无效
    + * 设置注释无效 * 当写出CSV时,{@link CsvWriter#writeComment(String)}将抛出异常 * 当读取CSV时,注释行按照正常行读取 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvData.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvData.java index 14cd2b7923..ae52267edd 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvData.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvData.java @@ -32,7 +32,6 @@ * CSV数据,包括头部信息和行数据 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class CsvData { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvHandler.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvHandler.java index 46c372f8fe..58e7af5029 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvHandler.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvHandler.java @@ -29,7 +29,6 @@ * CSV的行处理器,实现此接口用于按照行处理数据 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvParser.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvParser.java index 63e7d6bece..862abcffbc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvParser.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvParser.java @@ -26,9 +26,9 @@ package org.aoju.bus.core.text.csv; import org.aoju.bus.core.collection.ComputeIterator; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.text.TextBuilder; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.MapKit; @@ -45,7 +45,6 @@ * CSV行解析器,参考:FastCSV * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class CsvParser extends ComputeIterator implements Closeable, Serializable { @@ -416,7 +415,7 @@ int read(Reader reader) { } /** - * 先获取当前字符,再将当前位置后移一位
    + * 先获取当前字符,再将当前位置后移一位 * 此方法不检查是否到了数组末尾,请自行使用{@link #hasRemaining()}判断。 * * @return 当前位置字符 diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReadConfig.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReadConfig.java index 61d7050b9f..2dde05edf4 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReadConfig.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReadConfig.java @@ -31,7 +31,6 @@ * CSV读取配置项 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CsvReadConfig extends CsvConfig implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReader.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReader.java index d45da6bf34..63fdd0740e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReader.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvReader.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.text.csv; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.ObjectKit; @@ -43,7 +43,6 @@ * CSV文件读取器,参考:FastCSV * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CsvReader implements Iterable, Closeable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvRow.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvRow.java index 857f683bc3..5b6fb25486 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvRow.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvRow.java @@ -35,7 +35,6 @@ * CSV中一行的表示 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class CsvRow implements List { @@ -137,7 +136,7 @@ public int getFieldCount() { * @return Bean */ public T toBean(Class clazz) { - return BeanKit.mapToBean(getFieldMap(), clazz, true); + return BeanKit.toBeanIgnoreError(getFieldMap(), clazz); } @Override diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriteConfig.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriteConfig.java index 350608bd68..44dd54cf7a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriteConfig.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriteConfig.java @@ -33,7 +33,6 @@ * CSV写出配置项 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CsvWriteConfig extends CsvConfig implements Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriter.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriter.java index 46ab182e7b..469bca5c06 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriter.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/CsvWriter.java @@ -27,10 +27,10 @@ import org.aoju.bus.core.collection.ArrayIterator; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.*; import java.io.*; @@ -42,7 +42,6 @@ * CSV数据写出器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class CsvWriter implements Closeable, Flushable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/csv/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/csv/package-info.java index bc00483431..abb6ff4ed7 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/csv/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/csv/package-info.java @@ -2,7 +2,6 @@ * 提供CSV文件读写的封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text.csv; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/EscapeCodeValues.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/EscapeCodeValues.java index 88845291e0..085b892c04 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/EscapeCodeValues.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/EscapeCodeValues.java @@ -42,7 +42,6 @@ * ESCAPE信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EscapeCodeValues { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/JavaUnicodeEscaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/JavaUnicodeEscaper.java index 78a9764295..1dc9424546 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/JavaUnicodeEscaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/JavaUnicodeEscaper.java @@ -31,7 +31,6 @@ * Translates codepoints to their Unicode escaped value suitable for Java source. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JavaUnicodeEscaper extends UnicodeEscaper { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericEscaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericEscaper.java index 0788f34852..2a2a0589b6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericEscaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericEscaper.java @@ -37,7 +37,6 @@ * Translates codepoints to their XML numeric entity escaped value. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NumericEscaper extends CodePointTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericUnescaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericUnescaper.java index 36d1240689..1075f38f91 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericUnescaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/NumericUnescaper.java @@ -41,7 +41,6 @@ * Note that the semi-colon is optional. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NumericUnescaper extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/OctalUnescaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/OctalUnescaper.java index de0b93d179..34d058fd68 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/OctalUnescaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/OctalUnescaper.java @@ -40,7 +40,6 @@ * 1 to 377. This is because parsing Java is the main use case. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class OctalUnescaper extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeEscaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeEscaper.java index d1e252a739..5bedfd218b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeEscaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeEscaper.java @@ -36,7 +36,6 @@ * Translates codepoints to their Unicode escaped value. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UnicodeEscaper extends CodePointTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnescaper.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnescaper.java index 1e3c92a36d..f59f6772ea 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnescaper.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnescaper.java @@ -38,7 +38,6 @@ * without the +. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UnicodeUnescaper extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnpaired.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnpaired.java index 9d402bf438..1c8bac039b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnpaired.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/UnicodeUnpaired.java @@ -33,7 +33,6 @@ * Helper subclass to CharSequenceTranslator to remove unpaired surrogates. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UnicodeUnpaired extends CodePointTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/escape/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/escape/package-info.java index aa689045ae..6ac9da3811 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/escape/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/escape/package-info.java @@ -2,7 +2,6 @@ * 提供各种转义和反转义实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text.escape; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/CharFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/CharFinder.java index 2d9ea91c6e..d7483a978d 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/CharFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/CharFinder.java @@ -34,7 +34,6 @@ * 查找指定字符在字符串中的位置信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CharFinder extends TextFinder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/Finder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/Finder.java index 9ca9d75222..c5a63cd4e6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/Finder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/Finder.java @@ -30,7 +30,6 @@ * 通过调用{@link #start(int)}查找开始位置,再调用{@link #end(int)}找结束位置 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Finder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/LengthFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/LengthFinder.java index 39ab551e27..71eb5cdec6 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/LengthFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/LengthFinder.java @@ -32,7 +32,6 @@ * 给定一个长度,查找的位置为from + length,一般用于分段截取 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LengthFinder extends TextFinder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/MatcherFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/MatcherFinder.java index c3422bd1d6..947a696a8b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/MatcherFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/MatcherFinder.java @@ -33,7 +33,6 @@ * 查找满足指定{@link Matcher} 匹配的字符所在位置,此类长用于查找某一类字符,如数字等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MatcherFinder extends TextFinder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/PatternFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/PatternFinder.java index 7f8be79612..fb43fc6f18 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/PatternFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/PatternFinder.java @@ -35,7 +35,6 @@ * 通过传入正则表达式,查找指定字符串中匹配正则的开始和结束位置 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PatternFinder extends TextFinder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/StringFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/StringFinder.java index ae226a9f4c..5f85312f40 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/StringFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/StringFinder.java @@ -33,7 +33,6 @@ * 字符查找器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringFinder extends TextFinder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/TextFinder.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/TextFinder.java index d9cb43292c..706108cd55 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/TextFinder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/TextFinder.java @@ -33,7 +33,6 @@ * 文本查找抽象类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class TextFinder implements Finder, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/finder/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/finder/package-info.java index 9222d1932e..40f0b49062 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/finder/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/finder/package-info.java @@ -9,7 +9,6 @@ *
* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text.finder; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/package-info.java index 08d0f7ce70..a2dc08855e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/package-info.java @@ -2,7 +2,6 @@ * 提供文本相关操作的封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/LookupReplacer.java b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/LookupReplacer.java index 3dcc1ad588..3f472ebbd3 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/LookupReplacer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/LookupReplacer.java @@ -36,7 +36,6 @@ * 查找替换器,通过查找指定关键字,替换对应的值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LookupReplacer extends TextReplacer { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/PrivacyReplacer.java b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/PrivacyReplacer.java index 0d338fe574..3190dc05cf 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/PrivacyReplacer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/PrivacyReplacer.java @@ -40,7 +40,6 @@ * 按值替换字符串中的变量 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PrivacyReplacer implements Replacer, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/ReplacerChain.java b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/ReplacerChain.java index 6d97f84563..57ad3c1e82 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/ReplacerChain.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/ReplacerChain.java @@ -36,7 +36,6 @@ * 字符串替换链,用于组合多个字符串替换逻辑 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReplacerChain extends TextReplacer implements Chain { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/TextReplacer.java b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/TextReplacer.java index 70dec232a9..203b47c209 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/TextReplacer.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/TextReplacer.java @@ -35,7 +35,6 @@ * 通过实现replace方法实现局部替换逻辑 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class TextReplacer implements Replacer, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/package-info.java index be9b1e6948..8a0ca05fc5 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/replacer/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/replacer/package-info.java @@ -2,7 +2,6 @@ * 文本替换类抽象及实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text.replacer; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/AggregateTranslator.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/AggregateTranslator.java index dbf04b5496..0c7f12cb73 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/AggregateTranslator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/AggregateTranslator.java @@ -35,7 +35,6 @@ * 第一个转换器使用输入中的代码点 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AggregateTranslator extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/CharSequenceTranslator.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/CharSequenceTranslator.java index 70a360f15c..32d6441f08 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/CharSequenceTranslator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/CharSequenceTranslator.java @@ -35,7 +35,6 @@ * 其核心用途是转义和反转义文本 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/CodePointTranslator.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/CodePointTranslator.java index 31d3287a20..5fa8e8489b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/CodePointTranslator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/CodePointTranslator.java @@ -33,7 +33,6 @@ * 以支持转换一次最多替换一个字符 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class CodePointTranslator extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/LookupTranslator.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/LookupTranslator.java index 85465b6670..7d4508df36 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/LookupTranslator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/LookupTranslator.java @@ -37,7 +37,6 @@ * 使用查找表转换值 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LookupTranslator extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/SinglePassTranslator.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/SinglePassTranslator.java index 00f1feec36..47ae3cb6f7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/SinglePassTranslator.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/SinglePassTranslator.java @@ -33,7 +33,6 @@ * 处理初始索引检查和返回代码点的计数. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ abstract class SinglePassTranslator extends CharSequenceTranslator { diff --git a/bus-core/src/main/java/org/aoju/bus/core/text/translate/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/text/translate/package-info.java index 15f618e093..6c2f8e1490 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/text/translate/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/text/translate/package-info.java @@ -2,7 +2,6 @@ * 提供文本转换相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.text.translate; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/BlockPolicy.java b/bus-core/src/main/java/org/aoju/bus/core/thread/BlockPolicy.java new file mode 100755 index 0000000000..2ad09a9b19 --- /dev/null +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/BlockPolicy.java @@ -0,0 +1,50 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.core.thread; + +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 当任务队列过长时处于阻塞状态,直到添加到队列中,如果阻塞过程中被中断,就会抛出{@link InterruptedException}异常 + * 有时候在线程池内访问第三方接口,只希望固定并发数去访问,并且不希望丢弃任务时使用此策略,队列满的时候会处于阻塞状态(例如刷库的场景) + * + * @author Kimi Liu + * @since Java 17+ + */ +public class BlockPolicy implements RejectedExecutionHandler { + + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + try { + e.getQueue().put(r); + } catch (InterruptedException ex) { + throw new RejectedExecutionException("Task " + r + " rejected from " + e); + } + } + +} diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/DelegatedService.java b/bus-core/src/main/java/org/aoju/bus/core/thread/DelegatedService.java index dda490ebd7..1a214e77e8 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/DelegatedService.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/DelegatedService.java @@ -34,7 +34,6 @@ * ExecutorService 代理 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DelegatedService extends AbstractExecutorService { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorBuilder.java index 34be9cabda..9dec3708cf 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorBuilder.java @@ -42,7 +42,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ExecutorBuilder implements Builder { @@ -107,7 +106,7 @@ private static ThreadPoolExecutor build(ExecutorBuilder builder) { workQueue = (corePoolSize <= 0) ? new SynchronousQueue<>() : new LinkedBlockingQueue<>(DEFAULT_QUEUE_CAPACITY); } final ThreadFactory threadFactory = (null != builder.threadFactory) ? builder.threadFactory : Executors.defaultThreadFactory(); - RejectedExecutionHandler handler = ObjectKit.defaultIfNull(builder.handler, ThreadPoolExecutor.AbortPolicy::new); + RejectedExecutionHandler handler = ObjectKit.defaultIfNull(builder.handler, RejectPolicy.ABORT.getValue()); final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(// corePoolSize, diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorService.java b/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorService.java index 21bacada3c..58dac26a8b 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorService.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/ExecutorService.java @@ -29,7 +29,6 @@ * 保证ExecutorService在对象回收时正常结束 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ExecutorService extends DelegatedService { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/GlobalThread.java b/bus-core/src/main/java/org/aoju/bus/core/thread/GlobalThread.java index 68fc2829ea..d63819280a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/GlobalThread.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/GlobalThread.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.thread; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -35,7 +35,6 @@ * 全局公共线程池 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GlobalThread { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThread.java b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThread.java index 1d847ed196..00268c3897 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThread.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThread.java @@ -31,7 +31,6 @@ * * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NamedThread extends InheritableThreadLocal { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadFactory.java b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadFactory.java index 30ea4bbb4b..e82e7a57bc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadFactory.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadFactory.java @@ -26,7 +26,6 @@ package org.aoju.bus.core.thread; import org.aoju.bus.core.toolkit.StringKit; -import org.aoju.bus.core.toolkit.ThreadKit; import java.lang.Thread.UncaughtExceptionHandler; import java.util.concurrent.ThreadFactory; @@ -41,7 +40,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NamedThreadFactory implements ThreadFactory { @@ -61,7 +59,7 @@ public class NamedThreadFactory implements ThreadFactory { /** * 是否守护线程 */ - private final boolean isDeamon; + private final boolean isDaemon; /** * 无法捕获的异常统一处理 */ @@ -75,10 +73,10 @@ public NamedThreadFactory(String prefix) { * 构造 * * @param prefix 线程名前缀 - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 */ - public NamedThreadFactory(String prefix, boolean isDeamon) { - this(prefix, null, isDeamon); + public NamedThreadFactory(String prefix, boolean isDaemon) { + this(prefix, null, isDaemon); } /** @@ -86,10 +84,10 @@ public NamedThreadFactory(String prefix, boolean isDeamon) { * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 */ - public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon) { - this(prefix, threadGroup, isDeamon, null); + public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) { + this(prefix, threadGroup, isDaemon, null); } /** @@ -97,16 +95,16 @@ public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeam * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 * @param handler 未捕获异常处理 */ - public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon, UncaughtExceptionHandler handler) { + public NamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) { this.prefix = StringKit.isBlank(prefix) ? "Thread" : prefix; if (null == threadGroup) { - threadGroup = ThreadKit.currentThreadGroup(); + threadGroup = Thread.currentThread().getThreadGroup(); } this.group = threadGroup; - this.isDeamon = isDeamon; + this.isDaemon = isDaemon; this.handler = handler; } @@ -116,11 +114,11 @@ public Thread newThread(Runnable r) { //守护线程 if (false == t.isDaemon()) { - if (isDeamon) { + if (isDaemon) { // 原线程为非守护则设置为守护 t.setDaemon(true); } - } else if (false == isDeamon) { + } else if (false == isDaemon) { // 原线程为守护则还原为非守护 t.setDaemon(false); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadLocal.java b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadLocal.java index 8d543673c9..4117ecd61a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadLocal.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/NamedThreadLocal.java @@ -31,7 +31,6 @@ * * @param 值类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NamedThreadLocal extends ThreadLocal { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/RejectPolicy.java b/bus-core/src/main/java/org/aoju/bus/core/thread/RejectPolicy.java index 326b728f50..6214a7015f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/RejectPolicy.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/RejectPolicy.java @@ -37,7 +37,6 @@ * 此枚举为JDK预定义的几种策略枚举表示 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum RejectPolicy { @@ -57,7 +56,11 @@ public enum RejectPolicy { /** * 由主线程来直接执行 */ - CALLER_RUNS(new ThreadPoolExecutor.CallerRunsPolicy()); + CALLER_RUNS(new ThreadPoolExecutor.CallerRunsPolicy()), + /** + * 当任务队列过长时处于阻塞状态,直到添加到队列中,固定并发数去访问,并且不希望丢弃任务时使用此策略 + */ + BLOCK(new BlockPolicy()); private final RejectedExecutionHandler value; diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/Semaphore.java b/bus-core/src/main/java/org/aoju/bus/core/thread/Semaphore.java index f8a299fc19..770405d8de 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/Semaphore.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/Semaphore.java @@ -35,7 +35,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Semaphore implements Runnable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/SyncFinisher.java b/bus-core/src/main/java/org/aoju/bus/core/thread/SyncFinisher.java index 125cd120c0..3c39c016d8 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/SyncFinisher.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/SyncFinisher.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.thread; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.ThreadKit; import java.util.LinkedHashSet; @@ -40,7 +40,6 @@ * 不能保证同时开始 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SyncFinisher { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/ThreadBuilder.java b/bus-core/src/main/java/org/aoju/bus/core/thread/ThreadBuilder.java index 3e17824291..a526f1660b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/ThreadBuilder.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/ThreadBuilder.java @@ -37,7 +37,6 @@ * ThreadFactory创建器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ThreadBuilder implements Builder { diff --git a/bus-core/src/main/java/org/aoju/bus/core/thread/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/thread/package-info.java index 4c20c58bf4..3f9f3c6085 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/thread/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/thread/package-info.java @@ -2,7 +2,6 @@ * 提供线程及高并发封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.thread; \ No newline at end of file diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/$.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/$.java index 3abe24289e..2ef3d31601 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/$.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/$.java @@ -32,7 +32,6 @@ * 工具包集合,工具类快捷方式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class $ { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/AnnoKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/AnnoKit.java index e9e8d27a3e..3af46e4ea1 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/AnnoKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/AnnoKit.java @@ -26,7 +26,7 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.annotation.AnnoProxy; -import org.aoju.bus.core.annotation.Element; +import org.aoju.bus.core.annotation.Annotated; import java.lang.annotation.*; import java.lang.reflect.AccessibleObject; @@ -35,13 +35,13 @@ import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; +import java.util.function.Predicate; /** * 注解工具类 * 快速获取注解对象、注解值等工具封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AnnoKit { @@ -52,22 +52,82 @@ public class AnnoKit { * @param annotationEle 注解元素 * @return 组合注解元素 */ - public static Element toCombination(AnnotatedElement annotationEle) { - if (annotationEle instanceof Element) { - return (Element) annotationEle; + public static Annotated toCombination(AnnotatedElement annotationEle) { + if (annotationEle instanceof Annotated) { + return (Annotated) annotationEle; } - return new Element(annotationEle); + return new Annotated(annotationEle); } /** * 获取指定注解 * - * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission - * @param isCombination boolean + * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission + * @param isToCombination 是否为转换为组合注解,组合注解可以递归获取注解的注解 * @return 注解对象 */ - public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isCombination) { - return (null == annotationEle) ? null : (isCombination ? toCombination(annotationEle) : annotationEle).getAnnotations(); + public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isToCombination) { + return getAnnotations(annotationEle, isToCombination, (Predicate) null); + } + + /** + * 获取组合注解 + * + * @param 注解类型 + * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission + * @param annotationType 限定的 + * @return 注解对象数组 + */ + public static T[] getCombinationAnnotations(AnnotatedElement annotationEle, Class annotationType) { + return getAnnotations(annotationEle, true, annotationType); + } + + /** + * 获取指定注解 + * + * @param 注解类型 + * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission + * @param isToCombination 是否为转换为组合注解,组合注解可以递归获取注解的注解 + * @param annotationType 限定的 + * @return 注解对象数组 + */ + public static T[] getAnnotations(AnnotatedElement annotationEle, boolean isToCombination, Class annotationType) { + final Annotation[] annotations = getAnnotations(annotationEle, isToCombination, + (annotation -> null == annotationType || annotationType.isAssignableFrom(annotation.getClass()))); + + final T[] result = ArrayKit.newArray(annotationType, annotations.length); + for (int i = 0; i < annotations.length; i++) { + //noinspection unchecked + result[i] = (T) annotations[i]; + } + return result; + } + + /** + * 获取指定注解 + * + * @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission + * @param isToCombination 是否为转换为组合注解,组合注解可以递归获取注解的注解 + * @param predicate 过滤器,{@link Predicate#test(Object)}返回{@code true}保留,否则不保留 + * @return 注解对象 + */ + public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isToCombination, Predicate predicate) { + if (null == annotationEle) { + return null; + } + + if (isToCombination) { + if (null == predicate) { + return toCombination(annotationEle).getAnnotations(); + } + return Annotated.of(annotationEle, predicate).getAnnotations(); + } + + final Annotation[] result = annotationEle.getAnnotations(); + if (null == predicate) { + return result; + } + return ArrayKit.filter(result, predicate::test); } /** diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ArrayKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ArrayKit.java index ab8d7bfd58..a21a4c28a6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ArrayKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ArrayKit.java @@ -28,10 +28,12 @@ import org.aoju.bus.core.builder.HashCodeBuilder; import org.aoju.bus.core.builder.ToStringBuilder; import org.aoju.bus.core.builder.ToStringStyle; +import org.aoju.bus.core.collection.UniqueKeySet; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Optional; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.lang.mutable.MutableInt; +import org.aoju.bus.core.text.TextJoiner; import java.lang.System; import java.lang.reflect.Array; @@ -44,7 +46,6 @@ * 数组工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ArrayKit { @@ -4704,6 +4705,32 @@ public static T[] remove(final T[] array, final int index) { return (T[]) remove((Object) array, index); } + /** + * 去重数组中的元素,去重后生成新的数组,原数组不变 + * 此方法通过{@link LinkedHashSet} 去重 + * + * @param 数组元素类型 + * @param 唯一键类型 + * @param array 数组 + * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 + * @return 去重后的数组 + */ + public static T[] remove(T[] array, Function uniqueGenerator, boolean override) { + if (isEmpty(array)) { + return array; + } + + final UniqueKeySet set = new UniqueKeySet<>(true, uniqueGenerator); + if (override) { + Collections.addAll(set, array); + } else { + for (T t : array) { + set.addIfAbsent(t); + } + } + return toArray(set, (Class) getComponentType(array)); + } + /** * 从指定数组中移除指定位置的元素。所有后续元素都向左移动(从它们的索引中减去1) * 此方法返回一个新数组,除了指定位置上的元素外,该数组具有与输入数组相同的元素 @@ -8023,40 +8050,25 @@ public static String join(T[] array, CharSequence conjunction) { /** * 以 conjunction 为分隔符将数组转换为字符串 * - * @param 被处理的集合 - * @param array 数组 - * @param conjunction 分隔符 - * @param prefix 每个元素添加的前缀,null表示不添加 - * @param suffix 每个元素添加的后缀,null表示不添加 + * @param 被处理的集合 + * @param array 数组 + * @param delimiter 分隔符 + * @param prefix 每个元素添加的前缀,null表示不添加 + * @param suffix 每个元素添加的后缀,null表示不添加 * @return 连接后的字符串 */ - public static String join(T[] array, CharSequence conjunction, String prefix, String suffix) { + public static String join(T[] array, CharSequence delimiter, String prefix, String suffix) { if (null == array) { return null; } - final StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (T item : array) { - if (isFirst) { - isFirst = false; - } else { - sb.append(conjunction); - } - if (ArrayKit.isArray(item)) { - sb.append(join(ArrayKit.wrap(item), conjunction, prefix, suffix)); - } else if (item instanceof Iterable) { - sb.append(CollKit.join((Iterable) item, conjunction, prefix, suffix)); - } else if (item instanceof Iterator) { - sb.append(IterKit.join((Iterator) item, conjunction, prefix, suffix)); - } else { - sb.append(StringKit.wrap(StringKit.toString(item), prefix, suffix)); - } - } - return sb.toString(); + return TextJoiner.of(delimiter, prefix, suffix) + // 每个元素都添加前后缀 + .setWrapElement(true) + .append(array) + .toString(); } - /** * 以 conjunction 为分隔符将数组转换为字符串 * @@ -8067,226 +8079,7 @@ public static String join(T[] array, CharSequence conjunction, String prefix * @return 连接后的字符串 */ public static String join(T[] array, CharSequence conjunction, Editor editor) { - if (null == array) { - return null; - } - - final StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - for (T item : array) { - if (isFirst) { - isFirst = false; - } else { - sb.append(conjunction); - } - if (null != editor) { - item = editor.edit(item); - } - if (null != item) { - sb.append(StringKit.toString(item)); - } - } - return sb.toString(); - } - - /** - * 以 conjunction 为分隔符将数组转换为字符串 - * - * @param array 数组 - * @param conjunction 分隔符 - * @return 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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 连接后的字符串 - */ - 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(); + return TextJoiner.of(conjunction).append(array, (t) -> String.valueOf(editor.edit(t))).toString(); } /** @@ -8298,40 +8091,16 @@ public static String join(double[] array, CharSequence conjunction) { */ public static String join(Object array, CharSequence conjunction) { if (null == array) { - throw new NullPointerException("Array must be not null!"); + return null; } if (false == isArray(array)) { throw new IllegalArgumentException(StringKit.format("[{}] is not a Array!", array.getClass())); } - final Class componentType = array.getClass().getComponentType(); - if (componentType.isPrimitive()) { - final String componentTypeName = componentType.getName(); - switch (componentTypeName) { - case "long": - return join((long[]) array, conjunction); - case "int": - return join((int[]) array, conjunction); - case "short": - return join((short[]) array, conjunction); - case "char": - return join((char[]) array, conjunction); - case "byte": - return join((byte[]) array, conjunction); - case "boolean": - return join((boolean[]) array, conjunction); - case "float": - return join((float[]) array, conjunction); - case "double": - return join((double[]) array, conjunction); - default: - throw new InstrumentException("Unknown primitive type: [{}]", componentTypeName); - } - } else { - return join((Object[]) array, conjunction); - } + return TextJoiner.of(conjunction).append(array).toString(); } + /** * 取最小值 * @@ -8963,6 +8732,19 @@ public static R[] map(Object array, Class targetComponentType, Functio return result; } + /** + * 按照指定规则,将一种类型的数组元素提取后转换为{@link Set} + * + * @param array 被转换的数组 + * @param func 转换规则函数 + * @param 原数组类型 + * @param 目标数组类型 + * @return 转换后的数组 + */ + public static Set mapToSet(T[] array, Function func) { + return Arrays.stream(array).map(func).collect(Collectors.toSet()); + } + /** * 判断两个数组是否相等,判断依据包括数组长度和每个元素都相等 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BeanKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BeanKit.java index 99553cd80b..f3828e5cc2 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BeanKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BeanKit.java @@ -30,10 +30,10 @@ import org.aoju.bus.core.beans.copier.CopyOptions; import org.aoju.bus.core.beans.copier.ValueProvider; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Editor; import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.map.CaseInsensitiveMap; import java.beans.*; @@ -43,6 +43,7 @@ import java.lang.reflect.Modifier; import java.util.*; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -50,7 +51,6 @@ * 把一个拥有对属性进行set和get方法的类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BeanKit { @@ -504,10 +504,23 @@ public static T toBean(Object source, Class clazz) { * @return Bean对象 */ public static T toBean(Object source, Class clazz, CopyOptions options) { - if (null == source) { + return toBean(source, () -> ReflectKit.newInstanceIfPossible(clazz), options); + } + + /** + * 对象或Map转Bean + * + * @param 转换的Bean类型 + * @param source Bean对象或Map + * @param targetSupplier 目标的Bean创建器 + * @param options 属性拷贝选项 + * @return Bean对象 + */ + public static T toBean(Object source, Supplier targetSupplier, CopyOptions options) { + if (null == source || null == targetSupplier) { return null; } - final T target = ReflectKit.newInstanceIfPossible(clazz); + final T target = targetSupplier.get(); copyProperties(source, target, options); return target; } @@ -556,46 +569,6 @@ public static T toBeanIgnoreCase(Object source, Class clazz, boolean igno .setIgnoreError(ignoreError)); } - /** - * Map转换为Bean对象 - * - * @param Bean类型 - * @param map {@link Map} - * @param beanClass Bean Class - * @param isIgnoreError 是否忽略注入错误 - * @return Bean - */ - public static T mapToBean(Map map, Class beanClass, boolean isIgnoreError) { - return fillBeanWithMap(map, ReflectKit.newInstance(beanClass), isIgnoreError); - } - - /** - * Map转换为Bean对象 - * - * @param Bean类型 - * @param map {@link Map} - * @param beanClass Bean Class - * @param copyOptions 转Bean选项 - * @return Bean - */ - public static T mapToBean(Map map, Class beanClass, CopyOptions copyOptions) { - return fillBeanWithMap(map, ReflectKit.newInstance(beanClass), copyOptions); - } - - /** - * Map转换为Bean对象 - * 忽略大小写 - * - * @param Bean类型 - * @param map Map - * @param beanClass Bean Class - * @param isIgnoreError 是否忽略注入错误 - * @return Bean - */ - public static T mapToBeanIgnoreCase(Map map, Class beanClass, boolean isIgnoreError) { - return fillBeanWithMapIgnoreCase(map, ReflectKit.newInstance(beanClass), isIgnoreError); - } - /** * 填充Bean的核心方法 * @@ -696,6 +669,27 @@ public static Map beanToMap(Object bean) { return beanToMap(bean, false, false); } + /** + * 将bean的部分属性转换成map + * 可选拷贝哪些属性值,默认是不忽略值为{@code null}的值的。 + * + * @param bean bean + * @param properties 需要拷贝的属性值,{@code null}或空表示拷贝所有值 + * @return Map + */ + public static Map beanToMap(Object bean, String... properties) { + int mapSize = 16; + Editor keyEditor = null; + if (ArrayKit.isNotEmpty(properties)) { + mapSize = properties.length; + final Set propertiesSet = CollKit.newHashSet(false, properties); + keyEditor = property -> propertiesSet.contains(property) ? property : null; + } + + // 指明了要复制的属性 所以不忽略null值 + return beanToMap(bean, new LinkedHashMap<>(mapSize, 1), false, keyEditor); + } + /** * 对象转Map * @@ -748,7 +742,7 @@ public static Map beanToMap(Object bean, Map tar return null; } - final Collection props = BeanKit.getBeanDesc(bean.getClass()).getProps(); + final Collection props = getBeanDesc(bean.getClass()).getProps(); String key; Method getter; @@ -777,7 +771,7 @@ public static Map beanToMap(Object bean, Map tar } /** - * 对象转Map
+ * 对象转Map * 通过自定义{@link CopyOptions} 完成抓换选项,以便实现: * *
@@ -811,6 +805,9 @@ public static Map beanToMap(Object bean, Map tar
      * @return 目标对象
      */
     public static  T copyProperties(Object source, Class clazz, String... ignoreProperties) {
+        if (null == source) {
+            return null;
+        }
         T target = ReflectKit.newInstanceIfPossible(clazz);
         copyProperties(source, target, CopyOptions.create().setIgnoreProperties(ignoreProperties));
         return target;
diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BloomKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BloomKit.java
index 5d0624db3d..5a289826bf 100644
--- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BloomKit.java
+++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BloomKit.java
@@ -32,7 +32,6 @@
  * 布隆过滤器工具
  *
  * @author Kimi Liu
- * @version 6.5.0
  * @since Java 17+
  */
 public class BloomKit {
diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BooleanKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BooleanKit.java
index ab65e4c5b4..5491888b59 100755
--- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BooleanKit.java
+++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BooleanKit.java
@@ -32,7 +32,6 @@
  * Boolean类型相关工具类
  *
  * @author Kimi Liu
- * @version 6.5.0
  * @since Java 17+
  */
 public class BooleanKit {
@@ -82,17 +81,38 @@ public static boolean isFalse(Boolean bool) {
     /**
      * 转换字符串为boolean值
      *
-     * @param valueStr 字符串
+     * @param text 字符串
      * @return boolean值
      */
-    public static boolean toBoolean(String valueStr) {
-        if (StringKit.isNotBlank(valueStr)) {
-            valueStr = valueStr.trim().toLowerCase();
-            return ArrayKit.contains(Normal.TRUE_ARRAY, valueStr);
+    public static boolean toBoolean(String text) {
+        if (StringKit.isNotBlank(text)) {
+            text = text.trim().toLowerCase();
+            return ArrayKit.contains(Normal.TRUE_ARRAY, text);
         }
         return false;
     }
 
+    /**
+     * 转换字符串为boolean值
+     * 如果为["true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"],返回{@code true}
+ * 如果为["false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"],返回{@code false}
+ * 其他情况返回{@code null} + * + * @param text 字符串 + * @return boolean值 + */ + public static Boolean toBooleanObject(String text) { + if (StringKit.isNotBlank(text)) { + text = text.trim().toLowerCase(); + if (ArrayKit.contains(Normal.TRUE_ARRAY, text)) { + return true; + } else if (ArrayKit.contains(Normal.FALSE_ARRAY, text)) { + return false; + } + } + return null; + } + /** * boolean值转为int * diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BufferKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BufferKit.java index 083e34517f..317ebe55a9 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/BufferKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/BufferKit.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.nio.ByteBuffer; import java.nio.CharBuffer; @@ -42,7 +42,6 @@ * ByteBuffer的相关介绍见:https://www.cnblogs.com/ruber/p/6857159.html * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BufferKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ByteKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ByteKit.java index 48fa764700..8927950856 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ByteKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ByteKit.java @@ -52,7 +52,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ByteKit { @@ -441,11 +440,33 @@ public static short getShort(byte[] data) { * @param byteOrder 端序 * @return the short */ - public static short getShort(byte[] data, ByteOrder byteOrder) { + /** + * byte数组转short + * 自定义端序 + * + * @param bytes byte数组,长度必须为2 + * @param byteOrder 端序 + * @return short值 + */ + public static short getShort(final byte[] bytes, final ByteOrder byteOrder) { + return getShort(bytes, 0, byteOrder); + } + + /** + * byte数组转short + * 自定义端序 + * + * @param bytes byte数组,长度必须大于2 + * @param start 开始位置 + * @param byteOrder 端序 + * @return short值 + */ + public static short getShort(final byte[] bytes, final int start, final ByteOrder byteOrder) { if (ByteOrder.LITTLE_ENDIAN == byteOrder) { - return (short) (data[1] & 0xff | (data[0] & 0xff) << Byte.SIZE); + // 小端模式,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 + return (short) (bytes[start] & 0xff | (bytes[start + 1] & 0xff) << Byte.SIZE); } else { - return (short) (data[0] & 0xff | (data[1] & 0xff) << Byte.SIZE); + return (short) (bytes[start + 1] & 0xff | (bytes[start] & 0xff) << Byte.SIZE); } } @@ -511,7 +532,9 @@ public static T getNumber(byte[] bytes, Class targetClass) * @return bytes */ public static byte[] get(Number number, ByteOrder byteOrder) { - if (number instanceof Double) { + if (number instanceof Byte) { + return new byte[]{number.byteValue()}; + } else if (number instanceof Double) { return getBytes((Double) number, byteOrder); } else if (number instanceof Long) { return getBytes((Long) number, byteOrder); diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CallerKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CallerKit.java index 933eecc3a3..8fa4ac7e98 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CallerKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CallerKit.java @@ -34,7 +34,6 @@ * 调用者 可以通过此类的方法获取调用者、多级调用者以及判断是否被调用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CallerKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CardKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CardKit.java index 8d44bea8ae..177579cc9f 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CardKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CardKit.java @@ -35,7 +35,6 @@ * 银行卡工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CardKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CertKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CertKit.java index 7b0ae8af37..f3d90a5481 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CertKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CertKit.java @@ -38,7 +38,6 @@ * 获取ssl证书信息工具类 * * @author zhaocy - * @version 6.5.0 * @since Java 17+ */ public class CertKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CharsKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CharsKit.java index 694bc8c64d..738328f2b3 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CharsKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CharsKit.java @@ -49,7 +49,6 @@ * 部分工具来自于Apache * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CharsKit { @@ -972,6 +971,23 @@ public static String normalize(CharSequence str) { return Normalizer.normalize(str, Normalizer.Form.NFC); } + /** + * 在给定字符串末尾填充指定字符,以达到给定长度 + * 如果字符串本身的长度大于等于length,返回原字符串 + * + * @param str 字符串 + * @param fixedChar 补充的字符 + * @param length 补充到的长度 + * @return 补充后的字符串 + */ + public static String fixLength(CharSequence str, char fixedChar, int length) { + final int fixedLength = length - str.length(); + if (fixedLength <= 0) { + return str.toString(); + } + return str + repeat(fixedChar, fixedLength); + } + /** * 字符串去空格 * @@ -3242,6 +3258,28 @@ public static boolean startWithAny(CharSequence text, CharSequence... prefixes) return false; } + + /** + * 给定字符串是否以任何一个字符串结尾(忽略大小写) + * 给定字符串和数组为空都返回false + * + * @param text 给定字符串 + * @param suffixes 需要检测的结尾字符串 + * @return 给定字符串是否以任何一个字符串结尾 + */ + public static boolean startWithAnyIgnoreCase(final CharSequence text, final CharSequence... suffixes) { + if (isEmpty(text) || ArrayKit.isEmpty(suffixes)) { + return false; + } + + for (final CharSequence suffix : suffixes) { + if (startWith(text, suffix, true)) { + return true; + } + } + return false; + } + /** * 是否以指定字符串开头,忽略大小写 * @@ -4393,7 +4431,7 @@ public static boolean endsWithAny(final CharSequence text, final CharSequence... * @param 元素类型 * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} */ - public T firstNonNull(T... texts) { + public static T firstNonNull(T... texts) { return ArrayKit.firstNonNull(texts); } @@ -4405,7 +4443,7 @@ public T firstNonNull(T... texts) { * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} * @see #isNotEmpty(CharSequence) */ - public T firstNonEmpty(T... texts) { + public static T firstNonEmpty(T... texts) { return ArrayKit.firstNonNull(CharsKit::isNotEmpty, texts); } @@ -4417,7 +4455,7 @@ public T firstNonEmpty(T... texts) { * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} * @see #isNotBlank(CharSequence) */ - public T firstNonBlank(T... texts) { + public static T firstNonBlank(T... texts) { return ArrayKit.firstNonNull(CharsKit::isNotBlank, texts); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CitizenIdKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CitizenIdKit.java index 94631ed798..e0afd01516 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CitizenIdKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CitizenIdKit.java @@ -37,7 +37,6 @@ * 身份证相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CitizenIdKit { @@ -204,7 +203,7 @@ public static boolean isValidCard18(String idcard) { *

* 判断18位身份证的合法性 *

- * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
+ * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成 * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 *

* 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 @@ -517,6 +516,36 @@ public static String getProvinceByIdCard(String idcard) { return null; } + /** + * 根据身份编号获取地市级编码,只支持15或18位身份证号码 + * 获取编码为4位 + * + * @param idcard 身份编码 + * @return 地市级编码 + */ + public static String getCityCodeByIdCard(String idcard) { + int len = idcard.length(); + if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { + return idcard.substring(0, 4); + } + return null; + } + + /** + * 根据身份编号获取区县级编码,只支持15或18位身份证号码 + * 获取编码为6位 + * + * @param idcard 身份编码 + * @return 地市级编码 + */ + public static String getDistrictCodeByIdCard(String idcard) { + int len = idcard.length(); + if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { + return idcard.substring(0, 6); + } + return null; + } + /** * 隐藏指定位置的几个身份证号数字为“*” * diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ClassKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ClassKit.java index c1b8b14d41..69b311b273 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ClassKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ClassKit.java @@ -25,19 +25,22 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.beans.BeanDesc; import org.aoju.bus.core.beans.NullWrapper; -import org.aoju.bus.core.beans.PropertyDesc; import org.aoju.bus.core.beans.copier.BeanCopier; import org.aoju.bus.core.beans.copier.CopyOptions; import org.aoju.bus.core.beans.copier.ValueProvider; import org.aoju.bus.core.compiler.JavaSourceCompiler; import org.aoju.bus.core.convert.BasicType; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.instance.Instances; -import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.Filter; +import org.aoju.bus.core.lang.Normal; +import org.aoju.bus.core.lang.Symbol; import org.aoju.bus.core.lang.mutable.MutableObject; +import org.aoju.bus.core.lang.tuple.Pair; import org.aoju.bus.core.loader.JarLoaders; +import org.aoju.bus.core.map.WeakMap; import javax.tools.*; import java.beans.IntrospectionException; @@ -45,17 +48,13 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.lang.System; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.net.JarURLConnection; import java.net.URI; import java.net.URL; import java.net.URLConnection; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.time.temporal.TemporalAccessor; -import java.util.Locale; import java.util.*; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -64,7 +63,6 @@ * Class工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ClassKit { @@ -77,17 +75,26 @@ public class ClassKit { * 原始类型名和其class对应表,例如:int = int.class */ private static final Map> PRIMITIVE_WRAPPER_MAP = new HashMap<>(); + /** + * 包装原始类型 + */ private static final Map, Class> WRAPPER_PRIMITIVE_MAP = new HashMap<>(); + /** + * 访问测试 + */ private static final int ACCESS_TEST = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; /** - * Array of primitive number types ordered by "promotability" + * 按"promotability"排序的原始数字类型数组 */ private static final Class[] ORDERED_PRIMITIVE_TYPES = { Byte.TYPE, Short.TYPE, Character.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE }; - private static final SimpleCache> CLASS_CACHE = new SimpleCache<>(); + /** + * 类缓存信息 + */ + private static final WeakMap, Class> CLASS_CACHE = new WeakMap<>(); static { List> primitiveTypes = new ArrayList<>(Normal._32); @@ -907,25 +914,41 @@ public static String getPackagePath(Class clazz) { */ public static Object getDefaultValue(Class clazz) { if (clazz.isPrimitive()) { - if (long.class == clazz) { - return 0L; - } else if (int.class == clazz) { - return 0; - } else if (short.class == clazz) { - return (short) 0; - } else if (char.class == clazz) { - return (char) 0; - } else if (byte.class == clazz) { - return (byte) 0; - } else if (double.class == clazz) { - return 0D; - } else if (float.class == clazz) { - return 0f; - } else if (boolean.class == clazz) { - return false; - } + return getPrimitiveDefaultValue(clazz); } + return null; + } + /** + * 获取指定原始类型分的默认值 + * 默认值规则为: + * + *

+     * 1、如果为原始类型,返回0
+     * 2、非原始类型返回{@code null}
+     * 
+ * + * @param clazz 类 + * @return 默认值 + */ + public static Object getPrimitiveDefaultValue(Class clazz) { + if (long.class == clazz) { + return 0L; + } else if (int.class == clazz) { + return 0; + } else if (short.class == clazz) { + return (short) 0; + } else if (char.class == clazz) { + return (char) 0; + } else if (byte.class == clazz) { + return (byte) 0; + } else if (double.class == clazz) { + return 0D; + } else if (float.class == clazz) { + return 0f; + } else if (boolean.class == clazz) { + return false; + } return null; } @@ -943,104 +966,6 @@ public static Object[] getDefaultValues(Class... classes) { return values; } - /** - * 对象转Map,不进行驼峰转下划线,不忽略值为空的字段 - * - * @param bean bean对象 - * @return Map - */ - public static Map beanToMap(Object bean) { - return beanToMap(bean, false, false); - } - - /** - * 对象转Map - * - * @param bean bean对象 - * @param isToUnderlineCase 是否转换为下划线模式 - * @param ignoreNullValue 是否忽略值为空的字段 - * @return Map - */ - public static Map beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue) { - return beanToMap(bean, new HashMap<>(), isToUnderlineCase, ignoreNullValue); - } - - /** - * 对象转Map - * - * @param bean bean对象 - * @param targetMap 目标的Map - * @param isToUnderlineCase 是否转换为下划线模式 - * @param ignoreNullValue 是否忽略值为空的字段 - * @return Map - */ - public static Map beanToMap(Object bean, Map targetMap, final boolean isToUnderlineCase, boolean ignoreNullValue) { - if (null == bean) { - return null; - } - - return beanToMap(bean, targetMap, ignoreNullValue, key -> isToUnderlineCase ? StringKit.toUnderlineCase(key) : key); - } - - /** - * 对象转Map - * 通过实现{@link Editor} 可以自定义字段值,如果这个Editor返回null则忽略这个字段,以便实现: - * - *
-     * 1. 字段筛选,可以去除不需要的字段
-     * 2. 字段变换,例如实现驼峰转下划线
-     * 3. 自定义字段前缀或后缀等等
-     * 
- * - * @param bean bean对象 - * @param targetMap 目标的Map - * @param ignoreNullValue 是否忽略值为空的字段 - * @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key - * @return Map - */ - public static Map beanToMap(Object bean, Map targetMap, boolean ignoreNullValue, Editor keyEditor) { - if (null == bean) { - return null; - } - - final Collection props = getBeanDesc(bean.getClass()).getProps(); - - String key; - Method getter; - Object value; - for (PropertyDesc prop : props) { - key = prop.getFieldName(); - // 过滤class属性 - // 得到property对应的getter方法 - getter = prop.getGetter(); - if (null != getter) { - // 只读取有getter方法的属性 - try { - value = getter.invoke(bean); - } catch (Exception ignore) { - continue; - } - if (false == ignoreNullValue || (null != value && false == value.equals(bean))) { - key = keyEditor.edit(key); - if (null != key) { - targetMap.put(key, value); - } - } - } - } - return targetMap; - } - - /** - * 获取{@link BeanDesc} Bean描述信息 - * - * @param clazz Bean类 - * @return the object - */ - public static BeanDesc getBeanDesc(Class clazz) { - return new BeanDesc(clazz); - } - /** * 获取{@link ClassLoader} * 获取顺序如下: @@ -1054,11 +979,11 @@ public static BeanDesc getBeanDesc(Class clazz) { * @return 类加载器 */ public static ClassLoader getClassLoader() { - ClassLoader classLoader = getContextClassLoader(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (null == classLoader) { classLoader = ClassKit.class.getClassLoader(); if (null == classLoader) { - classLoader = getSystemClassLoader(); + classLoader = ClassLoader.getSystemClassLoader(); } } return classLoader; @@ -1129,38 +1054,6 @@ public static T fillBean(T bean, ValueProvider valueProvider, CopyOp return BeanCopier.create(valueProvider, bean, copyOptions).copy(); } - /** - * 获取当前线程的{@link ClassLoader} - * - * @return 当前线程的class loader - * @see Thread#getContextClassLoader() - */ - public static ClassLoader getContextClassLoader() { - if (null == System.getSecurityManager()) { - return Thread.currentThread().getContextClassLoader(); - } else { - // 绕开权限检查 - return AccessController.doPrivileged( - (PrivilegedAction) () -> Thread.currentThread().getContextClassLoader()); - } - } - - /** - * 获取系统{@link ClassLoader} - * - * @return 系统{@link ClassLoader} - * @see ClassLoader#getSystemClassLoader() - */ - public static ClassLoader getSystemClassLoader() { - if (null == System.getSecurityManager()) { - return ClassLoader.getSystemClassLoader(); - } else { - // 绕开权限检查 - return AccessController.doPrivileged( - (PrivilegedAction) ClassLoader::getSystemClassLoader); - } - } - /** * 加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader并初始化类(调用static模块内容和初始化static属性) * 扩展{@link Class#forName(String, boolean, ClassLoader)}方法,支持以下几类类名的加载: @@ -1221,48 +1114,20 @@ public static Class loadClass(String name, boolean isInitialized) throws public static Class loadClass(String name, ClassLoader classLoader, boolean isInitialized) throws InstrumentException { Assert.notNull(name, "Name must not be null"); - // 加载原始类型和缓存中的类 - Class clazz = loadPrimitiveClass(name); - if (null == clazz) { - clazz = CLASS_CACHE.get(name); - } - if (null != clazz) { - return clazz; + // 自动将包名中的"/"替换为"." + name = name.replace(Symbol.SLASH, Symbol.DOT); + if (null == classLoader) { + classLoader = getClassLoader(); } - if (name.endsWith(Symbol.BRACKET)) { - // 对象数组"java.lang.String[]"风格 - final String elementClassName = name.substring(0, name.length() - Symbol.BRACKET.length()); - final Class elementClass = loadClass(elementClassName, classLoader, isInitialized); - clazz = Array.newInstance(elementClass, 0).getClass(); - } else if (name.startsWith(Symbol.NON_PREFIX) && name.endsWith(Symbol.SEMICOLON)) { - // "[Ljava.lang.String;" 风格 - final String elementName = name.substring(Symbol.NON_PREFIX.length(), name.length() - 1); - final Class elementClass = loadClass(elementName, classLoader, isInitialized); - clazz = Array.newInstance(elementClass, 0).getClass(); - } else if (name.startsWith(Symbol.BRACKET_LEFT)) { - // "[[I" 或 "[[Ljava.lang.String;" 风格 - final String elementName = name.substring(Symbol.BRACKET_LEFT.length()); - final Class elementClass = loadClass(elementName, classLoader, isInitialized); - clazz = Array.newInstance(elementClass, 0).getClass(); - } else { - // 加载普通类 - if (null == classLoader) { - classLoader = getClassLoader(); - } - try { - clazz = Class.forName(name, isInitialized, classLoader); - } catch (ClassNotFoundException ex) { - // 尝试获取内部类,例如java.lang.Thread.State = java.lang.Thread$State - clazz = tryLoadInnerClass(name, classLoader, isInitialized); - if (null == clazz) { - throw new InstrumentException(ex); - } - } + // 加载原始类型和缓存中的类 + Class clazz = loadPrimitiveClass(name); + if (clazz == null) { + final String finalName = name; + final ClassLoader finalClassLoader = classLoader; + clazz = CLASS_CACHE.computeIfAbsent(Pair.of(name, classLoader), (key) -> doLoadClass(finalName, finalClassLoader, isInitialized)); } - - // 加入缓存并返回 - return CLASS_CACHE.put(name, clazz); + return clazz; } /** @@ -1337,28 +1202,6 @@ public static boolean isPresent(String className, ClassLoader classLoader) { } } - /** - * 尝试转换并加载内部类,例如java.lang.Thread.State = java.lang.Thread$State - * - * @param name 类名 - * @param classLoader {@link ClassLoader},{@code null} 则使用系统默认ClassLoader - * @param isInitialized 是否初始化类(调用static模块内容和初始化static属性) - * @return 类名对应的类 - */ - private static Class tryLoadInnerClass(String name, ClassLoader classLoader, boolean isInitialized) { - // 尝试获取内部类,例如java.lang.Thread.State = java.lang.Thread$State - final int lastDotIndex = name.lastIndexOf(Symbol.C_DOT); - if (lastDotIndex > 0) {// 类与内部类的分隔符不能在第一位,因此>0 - final String innerClassName = name.substring(0, lastDotIndex) + Symbol.C_DOLLAR + name.substring(lastDotIndex + 1); - try { - return Class.forName(innerClassName, isInitialized, classLoader); - } catch (ClassNotFoundException ex2) { - // 尝试获取内部类失败时,忽略之 - } - } - return null; - } - /** * 获取给定类的包的名称. * 类似{@code java.lang.String} 字符串类 @@ -3779,6 +3622,144 @@ public static JavaSourceCompiler getCompiler(ClassLoader parent) { return JavaSourceCompiler.create(parent); } + /** + * 加载非原始类类,无缓存 + * + * @param name 类名 + * @param classLoader {@link ClassLoader} + * @param isInitialized 是否初始化 + * @return 类 + */ + private static Class doLoadClass(String name, ClassLoader classLoader, boolean isInitialized) { + Class clazz; + if (name.endsWith(Symbol.BRACKET)) { + // 对象数组"java.lang.String[]"风格 + final String elementClassName = name.substring(0, name.length() - Symbol.BRACKET.length()); + final Class elementClass = loadClass(elementClassName, classLoader, isInitialized); + clazz = Array.newInstance(elementClass, 0).getClass(); + } else if (name.startsWith(Symbol.NON_PREFIX) && name.endsWith(Symbol.SEMICOLON)) { + // "[Ljava.lang.String;" 风格 + final String elementName = name.substring(Symbol.NON_PREFIX.length(), name.length() - 1); + final Class elementClass = loadClass(elementName, classLoader, isInitialized); + clazz = Array.newInstance(elementClass, 0).getClass(); + } else if (name.startsWith(Symbol.BRACKET_LEFT)) { + // "[[I" 或 "[[Ljava.lang.String;" 风格 + final String elementName = name.substring(Symbol.BRACKET_LEFT.length()); + final Class elementClass = loadClass(elementName, classLoader, isInitialized); + clazz = Array.newInstance(elementClass, 0).getClass(); + } else { + // 加载普通类 + if (null == classLoader) { + classLoader = getClassLoader(); + } + try { + clazz = Class.forName(name, isInitialized, classLoader); + } catch (ClassNotFoundException ex) { + // 尝试获取内部类,例如java.lang.Thread.State = java.lang.Thread$State + clazz = tryLoadInnerClass(name, classLoader, isInitialized); + if (null == clazz) { + throw new InstrumentException(ex); + } + } + } + return clazz; + } + + /** + * 尝试转换并加载内部类,例如java.lang.Thread.State - java.lang.Thread$State + * + * @param name 类名 + * @param classLoader {@link ClassLoader},{@code null} 则使用系统默认ClassLoader + * @param isInitialized 是否初始化类(调用static模块内容和初始化static属性) + * @return 类名对应的类 + */ + private static Class tryLoadInnerClass(String name, ClassLoader classLoader, boolean isInitialized) { + // 尝试获取内部类,例如java.lang.Thread.State = java.lang.Thread$State + final int lastDotIndex = name.lastIndexOf(Symbol.C_DOT); + if (lastDotIndex > 0) {// 类与内部类的分隔符不能在第一位,因此>0 + final String innerClassName = name.substring(0, lastDotIndex) + Symbol.C_DOLLAR + name.substring(lastDotIndex + 1); + try { + return Class.forName(innerClassName, isInitialized, classLoader); + } catch (ClassNotFoundException ex2) { + // 尝试获取内部类失败时,忽略之。 + } + } + return null; + } + + /** + * 获取class类路径URL, 不管是否在jar包中都会返回文件夹的路径 + * class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 + * jdk中的类不能使用此方法 + * + * @param clazz 类 + * @return URL + */ + public static URL getLocation(Class clazz) { + if (null == clazz) { + return null; + } + return clazz.getProtectionDomain().getCodeSource().getLocation(); + } + + /** + * 获取class类路径, 不管是否在jar包中都会返回文件夹的路径 + * class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 + * jdk中的类不能使用此方法 + * + * @param clazz 类 + * @return class路径 + */ + public static String getLocationPath(Class clazz) { + final URL location = getLocation(clazz); + if (null == location) { + return null; + } + return location.getPath(); + } + + /** + * 是否为抽象类或接口 + * + * @param clazz 类 + * @return 是否为抽象类或接口 + */ + public static boolean isAbstractOrInterface(Class clazz) { + return isAbstract(clazz) || isInterface(clazz); + } + + /** + * 是否为JDK中定义的类或接口,判断依据: + * + *
+     * 1、以java.、javax.开头的包名
+     * 2、ClassLoader为null
+     * 
+ * + * @param clazz 被检查的类 + * @return 是否为JDK中定义的类或接口 + */ + public static boolean isJdkClass(Class clazz) { + final Package objectPackage = clazz.getPackage(); + if (null == objectPackage) { + return false; + } + final String objectPackageName = objectPackage.getName(); + return objectPackageName.startsWith("java.") + || objectPackageName.startsWith("javax.") + || clazz.getClassLoader() == null; + } + + /** + * 是否为接口 + * + * @param clazz 类 + * @return 是否为接口 + */ + public static boolean isInterface(Class clazz) { + return clazz.isInterface(); + } + public enum Interfaces { INCLUDE, EXCLUDE } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CollKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CollKit.java index dbd7921758..f2257d233d 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CollKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CollKit.java @@ -25,16 +25,13 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.collection.ArrayIterator; -import org.aoju.bus.core.collection.EnumerationIterator; -import org.aoju.bus.core.collection.IteratorEnumeration; -import org.aoju.bus.core.collection.SimpleCollector; +import org.aoju.bus.core.collection.*; import org.aoju.bus.core.compare.PinyinCompare; import org.aoju.bus.core.compare.PropertyCompare; import org.aoju.bus.core.convert.Convert; import org.aoju.bus.core.convert.ConverterRegistry; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.lang.System; import java.lang.reflect.Array; @@ -54,7 +51,6 @@ * 集合相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CollKit { @@ -735,6 +731,9 @@ public static String join(Iterable iterable, CharSequence conjunction, Fu * @see IterKit#join(Iterable, CharSequence) */ public static String join(Iterable iterable, CharSequence conjunction) { + if (null == iterable) { + return null; + } return IterKit.join(iterable, conjunction); } @@ -749,6 +748,9 @@ public static String join(Iterable iterable, CharSequence conjunction) { * @see IterKit#join(Iterator, CharSequence) */ public static String join(Iterator iterator, CharSequence conjunction) { + if (null == iterator) { + return null; + } return IterKit.join(iterator, conjunction); } @@ -1404,6 +1406,30 @@ public static Predicate distinct(Function key) { return t -> map.putIfAbsent(key.apply(t), Boolean.TRUE) == null; } + /** + * 根据函数生成的KEY去重集合,如根据Bean的某个或者某些字段完成去重 + * 去重可选是保留最先加入的值还是后加入的值 + * + * @param 集合元素类型 + * @param 唯一键类型 + * @param collection 集合 + * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 + * @return {@link ArrayList} + */ + public static List distinct(Collection collection, Function uniqueGenerator, boolean override) { + if (isEmpty(collection)) { + return new ArrayList<>(); + } + + final UniqueKeySet set = new UniqueKeySet<>(true, uniqueGenerator); + if (override) { + set.addAll(collection); + } else { + set.addAllIfAbsent(collection); + } + return new ArrayList<>(set); + } + /** * 截取集合的部分 * @@ -2475,28 +2501,6 @@ public static T getLast(Collection collection) { return get(collection, -1); } - /** - * 获得{@link Iterable}对象的元素类型(通过第一个非空元素判断) - * - * @param iterable {@link Iterable} - * @return 元素类型, 当列表为空或元素全部为null时, 返回null - * @see IterKit#getElementType(Iterable) - */ - public static Class getElementType(Iterable iterable) { - return IterKit.getElementType(iterable); - } - - /** - * 获得{@link Iterator}对象的元素类型(通过第一个非空元素判断) - * - * @param iterator {@link Iterator} - * @return 元素类型, 当列表为空或元素全部为null时, 返回null - * @see IterKit#getElementType(Iterator) - */ - public static Class getElementType(Iterator iterator) { - return IterKit.getElementType(iterator); - } - /** * 从Map中获取指定键列表对应的值列表 * 如果key在map中不存在或key对应值为null,则返回值列表对应位置的值也为null @@ -3272,6 +3276,19 @@ public static void padRight(Collection list, int minLen, T padObj) { } } + /** + * 使用给定的转换函数,转换源集合为新类型的集合 + * + * @param 源元素类型 + * @param 目标元素类型 + * @param collection 集合 + * @param function 转换函数 + * @return 新类型的集合 + */ + public static Collection trans(Collection collection, Function function) { + return new TransitionCollection<>(collection, function); + } + /** * 像java11一样获取一个List * diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ComplexKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ComplexKit.java index 54669a1a06..9704cae4d4 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ComplexKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ComplexKit.java @@ -33,7 +33,6 @@ * 来自:https://github.com/venshine/CheckPasswordStrength * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ComplexKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CsvKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CsvKit.java index 3712ba9065..5325d8de84 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/CsvKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/CsvKit.java @@ -39,7 +39,6 @@ * CSV工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CsvKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/DateKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/DateKit.java index 1261237f71..1ffcba7905 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/DateKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/DateKit.java @@ -37,7 +37,6 @@ * 时间工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DateKit extends Almanac { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/EnumKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/EnumKit.java index e93d0f776a..f9532b9610 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/EnumKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/EnumKit.java @@ -26,15 +26,17 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.function.Func1; import java.lang.reflect.Field; import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; /** * 枚举工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EnumKit { @@ -245,6 +247,60 @@ public static Map getFieldNames(Class> clazz, return map; } + /** + * 通过 某字段对应值 获取 枚举,获取不到时为 {@code null} + * + * @param enumClass 枚举类 + * @param predicate 条件 + * @param 枚举类型 + * @return 对应枚举 ,获取不到时为 {@code null} + */ + public static > E getBy(Class enumClass, Predicate predicate) { + return Arrays.stream(enumClass.getEnumConstants()) + .filter(predicate).findFirst().orElse(null); + } + + /** + * 通过 某字段对应值 获取 枚举,获取不到时为 {@code null} + * + * @param condition 条件字段 + * @param value 条件字段值 + * @param 枚举类型 + * @param 字段类型 + * @return 对应枚举 ,获取不到时为 {@code null} + */ + public static , C> E getBy(Func1 condition, C value) { + Class implClass = LambdaKit.getRealClass(condition); + if (Enum.class.equals(implClass)) { + implClass = LambdaKit.getRealClass(condition); + } + return Arrays.stream(implClass.getEnumConstants()).filter(e -> condition.callWithRuntimeException(e).equals(value)).findAny().orElse(null); + } + + /** + * 通过 某字段对应值 获取 枚举中另一字段值,获取不到时为 {@code null} + * + * @param field 你想要获取的字段 + * @param condition 条件字段 + * @param value 条件字段值 + * @param 枚举类型 + * @param 想要获取的字段类型 + * @param 条件字段类型 + * @return 对应枚举中另一字段值 ,获取不到时为 {@code null} + */ + public static , F, C> F getFieldBy(Func1 field, + Function condition, C value) { + Class implClass = LambdaKit.getRealClass(field); + if (Enum.class.equals(implClass)) { + implClass = LambdaKit.getRealClass(field); + } + return Arrays.stream(implClass.getEnumConstants()) + // 过滤 + .filter(e -> condition.apply(e).equals(value)) + // 获取第一个并转换为结果 + .findFirst().map(field::callWithRuntimeException).orElse(null); + } + /** * 获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序 * 结果中键为枚举名,值为枚举对象 diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/EscapeKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/EscapeKit.java index 09369100ea..04f1678261 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/EscapeKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/EscapeKit.java @@ -34,7 +34,6 @@ * Java, Java Script, HTML and XML. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EscapeKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/FileKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/FileKit.java index a26614ab04..2195aa3d33 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/FileKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/FileKit.java @@ -26,6 +26,7 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.collection.EnumerationIterator; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.LineHandler; import org.aoju.bus.core.io.file.FileReader; import org.aoju.bus.core.io.file.FileWriter; @@ -37,16 +38,18 @@ import org.aoju.bus.core.io.resource.Resource; import org.aoju.bus.core.io.streams.BOMInputStream; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.*; import java.lang.System; -import java.net.*; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.text.DecimalFormat; import java.util.*; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.zip.CRC32; @@ -56,7 +59,6 @@ * 文件工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FileKit { @@ -1071,7 +1073,7 @@ public static long copyFile(final File input, final OutputStream output) throws * 情况如下: * *
-     * 1、src和dest都为目录,则讲src下所有文件(包括子目录)拷贝到dest下
+     * 1、src和dest都为目录,则将src下所有文件(包括子目录)拷贝到dest下
      * 2、src和dest都为文件,直接复制,名字为dest
      * 3、src为文件,dest为目录,将src拷贝到dest目录下
      * 
@@ -1125,7 +1127,7 @@ public static File copy(File src, File dest, boolean isOverride) throws Instrume * 情况如下: * *
-     * 1、src和dest都为目录,则讲src下所有文件目录拷贝到dest下
+     * 1、src和dest都为目录,则将src下所有文件目录拷贝到dest下
      * 2、src和dest都为文件,直接复制,名字为dest
      * 3、src为文件,dest为目录,将src拷贝到dest目录下
      * 
@@ -1331,7 +1333,13 @@ public static String getAbsolutePath(File file) { /** * 给定路径已经是绝对路径 - * 此方法并没有针对路径做标准化,建议先执行{@link #normalize(String)}方法标准化路径后判断 + * 此方法并没有针对路径做标准化,建议先执行{@link #normalize(String)}方法标准化路径后判断 + * 绝对路径判断条件是: + *
    + *
  • 以/开头的路径
  • + *
  • 满足类似于 c:/xxxxx,其中祖母随意,不区分大小写
  • + *
  • 满足类似于 d:\xxxxx,其中祖母随意,不区分大小写
  • + *
* * @param path 需要检查的Path * @return 是否已经是绝对路径 @@ -1340,7 +1348,7 @@ public static boolean isAbsolutePath(String path) { if (StringKit.isEmpty(path)) { return false; } - return Symbol.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:[/\\\\].*"); + return Symbol.C_SLASH == path.charAt(0) || PatternKit.isMatch("^[a-zA-Z]:[/\\\\].*", path); } @@ -3694,21 +3702,26 @@ public static File checkSlip(File parentFile, File file) throws IllegalArgumentE * @return the string {@link MediaType} */ public static String getMediaType(String path) { - try { - FileNameMap fileNameMap = URLConnection.getFileNameMap(); - String contentType = fileNameMap.getContentTypeFor(URLEncoder.encode(path, Charset.DEFAULT_UTF_8)); - if (ObjectKit.isNull(contentType)) { - if (path.endsWith(".css")) { - contentType = "text/css"; - } else if (path.endsWith(".js")) { - contentType = "application/x-javascript"; - } + String contentType = URLConnection.getFileNameMap().getContentTypeFor(path); + if (null == contentType) { + // 补充一些常用的mimeType + if (StringKit.endWithIgnoreCase(path, ".css")) { + contentType = "text/css"; + } else if (StringKit.endWithIgnoreCase(path, ".js")) { + contentType = "application/x-javascript"; + } else if (StringKit.endWithIgnoreCase(path, ".rar")) { + contentType = "application/x-rar-compressed"; + } else if (StringKit.endWithIgnoreCase(path, ".7z")) { + contentType = "application/x-7z-compressed"; } - return contentType; - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); } - return null; + + // 补充 + if (null == contentType) { + contentType = getMediaType(Paths.get(path)); + } + + return contentType; } /** @@ -4011,7 +4024,7 @@ public static List getResources(String resource) { * @param filter 过滤器,用于过滤不需要的资源,{@code null}表示不过滤,保留所有元素 * @return 资源列表 */ - public static List getResources(String resource, Filter filter) { + public static List getResources(String resource, Predicate filter) { return IterKit.filterToList(getResourceIter(resource), filter); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/GeoKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/GeoKit.java index fb786f68f7..62be21d934 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/GeoKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/GeoKit.java @@ -27,8 +27,8 @@ import org.aoju.bus.core.builder.EqualsBuilder; import org.aoju.bus.core.builder.HashCodeBuilder; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.awt.geom.Point2D; import java.io.Serializable; @@ -41,7 +41,6 @@ * 地理区域坐标距离计算工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GeoKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/HashKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/HashKit.java index 6751d1d49a..26d34aa67b 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/HashKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/HashKit.java @@ -32,7 +32,6 @@ * 推荐使用FNV1算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HashKit { @@ -250,7 +249,7 @@ public static int jsHash(String text) { hash ^= ((hash << 5) + text.charAt(i) + (hash >> 2)); } - return hash & 0x7FFFFFFF; + return Math.abs(hash) & 0x7FFFFFFF; } /** @@ -457,4 +456,40 @@ public static long mixHash(String text) { return hash; } + /** + * HF Hash算法 + * + * @param data 字符串 + * @return hash结果 + */ + public static long hfHash(String data) { + int length = data.length(); + long hash = 0; + + for (int i = 0; i < length; i++) { + hash += (long) data.charAt(i) * 3 * i; + } + + if (hash < 0) { + hash = -hash; + } + + return hash; + } + + /** + * HFIP Hash算法 + * + * @param data 字符串 + * @return hash结果 + */ + public static long hfIpHash(String data) { + int length = data.length(); + long hash = 0; + for (int i = 0; i < length; i++) { + hash += data.charAt(i % 4) ^ data.charAt(i); + } + return hash; + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/HexKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/HexKit.java index 4488894126..d14f153e02 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/HexKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/HexKit.java @@ -38,7 +38,6 @@ * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HexKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ImageKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ImageKit.java index ad17dd776e..3b7d862d6c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ImageKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ImageKit.java @@ -27,6 +27,7 @@ import org.aoju.bus.core.codec.Base64; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.image.Images; import org.aoju.bus.core.image.Removal; import org.aoju.bus.core.io.resource.Resource; @@ -34,7 +35,6 @@ import org.aoju.bus.core.lang.FileType; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import javax.imageio.*; import javax.imageio.stream.ImageInputStream; @@ -56,7 +56,6 @@ * 彩色转黑白、文字水印、图片水印等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ImageKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/IoKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/IoKit.java index 993c9b313a..56f9ec67cb 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/IoKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/IoKit.java @@ -27,18 +27,18 @@ import org.aoju.bus.core.collection.LineIterator; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.*; import org.aoju.bus.core.io.copier.ChannelCopier; import org.aoju.bus.core.io.copier.ReaderWriterCopier; import org.aoju.bus.core.io.copier.StreamCopier; import org.aoju.bus.core.io.streams.BOMInputStream; import org.aoju.bus.core.io.streams.BOMReader; -import org.aoju.bus.core.io.streams.ByteArrayOutputStream; +import org.aoju.bus.core.io.streams.FastByteOutputStream; import org.aoju.bus.core.io.streams.NullOutputStream; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.*; import java.net.ServerSocket; @@ -61,7 +61,6 @@ * 原因是流可能被多次读写,读写关闭后容易造成问题 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IoKit { @@ -488,7 +487,7 @@ public static OutputStreamWriter getWriter(OutputStream out, java.nio.charset.Ch * @throws InstrumentException 异常 */ public static String read(InputStream in, String charsetName) throws InstrumentException { - ByteArrayOutputStream out = read(in); + FastByteOutputStream out = read(in); return StringKit.isBlank(charsetName) ? out.toString() : out.toString(charsetName); } @@ -501,7 +500,7 @@ public static String read(InputStream in, String charsetName) throws InstrumentE * @throws InstrumentException 异常 */ public static String read(InputStream in, java.nio.charset.Charset charset) throws InstrumentException { - ByteArrayOutputStream out = read(in); + FastByteOutputStream out = read(in); return null == charset ? out.toString() : out.toString(charset); } @@ -512,7 +511,7 @@ public static String read(InputStream in, java.nio.charset.Charset charset) thro * @return 输出流 * @throws InstrumentException 异常 */ - public static ByteArrayOutputStream read(InputStream in) throws InstrumentException { + public static FastByteOutputStream read(InputStream in) throws InstrumentException { return read(in, true); } @@ -524,17 +523,17 @@ public static ByteArrayOutputStream read(InputStream in) throws InstrumentExcept * @return 输出流 * @throws InstrumentException IO异常 */ - public static ByteArrayOutputStream read(InputStream in, boolean isClose) throws InstrumentException { - final ByteArrayOutputStream out; + public static FastByteOutputStream read(InputStream in, boolean isClose) throws InstrumentException { + final FastByteOutputStream out; if (in instanceof FileInputStream) { // 文件流的长度是可预见的,此时直接读取效率更高 try { - out = new ByteArrayOutputStream(in.available()); + out = new FastByteOutputStream(in.available()); } catch (IOException e) { throw new InstrumentException(e); } } else { - out = new ByteArrayOutputStream(); + out = new FastByteOutputStream(); } try { copy(in, out); @@ -632,7 +631,7 @@ public static String read(FileChannel fileChannel, java.nio.charset.Charset char * @throws InstrumentException IO异常 */ public static String read(ReadableByteChannel channel, java.nio.charset.Charset charset) throws InstrumentException { - ByteArrayOutputStream out = read(channel); + FastByteOutputStream out = read(channel); return null == charset ? out.toString() : out.toString(charset); } @@ -643,8 +642,8 @@ public static String read(ReadableByteChannel channel, java.nio.charset.Charset * @return 输出流 * @throws InstrumentException IO异常 */ - public static ByteArrayOutputStream read(ReadableByteChannel channel) throws InstrumentException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); + public static FastByteOutputStream read(ReadableByteChannel channel) throws InstrumentException { + final FastByteOutputStream out = new FastByteOutputStream(); copy(channel, Channels.newChannel(out)); return out; } @@ -709,20 +708,9 @@ public static byte[] readBytes(InputStream in, int length) throws InstrumentExce return Normal.EMPTY_BYTE_ARRAY; } - byte[] b = new byte[length]; - int readLength; - try { - readLength = in.read(b); - } catch (IOException e) { - throw new InstrumentException(e); - } - if (readLength > 0 && readLength < length) { - byte[] b2 = new byte[readLength]; - System.arraycopy(b, 0, b2, 0, readLength); - return b2; - } else { - return b; - } + final FastByteOutputStream out = new FastByteOutputStream(length); + copy(in, out, DEFAULT_BUFFER_SIZE, length, null); + return out.toByteArray(); } /** @@ -942,12 +930,12 @@ public static ByteArrayInputStream toStream(byte[] content) { } /** - * {@link ByteArrayOutputStream}转为{@link ByteArrayInputStream} + * {@link FastByteOutputStream}转为{@link ByteArrayInputStream} * * @param out {@link java.io.ByteArrayOutputStream} * @return 字节流 */ - public static ByteArrayInputStream toStream(ByteArrayOutputStream out) { + public static ByteArrayInputStream toStream(FastByteOutputStream out) { if (out == null) { return null; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/IterKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/IterKit.java index 50b05ead95..e304ca896c 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/IterKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/IterKit.java @@ -25,22 +25,28 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.collection.CopiedIterator; +import org.aoju.bus.core.collection.ArrayIterator; import org.aoju.bus.core.collection.EnumerationIterator; +import org.aoju.bus.core.collection.FilterIterator; +import org.aoju.bus.core.collection.NodeListIterator; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.lang.Matcher; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.lang.function.Func1; +import org.aoju.bus.core.text.TextJoiner; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Predicate; /** * {@link Iterable} 和 {@link Iterator} 相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class IterKit { @@ -605,11 +611,7 @@ public static List toList(Iterable iterable) { * @return List */ public static List toList(Iterator iterator) { - final List list = new ArrayList<>(); - while (iterator.hasNext()) { - list.add(iterator.next()); - } - return list; + return CollKit.toList(iterator); } /** @@ -658,10 +660,7 @@ public static T getFirst(Iterable iterable) { * @return 第一个元素 */ public static T getFirst(Iterator iterator) { - if (null != iterator && iterator.hasNext()) { - return iterator.next(); - } - return null; + return get(iterator, 0); } /** @@ -718,29 +717,22 @@ public static T getFirstNoneNull(Iterator iterator, Matcher matcher) { * @return 元素类型, 当列表为空或元素全部为null时, 返回null */ public static Class getElementType(Iterable iterable) { - if (null != iterable) { - final Iterator iterator = iterable.iterator(); - return getElementType(iterator); - } - return null; + return getElementType(get(iterable)); } /** * 获得{@link Iterator}对象的元素类型(通过第一个非空元素判断) * 注意,此方法至少会调用多次next方法 * - * @param iterator {@link Iterator} - * @return 元素类型, 当列表为空或元素全部为null时, 返回null + * @param iterator {@link Iterator},为 {@code null}返回{@code null} + * @return 元素类型,当列表为空或元素全部为{@code null}时,返回{@code null} */ public static Class getElementType(Iterator iterator) { - final Iterator iter2 = new CopiedIterator<>(iterator); - if (iter2.hasNext()) { - final Object t = iter2.next(); - if (null != t) { - return t.getClass(); - } + if (null == iterator) { + return null; } - return null; + final Object ele = getFirstNoneNull(iterator); + return null == ele ? null : ele.getClass(); } /** @@ -801,20 +793,22 @@ public static Iterator filter(Iterator iterator, Filter filter) { * @param 元素类型 * @param iter {@link Iterator} * @param filter 过滤器,保留{@link Filter#accept(Object)}为{@code true}的元素 - * @return ArrayList - */ - public static List filterToList(Iterator iter, Filter filter) { - final List result = new ArrayList<>(); - if (null != iter) { - E ele; - while (iter.hasNext()) { - ele = iter.next(); - if (null == filter || filter.accept(ele)) { - result.add(ele); - } - } - } - return result; + * @return the list + */ + public static List filterToList(Iterator iter, Predicate filter) { + return toList(filtered(iter, filter)); + } + + /** + * 获取一个新的 {@link FilterIterator},用于过滤指定元素 + * + * @param iterator 被包装的 {@link Iterator} + * @param filter 过滤断言,当{@link Filter#accept(Object)}为{@code true}时保留元素,{@code false}抛弃元素 + * @param 元素类型 + * @return {@link FilterIterator} + */ + public static FilterIterator filtered(final Iterator iterator, final Predicate filter) { + return new FilterIterator<>(iterator, filter); } /** @@ -926,4 +920,151 @@ public static void clear(Iterator iterator) { } } + /** + * 遍历{@link Iterator} + * 当consumer为{@code null}表示不处理,但是依旧遍历{@link Iterator} + * + * @param iterator {@link Iterator} + * @param consumer 节点消费,{@code null}表示不处理 + * @param 元素类型 + */ + public static void forEach(final Iterator iterator, final Consumer consumer) { + if (iterator != null) { + while (iterator.hasNext()) { + final E element = iterator.next(); + if (null != consumer) { + consumer.accept(element); + } + } + } + } + + /** + * 拼接 {@link Iterator}为字符串 + * + * @param iterator {@link Iterator} + * @param 元素类型 + * @return 字符串 + */ + public static String toString(final Iterator iterator) { + return toString(iterator, ObjectKit::toString); + } + + /** + * 拼接 {@link Iterator}为字符串 + * + * @param iterator {@link Iterator} + * @param transFunc 元素转字符串函数 + * @param 元素类型 + * @return 字符串 + */ + public static String toString(final Iterator iterator, final Function transFunc) { + return toString(iterator, transFunc, ", ", "[", "]"); + } + + /** + * 拼接 {@link Iterator}为字符串 + * + * @param iterator {@link Iterator} + * @param transFunc 元素转字符串函数 + * @param delimiter 分隔符 + * @param prefix 前缀 + * @param suffix 后缀 + * @param 元素类型 + * @return 字符串 + */ + public static String toString(final Iterator iterator, + final Function transFunc, + final String delimiter, + final String prefix, + final String suffix) { + final TextJoiner textJoiner = TextJoiner.of(delimiter, prefix, suffix); + textJoiner.append(iterator, transFunc); + return textJoiner.toString(); + } + + /** + * 获取{@link Iterator} + * + * @param iterable {@link Iterable} + * @param 元素类型 + * @return 当iterable为null返回{@code null},否则返回对应的{@link Iterator} + */ + public static Iterator get(Iterable iterable) { + return null == iterable ? null : iterable.iterator(); + } + + /** + * 遍历{@link Iterator},获取指定index位置的元素 + * + * @param iterator {@link Iterator} + * @param index 位置 + * @param 元素类型 + * @return 元素,找不到元素返回{@code null} + */ + public static E get(final Iterator iterator, int index) { + Assert.isTrue(index >= 0, "[index] must be >= 0"); + while (iterator.hasNext()) { + index--; + if (-1 == index) { + return iterator.next(); + } + iterator.next(); + } + return null; + } + + /** + * 从给定的对象中获取可能存在的{@link Iterator},规则如下: + *
    + *
  • null - null
  • + *
  • Iterator - 直接返回
  • + *
  • Enumeration - {@link EnumerationIterator}
  • + *
  • Collection - 调用{@link Collection#iterator()}
  • + *
  • Map - Entry的{@link Iterator}
  • + *
  • Dictionary - values (elements) enumeration returned as iterator
  • + *
  • array - {@link ArrayIterator}
  • + *
  • NodeList - {@link NodeListIterator}
  • + *
  • Node - 子节点
  • + *
  • object with iterator() public method,通过反射访问
  • + *
  • object - 单对象的{@link ArrayIterator}
  • + *
+ * + * @param obj 可以获取{@link Iterator}的对象 + * @return {@link Iterator},如果提供对象为{@code null},返回{@code null} + */ + public static Iterator get(final Object obj) { + if (obj == null) { + return null; + } else if (obj instanceof Iterator) { + return (Iterator) obj; + } else if (obj instanceof Iterable) { + return ((Iterable) obj).iterator(); + } else if (ArrayKit.isArray(obj)) { + return new ArrayIterator<>(obj); + } else if (obj instanceof Enumeration) { + return new EnumerationIterator<>((Enumeration) obj); + } else if (obj instanceof Map) { + return ((Map) obj).entrySet().iterator(); + } else if (obj instanceof NodeList) { + return new NodeListIterator((NodeList) obj); + } else if (obj instanceof Node) { + // 遍历子节点 + return new NodeListIterator(((Node) obj).getChildNodes()); + } else if (obj instanceof Dictionary) { + return new EnumerationIterator<>(((Dictionary) obj).elements()); + } + + // 反射获取 + try { + final Object iterator = ReflectKit.invoke(obj, "iterator"); + if (iterator instanceof Iterator) { + return (Iterator) iterator; + } + } catch (final RuntimeException ignore) { + // ignore + } + return new ArrayIterator<>(new Object[]{obj}); + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/LambdaKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/LambdaKit.java index ea94212476..e1f25f7b6e 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/LambdaKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/LambdaKit.java @@ -25,26 +25,26 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.lang.SimpleCache; import org.aoju.bus.core.lang.function.Func0; import org.aoju.bus.core.lang.function.Func1; +import org.aoju.bus.core.map.WeakMap; import java.io.Serializable; +import java.lang.invoke.MethodHandleInfo; import java.lang.invoke.SerializedLambda; /** * Lambda相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LambdaKit { - private static final SimpleCache cache = new SimpleCache<>(); + private static final WeakMap cache = new WeakMap<>(); /** - * 解析lambda表达式,加了缓存。 + * 解析lambda表达式,加了缓存 * 该缓存可能会在任意不定的时间被清除 * * @param Lambda类型 @@ -89,6 +89,37 @@ public static String getMethodName(Func0 func) { return resolve(func).getImplMethodName(); } + /** + * 通过对象的方法或类的静态方法引用,获取lambda实现类 + * + * @param func lambda + * @param 类型 + * @return lambda实现类 + * @throws IllegalArgumentException 如果是不支持的方法引用,抛出该异常,见{@link LambdaKit#checkLambdaTypeCanGetClass} + */ + public static Class getRealClass(Func0 func) { + final SerializedLambda lambda = resolve(func); + checkLambdaTypeCanGetClass(lambda.getImplMethodKind()); + return ClassKit.loadClass(lambda.getImplClass()); + } + + /** + * 通过对象的方法或类的静态方法引用,然后根据{@link SerializedLambda#getInstantiatedMethodType()}获取lambda实现类 + * 传入lambda有参数且含有返回值的情况能够匹配到此方法: + * + * @param func lambda + * @param

方法调用方类型 + * @param 返回值类型 + * @return lambda实现类 + * @throws IllegalArgumentException 如果是不支持的方法引用,抛出该异常,见{@link LambdaKit#checkLambdaTypeCanGetClass} + */ + public static Class

getRealClass(Func1 func) { + final SerializedLambda lambda = resolve(func); + checkLambdaTypeCanGetClass(lambda.getImplMethodKind()); + final String instantiatedMethodType = lambda.getInstantiatedMethodType(); + return ClassKit.loadClass(StringKit.sub(instantiatedMethodType, 2, StringKit.indexOf(instantiatedMethodType, ';'))); + } + /** * 获取lambda表达式Getter或Setter函数(方法)对应的字段名称,规则如下: *

    @@ -126,14 +157,27 @@ public static String getFieldName(Func0 func) throws IllegalArgumentExcep } /** - * 解析lambda表达式,加了缓存。 + * 检查是否为支持的类型 + * + * @param implMethodKind 支持的lambda类型 + * @throws IllegalArgumentException 如果是不支持的方法引用,抛出该异常 + */ + private static void checkLambdaTypeCanGetClass(int implMethodKind) { + if (implMethodKind != MethodHandleInfo.REF_invokeVirtual && + implMethodKind != MethodHandleInfo.REF_invokeStatic) { + throw new IllegalArgumentException("该lambda不是合适的方法引用"); + } + } + + /** + * 解析lambda表达式,加了缓存 * 该缓存可能会在任意不定的时间被清除 * * @param func 需要解析的 lambda 对象 * @return 返回解析后的结果 */ private static SerializedLambda _resolve(Serializable func) { - return cache.get(func.getClass().getName(), () -> ReflectKit.invoke(func, "writeReplace")); + return cache.computeIfAbsent(func.getClass().getName(), () -> ReflectKit.invoke(func, "writeReplace")); } } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/MapKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/MapKit.java index 3c062b8076..e83e50cc59 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/MapKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/MapKit.java @@ -30,18 +30,17 @@ import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Types; -import org.aoju.bus.core.lang.tuple.Pair; import org.aoju.bus.core.map.*; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiFunction; /** * Map相关工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MapKit { @@ -86,20 +85,6 @@ public static HashMap newHashMap() { return new HashMap<>(); } - /** - * 新建一个HashMap - * - * @param Key类型 - * @param Value类型 - * @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1 - * @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap} - * @return HashMap对象 - */ - public static HashMap newHashMap(int size, boolean isOrder) { - int initialCapacity = (int) (size / DEFAULT_LOAD_FACTOR) + 1; - return isOrder ? new LinkedHashMap<>(initialCapacity) : new HashMap<>(initialCapacity); - } - /** * 新建一个HashMap * @@ -136,6 +121,20 @@ public static TreeMap newTreeMap(Comparator comparator) return new TreeMap<>(comparator); } + /** + * 新建一个HashMap + * + * @param Key类型 + * @param Value类型 + * @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1 + * @param isLinked Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap} + * @return HashMap对象 + */ + public static HashMap newHashMap(int size, boolean isLinked) { + int initialCapacity = (int) (size / DEFAULT_LOAD_FACTOR) + 1; + return isLinked ? new LinkedHashMap<>(initialCapacity) : new HashMap<>(initialCapacity); + } + /** * 新建TreeMap,Key有序的Map * @@ -221,6 +220,7 @@ public static Map createMap(Class mapType) { } } + /** * 将单一键值对转换为Map * @@ -253,14 +253,15 @@ public static HashMap of(K key, V value, boolean isOrder) { /** * 根据给定的Pair数组创建Map对象 * - * @param 键类型 - * @param 值类型 - * @param pairs 键值对 + * @param 键类型 + * @param 值类型 + * @param entries 键值对 * @return Map + * @see #entry(Object, Object) */ - public static Map of(Pair... pairs) { + public static Map of(Map.Entry... entries) { final Map map = new HashMap<>(); - for (Pair pair : pairs) { + for (Map.Entry pair : entries) { map.put(pair.getKey(), pair.getValue()); } return map; @@ -716,6 +717,24 @@ public static Map filter(Map map, K... keys) { return map2; } + /** + * 通过biFunction自定义一个规则,此规则将原Map中的元素转换成新的元素,生成新的Map返回 + * 变更过程通过传入的 {@link BiFunction} 实现来返回一个值可以为不同类型的 {@link Map} + * + * @param map 原有的map + * @param biFunction {@code lambda},参数包含{@code key},{@code value},返回值会作为新的{@code value} + * @param {@code key}的类型 + * @param {@code value}的类型 + * @param 新的,修改后的{@code value}的类型 + * @return 值可以为不同类型的 {@link Map} + */ + public static Map map(Map map, BiFunction biFunction) { + if (null == map || null == biFunction) { + return newHashMap(); + } + return map.entrySet().stream().collect(CollKit.toMap(Map.Entry::getKey, m -> biFunction.apply(m.getKey(), m.getValue()), (l, r) -> l)); + } + /** * Map的键和值互换 * @@ -1274,4 +1293,34 @@ public static void clear(Map... maps) { } } + /** + * 将键和值转换为{@link AbstractMap.SimpleImmutableEntry} + * 返回的Entry不可变 + * + * @param key 键 + * @param value 值 + * @param 键类型 + * @param 值类型 + * @return {@link AbstractMap.SimpleImmutableEntry} + */ + public static Map.Entry entry(K key, V value) { + return entry(key, value, true); + } + + /** + * 将键和值转换为{@link AbstractMap.SimpleEntry} 或者 {@link AbstractMap.SimpleImmutableEntry} + * + * @param key 键 + * @param value 值 + * @param 键类型 + * @param 值类型 + * @param isImmutable 是否不可变Entry + * @return {@link AbstractMap.SimpleEntry} 或者 {@link AbstractMap.SimpleImmutableEntry} + */ + public static Map.Entry entry(K key, V value, boolean isImmutable) { + return isImmutable ? + new AbstractMap.SimpleImmutableEntry<>(key, value) : + new AbstractMap.SimpleEntry<>(key, value); + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/MathKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/MathKit.java index e0f251edc8..5531b915f7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/MathKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/MathKit.java @@ -25,10 +25,10 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.math.Arrange; import org.aoju.bus.core.math.Combine; import org.aoju.bus.core.math.Formula; @@ -52,7 +52,6 @@ * 计量标准 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MathKit { @@ -658,7 +657,7 @@ public static BigDecimal div(Number v1, Number v2, int scale, RoundingMode round if (v1 instanceof BigDecimal && v2 instanceof BigDecimal) { return div((BigDecimal) v1, (BigDecimal) v2, scale, roundingMode); } - return div(v1.toString(), v2.toString(), scale, roundingMode); + return div(StringKit.toStringOrNull(v1), StringKit.toStringOrNull(v2), scale, roundingMode); } /** @@ -1157,6 +1156,9 @@ public static boolean isNumber(String text) { * @return 是否为整数 */ public static boolean isInteger(String s) { + if (StringKit.isBlank(s)) { + return false; + } try { Integer.parseInt(s); } catch (NumberFormatException e) { @@ -2330,8 +2332,18 @@ public static double parseDouble(String number) { * @throws NumberFormatException 包装了{@link ParseException},当给定的数字字符串无法解析时抛出 */ public static Number parseNumber(String numberStr) throws NumberFormatException { + if (StringKit.startWithIgnoreCase(numberStr, "0x")) { + // 0x04表示16进制数 + return Long.parseLong(numberStr.substring(2), 16); + } + try { - return NumberFormat.getInstance().parse(numberStr); + final NumberFormat format = NumberFormat.getInstance(); + if (format instanceof DecimalFormat) { + // 当字符串数字超出double的长度时,会导致截断,此处使用BigDecimal接收 + ((DecimalFormat) format).setParseBigDecimal(true); + } + return format.parse(numberStr); } catch (ParseException e) { final NumberFormatException nfe = new NumberFormatException(e.getMessage()); nfe.initCause(e); diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/NameKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/NameKit.java index fba1fdbc13..3a74fa030e 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/NameKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/NameKit.java @@ -32,7 +32,6 @@ * 生成姓名 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NameKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/NetKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/NetKit.java index 7df77be337..f19093ccb5 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/NetKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/NetKit.java @@ -27,8 +27,8 @@ import org.aoju.bus.core.collection.EnumerationIterator; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -47,7 +47,6 @@ * 网络相关工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class NetKit { @@ -830,7 +829,7 @@ public static InitialContext createInitialContext(Map environmen } /** - * 获取指定容器环境的对象的属性
    + * 获取指定容器环境的对象的属性 * 如获取DNS属性,则URI为类似:dns:aoju.cn * * @param uri URI字符串,格式为[scheme:][name]/[domain] diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ObjectKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ObjectKit.java index 1e8a0aa14d..652e7ef91f 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ObjectKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ObjectKit.java @@ -28,11 +28,11 @@ import org.aoju.bus.core.compare.NormalCompare; import org.aoju.bus.core.compare.PinyinCompare; import org.aoju.bus.core.convert.Convert; -import org.aoju.bus.core.io.streams.ByteArrayOutputStream; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.io.streams.FastByteOutputStream; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.text.TextBuilder; import java.io.*; @@ -46,7 +46,6 @@ * 一些通用的函数 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ObjectKit { @@ -517,7 +516,7 @@ public static T cloneByStream(T obj) { if (null == obj || false == (obj instanceof Serializable)) { return null; } - final ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + final FastByteOutputStream byteOut = new FastByteOutputStream(); ObjectOutputStream out = null; try { out = new ObjectOutputStream(byteOut); @@ -1531,7 +1530,7 @@ public static byte[] serialize(T obj) { if (false == (obj instanceof Serializable)) { return null; } - final ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + final FastByteOutputStream byteOut = new FastByteOutputStream(); IoKit.writeObjects(byteOut, false, (Serializable) obj); return byteOut.toByteArray(); } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/PatternKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/PatternKit.java index d4be8d6d61..fdf89dc1df 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/PatternKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/PatternKit.java @@ -26,9 +26,13 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.convert.Convert; -import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.Normal; +import org.aoju.bus.core.lang.RegEx; +import org.aoju.bus.core.lang.Symbol; import org.aoju.bus.core.lang.function.Func1; +import org.aoju.bus.core.lang.mutable.Mutable; import org.aoju.bus.core.lang.mutable.MutableObject; import java.lang.reflect.InvocationTargetException; @@ -44,7 +48,6 @@ * 常用正则表达式集合 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PatternKit { @@ -366,7 +369,7 @@ public static String extractMulti(String regex, CharSequence content, String tem * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推 * @return 新字符串 */ - public static String extractMultiAndDelPre(Pattern pattern, Holder contentHolder, String template) { + public static String extractMultiAndDelPre(Pattern pattern, Mutable contentHolder, String template) { if (null == contentHolder || null == pattern || null == template) { return null; } @@ -396,7 +399,7 @@ public static String extractMultiAndDelPre(Pattern pattern, Holder * @param template 生成内容模板,变量 $1 表示group1的内容,以此类推 * @return 按照template拼接后的字符串 */ - public static String extractMultiAndDelPre(String regex, Holder contentHolder, String template) { + public static String extractMultiAndDelPre(String regex, Mutable contentHolder, String template) { if (null == contentHolder || null == regex || null == template) { return null; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/RandomKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/RandomKit.java index 1b381a6100..db82d6f6c7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/RandomKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/RandomKit.java @@ -26,17 +26,15 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.date.DateTime; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Algorithm; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.InstrumentException; -import java.awt.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; -import java.util.List; import java.util.*; import java.util.concurrent.ThreadLocalRandom; @@ -44,7 +42,6 @@ * 随机工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RandomKit { @@ -493,16 +490,6 @@ public static char randomChar(String baseString) { return baseString.charAt(getRandom().nextInt(baseString.length())); } - /** - * 生成随机颜色 - * - * @return 随机颜色 - */ - public static Color randomColor() { - final Random random = getRandom(); - return new Color(random.nextInt(Normal._256), random.nextInt(Normal._256), random.nextInt(Normal._256)); - } - /** * 以当天为基准,随机产生一个日期 * diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ReflectKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ReflectKit.java index 6d2750666f..39b90fc814 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ReflectKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ReflectKit.java @@ -28,8 +28,12 @@ import org.aoju.bus.core.annotation.Alias; import org.aoju.bus.core.collection.UniqueKeySet; import org.aoju.bus.core.convert.Convert; -import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.Filter; +import org.aoju.bus.core.lang.Normal; +import org.aoju.bus.core.lang.Symbol; +import org.aoju.bus.core.map.WeakMap; import java.lang.reflect.*; import java.util.*; @@ -39,25 +43,22 @@ * 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ReflectKit { - private static final String CGLIB_CLASS_SEPARATOR = Symbol.DOLLAR + Symbol.DOLLAR; - /** * 构造对象缓存 */ - private static final SimpleCache, Constructor[]> CONSTRUCTORS_CACHE = new SimpleCache<>(); + private static final WeakMap, Constructor[]> CONSTRUCTORS_CACHE = new WeakMap<>(); /** * 字段缓存 */ - private static final SimpleCache, Field[]> FIELDS_CACHE = new SimpleCache<>(); + private static final WeakMap, Field[]> FIELDS_CACHE = new WeakMap<>(); /** * 方法缓存 */ - private static final SimpleCache, Method[]> METHODS_CACHE = new SimpleCache<>(); + private static final WeakMap, Method[]> METHODS_CACHE = new WeakMap<>(); /** * 调用Getter方法. @@ -326,7 +327,7 @@ public static Class getClassGenricType(final Class clazz, final int index) { public static Class getUserClass(Object instance) { Class clazz = instance.getClass(); - if (null != clazz && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { + if (null != clazz && clazz.getName().contains(Symbol.DOLLAR + Symbol.DOLLAR)) { Class superClass = clazz.getSuperclass(); if (null != superClass && !Object.class.equals(superClass)) { return superClass; @@ -412,7 +413,7 @@ public static Constructor getConstructor(Class clazz, Class... para */ public static Constructor[] getConstructors(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return (Constructor[]) CONSTRUCTORS_CACHE.get(beanClass, () -> getConstructorsDirectly(beanClass)); + return (Constructor[]) CONSTRUCTORS_CACHE.computeIfAbsent(beanClass, () -> getConstructorsDirectly(beanClass)); } /** @@ -448,7 +449,7 @@ public static Field getField(Class beanClass, String name) throws SecurityExc */ public static Field[] getFields(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return FIELDS_CACHE.get(beanClass, () -> getFields(beanClass, true)); + return FIELDS_CACHE.computeIfAbsent(beanClass, () -> getFields(beanClass, true)); } /** @@ -745,7 +746,7 @@ public static Method[] getMethods(Class clazz, Filter filter) throws */ public static Method[] getMethods(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return METHODS_CACHE.get(beanClass, + return METHODS_CACHE.computeIfAbsent(beanClass, () -> getMethods(beanClass, true, true)); } @@ -939,28 +940,44 @@ public static T newInstance(Class clazz, Object... params) throws Instrum /** * 尝试遍历并调用此类的所有构造方法,直到构造成功并返回 * - * @param 对象类型 - * @param beanClass 被构造的类 + * @param 对象类型 + * @param type 被构造的类 * @return 构造后的对象, 构造失败返回{@code null} */ - public static T newInstanceIfPossible(Class beanClass) { - Assert.notNull(beanClass); + public static T newInstanceIfPossible(Class type) { + Assert.notNull(type); - if (beanClass.isAssignableFrom(AbstractMap.class)) { - beanClass = (Class) HashMap.class; - } else if (beanClass.isAssignableFrom(List.class)) { - beanClass = (Class) ArrayList.class; - } else if (beanClass.isAssignableFrom(Set.class)) { - beanClass = (Class) HashSet.class; + // 原始类型 + if (type.isPrimitive()) { + return (T) ClassKit.getPrimitiveDefaultValue(type); + } + + // 某些特殊接口的实例化按照默认实现进行 + if (type.isAssignableFrom(AbstractMap.class)) { + type = (Class) HashMap.class; + } else if (type.isAssignableFrom(List.class)) { + type = (Class) ArrayList.class; + } else if (type.isAssignableFrom(Set.class)) { + type = (Class) HashSet.class; } try { - return newInstance(beanClass); - } catch (InstrumentException e) { + return newInstance(type); + } catch (Exception e) { // 默认构造不存在的情况下查找其它构造 } - final Constructor[] constructors = getConstructors(beanClass); + // 枚举 + if (type.isEnum()) { + return type.getEnumConstants()[0]; + } + + // 数组 + if (type.isArray()) { + return (T) Array.newInstance(type.getComponentType(), 0); + } + + final Constructor[] constructors = getConstructors(type); Class[] parameterTypes; for (Constructor constructor : constructors) { parameterTypes = constructor.getParameterTypes(); diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/RuntimeKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/RuntimeKit.java index ba21b9c23e..b826ec182a 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/RuntimeKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/RuntimeKit.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.io.streams.ByteArrayOutputStream; +import org.aoju.bus.core.exception.InstrumentException; +import org.aoju.bus.core.io.streams.FastByteOutputStream; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.File; import java.io.IOException; @@ -48,7 +48,6 @@ * 用于执行系统命令的工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RuntimeKit { @@ -519,7 +518,7 @@ public static String getStackTrace(Throwable throwable, int limit) { * @return 堆栈转为的字符串 */ public static String getStackTrace(Throwable throwable, int limit, Map replaceCharToStrMap) { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final FastByteOutputStream baos = new FastByteOutputStream(); throwable.printStackTrace(new PrintStream(baos)); final String exceptionStr = baos.toString(); diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/StreamKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/StreamKit.java index f9fb6373b8..5d7d0866b6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/StreamKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/StreamKit.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.*; import java.net.URL; @@ -41,7 +41,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StreamKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/StringKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/StringKit.java index 958c0b68ba..c926fc0ba7 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/StringKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/StringKit.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.RegEx; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.text.Similarity; import org.aoju.bus.core.text.TextBuilder; @@ -43,7 +43,6 @@ * 字符串处理类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class StringKit extends CharsKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/SwingKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/SwingKit.java index 72acd402cf..ab598adff6 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/SwingKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/SwingKit.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.swing.ClipboardListener; import org.aoju.bus.core.swing.ClipboardMonitor; import org.aoju.bus.core.swing.ImageSelection; @@ -44,7 +44,6 @@ * 显示器等相关工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SwingKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TextKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TextKit.java index ce6169b370..a7fc6b14fc 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TextKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TextKit.java @@ -37,7 +37,6 @@ * 可复用的字符串生成器,非线程安全 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TextKit implements CharSequence, Appendable, Serializable { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ThreadKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ThreadKit.java index 13cef331b7..c79f9afaae 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ThreadKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ThreadKit.java @@ -26,6 +26,7 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.lang.Console; +import org.aoju.bus.core.lock.AtomicNoLock; import org.aoju.bus.core.thread.*; import java.lang.Thread.UncaughtExceptionHandler; @@ -39,7 +40,6 @@ * 线程池工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ThreadKit { @@ -148,6 +148,67 @@ public static ThreadPoolExecutor newExecutorByBlockingCoefficient(float blocking return ExecutorBuilder.create().setCorePoolSize(poolSize).setMaxPoolSize(poolSize).setKeepAliveTime(0L).build(); } + /** + * 获取一个新的线程池,默认的策略如下 + *
    +     *     1. 核心线程数与最大线程数为nThreads指定的大小
    +     *     2. 默认使用{@link LinkedBlockingQueue},默认队列大小为1024
    +     *     3. 如果isBlocked为{code true},当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
    +     * 
    + * + * @param nThreads 线程池大小 + * @param threadNamePrefix 线程名称前缀 + * @param isBlocked 是否使用{@link BlockPolicy}策略 + * @return {@link ExecutorService} + */ + public static ExecutorService newFixedExecutor(int nThreads, String threadNamePrefix, boolean isBlocked) { + return newFixedExecutor(nThreads, 1024, threadNamePrefix, isBlocked); + } + + /** + * 获取一个新的线程池,默认的策略如下 + *
    +     *     1. 核心线程数与最大线程数为nThreads指定的大小
    +     *     2. 默认使用{@link LinkedBlockingQueue}
    +     *     3. 如果isBlocked为{code true},当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
    +     * 
    + * + * @param nThreads 线程池大小 + * @param maximumQueueSize 队列大小 + * @param threadNamePrefix 线程名称前缀 + * @param isBlocked 是否使用{@link BlockPolicy}策略 + * @return {@link ExecutorService} + */ + public static ExecutorService newFixedExecutor(int nThreads, int maximumQueueSize, String threadNamePrefix, boolean isBlocked) { + return newFixedExecutor(nThreads, maximumQueueSize, threadNamePrefix, + (isBlocked ? RejectPolicy.BLOCK : RejectPolicy.ABORT).getValue()); + } + + /** + * 获得一个新的线程池,默认策略如下 + *
    +     *     1. 核心线程数与最大线程数为nThreads指定的大小
    +     *     2. 默认使用 {@link LinkedBlockingQueue}
    +     * 
    + * + * @param nThreads 线程池大小 + * @param maximumQueueSize 队列大小 + * @param threadNamePrefix 线程名称前缀 + * @param handler 拒绝策略 + * @return {@link ExecutorService} + */ + public static ExecutorService newFixedExecutor(int nThreads, + int maximumQueueSize, + String threadNamePrefix, + RejectedExecutionHandler handler) { + return ExecutorBuilder.create() + .setCorePoolSize(nThreads).setMaxPoolSize(nThreads) + .setWorkQueue(new LinkedBlockingQueue<>(maximumQueueSize)) + .setThreadFactory(createThreadFactory(threadNamePrefix)) + .setHandler(handler) + .build(); + } + /** * 直接在公共线程池中执行线程 * @@ -161,12 +222,12 @@ public static void execute(Runnable runnable) { * 执行异步方法 * * @param runnable 需要执行的方法体 - * @param isDeamon 是否守护线程 守护线程会在主线程结束后自动结束 + * @param isDaemon 是否守护线程 守护线程会在主线程结束后自动结束 * @return 执行的方法体 */ - public static Runnable excAsync(final Runnable runnable, boolean isDeamon) { + public static Runnable excAsync(final Runnable runnable, boolean isDaemon) { Thread thread = new Thread(() -> runnable.run()); - thread.setDaemon(isDeamon); + thread.setDaemon(isDaemon); thread.start(); return runnable; @@ -263,12 +324,12 @@ public static Thread newThread(Runnable runnable, String name) { * * @param runnable {@link Runnable} * @param name 线程名 - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 * @return {@link Thread} */ - public static Thread newThread(Runnable runnable, String name, boolean isDeamon) { + public static Thread newThread(Runnable runnable, String name, boolean isDaemon) { final Thread t = new Thread(null, runnable, name); - t.setDaemon(isDeamon); + t.setDaemon(isDaemon); return t; } @@ -417,6 +478,17 @@ public static ThreadBuilder createThreadFactoryBuilder() { return ThreadBuilder.create(); } + /** + * 创建自定义线程名称前缀的{@link ThreadFactory} + * + * @param threadNamePrefix 线程名称前缀 + * @return {@link ThreadFactory} + * @see ThreadBuilder#build() + */ + public static ThreadFactory createThreadFactory(String threadNamePrefix) { + return ThreadBuilder.create().setNamePrefix(threadNamePrefix).build(); + } + /** * 结束线程,调用此方法后,线程将抛出 {@link InterruptedException}异常 * @@ -495,25 +567,15 @@ public static Thread getMainThread() { return null; } - /** - * 获取当前线程的线程组 - * - * @return 线程组 - */ - public static ThreadGroup currentThreadGroup() { - final SecurityManager s = System.getSecurityManager(); - return (null != s) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); - } - /** * 创建线程工厂 * * @param prefix 线程名前缀 - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 * @return the object */ - public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDeamon) { - return new NamedThreadFactory(prefix, isDeamon); + public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDaemon) { + return new NamedThreadFactory(prefix, isDaemon); } /** @@ -521,11 +583,11 @@ public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDeamo * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 * @return the object */ - public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon) { - return new NamedThreadFactory(prefix, threadGroup, isDeamon); + public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) { + return new NamedThreadFactory(prefix, threadGroup, isDaemon); } /** @@ -533,12 +595,12 @@ public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup thr * * @param prefix 线程名前缀 * @param threadGroup 线程组,可以为null - * @param isDeamon 是否守护线程 + * @param isDaemon 是否守护线程 * @param handler 未捕获异常处理 * @return the object */ - public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDeamon, UncaughtExceptionHandler handler) { - return new NamedThreadFactory(prefix, threadGroup, isDeamon, handler); + public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) { + return new NamedThreadFactory(prefix, threadGroup, isDaemon, handler); } /** @@ -621,24 +683,6 @@ public static ScheduledThreadPoolExecutor schedule(ScheduledThreadPoolExecutor e return executor; } - - public static final class FastBufferThread extends Thread { - - private int pageIndex; - - public FastBufferThread(Runnable target, String name) { - super(target, name); - } - - public int getPageIndex() { - return pageIndex; - } - - public void setPageIndex(int pageIndex) { - this.pageIndex = pageIndex; - } - } - /** * 创建{@link StampedLock}锁 * @@ -667,4 +711,21 @@ public static AtomicNoLock getNoLock() { return NO_LOCK; } + public static final class FastBufferThread extends Thread { + + private int pageIndex; + + public FastBufferThread(Runnable target, String name) { + super(target, name); + } + + public int getPageIndex() { + return pageIndex; + } + + public void setPageIndex(int pageIndex) { + this.pageIndex = pageIndex; + } + } + } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TreeKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TreeKit.java index ce3ac4e3f2..8f04462a25 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TreeKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TreeKit.java @@ -22,7 +22,6 @@ * 6、代码简洁轻量无额外依赖 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TreeKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TypeKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TypeKit.java index 65d476dcfa..e0c7477614 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/TypeKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/TypeKit.java @@ -43,7 +43,6 @@ *
* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TypeKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/UriKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/UriKit.java index 612d0655db..bcd8e07f95 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/UriKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/UriKit.java @@ -26,8 +26,8 @@ package org.aoju.bus.core.toolkit; import org.aoju.bus.core.convert.Convert; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.map.TableMap; import java.io.*; @@ -40,7 +40,6 @@ * URL相关工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class UriKit { @@ -1642,7 +1641,7 @@ public String getQueryStr() { * @param value 值 * @return this */ - public UriKit addQuery(String key, String value) { + public UriKit addQuery(String key, Object value) { if (StringKit.isEmpty(key)) { return this; } diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/WatchKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/WatchKit.java index 448f959540..052ca2db47 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/WatchKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/WatchKit.java @@ -40,7 +40,6 @@ * 主要负责文件监听器的快捷创建 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class WatchKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/XmlKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/XmlKit.java index 39582f330a..34bfb0a271 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/XmlKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/XmlKit.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.core.toolkit; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -59,7 +59,6 @@ * 工具类封装了XML文档的创建、读取、写出和部分XML操作 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class XmlKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZipKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZipKit.java index c5b2777ed0..e5d03608ab 100755 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZipKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZipKit.java @@ -27,10 +27,10 @@ import org.aoju.bus.core.collection.EnumerationIterator; import org.aoju.bus.core.compress.*; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.io.resource.Resource; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import java.io.*; import java.net.URI; @@ -50,7 +50,6 @@ * 压缩工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZipKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZoneKit.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZoneKit.java index 6392fc2abd..782877ee12 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZoneKit.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/ZoneKit.java @@ -32,7 +32,6 @@ * {@link ZoneId}和{@link TimeZone}相关封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZoneKit { diff --git a/bus-core/src/main/java/org/aoju/bus/core/toolkit/package-info.java b/bus-core/src/main/java/org/aoju/bus/core/toolkit/package-info.java index 7206a535f8..15fdbeb511 100644 --- a/bus-core/src/main/java/org/aoju/bus/core/toolkit/package-info.java +++ b/bus-core/src/main/java/org/aoju/bus/core/toolkit/package-info.java @@ -2,7 +2,6 @@ * 工具包,提供各种工具方法,按照归类入口为XXXKit,如数组工具ArrayKit等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.core.toolkit; \ No newline at end of file diff --git a/bus-cron/pom.xml b/bus-cron/pom.xml index be33dc2468..4591e09b67 100755 --- a/bus-cron/pom.xml +++ b/bus-cron/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-cron - 6.5.0 + 6.5.1 jar ${project.artifactId} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Builder.java b/bus-cron/src/main/java/org/aoju/bus/cron/Builder.java old mode 100755 new mode 100644 index c2ce3a099e..088a11a44f --- a/bus-cron/src/main/java/org/aoju/bus/cron/Builder.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Builder.java @@ -25,18 +25,15 @@ ********************************************************************************/ package org.aoju.bus.cron; -import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.exception.CrontabException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.Fields; -import org.aoju.bus.core.lang.exception.InstrumentException; -import org.aoju.bus.core.toolkit.DateKit; import org.aoju.bus.cron.factory.Task; import org.aoju.bus.cron.pattern.CronPattern; import org.aoju.bus.setting.magic.PopSetting; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** * 定时任务工具类 @@ -44,22 +41,20 @@ * {@link #setMatchSecond(boolean)} 方法用于定义是否使用秒匹配模式,如果为true,则定时任务表达式中的第一位为秒,否则为分,默认是分 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public final class Builder { +public class Builder { /** * Crontab配置文件 */ public static final String CRONTAB_CONFIG_PATH = "config/cron.setting"; + public static final String CRONTAB_CONFIG_PATH2 = "cron.setting"; + private static final Lock lock = new ReentrantLock(); private static final Scheduler scheduler = new Scheduler(); private static PopSetting crontabSetting; - private Builder() { - } - /** * 自定义定时任务配置文件 * @@ -72,7 +67,7 @@ public static void setCronSetting(PopSetting cronSetting) { /** * 自定义定时任务配置文件路径 * - * @param cronSettingPath 定时任务配置文件路径(相对绝对都可) + * @param cronSettingPath 定时任务配置文件路径(相对绝对都可) */ public static void setCronSetting(String cronSettingPath) { try { @@ -175,32 +170,48 @@ public static void start() { /** * 开始 * - * @param isDeamon 是否以守护线程方式启动,如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束 + * @param isDaemon 是否以守护线程方式启动,如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束 */ - synchronized public static void start(boolean isDeamon) { - if (null == crontabSetting) { - setCronSetting(CRONTAB_CONFIG_PATH); - } + synchronized public static void start(boolean isDaemon) { if (scheduler.isStarted()) { - throw new InstrumentException("Scheduler has been started, please stop it first!"); + throw new CrontabException("Scheduler has been started, please stop it first!"); + } + + lock.lock(); + try { + if (null == crontabSetting) { + // 尝试查找config/cron.setting + setCronSetting(CRONTAB_CONFIG_PATH); + } + // 尝试查找cron.setting + if (null == crontabSetting) { + setCronSetting(CRONTAB_CONFIG_PATH2); + } + } finally { + lock.unlock(); } schedule(crontabSetting); - scheduler.start(isDeamon); + scheduler.start(isDaemon); } /** * 重新启动定时任务 * 此方法会清除动态加载的任务,重新启动后,守护线程与否与之前保持一致 */ - synchronized public static void restart() { - if (null != crontabSetting) { - //重新读取配置文件 - crontabSetting.load(); - } - if (scheduler.isStarted()) { - //关闭并清除已有任务 - stop(); + public static void restart() { + lock.lock(); + try { + if (null != crontabSetting) { + //重新读取配置文件 + crontabSetting.load(); + } + if (scheduler.isStarted()) { + //关闭并清除已有任务 + stop(); + } + } finally { + lock.unlock(); } //重新加载任务 @@ -212,74 +223,8 @@ synchronized public static void restart() { /** * 停止 */ - synchronized public static void stop() { + public static void stop() { scheduler.stop(true); } - /** - * 列举指定日期之后(到开始日期对应年年底)内所有匹配表达式的日期 - * - * @param patternStr 表达式字符串 - * @param start 起始时间 - * @param count 列举数量 - * @param isMatchSecond 是否匹配秒 - * @return 日期列表 - */ - public static List matchedDates(String patternStr, Date start, int count, boolean isMatchSecond) { - return matchedDates(patternStr, start, DateKit.endOfYear(start), count, isMatchSecond); - } - - /** - * 列举指定日期范围内所有匹配表达式的日期 - * - * @param patternStr 表达式字符串 - * @param start 起始时间 - * @param end 结束时间 - * @param count 列举数量 - * @param isMatchSecond 是否匹配秒 - * @return 日期列表 - */ - public static List matchedDates(String patternStr, Date start, Date end, int count, boolean isMatchSecond) { - return matchedDates(patternStr, start.getTime(), end.getTime(), count, isMatchSecond); - } - - /** - * 列举指定日期范围内所有匹配表达式的日期 - * - * @param patternStr 表达式字符串 - * @param start 起始时间 - * @param end 结束时间 - * @param count 列举数量 - * @param isMatchSecond 是否匹配秒 - * @return 日期列表 - */ - public static List matchedDates(String patternStr, long start, long end, int count, boolean isMatchSecond) { - return matchedDates(new CronPattern(patternStr), start, end, count, isMatchSecond); - } - - /** - * 列举指定日期范围内所有匹配表达式的日期 - * - * @param pattern 表达式 - * @param start 起始时间 - * @param end 结束时间 - * @param count 列举数量 - * @param isMatchSecond 是否匹配秒 - * @return 日期列表 - */ - public static List matchedDates(CronPattern pattern, long start, long end, int count, boolean isMatchSecond) { - Assert.isTrue(start < end, "Start date is later than end !"); - final List result = new ArrayList<>(count); - long step = isMatchSecond ? Fields.Units.SECOND.getUnit() : Fields.Units.MINUTE.getUnit(); - for (long i = start; i < end; i += step) { - if (pattern.match(i, isMatchSecond)) { - result.add(DateKit.date(i)); - if (result.size() >= count) { - break; - } - } - } - return result; - } - } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Configure.java b/bus-cron/src/main/java/org/aoju/bus/cron/Configure.java index d85aae349b..32f6d01883 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Configure.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Configure.java @@ -31,7 +31,6 @@ * 定时任务配置类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Configure { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/CronTimer.java b/bus-cron/src/main/java/org/aoju/bus/cron/CronTimer.java old mode 100755 new mode 100644 index 58c8645c45..a8207a61c3 --- a/bus-cron/src/main/java/org/aoju/bus/cron/CronTimer.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/CronTimer.java @@ -34,7 +34,6 @@ * 计时器线程每隔一分钟检查一次任务列表,一旦匹配到执行对应的Task * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CronTimer extends Thread { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Executor.java b/bus-cron/src/main/java/org/aoju/bus/cron/Executor.java old mode 100755 new mode 100644 index dbde292d7a..b0c9f8542b --- a/bus-cron/src/main/java/org/aoju/bus/cron/Executor.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Executor.java @@ -33,7 +33,6 @@ * 执行具体的作业,执行完毕销毁 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Executor implements Runnable { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Expression.java b/bus-cron/src/main/java/org/aoju/bus/cron/Expression.java index bddfd5720c..ede2459034 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Expression.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Expression.java @@ -37,7 +37,6 @@ * Crontab表达式提供了指定复杂时间组合的能力 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class Expression implements Serializable, Cloneable { @@ -300,7 +299,7 @@ protected void buildExpression(String expression) throws ParseException { throw pe; } catch (Exception e) { throw new ParseException("Illegal cron expression format (" - + e.toString() + ")", 0); + + e + ")", 0); } } @@ -958,7 +957,7 @@ protected int getDayOfWeekNumber(String s) { public Date getTimeAfter(Date afterTime) { // Computation is based on Gregorian year only. - Calendar cl = new java.util.GregorianCalendar(getTimeZone()); + Calendar cl = new GregorianCalendar(getTimeZone()); // move ahead one second, since we're computing the time *after* the // given time @@ -1213,10 +1212,7 @@ public Date getTimeAfter(Date afterTime) { daysToAdd = dow + (7 - cDow); } - boolean dayShifted = false; - if (daysToAdd > 0) { - dayShifted = true; - } + boolean dayShifted = daysToAdd > 0; day += daysToAdd; int weekOfMonth = day / 7; diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Launcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/Launcher.java old mode 100755 new mode 100644 index 5a63b1a95d..0fe186f587 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Launcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Launcher.java @@ -31,7 +31,6 @@ * 检查完毕后启动器结束 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Launcher implements Runnable { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Manager.java b/bus-cron/src/main/java/org/aoju/bus/cron/Manager.java old mode 100755 new mode 100644 index da18ccf2d0..a3f813f5b2 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Manager.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Manager.java @@ -28,7 +28,9 @@ import org.aoju.bus.cron.factory.CronTask; import org.aoju.bus.cron.factory.Task; +import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -36,23 +38,32 @@ * 负责管理作业的启动、停止等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class Manager { +public class Manager implements Serializable { - protected Scheduler scheduler; + private static final long serialVersionUID = 1L; /** * 执行器列表 */ - private List executors = new ArrayList<>(); + private final List executors = new ArrayList<>(); + protected Scheduler scheduler; public Manager(Scheduler scheduler) { this.scheduler = scheduler; } /** - * 启动 TaskExecutor + * 获取所有正在执行的任务调度执行器 + * + * @return 任务执行器列表 + */ + public List getExecutors() { + return Collections.unmodifiableList(this.executors); + } + + /** + * 启动 执行器TaskExecutor,即启动作业 * * @param task {@link Task} * @return {@link Executor} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Repertoire.java b/bus-cron/src/main/java/org/aoju/bus/cron/Repertoire.java old mode 100755 new mode 100644 index e09056c295..cdf3ceae77 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Repertoire.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Repertoire.java @@ -25,12 +25,13 @@ ********************************************************************************/ package org.aoju.bus.cron; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.CrontabException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.cron.factory.CronTask; import org.aoju.bus.cron.factory.Task; import org.aoju.bus.cron.pattern.CronPattern; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -44,13 +45,12 @@ * 任务的添加、移除使用读写锁保证线程安全性 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class Repertoire { +public class Repertoire implements Serializable { public static final int DEFAULT_CAPACITY = 10; - + private static final long serialVersionUID = 1L; private final ReadWriteLock lock; private final List ids; @@ -91,7 +91,7 @@ public Repertoire add(String id, CronPattern pattern, Task task) { writeLock.lock(); try { if (ids.contains(id)) { - throw new InstrumentException("Id [{}] has been existed!", id); + throw new CrontabException("Id [{}] has been existed!", id); } ids.add(id); patterns.add(pattern); diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Scheduler.java b/bus-cron/src/main/java/org/aoju/bus/cron/Scheduler.java old mode 100755 new mode 100644 index b6d0d38f4f..8564f1f2e7 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Scheduler.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Scheduler.java @@ -25,12 +25,12 @@ ********************************************************************************/ package org.aoju.bus.cron; +import org.aoju.bus.core.exception.CrontabException; import org.aoju.bus.core.key.UUID; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.thread.ExecutorBuilder; import org.aoju.bus.core.thread.ThreadBuilder; -import org.aoju.bus.core.toolkit.CollKit; +import org.aoju.bus.core.toolkit.MapKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.cron.factory.InvokeTask; import org.aoju.bus.cron.factory.RunnableTask; @@ -41,6 +41,7 @@ import org.aoju.bus.logger.Logger; import org.aoju.bus.setting.magic.PopSetting; +import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map.Entry; import java.util.TimeZone; @@ -75,43 +76,42 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class Scheduler { +public class Scheduler implements Serializable { + + private static final long serialVersionUID = 1L; + + private final Lock lock = new ReentrantLock(); /** - * 同步锁 + * 定时任务配置 */ - private final Lock lock = new ReentrantLock(); + protected Configure config = new Configure(); /** * 是否为守护线程 */ protected boolean daemon; /** - * 启动管理器 - */ - protected Supervisor supervisor; - /** - * 执行管理器 - */ - protected Manager manager; - /** - * 线程池 + * 定时任务表 */ - protected ExecutorService threadExecutor; + protected Repertoire repertoire = new Repertoire(); /** - * 定时任务配置 + * 启动器管理器 */ - protected Configure config = new Configure(); + protected Supervisor supervisor; /** - * 定时任务表 + * 执行器管理器 */ - protected Repertoire repertoire = new Repertoire(); + protected Manager manager; /** * 监听管理器列表 */ protected TaskListenerManager listenerManager = new TaskListenerManager(); + /** + * 线程池,用于执行TaskLauncher和TaskExecutor + */ + protected ExecutorService threadExecutor; /** * 是否已经启动 */ @@ -121,6 +121,15 @@ public class Scheduler { */ private CronTimer timer; + /** + * 获得时区,默认为 {@link TimeZone#getDefault()} + * + * @return 时区 + */ + public TimeZone getTimeZone() { + return this.config.getTimeZone(); + } + /** * 设置时区 * @@ -132,6 +141,25 @@ public Scheduler setTimeZone(TimeZone timeZone) { return this; } + /** + * 设置自定义线程池 + * 自定义线程池时须考虑方法执行的线程是否为守护线程 + * + * @param threadExecutor 自定义线程池 + * @return this + * @throws CrontabException 定时任务已经启动抛出此异常 + */ + public Scheduler setThreadExecutor(ExecutorService threadExecutor) throws CrontabException { + lock.lock(); + try { + checkStarted(); + this.threadExecutor = threadExecutor; + } finally { + lock.unlock(); + } + return this; + } + /** * 是否为守护线程 * @@ -143,18 +171,17 @@ public boolean isDaemon() { /** * 设置是否为守护线程 - * 如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束 默认非守护线程 + * 如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束。默认非守护线程 + * 如果用户调用{@link #setThreadExecutor(ExecutorService)}自定义线程池则此参数无效 * - * @param on true为守护线程,否则非守护线程 + * @param on {@code true}为守护线程,否则非守护线程 * @return this - * @throws InstrumentException 定时任务已经启动抛出此异常 + * @throws CrontabException 定时任务已经启动抛出此异常 */ - public Scheduler setDaemon(boolean on) throws InstrumentException { + public Scheduler setDaemon(boolean on) throws CrontabException { lock.lock(); try { - if (this.started) { - throw new InstrumentException("Scheduler already started!"); - } + checkStarted(); this.daemon = on; } finally { lock.unlock(); @@ -165,16 +192,16 @@ public Scheduler setDaemon(boolean on) throws InstrumentException { /** * 是否支持秒匹配 * - * @return true使用,false不使用 + * @return {@code true}使用,{@code false}不使用 */ public boolean isMatchSecond() { return this.config.isMatchSecond(); } /** - * 设置是否支持秒匹配,默认不使用 + * 设置是否支持秒匹配,默认不使用 * - * @param isMatchSecond true支持,false不支持 + * @param isMatchSecond {@code true}支持,{@code false}不支持 * @return this */ public Scheduler setMatchSecond(boolean isMatchSecond) { @@ -212,7 +239,7 @@ public Scheduler removeListener(TaskListener listener) { * @return this */ public Scheduler schedule(PopSetting cronSetting) { - if (CollKit.isNotEmpty(cronSetting)) { + if (MapKit.isNotEmpty(cronSetting)) { String group; for (Entry> groupedEntry : cronSetting.getGroupMap().entrySet()) { group = groupedEntry.getKey(); @@ -226,7 +253,7 @@ public Scheduler schedule(PopSetting cronSetting) { try { schedule(pattern, new InvokeTask(jobClass)); } catch (Exception e) { - throw new InstrumentException("Schedule [{}] [{}] error!", pattern, jobClass); + throw new CrontabException("Schedule [{}] [{}] error!", pattern, jobClass); } } } @@ -259,7 +286,7 @@ public String schedule(String pattern, Task task) { } /** - * 新增Task + * 新增Task,如果任务ID已经存在,抛出异常 * * @param id ID,为每一个Task定义一个ID * @param pattern {@link CronPattern}对应的String表达式 @@ -271,7 +298,7 @@ public Scheduler schedule(String id, String pattern, Runnable task) { } /** - * 新增Task + * 新增Task,如果任务ID已经存在,抛出异常 * * @param id ID,为每一个Task定义一个ID * @param pattern {@link CronPattern}对应的String表达式 @@ -283,7 +310,7 @@ public Scheduler schedule(String id, String pattern, Task task) { } /** - * 新增Task + * 新增Task,如果任务ID已经存在,抛出异常 * * @param id ID,为每一个Task定义一个ID * @param pattern {@link CronPattern} @@ -395,11 +422,11 @@ public boolean isStarted() { /** * 启动 * - * @param isDeamon 是否以守护线程方式启动,如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束 + * @param isDaemon 是否以守护线程方式启动,如果为true,则在调用{@link #stop()}方法后执行的定时任务立即结束,否则等待执行完毕才结束 * @return this */ - public Scheduler start(boolean isDeamon) { - this.daemon = isDeamon; + public Scheduler start(boolean isDaemon) { + this.daemon = isDaemon; return start(); } @@ -411,13 +438,14 @@ public Scheduler start(boolean isDeamon) { public Scheduler start() { lock.lock(); try { - if (this.started) { - throw new InstrumentException("Schedule is started!"); - } + checkStarted(); - this.threadExecutor = ExecutorBuilder.create().useSynchronousQueue().setThreadFactory(// - ThreadBuilder.create().setNamePrefix("exec-cron-").setDaemon(this.daemon).build()// - ).build(); + if (null == this.threadExecutor) { + // 无界线程池,确保每一个需要执行的线程都可以及时运行,同时复用已有线程避免线程重复创建 + this.threadExecutor = ExecutorBuilder.create().useSynchronousQueue().setThreadFactory(// + ThreadBuilder.create().setNamePrefix("exec-cron-").setDaemon(this.daemon).build()// + ).build(); + } this.supervisor = new Supervisor(this); this.manager = new Manager(this); @@ -478,4 +506,15 @@ public Scheduler stop(boolean clearTasks) { return this; } + /** + * 检查定时任务是否已经启动 + * + * @throws CrontabException 已经启动则抛出此异常 + */ + private void checkStarted() throws CrontabException { + if (this.started) { + throw new CrontabException("Scheduler already started!"); + } + } + } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Strategy.java b/bus-cron/src/main/java/org/aoju/bus/cron/Strategy.java index 070dafc3dd..4c1b7dab18 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Strategy.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Strategy.java @@ -29,7 +29,6 @@ * 任务执行规则 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Strategy { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/Supervisor.java b/bus-cron/src/main/java/org/aoju/bus/cron/Supervisor.java old mode 100755 new mode 100644 index 77036fafec..def447da78 --- a/bus-cron/src/main/java/org/aoju/bus/cron/Supervisor.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/Supervisor.java @@ -25,6 +25,7 @@ ********************************************************************************/ package org.aoju.bus.cron; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -32,16 +33,16 @@ * 作业启动管理器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class Supervisor { +public class Supervisor implements Serializable { - protected Scheduler scheduler; + private static final long serialVersionUID = 1L; /** * 启动器列表 */ - protected List launchers = new ArrayList<>(); + protected final List launchers = new ArrayList<>(); + protected Scheduler scheduler; public Supervisor(Scheduler scheduler) { this.scheduler = scheduler; @@ -58,6 +59,7 @@ protected Launcher spawnLauncher(long millis) { synchronized (this.launchers) { this.launchers.add(launcher); } + // 子线程是否为daemon线程取决于父线程,因此此处无需显示调用 this.scheduler.threadExecutor.execute(launcher); return launcher; } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/annotation/Crontab.java b/bus-cron/src/main/java/org/aoju/bus/cron/annotation/Crontab.java index 288fc63bde..3975c4c8bf 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/annotation/Crontab.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/annotation/Crontab.java @@ -33,7 +33,6 @@ * cron处理程序的注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @Target({ElementType.TYPE}) diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/annotation/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/annotation/package-info.java index 4d312942b8..1c191b9e42 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/annotation/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/annotation/package-info.java @@ -2,7 +2,6 @@ * 提供cron增强型注解 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.annotation; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/factory/CronTask.java b/bus-cron/src/main/java/org/aoju/bus/cron/factory/CronTask.java index 23b140870d..a3c138870a 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/factory/CronTask.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/factory/CronTask.java @@ -31,7 +31,6 @@ * 定时作业,除了定义了作业,也定义了作业的执行周期以及ID * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CronTask implements Task { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/factory/InvokeTask.java b/bus-cron/src/main/java/org/aoju/bus/cron/factory/InvokeTask.java old mode 100755 new mode 100644 index b9aad28908..446e496b07 --- a/bus-cron/src/main/java/org/aoju/bus/cron/factory/InvokeTask.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/factory/InvokeTask.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.cron.factory; +import org.aoju.bus.core.exception.CrontabException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.ReflectKit; import org.aoju.bus.core.toolkit.StringKit; @@ -39,19 +39,17 @@ * 如果是静态方法直接执行,如果是对象方法,需要类有默认的构造方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class InvokeTask implements Task { - private Class clazz; - private Object obj; - private Method method; + private final Object obj; + private final Method method; /** * 构造 * - * @param classNameWithMethodName 类名与方法名的字符串表示,方法名和类名使用#隔开或者.隔开 + * @param classNameWithMethodName 类名与方法名的字符串表示,方法名和类名使用#隔开或者.隔开 */ public InvokeTask(String classNameWithMethodName) { int splitIndex = classNameWithMethodName.lastIndexOf(Symbol.C_SHAPE); @@ -59,7 +57,7 @@ public InvokeTask(String classNameWithMethodName) { splitIndex = classNameWithMethodName.lastIndexOf(Symbol.C_DOT); } if (splitIndex <= 0) { - throw new InstrumentException("Invalid classNameWithMethodName [{}]!", classNameWithMethodName); + throw new CrontabException("Invalid classNameWithMethodName [{}]!", classNameWithMethodName); } // 类 @@ -67,18 +65,18 @@ public InvokeTask(String classNameWithMethodName) { if (StringKit.isBlank(className)) { throw new IllegalArgumentException("Class name is blank !"); } - this.clazz = ClassKit.loadClass(className); - if (null == this.clazz) { + final Class clazz = ClassKit.loadClass(className); + if (null == clazz) { throw new IllegalArgumentException("Load class with name of [" + className + "] fail !"); } - this.obj = ReflectKit.newInstanceIfPossible(this.clazz); + this.obj = ReflectKit.newInstanceIfPossible(clazz); // 方法 final String methodName = classNameWithMethodName.substring(splitIndex + 1); if (StringKit.isBlank(methodName)) { throw new IllegalArgumentException("Method name is blank !"); } - this.method = ClassKit.getPublicMethod(this.clazz, methodName); + this.method = ClassKit.getPublicMethod(clazz, methodName); if (null == this.method) { throw new IllegalArgumentException("No method with name of [" + methodName + "] !"); } @@ -87,9 +85,9 @@ public InvokeTask(String classNameWithMethodName) { @Override public void execute() { try { - ReflectKit.invoke(this.obj, this.method, new Object[]{}); - } catch (InstrumentException e) { - throw new InstrumentException(e.getCause()); + ReflectKit.invoke(this.obj, this.method); + } catch (CrontabException e) { + throw new CrontabException(e.getCause()); } } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/factory/RunnableTask.java b/bus-cron/src/main/java/org/aoju/bus/cron/factory/RunnableTask.java old mode 100755 new mode 100644 index e7d2a62ddc..ccddec0bb3 --- a/bus-cron/src/main/java/org/aoju/bus/cron/factory/RunnableTask.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/factory/RunnableTask.java @@ -29,12 +29,11 @@ * {@link Runnable} 的 {@link Task}包装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RunnableTask implements Task { - private Runnable runnable; + private final Runnable runnable; public RunnableTask(Runnable runnable) { this.runnable = runnable; diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/factory/Task.java b/bus-cron/src/main/java/org/aoju/bus/cron/factory/Task.java old mode 100755 new mode 100644 index 27f3c3f3c0..9634e94af0 --- a/bus-cron/src/main/java/org/aoju/bus/cron/factory/Task.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/factory/Task.java @@ -26,10 +26,14 @@ package org.aoju.bus.cron.factory; /** - * 定时作业接口,通过实现execute方法执行具体的任务 + * 定时作业接口,通过实现execute方法执行具体的任务 + *

+ * 作业执行是异步执行,即不同作业、相同作业在不同时间的执行是相互独立的 + * 假如前一个作业未完成,下一个调度开始,则不会等待前一个作业,直接执行 + * 关于作业的互斥,请自行加锁完成 + *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ @FunctionalInterface @@ -37,6 +41,8 @@ public interface Task { /** * 执行作业 + * 作业的具体实现需考虑异常情况,默认情况下任务异常在监听中统一监听处理,如果不加入监听,异常会被忽略 + * 因此最好自行捕获异常后处理 */ void execute(); diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/factory/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/factory/package-info.java index ff19213300..9c5005c8a6 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/factory/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/factory/package-info.java @@ -2,7 +2,6 @@ * 定时任务中作业的抽象封装和实现,包括Runnable实现和反射实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.factory; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/listener/SimpleTaskListener.java b/bus-cron/src/main/java/org/aoju/bus/cron/listener/SimpleTaskListener.java index dafade5347..d5ac41bc07 100755 --- a/bus-cron/src/main/java/org/aoju/bus/cron/listener/SimpleTaskListener.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/listener/SimpleTaskListener.java @@ -32,7 +32,6 @@ * 继承此监听后实现需要的方法即可 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SimpleTaskListener implements TaskListener { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListener.java b/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListener.java index 90d052b018..6aec2249f6 100755 --- a/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListener.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListener.java @@ -32,7 +32,6 @@ * 通过实现此接口,实现对定时任务的各个环节做监听 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface TaskListener { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListenerManager.java b/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListenerManager.java old mode 100755 new mode 100644 index 6eb0a8e8bc..778281d977 --- a/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListenerManager.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/listener/TaskListenerManager.java @@ -28,6 +28,7 @@ import org.aoju.bus.cron.Executor; import org.aoju.bus.logger.Logger; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -35,10 +36,11 @@ * 监听调度器,统一管理监听 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class TaskListenerManager { +public class TaskListenerManager implements Serializable { + + private static final long serialVersionUID = 1L; private final List listeners = new ArrayList<>(); @@ -75,7 +77,9 @@ public TaskListenerManager removeListener(TaskListener listener) { */ public void notifyTaskStart(Executor executor) { synchronized (listeners) { - for (TaskListener listener : listeners) { + TaskListener listener; + for (TaskListener taskListener : listeners) { + listener = taskListener; if (null != listener) { listener.onStart(executor); } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/listener/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/listener/package-info.java index 46ade27eb4..cd9d4c30c8 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/listener/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/listener/package-info.java @@ -2,7 +2,6 @@ * 定时任务执行监听接口及部分实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.listener; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/package-info.java index 00a9b06341..7a0b3ad0a1 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/package-info.java @@ -2,7 +2,6 @@ * 定时任务模块,提供类Crontab表达式的定时任务,实现参考了Cron4j,同时可以支持秒级别的定时任务定义和年的定义(同时兼容Crontab、Cron4j、Quartz表达式) * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronBuilder.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronBuilder.java new file mode 100644 index 0000000000..bd76f5b5c9 --- /dev/null +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronBuilder.java @@ -0,0 +1,113 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.cron.pattern; + +import org.aoju.bus.core.builder.Builder; +import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.Symbol; +import org.aoju.bus.core.text.TextJoiner; +import org.aoju.bus.core.toolkit.ArrayKit; +import org.aoju.bus.core.toolkit.StringKit; + +/** + * 定时任务表达式构建器 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class CronBuilder implements Builder { + + private static final long serialVersionUID = 1L; + + final String[] parts = new String[7]; + + /** + * 创建构建器 + * + * @return CronPatternBuilder + */ + public static CronBuilder of() { + return new CronBuilder(); + } + + /** + * 设置值 + * + * @param part 部分,如秒、分、时等 + * @param values 时间值列表 + * @return this + */ + public CronBuilder setValues(Part part, int... values) { + for (int value : values) { + part.checkValue(value); + } + return set(part, ArrayKit.join(values, ",")); + } + + /** + * 设置区间 + * + * @param part 部分,如秒、分、时等 + * @param begin 起始值 + * @param end 结束值 + * @return this + */ + public CronBuilder setRange(Part part, int begin, int end) { + Assert.notNull(part); + part.checkValue(begin); + part.checkValue(end); + return set(part, StringKit.format("{}-{}", begin, end)); + } + + /** + * 设置对应部分的定时任务值 + * + * @param part 部分,如秒、分、时等 + * @param value 表达式值,如"*"、"1,2"、"5-12"等 + * @return this + */ + public CronBuilder set(Part part, String value) { + parts[part.ordinal()] = value; + return this; + } + + @Override + public String build() { + for (int i = Part.MINUTE.ordinal(); i < Part.YEAR.ordinal(); i++) { + // 从分到周,用户未设置使用默认值 + // 秒和年如果不设置,忽略之 + if (StringKit.isBlank(parts[i])) { + parts[i] = "*"; + } + } + + return TextJoiner.of(Symbol.SPACE) + .setNullMode(TextJoiner.NullMode.IGNORE) + .append(this.parts) + .toString(); + } + +} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronPattern.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronPattern.java old mode 100755 new mode 100644 index 196d78efb7..9f58be4ca5 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronPattern.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/CronPattern.java @@ -25,13 +25,15 @@ ********************************************************************************/ package org.aoju.bus.cron.pattern; +import org.aoju.bus.core.date.Almanac; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.toolkit.CollKit; import org.aoju.bus.core.toolkit.DateKit; -import org.aoju.bus.cron.pattern.matcher.MatcherTable; -import org.aoju.bus.cron.pattern.parser.CronPatternParser; +import org.aoju.bus.cron.pattern.matcher.PatternMatcher; +import org.aoju.bus.cron.pattern.parser.PatternParser; +import java.time.LocalDateTime; import java.util.*; /** @@ -89,13 +91,12 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CronPattern { private final String pattern; - private final MatcherTable matcherTable; + private final List matchers; /** * 构造 @@ -104,7 +105,55 @@ public class CronPattern { */ public CronPattern(String pattern) { this.pattern = pattern; - this.matcherTable = CronPatternParser.parse(pattern); + this.matchers = PatternParser.parse(pattern); + } + + /** + * 解析表达式为 CronPattern + * + * @param pattern 表达式 + * @return this + */ + public static CronPattern of(String pattern) { + return new CronPattern(pattern); + } + + /** + * 获取处理后的字段列表 + * 月份从1开始,周从0开始 + * + * @param calendar {@link Calendar} + * @param isMatchSecond 是否匹配秒,{@link false}则秒返回-1 + * @return 字段值列表 + */ + private static int[] getFields(Calendar calendar, boolean isMatchSecond) { + final int second = isMatchSecond ? calendar.get(Calendar.SECOND) : -1; + final int minute = calendar.get(Calendar.MINUTE); + final int hour = calendar.get(Calendar.HOUR_OF_DAY); + final int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); + final int month = calendar.get(Calendar.MONTH) + 1;// 月份从1开始 + final int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 星期从1开始,1都表示周日 + final int year = calendar.get(Calendar.YEAR); + return new int[]{second, minute, hour, dayOfMonth, month, dayOfWeek, year}; + } + + /** + * 获取处理后的字段列表 + * 月份从1开始,周从0开始 + * + * @param dateTime {@link Calendar} + * @param isMatchSecond 是否匹配秒,{@link false}则秒返回-1 + * @return 字段值列表 + */ + static int[] getFields(LocalDateTime dateTime, boolean isMatchSecond) { + final int second = isMatchSecond ? dateTime.getSecond() : -1; + final int minute = dateTime.getMinute(); + final int hour = dateTime.getHour(); + final int dayOfMonth = dateTime.getDayOfMonth(); + final int month = dateTime.getMonthValue();// 月份从1开始 + final int dayOfWeek = Fields.Week.getByCode(dateTime.getDayOfWeek().getValue()).getKey() - 1; // 星期从1开始,1表示周日 + final int year = dateTime.getYear(); + return new int[]{second, minute, hour, dayOfMonth, month, dayOfWeek, year}; } /** @@ -222,16 +271,66 @@ public boolean match(TimeZone timezone, long millis, boolean isMatchSecond) { * @param isMatchSecond 是否匹配秒 * @return 如果匹配返回 {@code true}, 否则返回 {@code false} */ - public boolean match(GregorianCalendar calendar, boolean isMatchSecond) { - final int second = isMatchSecond ? calendar.get(Calendar.SECOND) : -1; - final int minute = calendar.get(Calendar.MINUTE); - final int hour = calendar.get(Calendar.HOUR_OF_DAY); - final int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); - final int month = calendar.get(Calendar.MONTH) + 1;// 月份从1开始 - final int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 星期从0开始,0和7都表示周日 - final int year = calendar.get(Calendar.YEAR); + public boolean match(Calendar calendar, boolean isMatchSecond) { + return match(getFields(calendar, isMatchSecond)); + } + + /** + * 给定时间是否匹配定时任务表达式 + * + * @param fields 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + */ + private boolean match(int[] fields) { + for (PatternMatcher matcher : matchers) { + if (matcher.match(fields)) { + return true; + } + } + return false; + } + + /** + * 给定时间是否匹配定时任务表达式 + * + * @param dateTime 时间 + * @param isMatchSecond 是否匹配秒 + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + */ + public boolean match(LocalDateTime dateTime, boolean isMatchSecond) { + return match(getFields(dateTime, isMatchSecond)); + } + + /** + * 返回匹配到的下一个时间 + * + * @param calendar 时间 + * @return 匹配到的下一个时间 + */ + public Calendar nextMatchAfter(Calendar calendar) { + Calendar next = nextMatchAfter(getFields(calendar, true), calendar.getTimeZone()); + if (false == match(next, true)) { + next.set(Calendar.DAY_OF_MONTH, next.get(Calendar.DAY_OF_MONTH) + 1); + next = Almanac.beginOfDay(next); + return nextMatchAfter(next); + } + return next; + } - return this.matcherTable.match(second, minute, hour, dayOfMonth, month, dayOfWeek, year); + /** + * 获取下一个最近的匹配日期时间 + * + * @param values 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} + * @param zone 时区 + * @return {@link Calendar},毫秒数为0 + */ + private Calendar nextMatchAfter(int[] values, TimeZone zone) { + final List nextMatches = new ArrayList<>(matchers.size()); + for (PatternMatcher matcher : matchers) { + nextMatches.add(matcher.nextMatchAfter(values, zone)); + } + // 返回匹配到的最早日期 + return CollKit.min(nextMatches); } @Override diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/Part.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/Part.java new file mode 100644 index 0000000000..20970476b8 --- /dev/null +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/Part.java @@ -0,0 +1,129 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.cron.pattern; + +import org.aoju.bus.core.exception.CrontabException; +import org.aoju.bus.core.lang.Assert; +import org.aoju.bus.core.lang.Fields; + +import java.util.Calendar; + +/** + * 表达式各个部分的枚举,用于限定在表达式中的位置和规则(如最小值和最大值)
+ * {@link #ordinal()}表示此部分在表达式中的位置,如0表示秒
+ * 表达式各个部分的枚举位置为: + *
+ *         0       1    2        3         4       5         6
+ *     [SECOND] MINUTE HOUR DAY_OF_MONTH MONTH DAY_OF_WEEK [YEAR]
+ * 
+ * + * @author Kimi Liu + * @since Java 17+ + */ +public enum Part { + SECOND(Calendar.SECOND, 0, 59), + MINUTE(Calendar.MINUTE, 0, 59), + HOUR(Calendar.HOUR_OF_DAY, 0, 23), + DAY_OF_MONTH(Calendar.DAY_OF_MONTH, 1, 31), + MONTH(Calendar.MONTH, Fields.Month.Jan.getKey(), Fields.Month.Dec.getKey()), + DAY_OF_WEEK(Calendar.DAY_OF_WEEK, Fields.Week.Sun.getKey(), Fields.Week.Sat.getKey()), + YEAR(Calendar.YEAR, 1970, 2099); + + private static final Part[] ENUMS = Part.values(); + + private final int calendarField; + private final int min; + private final int max; + + /** + * 构造 + * + * @param calendarField Calendar中对应字段项 + * @param min 限定最小值(包含) + * @param max 限定最大值(包含) + */ + Part(int calendarField, int min, int max) { + this.calendarField = calendarField; + if (min > max) { + this.min = max; + this.max = min; + } else { + this.min = min; + this.max = max; + } + } + + /** + * 根据位置获取Part + * + * @param i 位置,从0开始 + * @return Part + */ + public static Part of(int i) { + return ENUMS[i]; + } + + /** + * 获取Calendar中对应字段项 + * + * @return Calendar中对应字段项 + */ + public int getCalendarField() { + return this.calendarField; + } + + /** + * 获取最小值 + * + * @return 最小值 + */ + public int getMin() { + return this.min; + } + + /** + * 获取最大值 + * + * @return 最大值 + */ + public int getMax() { + return this.max; + } + + /** + * 检查单个值是否有效 + * + * @param value 值 + * @return 检查后的值 + * @throws CrontabException 检查无效抛出此异常 + */ + public int checkValue(int value) throws CrontabException { + Assert.checkBetween(value, min, max, + () -> new CrontabException("Value {} out of range: [{} , {}]", value, min, max)); + return value; + } + +} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueValueMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueMatcher.java old mode 100755 new mode 100644 similarity index 92% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueValueMatcher.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueMatcher.java index 0bb4147237..65b2687b7f --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueValueMatcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/AlwaysTrueMatcher.java @@ -28,15 +28,14 @@ import org.aoju.bus.core.toolkit.StringKit; /** - * 值匹配,始终返回true + * 所有值匹配,始终返回{@code true} * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class AlwaysTrueValueMatcher implements ValueMatcher { +public class AlwaysTrueMatcher implements PartMatcher { - public static AlwaysTrueValueMatcher INSTANCE = new AlwaysTrueValueMatcher(); + public static AlwaysTrueMatcher INSTANCE = new AlwaysTrueMatcher(); @Override public boolean match(Integer t) { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayValueMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayMatcher.java old mode 100755 new mode 100644 similarity index 85% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayValueMatcher.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayMatcher.java index 75da732a8b..e5c157b4e6 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayValueMatcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/BoolArrayMatcher.java @@ -33,47 +33,48 @@ import java.util.List; /** - * 将表达式中的数字值列表转换为Boolean数组,匹配时匹配相应数组位 + * 将表达式中的数字值列表转换为Boolean数组,匹配时匹配相应数组位 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class BoolArrayValueMatcher implements ValueMatcher { +public class BoolArrayMatcher implements PartMatcher { /** * 用户定义此字段的最小值 */ private final int minValue; + private final boolean[] bValues; + /** - * 数组值 + * 构造 + * + * @param intValueList 匹配值列表 */ - private final boolean[] values; - - public BoolArrayValueMatcher(List intValueList) { + public BoolArrayMatcher(List intValueList) { Assert.isTrue(CollKit.isNotEmpty(intValueList), "Values must be not empty!"); - values = new boolean[Collections.max(intValueList) + 1]; + bValues = new boolean[Collections.max(intValueList) + 1]; int min = Integer.MAX_VALUE; for (Integer value : intValueList) { min = Math.min(min, value); - values[value] = true; + bValues[value] = true; } this.minValue = min; } @Override public boolean match(Integer value) { - if (null == value || value >= values.length) { + if (null == value || value >= bValues.length) { return false; } - return values[value]; + return bValues[value]; } @Override public int nextAfter(int value) { if (value > minValue) { - while (value < values.length) { - if (values[value]) { + while (value < bValues.length) { + if (bValues[value]) { return value; } value++; @@ -97,7 +98,7 @@ public int getMinValue() { @Override public String toString() { - return StringKit.format("Matcher:{}", new Object[]{this.values}); + return StringKit.format("Matcher:{}", new Object[]{this.bValues}); } } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DateTimeMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DateTimeMatcher.java deleted file mode 100644 index 075207b95e..0000000000 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DateTimeMatcher.java +++ /dev/null @@ -1,122 +0,0 @@ -/********************************************************************************* - * * - * The MIT License (MIT) * - * * - * Copyright (c) 2015-2022 aoju.org and other contributors. * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * - * THE SOFTWARE. * - * * - ********************************************************************************/ -package org.aoju.bus.cron.pattern.matcher; - -import java.time.Year; - -/** - * 日期和时间的单一匹配器 - * - * @author Kimi Liu - * @version 6.5.0 - * @since Java 17+ - */ -public class DateTimeMatcher { - - /** - * 秒字段匹配列表 - */ - final ValueMatcher secondMatcher; - /** - * 分字段匹配列表 - */ - final ValueMatcher minuteMatcher; - /** - * 时字段匹配列表 - */ - final ValueMatcher hourMatcher; - /** - * 每月几号字段匹配列表 - */ - final ValueMatcher dayOfMonthMatcher; - /** - * 月字段匹配列表 - */ - final ValueMatcher monthMatcher; - /** - * 星期字段匹配列表 - */ - final ValueMatcher dayOfWeekMatcher; - /** - * 年字段匹配列表 - */ - final ValueMatcher yearMatcher; - - public DateTimeMatcher(ValueMatcher secondMatcher, - ValueMatcher minuteMatcher, - ValueMatcher hourMatchers, - ValueMatcher dayOfMonthMatchers, - ValueMatcher monthMatchers, - ValueMatcher dayOfWeekMatchers, - ValueMatcher yearMatchers) { - - this.secondMatcher = secondMatcher; - this.minuteMatcher = minuteMatcher; - this.hourMatcher = hourMatchers; - this.dayOfMonthMatcher = dayOfMonthMatchers; - this.monthMatcher = monthMatchers; - this.dayOfWeekMatcher = dayOfWeekMatchers; - this.yearMatcher = yearMatchers; - } - - /** - * 是否匹配日(指定月份的第几天) - * - * @param matcher {@link ValueMatcher} - * @param dayOfMonth 日 - * @param month 月 - * @param isLeapYear 是否闰年 - * @return 是否匹配 - */ - private static boolean isMatchDayOfMonth(ValueMatcher matcher, int dayOfMonth, int month, boolean isLeapYear) { - return ((matcher instanceof DayOfMonthValueMatcher) // - ? ((DayOfMonthValueMatcher) matcher).match(dayOfMonth, month, isLeapYear) // - : matcher.match(dayOfMonth)); - } - - /** - * 给定时间是否匹配定时任务表达式 - * - * @param second 秒数,-1表示不匹配此项 - * @param minute 分钟 - * @param hour 小时 - * @param dayOfMonth 天 - * @param month 月 - * @param dayOfWeek 周几 - * @param year 年 - * @return 如果匹配返回 {@code true}, 否则返回 {@code false} - */ - public boolean match(int second, int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year) { - return ((second < 0) || secondMatcher.match(second)) // 匹配秒(非秒匹配模式下始终返回true) - && minuteMatcher.match(minute)// 匹配分 - && hourMatcher.match(hour)// 匹配时 - && isMatchDayOfMonth(dayOfMonthMatcher, dayOfMonth, month, Year.isLeap(year))// 匹配日 - && monthMatcher.match(month) // 匹配月 - && dayOfWeekMatcher.match(dayOfWeek)// 匹配周 - && yearMatcher.match(year);// 匹配年 - } - -} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthValueMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthMatcher.java old mode 100755 new mode 100644 similarity index 83% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthValueMatcher.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthMatcher.java index 4b8e7b7e6b..fdcd73cd35 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthValueMatcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/DayOfMonthMatcher.java @@ -26,26 +26,24 @@ package org.aoju.bus.cron.pattern.matcher; import org.aoju.bus.core.lang.Fields; -import org.aoju.bus.core.lang.Normal; import java.util.List; /** * 每月第几天匹配 - * 考虑每月的天数不同,切存在闰年情况,日匹配单独使用 + * 考虑每月的天数不同,且存在闰年情况,日匹配单独使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class DayOfMonthValueMatcher extends BoolArrayValueMatcher { +public class DayOfMonthMatcher extends BoolArrayMatcher { /** * 构造 * * @param intValueList 匹配的日值 */ - public DayOfMonthValueMatcher(List intValueList) { + public DayOfMonthMatcher(List intValueList) { super(intValueList); } @@ -57,25 +55,26 @@ public DayOfMonthValueMatcher(List intValueList) { * * * @param value 被检查的值 - * @param month 月份 + * @param month 月份,从1开始 * @param isLeapYear 是否闰年 * @return 是否为本月最后一天 */ private static boolean isLastDayOfMonth(int value, int month, boolean isLeapYear) { - return value == Fields.Month.getLastDay(month, isLeapYear); + return value == Fields.Month.getLastDay(month - 1, isLeapYear); } /** * 给定的日期是否匹配当前匹配器 * * @param value 被检查的值,此处为日 - * @param month 实际的月份 + * @param month 实际的月份,从1开始 * @param isLeapYear 是否闰年 * @return 是否匹配 */ public boolean match(int value, int month, boolean isLeapYear) { - return (super.match(value) - || (value > 27 && match(Normal._32) && isLastDayOfMonth(value, month, isLeapYear))); + return (super.match(value) // 在约定日范围内的某一天 + // 匹配器中用户定义了最后一天(31表示最后一天) + || (value > 27 && match(31) && isLastDayOfMonth(value, month, isLeapYear))); } } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PartMatcher.java old mode 100755 new mode 100644 similarity index 96% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcher.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PartMatcher.java index 4725392dad..7da829f141 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PartMatcher.java @@ -28,14 +28,13 @@ import org.aoju.bus.core.lang.Matcher; /** - * 值匹配器 + * 表达式中的某个位置部分匹配器 * 用于匹配日期位中对应数字是否匹配 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public interface ValueMatcher extends Matcher { +public interface PartMatcher extends Matcher { /** * 获取指定值之后的匹配值,也可以是指定值本身 diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PatternMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PatternMatcher.java new file mode 100644 index 0000000000..63e888aa34 --- /dev/null +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/PatternMatcher.java @@ -0,0 +1,305 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.cron.pattern.matcher; + +import org.aoju.bus.cron.pattern.Part; + +import java.time.Year; +import java.util.Calendar; +import java.util.TimeZone; + +/** + * 单一表达式的匹配器,匹配器由7个{@link PartMatcher}组成,分别是: + *
+ *         0      1     2        3         4       5        6
+ *      SECOND MINUTE HOUR DAY_OF_MONTH MONTH DAY_OF_WEEK YEAR
+ * 
+ * + * @author Kimi Liu + * @since Java 17+ + */ +public class PatternMatcher { + + private final PartMatcher[] matchers; + + /** + * 构造 + * + * @param secondMatcher 秒匹配器 + * @param minuteMatcher 分匹配器 + * @param hourMatcher 时匹配器 + * @param dayOfMonthMatcher 日匹配器 + * @param monthMatcher 月匹配器 + * @param dayOfWeekMatcher 周匹配器 + * @param yearMatcher 年匹配器 + */ + public PatternMatcher(PartMatcher secondMatcher, + PartMatcher minuteMatcher, + PartMatcher hourMatcher, + PartMatcher dayOfMonthMatcher, + PartMatcher monthMatcher, + PartMatcher dayOfWeekMatcher, + PartMatcher yearMatcher) { + + matchers = new PartMatcher[]{ + secondMatcher, + minuteMatcher, + hourMatcher, + dayOfMonthMatcher, + monthMatcher, + dayOfWeekMatcher, + yearMatcher + }; + } + + /** + * 是否匹配日(指定月份的第几天) + * + * @param matcher {@link PartMatcher} + * @param dayOfMonth 日 + * @param month 月 + * @param isLeapYear 是否闰年 + * @return 是否匹配 + */ + private static boolean isMatchDayOfMonth(PartMatcher matcher, int dayOfMonth, int month, boolean isLeapYear) { + return ((matcher instanceof DayOfMonthMatcher) + ? ((DayOfMonthMatcher) matcher).match(dayOfMonth, month, isLeapYear) + : matcher.match(dayOfMonth)); + } + + /** + * 根据表达式位置,获取对应的{@link PartMatcher} + * + * @param part 表达式位置 + * @return {@link PartMatcher} + */ + public PartMatcher get(Part part) { + return matchers[part.ordinal()]; + } + + /** + * 给定时间是否匹配定时任务表达式 + * + * @param fields 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + */ + public boolean match(int[] fields) { + return match(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6]); + } + + /** + * 给定周的值是否匹配定时任务表达式对应部分 + * + * @param dayOfWeekValue dayOfMonth值,星期从0开始,0和7都表示周日 + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + */ + public boolean matchWeek(int dayOfWeekValue) { + return matchers[5].match(dayOfWeekValue); + } + + /** + * 给定时间是否匹配定时任务表达式 + * + * @param second 秒数,-1表示不匹配此项 + * @param minute 分钟 + * @param hour 小时 + * @param dayOfMonth 天 + * @param month 月,从1开始 + * @param dayOfWeek 周,从0开始,0和7都表示周日 + * @param year 年 + * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + */ + private boolean match(int second, int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year) { + return ((second < 0) || matchers[0].match(second)) // 匹配秒(非秒匹配模式下始终返回true) + && matchers[1].match(minute)// 匹配分 + && matchers[2].match(hour)// 匹配时 + && isMatchDayOfMonth(matchers[3], dayOfMonth, month, Year.isLeap(year))// 匹配日 + && matchers[4].match(month) // 匹配月 + && matchers[5].match(dayOfWeek)// 匹配周 + && matchers[6].match(year);// 匹配年 + } + + /** + * 获取下一个匹配日期时间 + * 获取方法是,先从年开始查找对应部分的下一个值: + *
    + *
  • 如果此部分下个值不变,获取下一个部分
  • + *
  • 如果此部分下个值大于给定值,以下所有值置为最小值
  • + *
  • 如果此部分下个值小于给定值,回退到上一个值获取下一个新值,之后的值置为最小值
  • + *
+ * + *
+     *        秒 分 时 日 月 周 年
+     *     下 <-----------------> 上
+     * 
+ * + * @param values 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} + * @param zone 时区 + * @return {@link Calendar},毫秒数为0 + */ + public Calendar nextMatchAfter(int[] values, TimeZone zone) { + final Calendar calendar = Calendar.getInstance(zone); + calendar.set(Calendar.MILLISECOND, 0); + + final int[] newValues = nextMatchValuesAfter(values); + for (int i = 0; i < newValues.length; i++) { + // 周无需设置 + if (i != Part.DAY_OF_WEEK.ordinal()) { + setValue(calendar, Part.of(i), newValues[i]); + } + } + + return calendar; + } + + /** + * 获取下一个匹配日期时间 + * 获取方法是,先从年开始查找对应部分的下一个值: + *
    + *
  • 如果此部分下个值不变,获取下一个部分
  • + *
  • 如果此部分下个值大于给定值,以下所有值置为最小值
  • + *
  • 如果此部分下个值小于给定值,回退到上一个值获取下一个新值,之后的值置为最小值
  • + *
+ * + *
+     *        秒 分 时 日 月 周 年
+     *     下 <-----------------> 上
+     * 
+ * + * @param values 时间字段值,{second, minute, hour, dayOfMonth, month, dayOfWeek, year} + * @return {@link Calendar},毫秒数为0 + */ + private int[] nextMatchValuesAfter(int[] values) { + final int[] newValues = values.clone(); + + int i = Part.YEAR.ordinal(); + // 新值,-1表示标识为回退 + int nextValue = 0; + while (i >= 0) { + if (i == Part.DAY_OF_WEEK.ordinal()) { + // 周不参与计算 + i--; + continue; + } + nextValue = matchers[i].nextAfter(values[i]); + if (nextValue > values[i]) { + // 此部分正常获取新值,结束循环,后续的部分置最小值 + newValues[i] = nextValue; + i--; + break; + } else if (nextValue < values[i]) { + // 此部分下一个值获取到的值产生回退,回到上一个部分,继续获取新值 + i++; + nextValue = -1;// 标记回退查找 + break; + } + // 值不变,检查下一个部分 + i--; + } + + // 值产生回退,向上查找变更值 + if (-1 == nextValue) { + while (i <= Part.YEAR.ordinal()) { + if (i == Part.DAY_OF_WEEK.ordinal()) { + // 周不参与计算 + i++; + continue; + } + nextValue = matchers[i].nextAfter(values[i] + 1); + if (nextValue > values[i]) { + newValues[i] = nextValue; + i--; + break; + } + i++; + } + } + + // 修改值以下的字段全部归最小值 + setToMin(newValues, i); + return newValues; + } + + /** + * 设置从{@link Part#SECOND}到指定部分,全部设置为最小值 + * + * @param values 值数组 + * @param toPart 截止的部分 + */ + private void setToMin(int[] values, int toPart) { + Part part; + for (int i = 0; i <= toPart; i++) { + part = Part.of(i); + values[i] = getMin(part); + } + } + + /** + * 获取表达式部分的最小值 + * + * @param part {@link Part} + * @return 最小值,如果匹配所有,返回对应部分范围的最小值 + */ + private int getMin(Part part) { + PartMatcher matcher = get(part); + + int min; + if (matcher instanceof AlwaysTrueMatcher) { + min = part.getMin(); + } else if (matcher instanceof BoolArrayMatcher) { + min = ((BoolArrayMatcher) matcher).getMinValue(); + } else { + throw new IllegalArgumentException("Invalid matcher: " + matcher.getClass().getName()); + } + return min; + } + + /** + * 设置对应部分修正后的值 + *
    + *
  • 月在表达式中从1开始,但是{@link Calendar}中是从0开始的,需要-1
  • + *
  • 周在表达式中从0开始(0表示周日),但是{@link Calendar}中是从1开始的(1表示周日),需要+1
  • + *
+ * + * @param calendar {@link Calendar} + * @param part 表达式部分 + * @param value 值 + * @return {@link Calendar} + */ + private Calendar setValue(Calendar calendar, Part part, int value) { + switch (part) { + case MONTH: + value -= 1; + break; + case DAY_OF_WEEK: + value += 1; + break; + } + calendar.set(part.getCalendarField(), value); + return calendar; + } + +} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcherBuilder.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcherBuilder.java deleted file mode 100755 index 2b9867f29d..0000000000 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/ValueMatcherBuilder.java +++ /dev/null @@ -1,229 +0,0 @@ -/********************************************************************************* - * * - * The MIT License (MIT) * - * * - * Copyright (c) 2015-2022 aoju.org and other contributors. * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * - * THE SOFTWARE. * - * * - ********************************************************************************/ -package org.aoju.bus.cron.pattern.matcher; - -import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; -import org.aoju.bus.core.toolkit.CollKit; -import org.aoju.bus.core.toolkit.MathKit; -import org.aoju.bus.core.toolkit.StringKit; -import org.aoju.bus.cron.pattern.parser.DayOfMonthValueParser; -import org.aoju.bus.cron.pattern.parser.ValueParser; -import org.aoju.bus.cron.pattern.parser.YearValueParser; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link ValueMatcher} 构建器,用于构建表达式中每一项的匹配器 - * - * @author Kimi Liu - * @version 6.5.0 - * @since Java 17+ - */ -public class ValueMatcherBuilder { - - /** - * 处理定时任务表达式每个时间字段 - * 多个时间使用逗号分隔 - * - * @param value 某个时间字段 - * @param parser 针对这个时间字段的解析器 - * @return the list - */ - public static ValueMatcher build(String value, ValueParser parser) { - if (isMatchAllStr(value)) { - // 兼容Quartz的"?"表达式,不会出现互斥情况,与"*"作用相同 - return new AlwaysTrueValueMatcher(); - } - - List values = parseArray(value, parser); - if (values.size() == 0) { - throw new InstrumentException("Invalid field: [{}]", value); - } - - if (parser instanceof DayOfMonthValueParser) { - // 考虑每月的天数不同,且存在闰年情况,日匹配单独使用 - return new DayOfMonthValueMatcher(values); - } else if (parser instanceof YearValueParser) { - // 考虑年数字太大,不适合boolean数组,单独使用列表遍历匹配 - return new YearValueMatcher(values); - } else { - return new BoolArrayValueMatcher(values); - } - } - - /** - * 处理数组形式表达式 - * 处理的形式包括: - *
    - *
  • a*
  • - *
  • a,b,c,d
  • - *
- * - * @param value 子表达式值 - * @param parser 针对这个字段的解析器 - * @return the list - */ - private static List parseArray(String value, ValueParser parser) { - final List values = new ArrayList<>(); - - final List parts = StringKit.split(value, Symbol.C_COMMA); - for (String part : parts) { - CollKit.addAllIfNotContains(values, parseStep(part, parser)); - } - return values; - } - - /** - * 处理间隔形式的表达式 - * 处理的形式包括: - *
    - *
  • a*
  • - *
  • a/b*/b
  • - *
  • a-b/2
  • - *
- * - * @param value 表达式值 - * @param parser 针对这个时间字段的解析器 - * @return the list - */ - private static List parseStep(String value, ValueParser parser) { - final List parts = StringKit.split(value, Symbol.C_SLASH); - int size = parts.size(); - - List results; - if (size == 1) {// 普通形式 - results = parseRange(value, -1, parser); - } else if (size == 2) {// 间隔形式 - final int step = parser.parse(parts.get(1)); - if (step < 1) { - throw new InstrumentException("Non positive divisor for field: [{}]", value); - } - results = parseRange(parts.get(0), step, parser); - } else { - throw new InstrumentException("Invalid syntax of field: [{}]", value); - } - return results; - } - - /** - * 处理表达式中范围表达式 处理的形式包括: - *
    - *
  • *
  • - *
  • 2
  • - *
  • 3-8
  • - *
  • 8-3
  • - *
  • 3-3
  • - *
- * - * @param value 范围表达式 - * @param step 步进 - * @param parser 针对这个时间字段的解析器 - * @return the list - */ - private static List parseRange(String value, int step, ValueParser parser) { - final List results = new ArrayList<>(); - - // 全部匹配形式 - if (value.length() <= 2) { - // 根据步进的第一个数字确定起始时间,类似于 12/3则从12(秒、分等)开始 - int minValue = parser.getMin(); - if (false == isMatchAllStr(value)) { - try { - minValue = Math.max(minValue, Integer.parseInt(value)); - } catch (NumberFormatException e) { - throw new InstrumentException("Invalid field value: [{}]", value); - } - } else { - // 在全匹配模式下,如果步进不存在,表示步进为1 - if (step < 1) { - step = 1; - } - } - if (step > 0) { - final int maxValue = parser.getMax(); - if (minValue > maxValue) { - throw new InstrumentException("Invalid value {} > {}", minValue, maxValue); - } - // 有步进 - for (int i = minValue; i <= maxValue; i += step) { - results.add(i); - } - } else { - // 固定时间 - results.add(minValue); - } - return results; - } - - // Range模式 - List parts = StringKit.split(value, Symbol.C_MINUS); - int size = parts.size(); - if (size == 1) {// 普通值 - final int v1 = parser.parse(value); - if (step > 0) {// 类似 20/2的形式 - MathKit.appendRange(v1, parser.getMax(), step, results); - } else { - results.add(v1); - } - } else if (size == 2) {// range值 - final int v1 = parser.parse(parts.get(0)); - final int v2 = parser.parse(parts.get(1)); - if (step < 1) { - // 在range模式下,如果步进不存在,表示步进为1 - step = 1; - } - if (v1 < v2) {// 正常范围,例如:2-5 - MathKit.appendRange(v1, v2, step, results); - } else if (v1 > v2) {// 逆向范围,反选模式,例如:5-2 - MathKit.appendRange(v1, parser.getMax(), step, results); - MathKit.appendRange(parser.getMin(), v2, step, results); - } else {// v1 == v2,此时与单值模式一致 - if (step > 0) {// 类似 20/2的形式 - MathKit.appendRange(v1, parser.getMax(), step, results); - } else { - results.add(v1); - } - } - } else { - throw new InstrumentException("Invalid syntax of field: [{}]", value); - } - return results; - } - - /** - * 是否为全匹配符 - * 全匹配符指 * 或者 ? - * - * @param value 被检查的值 - * @return 是否为全匹配符 - */ - private static boolean isMatchAllStr(String value) { - return (1 == value.length()) && (Symbol.STAR.equals(value) || Symbol.QUESTION_MARK.equals(value)); - } - -} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/YearValueMatcher.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/YearValueMatcher.java old mode 100755 new mode 100644 index 8291f84304..fb9e068e9f --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/YearValueMatcher.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/YearValueMatcher.java @@ -25,30 +25,22 @@ ********************************************************************************/ package org.aoju.bus.cron.pattern.matcher; -import java.util.List; +import java.util.Collection; +import java.util.LinkedHashSet; /** * 年匹配 - * 考虑年数字太大,不适合boolean数组,单独使用列表遍历匹配 + * 考虑年数字太大,不适合boolean数组,单独使用{@link LinkedHashSet}匹配 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class YearValueMatcher implements ValueMatcher { +public class YearValueMatcher implements PartMatcher { - /** - * 值列表 - */ - private List list; + private final LinkedHashSet list; - /** - * 构造 - * - * @param list 列表年份 - */ - public YearValueMatcher(List list) { - this.list = list; + public YearValueMatcher(Collection list) { + this.list = new LinkedHashSet<>(list); } @Override diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/package-info.java index 935435bf85..7f91365cdb 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/package-info.java @@ -2,7 +2,6 @@ * 定时任务表达式匹配器,内部使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.pattern.matcher; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/package-info.java index b57016f7d5..d5b78907c6 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/package-info.java @@ -2,7 +2,6 @@ * 定时任务表达式解析,核心为CronPattern * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.pattern; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/AbstractValueParser.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PartParser.java similarity index 57% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/AbstractValueParser.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PartParser.java index bab97c3ece..a3bb35f900 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/AbstractValueParser.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PartParser.java @@ -25,51 +25,56 @@ ********************************************************************************/ package org.aoju.bus.cron.pattern.parser; +import org.aoju.bus.core.exception.CrontabException; +import org.aoju.bus.core.lang.Fields; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.CrontabException; import org.aoju.bus.core.toolkit.CollKit; import org.aoju.bus.core.toolkit.MathKit; import org.aoju.bus.core.toolkit.StringKit; -import org.aoju.bus.cron.pattern.matcher.AlwaysTrueValueMatcher; -import org.aoju.bus.cron.pattern.matcher.BoolArrayValueMatcher; -import org.aoju.bus.cron.pattern.matcher.ValueMatcher; +import org.aoju.bus.cron.pattern.Part; +import org.aoju.bus.cron.pattern.matcher.*; import java.util.ArrayList; import java.util.List; /** - * 简易值转换器将给定String值转为int,并限定最大值和最小值 - * 此类同时识别{@code L} 为最大值 + * 定时任务表达式各个部分的解析器,根据{@link Part}指定不同部分,解析为{@link PartMatcher} + * 每个部分支持: + *
    + *
  • * :表示匹配这个位置所有的时间
  • + *
  • ? :表示匹配这个位置任意的时间(与"*"作用一致)
  • + *
  • L :表示匹配这个位置允许的最大值
  • + *
  • */2 :表示间隔时间,例如在分上,表示每两分钟,同样*可以使用数字列表代替,逗号分隔
  • + *
  • 2-8 :表示连续区间,例如在分上,表示2,3,4,5,6,7,8分
  • + *
  • 2,3,5,8 :表示列表
  • + *
  • wed :表示周别名
  • + *
  • jan :表示月别名
  • + *
* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public abstract class AbstractValueParser implements ValueParser { +public class PartParser { + + private final Part part; /** - * 最小值(包括) - */ - protected int min; - /** - * 最大值(包括) + * 构造 + * + * @param part 对应解析的部分枚举 */ - protected int max; + public PartParser(Part part) { + this.part = part; + } /** - * 构造 + * 创建解析器 * - * @param min 最小值(包括) - * @param max 最大值(包括) + * @param part 对应解析的部分枚举 + * @return 解析器 */ - public AbstractValueParser(int min, int max) { - if (min > max) { - this.min = max; - this.max = min; - } else { - this.min = min; - this.max = max; - } + public static PartParser of(Part part) { + return new PartParser(part); } /** @@ -83,66 +88,37 @@ private static boolean isMatchAllStr(String value) { return (1 == value.length()) && ("*".equals(value) || "?".equals(value)); } - @Override - public int parse(String value) throws CrontabException { - if ("L".equalsIgnoreCase(value)) { - // L表示最大值 - return max; - } - - int i; - try { - i = Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new CrontabException("Invalid integer value: '{}'", value); - } - if (i < min || i > max) { - throw new CrontabException("Value {} out of range: [{} , {}]", i, min, max); - } - return i; - } - - @Override - public int getMin() { - return this.min; - } - - @Override - public int getMax() { - return this.max; - } - /** - * 处理定时任务表达式每个时间字段 - * 多个时间使用逗号分隔 + * 将表达式解析为{@link PartMatcher} + *
    + *
  • * 或者 ? 返回{@link AlwaysTrueMatcher}
  • + *
  • {@link Part#DAY_OF_MONTH} 返回{@link DayOfMonthMatcher}
  • + *
  • {@link Part#YEAR} 返回{@link YearValueMatcher}
  • + *
  • 其他 返回{@link BoolArrayMatcher}
  • + *
* - * @param value 某个时间字段 - * @return the list + * @param value 表达式 + * @return {@link PartMatcher} */ - @Override - public ValueMatcher parseAsValueMatcher(String value) { + public PartMatcher parse(String value) { if (isMatchAllStr(value)) { - // 兼容Quartz的"?"表达式,不会出现互斥情况,与"*"作用相同 - return new AlwaysTrueValueMatcher(); + //兼容Quartz的"?"表达式,不会出现互斥情况,与"*"作用相同 + return new AlwaysTrueMatcher(); } - List values = parseArray(value); + final List values = parseArray(value); if (values.size() == 0) { - throw new CrontabException("Invalid field: [{}]", value); + throw new CrontabException("Invalid part value: [{}]", value); } - return buildValueMatcher(values); - } - - /** - * 根据解析的数字值列表构建{@link ValueMatcher} - * 默认为{@link BoolArrayValueMatcher},如果有特殊实现,子类须重写此方法 - * - * @param values 数字值列表 - * @return {@link ValueMatcher} - */ - protected ValueMatcher buildValueMatcher(List values) { - return new BoolArrayValueMatcher(values); + switch (this.part) { + case DAY_OF_MONTH: + return new DayOfMonthMatcher(values); + case YEAR: + return new YearValueMatcher(values); + default: + return new BoolArrayMatcher(values); + } } /** @@ -186,7 +162,7 @@ private List parseStep(String value) { if (size == 1) {// 普通形式 results = parseRange(value, -1); } else if (size == 2) {// 间隔形式 - final int step = parse(parts.get(1)); + final int step = parseNumber(parts.get(1)); if (step < 1) { throw new CrontabException("Non positive divisor for field: [{}]", value); } @@ -216,56 +192,56 @@ private List parseRange(String value, int step) { // 全部匹配形式 if (value.length() <= 2) { - // 根据步进的第一个数字确定起始时间,类似于 12/3则从12(秒、分等)开始 - int minValue = getMin(); + //根据步进的第一个数字确定起始时间,类似于 12/3则从12(秒、分等)开始 + int minValue = part.getMin(); if (false == isMatchAllStr(value)) { - minValue = Math.max(minValue, parse(value)); + minValue = Math.max(minValue, parseNumber(value)); } else { - // 在全匹配模式下,如果步进不存在,表示步进为1 + //在全匹配模式下,如果步进不存在,表示步进为1 if (step < 1) { step = 1; } } if (step > 0) { - final int maxValue = getMax(); + final int maxValue = part.getMax(); if (minValue > maxValue) { throw new CrontabException("Invalid value {} > {}", minValue, maxValue); } - // 有步进 + //有步进 for (int i = minValue; i <= maxValue; i += step) { results.add(i); } } else { - // 固定时间 + //固定时间 results.add(minValue); } return results; } - // Range模式 + //Range模式 List parts = StringKit.split(value, '-'); int size = parts.size(); if (size == 1) {// 普通值 - final int v1 = parse(value); - if (step > 0) {// 类似 20/2的形式 - MathKit.appendRange(v1, getMax(), step, results); + final int v1 = parseNumber(value); + if (step > 0) {//类似 20/2的形式 + MathKit.appendRange(v1, part.getMax(), step, results); } else { results.add(v1); } } else if (size == 2) {// range值 - final int v1 = parse(parts.get(0)); - final int v2 = parse(parts.get(1)); + final int v1 = parseNumber(parts.get(0)); + final int v2 = parseNumber(parts.get(1)); if (step < 1) { - // 在range模式下,如果步进不存在,表示步进为1 + //在range模式下,如果步进不存在,表示步进为1 step = 1; } if (v1 < v2) {// 正常范围,例如:2-5 MathKit.appendRange(v1, v2, step, results); } else if (v1 > v2) {// 逆向范围,反选模式,例如:5-2 - MathKit.appendRange(v1, getMax(), step, results); - MathKit.appendRange(getMin(), v2, step, results); + MathKit.appendRange(v1, part.getMax(), step, results); + MathKit.appendRange(part.getMin(), v2, step, results); } else {// v1 == v2,此时与单值模式一致 - MathKit.appendRange(v1, getMax(), step, results); + MathKit.appendRange(v1, part.getMax(), step, results); } } else { throw new CrontabException("Invalid syntax of field: [{}]", value); @@ -273,4 +249,61 @@ private List parseRange(String value, int step) { return results; } + /** + * 解析单个int值,支持别名 + * + * @param value 被解析的值 + * @return 解析结果 + * @throws CrontabException 当无效数字或无效别名时抛出 + */ + private int parseNumber(String value) throws CrontabException { + int i; + try { + i = Integer.parseInt(value); + } catch (NumberFormatException ignore) { + i = parseAlias(value); + } + + // 支持负数 + if (i < 0) { + i += part.getMax(); + } + + // 周日可以用0或7表示,统一转换为0 + if (Part.DAY_OF_WEEK.equals(this.part) && Fields.Week.Sun.getKey() == i) { + i = Fields.Week.Sun.ordinal(); + } + + return part.checkValue(i); + } + + /** + * 解析别名支持包括: + *
    + *
  • L 表示最大值
  • + *
  • {@link Part#MONTH}和{@link Part#DAY_OF_WEEK}别名
  • + *
+ * + * @param name 别名 + * @return 解析int值 + * @throws CrontabException 无匹配别名时抛出异常 + */ + private int parseAlias(String name) throws CrontabException { + if ("L".equalsIgnoreCase(name)) { + // L表示最大值 + return part.getMax(); + } + + switch (this.part) { + case MONTH: + // 月份从1开始 + return Fields.Month.valueOf(name).ordinal(); + case DAY_OF_WEEK: + // 周从0开始,0表示周日 + return Fields.Month.valueOf(name).ordinal(); + } + + throw new CrontabException("Invalid alias value: [{}]", name); + } + } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/CronPatternParser.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PatternParser.java similarity index 53% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/CronPatternParser.java rename to bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PatternParser.java index 8ccdafeda4..6095f67bff 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/CronPatternParser.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/PatternParser.java @@ -25,40 +25,40 @@ ********************************************************************************/ package org.aoju.bus.cron.pattern.parser; -import org.aoju.bus.core.lang.exception.CrontabException; -import org.aoju.bus.core.toolkit.DateKit; +import org.aoju.bus.core.exception.CrontabException; +import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.toolkit.StringKit; -import org.aoju.bus.cron.pattern.matcher.AlwaysTrueValueMatcher; -import org.aoju.bus.cron.pattern.matcher.DateTimeMatcher; -import org.aoju.bus.cron.pattern.matcher.MatcherTable; -import org.aoju.bus.cron.pattern.matcher.ValueMatcher; +import org.aoju.bus.cron.pattern.Part; +import org.aoju.bus.cron.pattern.matcher.AlwaysTrueMatcher; +import org.aoju.bus.cron.pattern.matcher.PartMatcher; +import org.aoju.bus.cron.pattern.matcher.PatternMatcher; +import java.util.ArrayList; import java.util.List; /** - * 定时任务表达式解析器,用于将表达式字符串解析为{@link MatcherTable} + * 定时任务表达式解析器,用于将表达式字符串解析为{@link PatternMatcher}的列表 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class CronPatternParser { +public class PatternParser { - private static final ValueParser SECOND_VALUE_PARSER = new SecondValueParser(); - private static final ValueParser MINUTE_VALUE_PARSER = new MinuteValueParser(); - private static final ValueParser HOUR_VALUE_PARSER = new HourValueParser(); - private static final ValueParser DAY_OF_MONTH_VALUE_PARSER = new DayOfMonthValueParser(); - private static final ValueParser MONTH_VALUE_PARSER = new MonthValueParser(); - private static final ValueParser DAY_OF_WEEK_VALUE_PARSER = new DayOfWeekValueParser(); - private static final ValueParser YEAR_VALUE_PARSER = new YearValueParser(); + 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 MatcherTable} + * @return {@link List} */ - public static MatcherTable parse(String cronPattern) { + public static List parse(String cronPattern) { return parseGroupPattern(cronPattern); } @@ -69,57 +69,58 @@ public static MatcherTable parse(String cronPattern) { * * * @param groupPattern 复合表达式 - * @return {@link MatcherTable} + * @return {@link List} */ - private static MatcherTable parseGroupPattern(String groupPattern) { - final List patternList = StringKit.split(groupPattern, '|'); - final MatcherTable matcherTable = new MatcherTable(patternList.size()); + private static List parseGroupPattern(String groupPattern) { + final List patternList = StringKit.splitTrim(groupPattern, '|'); + final List patternMatchers = new ArrayList<>(patternList.size()); for (String pattern : patternList) { - matcherTable.matchers.add(parseSinglePattern(pattern)); + patternMatchers.add(parseSingle(pattern)); } - return matcherTable; + return patternMatchers; } /** * 解析单一定时任务表达式 * * @param pattern 表达式 - * @return {@link DateTimeMatcher} + * @return {@link PatternMatcher} */ - private static DateTimeMatcher parseSinglePattern(String pattern) { - final String[] parts = pattern.split("\\s"); + private static PatternMatcher parseSingle(String pattern) { + final String[] parts = pattern.split("\\s+"); + Assert.checkBetween(parts.length, 5, 7, + () -> new CrontabException("Pattern [{}] is invalid, it must be 5-7 parts!", pattern)); - int offset = 0;// 偏移量用于兼容Quartz表达式,当表达式有6或7项时,第一项为秒 + // 偏移量用于兼容Quartz表达式,当表达式有6或7项时,第一项为秒 + int offset = 0; if (parts.length == 6 || parts.length == 7) { offset = 1; - } else if (parts.length != 5) { - throw new CrontabException("Pattern [{}] is invalid, it must be 5-7 parts!", pattern); } - // 秒,如果不支持秒的表达式,则第一位按照表达式生成时间的秒数赋值,表示整分匹配 - final String secondPart = (1 == offset) ? parts[0] : String.valueOf(DateKit.date().second()); + // 秒,如果不支持秒的表达式,则第一位赋值0,表示整分匹配 + final String secondPart = (1 == offset) ? parts[0] : "0"; // 年 - ValueMatcher yearMatcher; + PartMatcher yearMatcher; if (parts.length == 7) {// 支持年的表达式 - yearMatcher = YEAR_VALUE_PARSER.parseAsValueMatcher(parts[6]); + yearMatcher = YEAR_VALUE_PARSER.parse(parts[6]); } else {// 不支持年的表达式,全部匹配 - yearMatcher = AlwaysTrueValueMatcher.INSTANCE; + yearMatcher = AlwaysTrueMatcher.INSTANCE; } - return new DateTimeMatcher( + return new PatternMatcher( // 秒 - SECOND_VALUE_PARSER.parseAsValueMatcher(secondPart), + SECOND_VALUE_PARSER.parse(secondPart), // 分 - MINUTE_VALUE_PARSER.parseAsValueMatcher(parts[offset]), + MINUTE_VALUE_PARSER.parse(parts[offset]), // 时 - HOUR_VALUE_PARSER.parseAsValueMatcher(parts[1 + offset]), + HOUR_VALUE_PARSER.parse(parts[1 + offset]), // 天 - DAY_OF_MONTH_VALUE_PARSER.parseAsValueMatcher(parts[2 + offset]), + DAY_OF_MONTH_VALUE_PARSER.parse(parts[2 + offset]), // 月 - MONTH_VALUE_PARSER.parseAsValueMatcher(parts[3 + offset]), + MONTH_VALUE_PARSER.parse(parts[3 + offset]), // 周 - DAY_OF_WEEK_VALUE_PARSER.parseAsValueMatcher(parts[4 + offset]), + DAY_OF_WEEK_VALUE_PARSER.parse(parts[4 + offset]), // 年 yearMatcher ); diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/SecondValueParser.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/SecondValueParser.java deleted file mode 100644 index eb5eb2ba2b..0000000000 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/SecondValueParser.java +++ /dev/null @@ -1,38 +0,0 @@ -/********************************************************************************* - * * - * The MIT License (MIT) * - * * - * Copyright (c) 2015-2022 aoju.org and other contributors. * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * - * THE SOFTWARE. * - * * - ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; - -/** - * 秒值处理 - * 限定于0-59 - * - * @author Kimi Liu - * @version 6.5.0 - * @since Java 17+ - */ -public class SecondValueParser extends MinuteValueParser { - -} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/ValueParser.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/ValueParser.java deleted file mode 100644 index b241dd8e9a..0000000000 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/ValueParser.java +++ /dev/null @@ -1,81 +0,0 @@ -/********************************************************************************* - * * - * The MIT License (MIT) * - * * - * Copyright (c) 2015-2022 aoju.org and other contributors. * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in * - * all copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * - * THE SOFTWARE. * - * * - ********************************************************************************/ -package org.aoju.bus.cron.pattern.parser; - -import org.aoju.bus.cron.pattern.matcher.ValueMatcher; - -/** - * 值处理接口 - * 值处理用于限定表达式中相应位置的值范围,并转换表达式值为int值 - * - * @author Kimi Liu - * @version 6.5.0 - * @since Java 17+ - */ -public interface ValueParser { - - /** - * 解析表达式对应部分为{@link ValueMatcher},支持的表达式包括: - *
    - *
  1. 单值或通配符形式,如 a*
  2. - *
  3. 数组形式,如 1,2,3
  4. - *
  5. 间隔形式,如 a/b*/b
  6. - *
  7. 范围形式,如 3-8
  8. - *
- * - * @param pattern 对应时间部分的表达式 - * @return {@link ValueMatcher} - */ - ValueMatcher parseAsValueMatcher(String pattern); - - /** - * 处理String值并转为int - * 转换包括: - *
    - *
  1. 数字字符串转为数字
  2. - *
  3. 别名转为对应的数字(如月份和星期)
  4. - *
- * - * @param value String值 - * @return int - */ - int parse(String value); - - /** - * 返回最小值 - * - * @return 最小值 - */ - int getMin(); - - /** - * 返回最大值 - * - * @return 最大值 - */ - int getMax(); - -} diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/package-info.java index e342c9d6e5..eea8f8f0cc 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/pattern/parser/package-info.java @@ -2,7 +2,6 @@ * 定时任务表达式解析器,内部使用 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.pattern.parser; \ No newline at end of file diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/timings/SystemTimer.java b/bus-cron/src/main/java/org/aoju/bus/cron/timings/SystemTimer.java index 8d0d99d696..5d2a1e4d4f 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/timings/SystemTimer.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/timings/SystemTimer.java @@ -1,3 +1,28 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ package org.aoju.bus.cron.timings; import org.aoju.bus.core.toolkit.ThreadKit; @@ -10,7 +35,6 @@ * 系统计时器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SystemTimer { @@ -98,7 +122,7 @@ private boolean advanceClock() { try { TimerTaskList timerTaskList = poll(); if (null != timerTaskList) { - //推进时间 + // 推进时间 timeWheel.advanceClock(timerTaskList.getExpire()); // 执行过期任务(包含降级操作) timerTaskList.flush(this::addTask); diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTask.java b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTask.java index 1d8490857a..8aae30a3b4 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTask.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTask.java @@ -1,10 +1,34 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ package org.aoju.bus.cron.timings; /** * 延迟任务 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TimerTask { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTaskList.java b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTaskList.java index 1706a9648b..23118b28e7 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTaskList.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimerTaskList.java @@ -1,3 +1,28 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ package org.aoju.bus.cron.timings; import java.util.concurrent.Delayed; @@ -9,7 +34,6 @@ * 任务队列,任务双向链表 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TimerTaskList implements Delayed { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimingWheel.java b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimingWheel.java index 8a07e71f61..8a4d7e3746 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimingWheel.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/timings/TimingWheel.java @@ -1,3 +1,28 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ package org.aoju.bus.cron.timings; import org.aoju.bus.logger.Logger; @@ -10,7 +35,6 @@ * 一个单独的线程推进时间一槽一槽的移动,并执行槽中的任务 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TimingWheel { diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/timings/package-info.java b/bus-cron/src/main/java/org/aoju/bus/cron/timings/package-info.java index 17a75bdb28..079302b122 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/timings/package-info.java +++ b/bus-cron/src/main/java/org/aoju/bus/cron/timings/package-info.java @@ -4,7 +4,6 @@ * 指针周期性地跳动,跳动到一个槽位,就执行该槽位的定时任务 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.cron.timings; diff --git a/bus-crypto/pom.xml b/bus-crypto/pom.xml index 843fc3a3c1..714772b096 100755 --- a/bus-crypto/pom.xml +++ b/bus-crypto/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-crypto - 6.5.0 + 6.5.1 jar ${project.artifactId} diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Builder.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Builder.java index 93bb49b636..5ecabb0bcd 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Builder.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Builder.java @@ -26,10 +26,10 @@ package org.aoju.bus.crypto; import org.aoju.bus.core.codec.Base64; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.instance.Instances; -import org.aoju.bus.core.io.streams.ByteArrayOutputStream; +import org.aoju.bus.core.io.streams.FastByteOutputStream; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.*; import org.aoju.bus.crypto.asymmetric.RSA; import org.aoju.bus.crypto.asymmetric.SM2; @@ -37,8 +37,7 @@ import org.aoju.bus.crypto.digest.*; import org.aoju.bus.crypto.digest.mac.BCHMacEngine; import org.aoju.bus.crypto.digest.mac.MacEngine; -import org.aoju.bus.crypto.symmetric.Crypto; -import org.aoju.bus.crypto.symmetric.SM4; +import org.aoju.bus.crypto.symmetric.*; import org.bouncycastle.asn1.*; import org.bouncycastle.asn1.gm.GMNamedCurves; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; @@ -97,7 +96,6 @@ * 3、摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Builder { @@ -482,7 +480,7 @@ public static byte[] sha256(String data, String charset) { * 计算sha256摘要值,使用UTF-8编码 * * @param data 被摘要数据 - * @return MD5摘要 + * @return SHA-256摘要 */ public static byte[] sha256(String data) { return sha256(data, Charset.DEFAULT_UTF_8); @@ -742,66 +740,6 @@ public static RSA rsa(byte[] privateKey, byte[] publicKey) { return new RSA(privateKey, publicKey); } - /** - * 创建签名算法对象 - * 生成新的私钥公钥对 - * - * @param algorithm 签名算法 - * @return {@link Sign} - */ - public static Sign sign(Algorithm algorithm) { - return new Sign(algorithm); - } - - /** - * 创建签名算法对象 - * 私钥和公钥同时为空时生成一对新的私钥和公钥 - * 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证 - * - * @param algorithm 签名算法 - * @param privateKey 私钥Base64 - * @param publicKey 公钥Base64 - * @return {@link Sign} - */ - public static Sign sign(Algorithm algorithm, String privateKey, String publicKey) { - return new Sign(algorithm, privateKey, publicKey); - } - - /** - * 创建Sign算法对象 - * 私钥和公钥同时为空时生成一对新的私钥和公钥 - * 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证 - * - * @param algorithm 算法枚举 - * @param privateKey 私钥 - * @param publicKey 公钥 - * @return {@link Sign} - */ - public static Sign sign(Algorithm algorithm, byte[] privateKey, byte[] publicKey) { - return new Sign(algorithm, privateKey, publicKey); - } - - /** - * 新建摘要器 - * - * @param algorithm 签名算法 - * @return Digester - */ - public static Digester digester(Algorithm algorithm) { - return new Digester(algorithm); - } - - /** - * 新建摘要器 - * - * @param algorithm 签名算法 - * @return Digester - */ - public static Digester digester(String algorithm) { - return new Digester(algorithm); - } - - /** * 创建SM2算法对象 * 生成新的私钥公钥对 @@ -947,6 +885,264 @@ public static SM4 sm4(byte[] key) { return new SM4(key); } + /** + * AES加密,生成随机KEY。注意解密时必须使用相同 {@link AES}对象或者使用相同KEY + * 例: + * + *
+     * AES加密:aes().encrypt(data)
+     * AES解密:aes().decrypt(data)
+     * 
+ * + * @return {@link AES} + */ + public static AES aes() { + return new AES(); + } + + /** + * AES加密 + * 例: + * + *
+     * AES加密:aes(key).encrypt(data)
+     * AES解密:aes(key).decrypt(data)
+     * 
+ * + * @param key 密钥 + * @return {@link Crypto} + */ + public static AES aes(byte[] key) { + return new AES(key); + } + + /** + * DES加密,生成随机KEY。注意解密时必须使用相同 {@link DES}对象或者使用相同KEY + * 例: + * + *
+     * DES加密:des().encrypt(data)
+     * DES解密:des().decrypt(data)
+     * 
+ * + * @return {@link DES} + */ + public static DES des() { + return new DES(); + } + + /** + * DES加密 + * 例: + * + *
+     * DES加密:des(key).encrypt(data)
+     * DES解密:des(key).decrypt(data)
+     * 
+ * + * @param key 密钥 + * @return {@link DES} + */ + public static DES des(byte[] key) { + return new DES(key); + } + + /** + * DESede加密(又名3DES、TripleDES),生成随机KEY。注意解密时必须使用相同 {@link DESede}对象或者使用相同KEY + * Java中默认实现为:DESede/ECB/PKCS5Padding + * 例: + * + *
+     * DESede加密:desede().encrypt(data)
+     * DESede解密:desede().decrypt(data)
+     * 
+ * + * @return {@link DESede} + */ + public static DESede desede() { + return new DESede(); + } + + /** + * DESede加密(又名3DES、TripleDES) + * Java中默认实现为:DESede/ECB/PKCS5Padding + * 例: + * + *
+     * DESede加密:desede(key).encrypt(data)
+     * DESede解密:desede(key).decrypt(data)
+     * 
+ * + * @param key 密钥 + * @return {@link DESede} + */ + public static DESede desede(byte[] key) { + return new DESede(key); + } + + /** + * 创建签名算法对象 + * 生成新的私钥公钥对 + * + * @param algorithm 签名算法 + * @return {@link Sign} + */ + public static Sign sign(Algorithm algorithm) { + return new Sign(algorithm); + } + + /** + * 创建签名算法对象 + * 私钥和公钥同时为空时生成一对新的私钥和公钥 + * 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证 + * + * @param algorithm 签名算法 + * @param privateKey 私钥Base64 + * @param publicKey 公钥Base64 + * @return {@link Sign} + */ + public static Sign sign(Algorithm algorithm, String privateKey, String publicKey) { + return new Sign(algorithm, privateKey, publicKey); + } + + /** + * 创建Sign算法对象 + * 私钥和公钥同时为空时生成一对新的私钥和公钥 + * 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证 + * + * @param algorithm 算法枚举 + * @param privateKey 私钥 + * @param publicKey 公钥 + * @return {@link Sign} + */ + public static Sign sign(Algorithm algorithm, byte[] privateKey, byte[] publicKey) { + return new Sign(algorithm, privateKey, publicKey); + } + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @return SHA-512摘要 + */ + public static byte[] sha512(final byte[] data) { + return new Digester(Algorithm.SHA512).digest(data); + } + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return SHA-512摘要 + * @since 3.0.8 + */ + public static byte[] sha512(final String data, final String charset) { + return new Digester(Algorithm.SHA512).digest(data, charset); + } + + /** + * 计算sha512摘要值,使用UTF-8编码 + * + * @param data 被摘要数据 + * @return MD5摘要 + */ + public static byte[] sha512(final String data) { + return sha512(data, Charset.DEFAULT_UTF_8); + } + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @return SHA-512摘要 + */ + public static byte[] sha512(final InputStream data) { + return new Digester(Algorithm.SHA512).digest(data); + } + + /** + * 计算SHA-512摘要值 + * + * @param file 被摘要文件 + * @return SHA-512摘要 + */ + public static byte[] sha512(final File file) { + return new Digester(Algorithm.SHA512).digest(file); + } + + /** + * 计算SHA-1摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final byte[] data) { + return new Digester(Algorithm.SHA512).digestHex(data); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final String data, final String charset) { + return new Digester(Algorithm.SHA512).digestHex(data, charset); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final String data) { + return sha512Hex(data, Charset.DEFAULT_UTF_8); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final InputStream data) { + return new Digester(Algorithm.SHA512).digestHex(data); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param file 被摘要文件 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final File file) { + return new Digester(Algorithm.SHA512).digestHex(file); + } + + /** + * 新建摘要器 + * + * @param algorithm 签名算法 + * @return Digester + */ + public static Digester digester(Algorithm algorithm) { + return new Digester(algorithm); + } + + /** + * 新建摘要器 + * + * @param algorithm 签名算法 + * @return Digester + */ + public static Digester digester(String algorithm) { + return new Digester(algorithm); + } + + /** * 数据加密 * @@ -1047,7 +1243,7 @@ public static byte[] encode(ASN1Encodable... elements) { * @return 编码后的bytes */ public static byte[] encode(String asn1Encoding, ASN1Encodable... elements) { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); + final FastByteOutputStream out = new FastByteOutputStream(); encode(asn1Encoding, out, elements); return out.toByteArray(); } diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Ciphers.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Ciphers.java index 79cda77a8a..e4c4804d12 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Ciphers.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Ciphers.java @@ -41,7 +41,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Ciphers { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Holder.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Holder.java index a34e5a5216..02aad68aff 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Holder.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Holder.java @@ -31,7 +31,6 @@ * 全局单例的 org.bouncycastle.jce.provider.BouncyCastleProvider 对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Holder { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Mode.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Mode.java index 84a0b6e0d0..d9549195f0 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Mode.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Mode.java @@ -31,7 +31,6 @@ * 在加密时对明文分组的模式,它代表了不同的分组方式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Mode { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Padding.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Padding.java index ce0e0edabf..034f38e98d 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Padding.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Padding.java @@ -31,7 +31,6 @@ * 需要在最后一个分组中填充一些数据使其凑满一个分组的长度。 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum Padding { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Provider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Provider.java index 635e46d791..3dcdfbb423 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Provider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Provider.java @@ -27,7 +27,6 @@ /** * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/Registry.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/Registry.java index b6177ac471..45c2489bd9 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/Registry.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/Registry.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.crypto; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ObjectKit; import org.aoju.bus.crypto.provider.*; @@ -38,7 +38,6 @@ * 注解和实现之间映射 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class Registry { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/AbstractCrypto.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/AbstractCrypto.java index 8ff77e99a0..e6b6d6ba1f 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/AbstractCrypto.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/AbstractCrypto.java @@ -33,7 +33,6 @@ * * @param 返回自身类型 * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractCrypto> extends Asymmetric diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Asymmetric.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Asymmetric.java index ca3f9bc3ee..3712049212 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Asymmetric.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Asymmetric.java @@ -26,8 +26,8 @@ package org.aoju.bus.crypto.asymmetric; import org.aoju.bus.core.codec.Base64; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.crypto.Builder; import java.io.Serializable; @@ -42,7 +42,6 @@ * 非对称基础,提供锁、私钥和公钥的持有 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Asymmetric> implements Serializable { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Crypto.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Crypto.java index 62af545dc3..a476803a9f 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Crypto.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Crypto.java @@ -26,9 +26,9 @@ package org.aoju.bus.crypto.asymmetric; import org.aoju.bus.core.codec.Base64; -import org.aoju.bus.core.io.streams.ByteArrayOutputStream; +import org.aoju.bus.core.exception.CryptoException; +import org.aoju.bus.core.io.streams.FastByteOutputStream; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.crypto.Builder; import org.aoju.bus.crypto.Ciphers; @@ -51,7 +51,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Crypto extends AbstractCrypto { @@ -340,7 +339,7 @@ private byte[] doFinal(byte[] data, int maxBlockSize) throws IllegalBlockSizeExc */ private byte[] doFinalWithBlock(byte[] data, int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException { final int dataLength = data.length; - final ByteArrayOutputStream out = new ByteArrayOutputStream(); + final FastByteOutputStream out = new FastByteOutputStream(); int offSet = 0; // 剩余长度 diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Decryptor.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Decryptor.java index 2b490f9e71..17d8b1d1aa 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Decryptor.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Decryptor.java @@ -26,8 +26,8 @@ package org.aoju.bus.crypto.asymmetric; import org.aoju.bus.core.codec.BCD; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Builder; @@ -45,7 +45,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Decryptor { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/ECIES.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/ECIES.java index dc740aae06..b336af9d6e 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/ECIES.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/ECIES.java @@ -34,7 +34,6 @@ * 此算法必须引入Bouncy Castle库 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ECIES extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Encryptor.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Encryptor.java index cd21559ce3..544a5187f8 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Encryptor.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Encryptor.java @@ -27,7 +27,7 @@ import org.aoju.bus.core.codec.BCD; import org.aoju.bus.core.codec.Base64; -import org.aoju.bus.core.lang.exception.CryptoException; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -45,7 +45,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Encryptor { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/KeyType.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/KeyType.java index 14691d80df..6fe92eeacc 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/KeyType.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/KeyType.java @@ -31,7 +31,6 @@ * 密钥类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum KeyType { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/RSA.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/RSA.java index 80a8eb1ce6..9e4dd8f037 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/RSA.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/RSA.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.crypto.asymmetric; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.instance.Instances; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.crypto.Builder; import org.aoju.bus.crypto.Holder; @@ -52,7 +52,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RSA extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/SM2.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/SM2.java index bc867e12e7..0345c5c9a4 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/SM2.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/SM2.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.crypto.asymmetric; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Algorithm; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.crypto.Builder; import org.bouncycastle.crypto.CipherParameters; @@ -60,7 +60,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SM2 extends AbstractCrypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Sign.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Sign.java index 8518cb6206..467ec02703 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Sign.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/Sign.java @@ -26,8 +26,8 @@ package org.aoju.bus.crypto.asymmetric; import org.aoju.bus.core.codec.Base64; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.CollKit; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.core.toolkit.IoKit; @@ -47,7 +47,6 @@ * 签名包装,{@link Signature} 包装类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Sign extends Asymmetric { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/package-info.java index 9f37d10714..ea7f922a7d 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/asymmetric/package-info.java @@ -2,7 +2,6 @@ * 非对称加密的实现,包括RSA等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.asymmetric; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/BCrypt.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/BCrypt.java index 59042b987b..6bebcb58e9 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/BCrypt.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/BCrypt.java @@ -37,7 +37,6 @@ * 它的口令必须是8至56个字符,并将在内部被转化为448位的密钥 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class BCrypt { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/Digester.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/Digester.java index d1f4b5dbd5..56dcac375b 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/Digester.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/Digester.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.crypto.digest; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.*; import org.aoju.bus.crypto.Builder; @@ -44,7 +44,6 @@ * 注意:此对象实例化后为非线程安全! * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Digester implements Serializable { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/HMac.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/HMac.java index 7eee57ff9d..7914c51719 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/HMac.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/HMac.java @@ -25,24 +25,13 @@ ********************************************************************************/ package org.aoju.bus.crypto.digest; -import org.aoju.bus.core.codec.Base64; import org.aoju.bus.core.lang.Algorithm; -import org.aoju.bus.core.lang.exception.CryptoException; -import org.aoju.bus.core.toolkit.FileKit; -import org.aoju.bus.core.toolkit.HexKit; -import org.aoju.bus.core.toolkit.IoKit; -import org.aoju.bus.core.toolkit.StringKit; +import org.aoju.bus.crypto.digest.mac.Mac; import org.aoju.bus.crypto.digest.mac.MacEngine; import org.aoju.bus.crypto.digest.mac.MacEngineFactory; import javax.crypto.spec.SecretKeySpec; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; -import java.nio.charset.Charset; import java.security.Key; -import java.security.MessageDigest; import java.security.spec.AlgorithmParameterSpec; /** @@ -54,15 +43,12 @@ * 注意:此对象实例化后为非线程安全! * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class HMac implements Serializable { +public class HMac extends Mac { private static final long serialVersionUID = 1L; - private final MacEngine engine; - /** * 构造,自动生成密钥 * @@ -129,206 +115,7 @@ public HMac(String algorithm, Key key, AlgorithmParameterSpec spec) { * @param engine MAC算法实现引擎 */ public HMac(MacEngine engine) { - this.engine = engine; - } - - /** - * 获得MAC算法引擎 - * - * @return MAC算法引擎 - */ - public MacEngine getEngine() { - return this.engine; - } - - /** - * 生成文件摘要 - * - * @param data 被摘要数据 - * @param charset 编码 - * @return 摘要 - */ - public byte[] digest(String data, Charset charset) { - return digest(StringKit.bytes(data, charset)); - } - - /** - * 生成文件摘要 - * - * @param data 被摘要数据 - * @return 摘要 - */ - public byte[] digest(String data) { - return digest(data, org.aoju.bus.core.lang.Charset.UTF_8); - } - - /** - * 生成文件摘要,并转为Base64 - * - * @param data 被摘要数据 - * @param isUrlSafe 是否使用URL安全字符 - * @return 摘要 - */ - public String digestBase64(String data, boolean isUrlSafe) { - return digestBase64(data, org.aoju.bus.core.lang.Charset.UTF_8, isUrlSafe); - } - - /** - * 生成文件摘要,并转为Base64 - * - * @param data 被摘要数据 - * @param charset 编码 - * @param isUrlSafe 是否使用URL安全字符 - * @return 摘要 - */ - public String digestBase64(String data, Charset charset, boolean isUrlSafe) { - final byte[] digest = digest(data, charset); - return isUrlSafe ? Base64.encodeUrlSafe(digest) : Base64.encode(digest); - } - - /** - * 生成文件摘要,并转为16进制字符串 - * - * @param data 被摘要数据 - * @param charset 编码 - * @return 摘要 - */ - public String digestHex(String data, Charset charset) { - return HexKit.encodeHexStr(digest(data, charset)); - } - - /** - * 生成文件摘要 - * - * @param data 被摘要数据 - * @return 摘要 - */ - public String digestHex(String data) { - return digestHex(data, org.aoju.bus.core.lang.Charset.UTF_8); - } - - /** - * 生成文件摘要 - * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} - * - * @param file 被摘要文件 - * @return 摘要bytes - * @throws CryptoException Cause by IOException - */ - public byte[] digest(File file) throws CryptoException { - InputStream in = null; - try { - in = FileKit.getInputStream(file); - return digest(in); - } finally { - IoKit.close(in); - } - } - - /** - * 生成文件摘要,并转为16进制字符串 - * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} - * - * @param file 被摘要文件 - * @return 摘要 - */ - public String digestHex(File file) { - return HexKit.encodeHexStr(digest(file)); - } - - /** - * 生成摘要 - * - * @param data 数据bytes - * @return 摘要bytes - */ - public byte[] digest(byte[] data) { - return digest(new ByteArrayInputStream(data), -1); - } - - /** - * 生成摘要,并转为16进制字符串 - * - * @param data 被摘要数据 - * @return 摘要 - */ - public String digestHex(byte[] data) { - return HexKit.encodeHexStr(digest(data)); - } - - /** - * 生成摘要,使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} - * - * @param data {@link InputStream} 数据流 - * @return 摘要bytes - */ - public byte[] digest(InputStream data) { - return digest(data, IoKit.DEFAULT_BUFFER_SIZE); - } - - /** - * 生成摘要,并转为16进制字符串 - * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} - * - * @param data 被摘要数据 - * @return 摘要 - */ - public String digestHex(InputStream data) { - return HexKit.encodeHexStr(digest(data)); - } - - /** - * 生成摘要 - * - * @param data {@link InputStream} 数据流 - * @param bufferLength 缓存长度,不足1使用 {@link IoKit#DEFAULT_BUFFER_SIZE} 做为默认值 - * @return 摘要bytes - */ - public byte[] digest(InputStream data, int bufferLength) { - return this.engine.digest(data, bufferLength); - } - - /** - * 生成摘要,并转为16进制字符串 - * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} - * - * @param data 被摘要数据 - * @param bufferLength 缓存长度,不足1使用 {@link IoKit#DEFAULT_BUFFER_SIZE} 做为默认值 - * @return 摘要 - */ - public String digestHex(InputStream data, int bufferLength) { - return HexKit.encodeHexStr(digest(data, bufferLength)); - } - - /** - * 验证生成的摘要与给定的摘要比较是否一致 - * 简单比较每个byte位是否相同 - * - * @param digest 生成的摘要 - * @param digestToCompare 需要比较的摘要 - * @return 是否一致 - * @see MessageDigest#isEqual(byte[], byte[]) - */ - public boolean verify(byte[] digest, byte[] digestToCompare) { - return MessageDigest.isEqual(digest, digestToCompare); - } - - /** - * 获取MAC算法块长度 - * - * @return MAC算法块长度 - */ - public int getMacLength() { - return this.engine.getMacLength(); - } - - /** - * 获取算法 - * - * @return 算法 - */ - public String getAlgorithm() { - return this.engine.getAlgorithm(); + super(engine); } } diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/MD5.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/MD5.java index 41ea0b3a5d..58f8bb70d7 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/MD5.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/MD5.java @@ -36,7 +36,6 @@ * MD5算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MD5 extends Digester { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/SM3.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/SM3.java index 28116680c8..8fa65f44aa 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/SM3.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/SM3.java @@ -37,7 +37,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SM3 extends Digester { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCHMacEngine.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCHMacEngine.java index caf65e7c8b..cfeb6f17e7 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCHMacEngine.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCHMacEngine.java @@ -37,12 +37,9 @@ * 当引入BouncyCastle库时自动使用其作为Provider * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class BCHMacEngine implements MacEngine { - - private Mac mac; +public class BCHMacEngine extends BCMacEngine { /** * 构造 @@ -72,56 +69,29 @@ public BCHMacEngine(Digest digest, byte[] key) { * @param params 参数,例如密钥可以用{@link KeyParameter} */ public BCHMacEngine(Digest digest, CipherParameters params) { - init(digest, params); + this(new HMac(digest), params); } /** - * 初始化 + * 构造 * - * @param digest 摘要算法 + * @param mac {@link HMac} * @param params 参数,例如密钥可以用{@link KeyParameter} - * @return this */ - public BCHMacEngine init(Digest digest, CipherParameters params) { - mac = new HMac(digest); - mac.init(params); - return this; + public BCHMacEngine(HMac mac, CipherParameters params) { + super(mac, params); } /** - * 获得 {@link Mac} + * 初始化 * - * @return {@link Mac} + * @param digest 摘要算法 + * @param params 参数,例如密钥可以用{@link KeyParameter} + * @return this + * @see #init(Mac, CipherParameters) */ - public Mac getMac() { - return mac; - } - - @Override - public void update(byte[] in, int inOff, int len) { - this.mac.update(in, inOff, len); - } - - @Override - public byte[] doFinal() { - final byte[] result = new byte[getMacLength()]; - this.mac.doFinal(result, 0); - return result; - } - - @Override - public void reset() { - this.mac.reset(); - } - - @Override - public int getMacLength() { - return mac.getMacSize(); - } - - @Override - public String getAlgorithm() { - return this.mac.getAlgorithmName(); + public BCHMacEngine init(Digest digest, CipherParameters params) { + return (BCHMacEngine) init(new HMac(digest), params); } } diff --git a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/MatcherTable.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCMacEngine.java similarity index 59% rename from bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/MatcherTable.java rename to bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCMacEngine.java index 5f97070464..96ade9bc03 100644 --- a/bus-cron/src/main/java/org/aoju/bus/cron/pattern/matcher/MatcherTable.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/BCMacEngine.java @@ -23,58 +23,80 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.cron.pattern.matcher; +package org.aoju.bus.crypto.digest.mac; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.Mac; +import org.bouncycastle.crypto.params.KeyParameter; /** - * 时间匹配表,用于存放定时任务表达式解析后的结构信息 + * BouncyCastle的MAC算法实现引擎,使用{@link Mac} 实现摘要 + * 当引入BouncyCastle库时自动使用其作为Provider * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -public class MatcherTable { +public class BCMacEngine implements MacEngine { - /** - * 秒字段匹配列表 - */ - public final List matchers; + private Mac mac; /** * 构造 * - * @param size 表达式个数,用于表示复合表达式中单个表达式个数 + * @param mac {@link Mac} + * @param params 参数,例如密钥可以用{@link KeyParameter} */ - public MatcherTable(int size) { - matchers = new ArrayList<>(size); + public BCMacEngine(Mac mac, CipherParameters params) { + init(mac, params); } - public LocalDateTime nextMatchAfter(int second, int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year) { - return null; + /** + * 初始化 + * + * @param mac 摘要算法 + * @param params 参数,例如密钥可以用{@link KeyParameter} + * @return this + */ + public BCMacEngine init(Mac mac, CipherParameters params) { + mac.init(params); + this.mac = mac; + return this; } /** - * 给定时间是否匹配定时任务表达式 + * 获得 {@link Mac} * - * @param second 秒数,-1表示不匹配此项 - * @param minute 分钟 - * @param hour 小时 - * @param dayOfMonth 天 - * @param month 月 - * @param dayOfWeek 周几 - * @param year 年 - * @return 如果匹配返回 {@code true}, 否则返回 {@code false} + * @return {@link Mac} */ - public boolean match(int second, int minute, int hour, int dayOfMonth, int month, int dayOfWeek, int year) { - for (DateTimeMatcher matcher : matchers) { - if (matcher.match(second, minute, hour, dayOfMonth, month, dayOfWeek, year)) { - return true; - } - } - return false; + public Mac getMac() { + return mac; + } + + @Override + public void update(byte[] in, int inOff, int len) { + this.mac.update(in, inOff, len); + } + + @Override + public byte[] doFinal() { + final byte[] result = new byte[getMacLength()]; + this.mac.doFinal(result, 0); + return result; + } + + @Override + public void reset() { + this.mac.reset(); + } + + @Override + public int getMacLength() { + return mac.getMacSize(); + } + + @Override + public String getAlgorithm() { + return this.mac.getAlgorithmName(); } } diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/CBCBlockCipher.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/CBCBlockCipher.java new file mode 100644 index 0000000000..da3ee38843 --- /dev/null +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/CBCBlockCipher.java @@ -0,0 +1,125 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.crypto.digest.mac; + +import org.bouncycastle.crypto.BlockCipher; +import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.Digest; +import org.bouncycastle.crypto.Mac; +import org.bouncycastle.crypto.macs.CBCBlockCipherMac; +import org.bouncycastle.crypto.params.KeyParameter; +import org.bouncycastle.crypto.params.ParametersWithIV; + +import java.security.Key; + +/** + * {@link CBCBlockCipherMac}实现的MAC算法,使用CBC Block方式 + * + * @author Kimi Liu + * @since Java 17+ + */ +public class CBCBlockCipher extends BCMacEngine { + + /** + * 构造 + * + * @param digest 摘要算法,为{@link Digest} 的接口实现 + * @param macSizeInBits mac结果的bits长度,必须为8的倍数 + * @param key 密钥 + * @param iv 加盐 + */ + public CBCBlockCipher(BlockCipher digest, int macSizeInBits, Key key, byte[] iv) { + this(digest, macSizeInBits, key.getEncoded(), iv); + } + + /** + * 构造 + * + * @param digest 摘要算法,为{@link Digest} 的接口实现 + * @param macSizeInBits mac结果的bits长度,必须为8的倍数 + * @param key 密钥 + * @param iv 加盐 + */ + public CBCBlockCipher(BlockCipher digest, int macSizeInBits, byte[] key, byte[] iv) { + this(digest, macSizeInBits, new ParametersWithIV(new KeyParameter(key), iv)); + } + + /** + * 构造 + * + * @param cipher 算法,为{@link BlockCipher} 的接口实现 + * @param macSizeInBits mac结果的bits长度,必须为8的倍数 + * @param key 密钥 + */ + public CBCBlockCipher(BlockCipher cipher, int macSizeInBits, Key key) { + this(cipher, macSizeInBits, key.getEncoded()); + } + + /** + * 构造 + * + * @param cipher 算法,为{@link BlockCipher} 的接口实现 + * @param macSizeInBits mac结果的bits长度,必须为8的倍数 + * @param key 密钥 + */ + public CBCBlockCipher(BlockCipher cipher, int macSizeInBits, byte[] key) { + this(cipher, macSizeInBits, new KeyParameter(key)); + } + + /** + * 构造 + * + * @param cipher 算法,为{@link BlockCipher} 的接口实现 + * @param macSizeInBits mac结果的bits长度,必须为8的倍数 + * @param params 参数,例如密钥可以用{@link KeyParameter} + */ + public CBCBlockCipher(BlockCipher cipher, int macSizeInBits, CipherParameters params) { + this(new CBCBlockCipherMac(cipher, macSizeInBits), params); + } + + /** + * 构造 + * + * @param mac {@link CBCBlockCipherMac} + * @param params 参数,例如密钥可以用{@link KeyParameter} + */ + public CBCBlockCipher(CBCBlockCipherMac mac, CipherParameters params) { + super(mac, params); + } + + /** + * 初始化 + * + * @param cipher {@link BlockCipher} + * @param params 参数,例如密钥可以用{@link KeyParameter} + * @return this + * @see #init(Mac, CipherParameters) + */ + public CBCBlockCipher init(BlockCipher cipher, CipherParameters params) { + return (CBCBlockCipher) init(new CBCBlockCipherMac(cipher), params); + } + +} diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/DefaultHMacEngine.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/DefaultHMacEngine.java index 044561056d..f433981e8c 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/DefaultHMacEngine.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/DefaultHMacEngine.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.digest.mac; -import org.aoju.bus.core.lang.exception.CryptoException; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.crypto.Builder; import javax.crypto.Mac; @@ -39,7 +39,6 @@ * 当引入BouncyCastle库时自动使用其作为Provider * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DefaultHMacEngine implements MacEngine { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/Mac.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/Mac.java new file mode 100644 index 0000000000..22a3229978 --- /dev/null +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/Mac.java @@ -0,0 +1,265 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.crypto.digest.mac; + +import org.aoju.bus.core.codec.Base64; +import org.aoju.bus.core.exception.CryptoException; +import org.aoju.bus.core.lang.Charset; +import org.aoju.bus.core.toolkit.FileKit; +import org.aoju.bus.core.toolkit.HexKit; +import org.aoju.bus.core.toolkit.IoKit; +import org.aoju.bus.core.toolkit.StringKit; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.io.Serializable; +import java.security.MessageDigest; + +/** + * MAC摘要算法(此类兼容和JCE的 {@code javax.crypto.Mac}对象和BC库的{@code org.bouncycastle.crypto.Mac}对象) + * MAC,全称为“Message Authentication Code”,中文名“消息鉴别码” 主要是利用指定算法,以一个密钥和一个消息为输入,生 + * 成一个消息摘要作为输出一般的,消息鉴别码用于验证传输于两个共同享有一个密钥的单位之间的消息 + * 注意:此对象实例化后为非线程安全! + * + * @author Kimi Liu + * @since Java 17+ + */ +public class Mac implements Serializable { + + private static final long serialVersionUID = 1L; + + private final MacEngine engine; + + /** + * 构造 + * + * @param engine MAC算法实现引擎 + */ + public Mac(MacEngine engine) { + this.engine = engine; + } + + /** + * 获得MAC算法引擎 + * + * @return MAC算法引擎 + */ + public MacEngine getEngine() { + return this.engine; + } + + /** + * 生成文件摘要 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return 摘要 + */ + public byte[] digest(String data, java.nio.charset.Charset charset) { + return digest(StringKit.bytes(data, charset)); + } + + /** + * 生成文件摘要 + * + * @param data 被摘要数据 + * @return 摘要 + */ + public byte[] digest(String data) { + return digest(data, Charset.UTF_8); + } + + /** + * 生成文件摘要,并转为Base64 + * + * @param data 被摘要数据 + * @param isUrlSafe 是否使用URL安全字符 + * @return 摘要 + */ + public String digestBase64(String data, boolean isUrlSafe) { + return digestBase64(data, Charset.UTF_8, isUrlSafe); + } + + /** + * 生成文件摘要,并转为Base64 + * + * @param data 被摘要数据 + * @param charset 编码 + * @param isUrlSafe 是否使用URL安全字符 + * @return 摘要 + */ + public String digestBase64(String data, java.nio.charset.Charset charset, boolean isUrlSafe) { + final byte[] digest = digest(data, charset); + return isUrlSafe ? Base64.encodeUrlSafe(digest) : Base64.encode(digest); + } + + /** + * 生成文件摘要,并转为16进制字符串 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return 摘要 + */ + public String digestHex(String data, java.nio.charset.Charset charset) { + return HexKit.encodeHexStr(digest(data, charset)); + } + + /** + * 生成文件摘要 + * + * @param data 被摘要数据 + * @return 摘要 + */ + public String digestHex(String data) { + return digestHex(data, Charset.UTF_8); + } + + /** + * 生成文件摘要 + * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} + * + * @param file 被摘要文件 + * @return 摘要bytes + * @throws CryptoException Cause by IOException + */ + public byte[] digest(File file) throws CryptoException { + InputStream in = null; + try { + in = FileKit.getInputStream(file); + return digest(in); + } finally { + IoKit.close(in); + } + } + + /** + * 生成文件摘要,并转为16进制字符串 + * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} + * + * @param file 被摘要文件 + * @return 摘要 + */ + public String digestHex(File file) { + return HexKit.encodeHexStr(digest(file)); + } + + /** + * 生成摘要 + * + * @param data 数据bytes + * @return 摘要bytes + */ + public byte[] digest(byte[] data) { + return digest(new ByteArrayInputStream(data), -1); + } + + /** + * 生成摘要,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return 摘要 + */ + public String digestHex(byte[] data) { + return HexKit.encodeHexStr(digest(data)); + } + + /** + * 生成摘要,使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} + * + * @param data {@link InputStream} 数据流 + * @return 摘要bytes + */ + public byte[] digest(InputStream data) { + return digest(data, IoKit.DEFAULT_BUFFER_SIZE); + } + + /** + * 生成摘要,并转为16进制字符串 + * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} + * + * @param data 被摘要数据 + * @return 摘要 + */ + public String digestHex(InputStream data) { + return HexKit.encodeHexStr(digest(data)); + } + + /** + * 生成摘要 + * + * @param data {@link InputStream} 数据流 + * @param bufferLength 缓存长度,不足1使用 {@link IoKit#DEFAULT_BUFFER_SIZE} 做为默认值 + * @return 摘要bytes + */ + public byte[] digest(InputStream data, int bufferLength) { + return this.engine.digest(data, bufferLength); + } + + /** + * 生成摘要,并转为16进制字符串 + * 使用默认缓存大小,见 {@link IoKit#DEFAULT_BUFFER_SIZE} + * + * @param data 被摘要数据 + * @param bufferLength 缓存长度,不足1使用 {@link IoKit#DEFAULT_BUFFER_SIZE} 做为默认值 + * @return 摘要 + */ + public String digestHex(InputStream data, int bufferLength) { + return HexKit.encodeHexStr(digest(data, bufferLength)); + } + + /** + * 验证生成的摘要与给定的摘要比较是否一致 + * 简单比较每个byte位是否相同 + * + * @param digest 生成的摘要 + * @param digestToCompare 需要比较的摘要 + * @return 是否一致 + * @see MessageDigest#isEqual(byte[], byte[]) + */ + public boolean verify(byte[] digest, byte[] digestToCompare) { + return MessageDigest.isEqual(digest, digestToCompare); + } + + /** + * 获取MAC算法块长度 + * + * @return MAC算法块长度 + */ + public int getMacLength() { + return this.engine.getMacLength(); + } + + /** + * 获取算法 + * + * @return 算法 + */ + public String getAlgorithm() { + return this.engine.getAlgorithm(); + } + +} diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngine.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngine.java index 9702639099..0dda889992 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngine.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngine.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.digest.mac; -import org.aoju.bus.core.lang.exception.CryptoException; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.toolkit.IoKit; import java.io.IOException; @@ -35,7 +35,6 @@ * MAC(Message Authentication Code)算法引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface MacEngine { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngineFactory.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngineFactory.java index f3094d8bd1..57eb245eb7 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngineFactory.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/MacEngineFactory.java @@ -35,7 +35,6 @@ * {@link MacEngine} 实现工厂类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MacEngineFactory { diff --git a/bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunEmailProperty.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/SM4.java similarity index 83% rename from bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunEmailProperty.java rename to bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/SM4.java index acef20f77c..e42132f83c 100644 --- a/bus-notify/src/main/java/org/aoju/bus/notify/provider/aliyun/AliyunEmailProperty.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/SM4.java @@ -23,34 +23,28 @@ * THE SOFTWARE. * * * ********************************************************************************/ -package org.aoju.bus.notify.provider.aliyun; +package org.aoju.bus.crypto.digest.mac; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.SuperBuilder; -import org.aoju.bus.notify.magic.Property; +import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.engines.SM4Engine; /** - * 阿里云邮件模版 + * SM4算法的MAC引擎实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ -@Getter -@Setter -@SuperBuilder -public class AliyunEmailProperty extends Property { +public class SM4 extends CBCBlockCipher { - /** - * 邮件内容 - * Limit 28K - */ - private String content; + private static final int MAC_SIZE = 128; /** - * 主题 + * 构造 + * + * @param params {@link CipherParameters} */ - private String subject; + public SM4(CipherParameters params) { + super(new SM4Engine(), MAC_SIZE, params); + } } diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/package-info.java index d5c9bb1928..92c54a590d 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/mac/package-info.java @@ -6,7 +6,6 @@ * HMAC 还可以使用一个用于计算和确认消息鉴别值的密钥 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.digest.mac; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/HOTP.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/HOTP.java index 902a966ac0..010973fff7 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/HOTP.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/HOTP.java @@ -40,7 +40,6 @@ *

参考:https://github.com/jchambers/java-otp

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HOTP { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/TOTP.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/TOTP.java index acc159ae69..804b094ce3 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/TOTP.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/TOTP.java @@ -41,7 +41,6 @@ *

参考:https://github.com/jchambers/java-otp

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TOTP extends HOTP { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/package-info.java index e0846badeb..0913d09183 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/otp/package-info.java @@ -9,7 +9,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.digest.otp; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/package-info.java index 22b97a9115..76aca685dd 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/digest/package-info.java @@ -2,7 +2,6 @@ * 摘要加密算法实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.digest; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/package-info.java index 55c13f7d90..7fdaa63df8 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/package-info.java @@ -8,7 +8,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/AESProvider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/AESProvider.java index a9792704c3..65be8c2e98 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/AESProvider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/AESProvider.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; import org.aoju.bus.crypto.symmetric.AES; @@ -38,7 +38,6 @@ * 达到十亿量级 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AESProvider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/DESProvider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/DESProvider.java index 32aeb5c994..e9e30dbbbc 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/DESProvider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/DESProvider.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; import org.aoju.bus.crypto.symmetric.DES; @@ -34,7 +34,6 @@ * 数据加密标准,速度较快,适用于加密大量数据的场合 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DESProvider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RC4Provider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RC4Provider.java index 865b97fc2b..b18b6a625c 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RC4Provider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RC4Provider.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; import org.aoju.bus.crypto.symmetric.RC4; @@ -39,7 +39,6 @@ * 达到十亿量级 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RC4Provider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RSAProvider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RSAProvider.java index 436bd25236..c820541b5e 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RSAProvider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/RSAProvider.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; import org.aoju.bus.crypto.asymmetric.KeyType; @@ -36,7 +36,6 @@ * RSA 加密解密算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RSAProvider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM2Provider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM2Provider.java index 7a7f25f1c5..3d312ed17e 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM2Provider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM2Provider.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; import org.aoju.bus.crypto.asymmetric.KeyType; @@ -37,7 +37,6 @@ * RSA 加密解密算法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SM2Provider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM4Provider.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM4Provider.java index 6a7a93c522..8640e3324a 100755 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM4Provider.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/SM4Provider.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.provider; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Provider; @@ -39,7 +39,6 @@ * 达到十亿量级 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SM4Provider implements Provider { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/package-info.java index a0942c36cf..72a35dd288 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/provider/package-info.java @@ -2,7 +2,6 @@ * 加解密服务实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.provider; \ No newline at end of file diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/AES.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/AES.java index b70615c5e9..9ab7e22b18 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/AES.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/AES.java @@ -49,7 +49,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class AES extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ChaCha20.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ChaCha20.java index 8f83f89bde..9e36721a30 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ChaCha20.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ChaCha20.java @@ -35,7 +35,6 @@ * ChaCha系列流密码,作为salsa密码的改良版,具有更强的抵抗密码分析攻击的特性,“20”表示该算法有20轮的加密计算 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ChaCha20 extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Crypto.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Crypto.java index 18298dfd3a..87f637c942 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Crypto.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Crypto.java @@ -25,10 +25,10 @@ ********************************************************************************/ package org.aoju.bus.crypto.symmetric; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Algorithm; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Optional; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.*; import org.aoju.bus.crypto.Builder; import org.aoju.bus.crypto.Ciphers; @@ -59,7 +59,6 @@ * 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Crypto implements Encryptor, Decryptor, Serializable { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DES.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DES.java index 8e0e86c31a..9fddbf5094 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DES.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DES.java @@ -40,7 +40,6 @@ * Java中默认实现为:DES/CBC/PKCS5Padding * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DES extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DESede.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DESede.java index 9da59dd2aa..6ee6331a1c 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DESede.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/DESede.java @@ -41,7 +41,6 @@ * Java中默认实现为:DESede/ECB/PKCS5Padding * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DESede extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Decryptor.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Decryptor.java index bb7b078955..4194a9636d 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Decryptor.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Decryptor.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.crypto.symmetric; -import org.aoju.bus.core.lang.exception.CryptoException; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Builder; @@ -43,7 +43,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Decryptor { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Encryptor.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Encryptor.java index 63af3d3b37..1972bf96e5 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Encryptor.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Encryptor.java @@ -26,7 +26,7 @@ package org.aoju.bus.crypto.symmetric; import org.aoju.bus.core.codec.Base64; -import org.aoju.bus.core.lang.exception.CryptoException; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.StringKit; @@ -44,7 +44,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface Encryptor { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/FPE.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/FPE.java index 1b8d8f477d..a35aa35620 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/FPE.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/FPE.java @@ -52,7 +52,6 @@ * 此类基于BouncyCastle实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FPE implements Serializable { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/PBKDF2.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/PBKDF2.java index da8d9d7991..409cb8f6f4 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/PBKDF2.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/PBKDF2.java @@ -37,7 +37,6 @@ * 参考:https://blog.csdn.net/huoji555/article/details/83659687 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PBKDF2 { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/RC4.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/RC4.java index 031440a03e..7ab88431c8 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/RC4.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/RC4.java @@ -26,8 +26,8 @@ package org.aoju.bus.crypto.symmetric; import org.aoju.bus.core.codec.Base64; +import org.aoju.bus.core.exception.CryptoException; import org.aoju.bus.core.lang.Normal; -import org.aoju.bus.core.lang.exception.CryptoException; import org.aoju.bus.core.toolkit.HexKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.crypto.Builder; @@ -45,7 +45,6 @@ * * @author Iurii Sergiichuk * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RC4 implements Serializable { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/SM4.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/SM4.java index 20e05df9ed..ea4b17b5b3 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/SM4.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/SM4.java @@ -45,7 +45,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SM4 extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Vigenere.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Vigenere.java index c376d44097..c0a24b6ad0 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Vigenere.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/Vigenere.java @@ -33,7 +33,6 @@ * 算法实现来自:https://github.com/zhaorenjie110/SymmetricEncryptionAndDecryption * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Vigenere { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ZUC.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ZUC.java index 07ddf6f5b0..9bad6cb268 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ZUC.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/ZUC.java @@ -10,7 +10,6 @@ * 祖冲之算法集(ZUC算法)实现,基于BouncyCastle实现。 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ZUC extends Crypto { diff --git a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/package-info.java b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/package-info.java index 1c79107371..38871a15f5 100644 --- a/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/package-info.java +++ b/bus-crypto/src/main/java/org/aoju/bus/crypto/symmetric/package-info.java @@ -2,7 +2,6 @@ * 对称加密算法实现,包括AES、DES、DESede等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.crypto.symmetric; \ No newline at end of file diff --git a/bus-extra/pom.xml b/bus-extra/pom.xml index 6e07d2978e..ee58fef9a7 100644 --- a/bus-extra/pom.xml +++ b/bus-extra/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-extra - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -42,25 +42,25 @@ UTF-8 UTF-8 17 - 1.18.22 - 1.2.76 - 2.8.7 - 2.12.3 + 1.18.24 + 1.2.83 + 2.9.0 + 2.13.3 1.1.8 2.5.1 2.0.3.RELEASE 1.0.0 0.3.1 0.1.54 - 0.32.0 - 3.4.1 + 0.33.0 + 3.5.0 3.8.0 5.1.1 1.21 1.0.6 1.3.0 1.1.7.6 - 4.0.1 + 4.0.4 @@ -151,7 +151,6 @@ org.apache.ftpserver ftpserver-core 1.1.1 - compile slf4j-api @@ -191,8 +190,8 @@ true - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api ${servlet.version} true diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaBuilder.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaBuilder.java index c660a73764..280251e4b3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaBuilder.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaBuilder.java @@ -34,7 +34,6 @@ * 图形验证码工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CaptchaBuilder { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaProvider.java index 4f8cf49160..590ed024ea 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/CaptchaProvider.java @@ -31,7 +31,6 @@ * 验证码接口,提供验证码对象接口定义 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface CaptchaProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/package-info.java index a9f939402e..d84622d8f3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/package-info.java @@ -2,7 +2,6 @@ * 图片验证码实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.captcha; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/AbstractProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/AbstractProvider.java index 6faa757824..f888ff7c7c 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/AbstractProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/AbstractProvider.java @@ -26,7 +26,7 @@ package org.aoju.bus.extra.captcha.provider; import org.aoju.bus.core.codec.Base64; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.ImageKit; import org.aoju.bus.core.toolkit.IoKit; @@ -47,7 +47,6 @@ * 实现类通过实现{@link #createImage(String)} 方法生成图片对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractProvider implements CaptchaProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/CircleProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/CircleProvider.java index f4ec3a8ead..52a69b4a4e 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/CircleProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/CircleProvider.java @@ -38,7 +38,6 @@ * 圆圈干扰验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class CircleProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ClickWordProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ClickWordProvider.java index 26d36f56ab..b24dec1dd1 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ClickWordProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ClickWordProvider.java @@ -33,7 +33,6 @@ * 点选文字验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ClickWordProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/GifProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/GifProvider.java index 4134b6c4fb..d9fff80066 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/GifProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/GifProvider.java @@ -37,7 +37,6 @@ * Git验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GifProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/LineProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/LineProvider.java index 39edf52de3..7cfc03c6ee 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/LineProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/LineProvider.java @@ -37,7 +37,6 @@ * 普通干扰线验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LineProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/PuzzleProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/PuzzleProvider.java index 303a1eecc6..f8f507bd62 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/PuzzleProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/PuzzleProvider.java @@ -33,7 +33,6 @@ * 滑动验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PuzzleProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ShearProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ShearProvider.java index f05e308019..3d85ff9907 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ShearProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/ShearProvider.java @@ -36,7 +36,6 @@ * 扭曲干扰验证码 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ShearProvider extends AbstractProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/package-info.java index fca805fd22..b35c7797e5 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/provider/package-info.java @@ -2,7 +2,6 @@ * 验证码生成实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.captcha.provider; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/AbstractStrategy.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/AbstractStrategy.java index 3efa284905..d0d9bf640c 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/AbstractStrategy.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/AbstractStrategy.java @@ -32,7 +32,6 @@ * 可以通过传入的基础集合和长度随机生成验证码字符 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractStrategy implements CodeStrategy { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/CodeStrategy.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/CodeStrategy.java index 3b88476e68..98fc067162 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/CodeStrategy.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/CodeStrategy.java @@ -29,7 +29,6 @@ * 验证码文字生成器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface CodeStrategy { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/MathStrategy.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/MathStrategy.java index 46b965ddfe..34f1de887c 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/MathStrategy.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/MathStrategy.java @@ -34,7 +34,6 @@ * 数字计算验证码生成器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class MathStrategy implements CodeStrategy { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/RandomStrategy.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/RandomStrategy.java index fd083f642e..18ae59d1f0 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/RandomStrategy.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/RandomStrategy.java @@ -33,7 +33,6 @@ * 可以通过传入的基础集合和长度随机生成验证码字符 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class RandomStrategy extends AbstractStrategy { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/package-info.java index 1287aa0bd5..d7e13171ac 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/captcha/strategy/package-info.java @@ -2,7 +2,6 @@ * 验证码策略实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.captcha.strategy; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectFactory.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectFactory.java index 9f18b909bb..c868c6e399 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectFactory.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectFactory.java @@ -35,7 +35,6 @@ * 解压缩服务工厂 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum EffectFactory { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectProvider.java index 5e4830b760..69694f5aa8 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/EffectProvider.java @@ -31,7 +31,6 @@ * 数据压缩/解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/package-info.java index d0e6ee4315..c1e3bd4bd4 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/package-info.java @@ -4,7 +4,6 @@ * ar, arj, cpio, dump, tar and zip等格式。 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.effect; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Bzip2Provider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Bzip2Provider.java index e8482fdcad..e632023095 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Bzip2Provider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Bzip2Provider.java @@ -37,7 +37,6 @@ * 基于bzip2算法的数据解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Bzip2Provider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/DeflaterProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/DeflaterProvider.java index 12792b4c74..d85fdbdf93 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/DeflaterProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/DeflaterProvider.java @@ -36,7 +36,6 @@ * 基于deflater算法的数据解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class DeflaterProvider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/GzipProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/GzipProvider.java index 82c1465997..618f7f8c16 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/GzipProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/GzipProvider.java @@ -37,7 +37,6 @@ * 基于gzip算法的数据解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GzipProvider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Lz4Provider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Lz4Provider.java index 6e3f1f49be..308965a0d2 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Lz4Provider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/Lz4Provider.java @@ -36,7 +36,6 @@ * 基于lz4算法的数据解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Lz4Provider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/LzoProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/LzoProvider.java index 22ac7b239f..7890b24bef 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/LzoProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/LzoProvider.java @@ -36,7 +36,6 @@ * 基于lzo算法的数据解压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class LzoProvider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/SnappyProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/SnappyProvider.java index ebc60fa91a..478e208ed8 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/SnappyProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/SnappyProvider.java @@ -34,7 +34,6 @@ * 基于snappy的数据压缩 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SnappyProvider implements EffectProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/package-info.java index a1003c7e22..662edc53b2 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/effect/provider/package-info.java @@ -2,7 +2,6 @@ * 基于commons-compress的解包(解压缩)封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.effect.provider; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/emoji/EmojiKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/emoji/EmojiKit.java index a4f150cabf..f4bf0b25b5 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/emoji/EmojiKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/emoji/EmojiKit.java @@ -37,7 +37,6 @@ * 基于emoji-java的Emoji表情工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class EmojiKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/emoji/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/emoji/package-info.java index 4b9c57f483..3a76f753a6 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/emoji/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/emoji/package-info.java @@ -2,7 +2,6 @@ * 基于https://github.com/vdurmont/emoji-java的Emoji表情工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.emoji; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/AbstractFtp.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/AbstractFtp.java index f819a62401..d04ebf0820 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/AbstractFtp.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/AbstractFtp.java @@ -25,9 +25,9 @@ ********************************************************************************/ package org.aoju.bus.extra.ftp; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.CollKit; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.StringKit; @@ -40,7 +40,6 @@ * 抽象FTP类,用于定义通用的FTP方法 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractFtp implements Closeable { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/Ftp.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/Ftp.java index aa734463db..184af090b5 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/Ftp.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/Ftp.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.extra.ftp; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.ObjectKit; @@ -53,7 +53,6 @@ * 此客户端基于Apache-Commons-Net * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Ftp extends AbstractFtp { @@ -350,7 +349,7 @@ public List ls(String path) { } /** - * 遍历某个目录下所有文件和目录,不会递归遍历
+ * 遍历某个目录下所有文件和目录,不会递归遍历 * 此方法自动过滤"."和".."两种目录 * * @param path 目录 @@ -416,7 +415,7 @@ public boolean mkdir(String dir) { } /** - * 判断ftp服务器文件是否存在 + * 判断ftp服务器目录内是否还有子元素(目录或文件) * * @param path 文件路径 * @return 是否存在 diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpConfig.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpConfig.java index c2a3e755a9..68637f6250 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpConfig.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpConfig.java @@ -32,7 +32,6 @@ * FTP配置项参数信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FtpConfig implements Serializable { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpMode.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpMode.java index bc05e0b21c..7aeba0b92d 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpMode.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpMode.java @@ -29,7 +29,6 @@ * FTP连接模式 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum FtpMode { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpServer.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpServer.java index 68aa0b0e4b..0c178e0404 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpServer.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/FtpServer.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.extra.ftp; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.NetKit; import org.apache.ftpserver.ConnectionConfig; import org.apache.ftpserver.FtpServerFactory; @@ -49,7 +49,6 @@ * 基于 Apache FtpServer的服务端简单封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FtpServer { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/package-info.java index 43abd6f9f0..ce0c7e818a 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ftp/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ftp/package-info.java @@ -2,7 +2,6 @@ * 基于Apache Commons Net封装的FTP工具 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.ftp; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonFactory.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonFactory.java index 3434f4246a..7f313b0ba6 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonFactory.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonFactory.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.extra.json; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.instance.Instances; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.extra.pinyin.PinyinProvider; @@ -37,7 +37,6 @@ * 自动创建对应的json解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JsonFactory { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonKit.java index ed24818ded..142ac3eaf7 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonKit.java @@ -33,7 +33,6 @@ * json工具类,通过SPI自动识别 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JsonKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonProvider.java index 0b78cd25be..610991ea7c 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/JsonProvider.java @@ -33,7 +33,6 @@ * JSON服务提供者 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface JsonProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/package-info.java index b5110dd722..78c7cb63a8 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/package-info.java @@ -2,7 +2,6 @@ * JSON封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.json; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/AbstractJsonProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/AbstractJsonProvider.java index 8f855b4dbd..132349690c 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/AbstractJsonProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/AbstractJsonProvider.java @@ -31,7 +31,6 @@ * 默认解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractJsonProvider implements JsonProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/FastJsonProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/FastJsonProvider.java index 22d2444043..d54d5e6acc 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/FastJsonProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/FastJsonProvider.java @@ -38,7 +38,6 @@ * FastJson 解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class FastJsonProvider extends AbstractJsonProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/GsonProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/GsonProvider.java index e86cd90368..f9fb509c5b 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/GsonProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/GsonProvider.java @@ -35,7 +35,6 @@ * Gson 解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class GsonProvider extends AbstractJsonProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/JacksonProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/JacksonProvider.java index d632f0a87d..4653d06f11 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/JacksonProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/JacksonProvider.java @@ -29,7 +29,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import java.io.IOException; import java.lang.reflect.Type; @@ -42,7 +42,6 @@ * Jackson 解析器 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JacksonProvider extends AbstractJsonProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/package-info.java index 134f78f884..f1f2ebc431 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/json/provider/package-info.java @@ -2,7 +2,6 @@ * JSON自定义序列化和反序列化接口实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.json.provider; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/package-info.java index 758e96aff7..baec4a6bee 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/package-info.java @@ -2,7 +2,6 @@ * 扩展第三方插件等功能 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinFactory.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinFactory.java index 9ba862d5d1..976e078592 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinFactory.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinFactory.java @@ -25,8 +25,8 @@ ********************************************************************************/ package org.aoju.bus.extra.pinyin; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.instance.Instances; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ClassKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.logger.Logger; @@ -36,7 +36,6 @@ * 自动创建对应的拼音引擎对象 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PinyinFactory { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinKit.java index 8dea195ca0..4c0dadf1e3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinKit.java @@ -25,11 +25,11 @@ ********************************************************************************/ package org.aoju.bus.extra.pinyin; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.Normal; import org.aoju.bus.core.lang.RegEx; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.StringKit; /** @@ -39,7 +39,6 @@ * 3. Pinyin4j * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class PinyinKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinProvider.java index fd7b558fb6..883025309a 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/PinyinProvider.java @@ -34,7 +34,6 @@ * 拼音服务提供者 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public interface PinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/package-info.java index bafb30f8b8..969783224d 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/package-info.java @@ -2,7 +2,6 @@ * 拼音工具封装 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.pinyin; diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/AbstractPinyinProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/AbstractPinyinProvider.java index 5715d4bec0..7dd18dec18 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/AbstractPinyinProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/AbstractPinyinProvider.java @@ -31,7 +31,6 @@ * 拼音默认实现 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public abstract class AbstractPinyinProvider implements PinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Bopomofo4jProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Bopomofo4jProvider.java index 70e67ba061..67f896e2d3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Bopomofo4jProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Bopomofo4jProvider.java @@ -33,7 +33,6 @@ * Bopomofo4j 引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Bopomofo4jProvider extends AbstractPinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/HoubbPinyinProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/HoubbPinyinProvider.java index ae781b695b..fca95edd8b 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/HoubbPinyinProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/HoubbPinyinProvider.java @@ -32,7 +32,6 @@ * houbb Pinyin 引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class HoubbPinyinProvider extends AbstractPinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/JPinyinProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/JPinyinProvider.java index a780b152e0..cde7190873 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/JPinyinProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/JPinyinProvider.java @@ -28,14 +28,13 @@ import com.github.stuxuhai.jpinyin.PinyinException; import com.github.stuxuhai.jpinyin.PinyinFormat; import com.github.stuxuhai.jpinyin.PinyinHelper; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.toolkit.ArrayKit; /** * Jpinyin 引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JPinyinProvider extends AbstractPinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Pinyin4JProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Pinyin4JProvider.java index feb97afb96..d5ea8ba93d 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Pinyin4JProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/Pinyin4JProvider.java @@ -31,7 +31,7 @@ import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; -import org.aoju.bus.core.lang.exception.InstrumentException; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.text.TextBuilder; import org.aoju.bus.core.toolkit.ArrayKit; @@ -39,7 +39,6 @@ * Pinyin4j 引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Pinyin4JProvider extends AbstractPinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/TinyPinyinProvider.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/TinyPinyinProvider.java index 0659a8fe6d..174908f3c3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/TinyPinyinProvider.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/TinyPinyinProvider.java @@ -31,7 +31,6 @@ * TinyPinyin 引擎 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class TinyPinyinProvider extends AbstractPinyinProvider { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/package-info.java index e5d87ad6cb..d112056ddc 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/pinyin/provider/package-info.java @@ -7,7 +7,6 @@ * TinyPinyin - https://github.com/promeG/TinyPinyin * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.pinyin.provider; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/LuminanceSource.java b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/LuminanceSource.java index d560a5689e..5068593222 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/LuminanceSource.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/LuminanceSource.java @@ -33,7 +33,6 @@ * {@link BufferedImage} 图片二维码源 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public final class LuminanceSource extends com.google.zxing.LuminanceSource { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrCodeKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrCodeKit.java index 23c8db2fb7..65a8add4df 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrCodeKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrCodeKit.java @@ -29,10 +29,10 @@ import com.google.zxing.common.BitMatrix; import com.google.zxing.common.GlobalHistogramBinarizer; import com.google.zxing.common.HybridBinarizer; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.image.Images; import org.aoju.bus.core.lang.Charset; import org.aoju.bus.core.lang.FileType; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.ImageKit; import javax.imageio.ImageIO; @@ -52,7 +52,6 @@ * * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class QrCodeKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrConfig.java b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrConfig.java index b9a9e8bac1..8fb965082b 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrConfig.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/QrConfig.java @@ -41,7 +41,6 @@ * 二维码设置 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class QrConfig { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/package-info.java index 19e68ebfcf..3e4b06b557 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/qrcode/package-info.java @@ -2,7 +2,6 @@ * 二维码封装,基于zxing库 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.qrcode; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/servlet/ServletKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/servlet/ServletKit.java index e42aaa3e7f..91b1783309 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/servlet/ServletKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/servlet/ServletKit.java @@ -28,8 +28,8 @@ import org.aoju.bus.core.beans.copier.CopyOptions; import org.aoju.bus.core.beans.copier.ValueProvider; import org.aoju.bus.core.collection.ArrayIterator; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.*; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.map.CaseInsensitiveMap; import org.aoju.bus.core.toolkit.*; @@ -46,7 +46,6 @@ * Servlet 工具类 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class ServletKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/servlet/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/servlet/package-info.java index 010016de27..fae786a69b 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/servlet/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/servlet/package-info.java @@ -2,7 +2,6 @@ * Servlet封装,包括Servlet参数获取、文件上传、Response写出等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.servlet; \ No newline at end of file diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/ChannelType.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/ChannelType.java index 20b634b6ff..8fee1cb1cc 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/ChannelType.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/ChannelType.java @@ -29,7 +29,6 @@ * Jsch支持的Channel类型 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum ChannelType { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Connector.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Connector.java index 25dd73452d..b4df0a74d6 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Connector.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Connector.java @@ -29,7 +29,6 @@ * 连接者对象,提供一些连接的基本信息 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Connector { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchKit.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchKit.java index c558dc84e0..75f337704b 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchKit.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchKit.java @@ -26,9 +26,9 @@ package org.aoju.bus.extra.ssh; import com.jcraft.jsch.*; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Assert; import org.aoju.bus.core.lang.Charset; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.IoKit; import org.aoju.bus.core.toolkit.NetKit; import org.aoju.bus.core.toolkit.StringKit; @@ -43,7 +43,6 @@ * 它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class JSchKit { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchSessionPool.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchSessionPool.java index 2f36bde485..a1dd292aff 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchSessionPool.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/JSchSessionPool.java @@ -37,7 +37,6 @@ * Jsch会话池 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public enum JSchSessionPool { diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Sftp.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Sftp.java index f3c4e55a6d..51d2eac37f 100755 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Sftp.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/Sftp.java @@ -28,9 +28,9 @@ import com.jcraft.jsch.*; import com.jcraft.jsch.ChannelSftp.LsEntry; import com.jcraft.jsch.ChannelSftp.LsEntrySelector; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Filter; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.StringKit; import org.aoju.bus.extra.ftp.AbstractFtp; @@ -55,7 +55,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class Sftp extends AbstractFtp { @@ -315,7 +314,7 @@ public boolean isDir(String dir) { sftpATTRS = this.channel.stat(dir); } catch (SftpException e) { final String msg = e.getMessage(); - if (msg.contains("No such file") || msg.contains("does not exist")) { + if (StringKit.containsAnyIgnoreCase(msg, "No such file", "does not exist")) { return false; } throw new InstrumentException(e); diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/SshjSftp.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/SshjSftp.java index 75aa2c0f04..d05c0039e3 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/SshjSftp.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/SshjSftp.java @@ -31,8 +31,8 @@ import net.schmizz.sshj.sftp.SFTPClient; import net.schmizz.sshj.transport.verification.PromiscuousVerifier; import net.schmizz.sshj.xfer.FileSystemFile; +import org.aoju.bus.core.exception.InstrumentException; import org.aoju.bus.core.lang.Symbol; -import org.aoju.bus.core.lang.exception.InstrumentException; import org.aoju.bus.core.toolkit.CollKit; import org.aoju.bus.core.toolkit.FileKit; import org.aoju.bus.core.toolkit.IoKit; @@ -55,7 +55,6 @@ *

* * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ public class SshjSftp extends AbstractFtp { @@ -125,7 +124,7 @@ public void init() { this.ssh = new SSHClient(); ssh.addHostKeyVerifier(new PromiscuousVerifier()); try { - ssh.connect(ftpConfig.getHost()); + ssh.connect(ftpConfig.getHost(), ftpConfig.getPort()); ssh.authPassword(ftpConfig.getUser(), ftpConfig.getPassword()); ssh.setRemoteCharset(ftpConfig.getCharset()); this.sftp = ssh.newSFTPClient(); diff --git a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/package-info.java b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/package-info.java index ad3b6a250f..33af8ac8ea 100644 --- a/bus-extra/src/main/java/org/aoju/bus/extra/ssh/package-info.java +++ b/bus-extra/src/main/java/org/aoju/bus/extra/ssh/package-info.java @@ -2,7 +2,6 @@ * Jsch封装,包括端口映射、SFTP封装等 * * @author Kimi Liu - * @version 6.5.0 * @since Java 17+ */ package org.aoju.bus.extra.ssh; \ No newline at end of file diff --git a/bus-gitlab/README.md b/bus-gitlab/README.md index b07e76e0da..e63a97d83b 100755 --- a/bus-gitlab/README.md +++ b/bus-gitlab/README.md @@ -70,7 +70,7 @@ dependencies { org.aoju bus-gitlab - 6.5.0 + 6.5.1 ``` diff --git a/bus-gitlab/pom.xml b/bus-gitlab/pom.xml index a40e6350de..9546e0a4fa 100755 --- a/bus-gitlab/pom.xml +++ b/bus-gitlab/pom.xml @@ -6,7 +6,7 @@ org.aoju bus-gitlab - 6.5.0 + 6.5.1 jar ${project.artifactId} @@ -42,9 +42,9 @@ UTF-8 UTF-8 17 - 2.10.3 - 2.30.1 - 4.0.1 + 2.12.4 + 2.35 + 5.0.0 @@ -53,39 +53,34 @@ bus-core ${project.version} - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson.version} - true - org.glassfish.jersey.inject jersey-hk2 ${jersey.version} - true org.glassfish.jersey.core jersey-client ${jersey.version} - true org.glassfish.jersey.connectors jersey-apache-connector ${jersey.version} - true org.glassfish.jersey.media jersey-media-multipart ${jersey.version} - true - javax.servlet - javax.servlet-api + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + jakarta.servlet + jakarta.servlet-api ${servlet.version} true diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AbstractApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AbstractApi.java index de2ebc2520..0687af030c 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AbstractApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AbstractApi.java @@ -25,8 +25,6 @@ ********************************************************************************/ package org.aoju.bus.gitlab; -import org.aoju.bus.core.toolkit.UriKit; -import org.aoju.bus.gitlab.GitLabApi.ApiVersion; import org.aoju.bus.gitlab.models.Group; import org.aoju.bus.gitlab.models.Label; import org.aoju.bus.gitlab.models.Project; @@ -38,7 +36,9 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.io.File; +import java.io.InputStream; import java.net.URL; +import java.net.URLEncoder; /** * This class is the base class for all the sub API classes. It provides implementations of @@ -56,21 +56,21 @@ public AbstractApi(GitLabApi gitLabApi) { * Returns the project ID or path from the provided Integer, String, or Project instance. * * @param obj the object to determine the ID or path from - * @return the project ID or path from the provided Integer, String, or Project instance + * @return the project ID or path from the provided Long, String, or Project instance * @throws GitLabApiException if any exception occurs during execution */ public Object getProjectIdOrPath(Object obj) throws GitLabApiException { if (obj == null) { throw (new RuntimeException("Cannot determine ID or path from null object")); - } else if (obj instanceof Integer) { + } else if (obj instanceof Long) { return (obj); } else if (obj instanceof String) { return (urlEncode(((String) obj).trim())); } else if (obj instanceof Project) { - Integer id = ((Project) obj).getId(); - if (id != null && id.intValue() > 0) { + Long id = ((Project) obj).getId(); + if (id != null && id.longValue() > 0) { return (id); } @@ -83,7 +83,7 @@ public Object getProjectIdOrPath(Object obj) throws GitLabApiException { } else { throw (new RuntimeException("Cannot determine ID or path from provided " + obj.getClass().getSimpleName() + - " instance, must be Integer, String, or a Project instance")); + " instance, must be Long, String, or a Project instance")); } } @@ -91,21 +91,21 @@ public Object getProjectIdOrPath(Object obj) throws GitLabApiException { * Returns the group ID or path from the provided Integer, String, or Group instance. * * @param obj the object to determine the ID or path from - * @return the group ID or path from the provided Integer, String, or Group instance + * @return the group ID or path from the provided Long, String, or Group instance * @throws GitLabApiException if any exception occurs during execution */ public Object getGroupIdOrPath(Object obj) throws GitLabApiException { if (obj == null) { throw (new RuntimeException("Cannot determine ID or path from null object")); - } else if (obj instanceof Integer) { + } else if (obj instanceof Long) { return (obj); } else if (obj instanceof String) { return (urlEncode(((String) obj).trim())); } else if (obj instanceof Group) { - Integer id = ((Group) obj).getId(); - if (id != null && id.intValue() > 0) { + Long id = ((Group) obj).getId(); + if (id != null && id.longValue() > 0) { return (id); } @@ -118,7 +118,7 @@ public Object getGroupIdOrPath(Object obj) throws GitLabApiException { } else { throw (new RuntimeException("Cannot determine ID or path from provided " + obj.getClass().getSimpleName() + - " instance, must be Integer, String, or a Group instance")); + " instance, must be Long, String, or a Group instance")); } } @@ -133,14 +133,14 @@ public Object getUserIdOrUsername(Object obj) throws GitLabApiException { if (obj == null) { throw (new RuntimeException("Cannot determine ID or username from null object")); - } else if (obj instanceof Integer) { + } else if (obj instanceof Long) { return (obj); } else if (obj instanceof String) { return (urlEncode(((String) obj).trim())); } else if (obj instanceof User) { - Integer id = ((User) obj).getId(); - if (id != null && id.intValue() > 0) { + Long id = ((User) obj).getId(); + if (id != null && id.longValue() > 0) { return (id); } @@ -168,14 +168,14 @@ public Object getLabelIdOrName(Object obj) throws GitLabApiException { if (obj == null) { throw (new RuntimeException("Cannot determine ID or name from null object")); - } else if (obj instanceof Integer) { + } else if (obj instanceof Long) { return (obj); } else if (obj instanceof String) { return (urlEncode(((String) obj).trim())); } else if (obj instanceof Label) { - Integer id = ((Label) obj).getId(); - if (id != null && id.intValue() > 0) { + Long id = ((Label) obj).getId(); + if (id != null && id.longValue() > 0) { return (id); } @@ -192,11 +192,11 @@ public Object getLabelIdOrName(Object obj) throws GitLabApiException { } } - protected ApiVersion getApiVersion() { + protected GitLabApi.ApiVersion getApiVersion() { return (gitLabApi.getApiVersion()); } - protected boolean isApiVersion(ApiVersion apiVersion) { + protected boolean isApiVersion(GitLabApi.ApiVersion apiVersion) { return (gitLabApi.getApiVersion() == apiVersion); } @@ -219,7 +219,18 @@ protected GitLabApiClient getApiClient() { * @throws GitLabApiException if encoding throws an exception */ protected String urlEncode(String s) throws GitLabApiException { - return (UriKit.encode(s)); + try { + String encoded = URLEncoder.encode(s, "UTF-8"); + // Since the encode method encodes plus signs as %2B, + // we can simply replace the encoded spaces with the correct encoding here + encoded = encoded.replace("+", "%20"); + encoded = encoded.replace(".", "%2E"); + encoded = encoded.replace("-", "%2D"); + encoded = encoded.replace("_", "%5F"); + return (encoded); + } catch (Exception e) { + throw new GitLabApiException(e); + } } /** @@ -393,7 +404,7 @@ protected Response post(Response.Status expectedStatus, Form formData, URL url) * @param expectedStatus the HTTP status that should be returned from the server * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaType the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaType unused; will be removed in the next major version * @param pathArgs variable list of arguments used to build the URI * @return a ClientResponse instance with the data returned from the endpoint * @throws GitLabApiException if any exception occurs during execution @@ -406,6 +417,14 @@ protected Response upload(Response.Status expectedStatus, String name, File file } } + protected Response upload(Response.Status expectedStatus, String name, InputStream inputStream, String filename, String mediaType, Object... pathArgs) throws GitLabApiException { + try { + return validate(getApiClient().upload(name, inputStream, filename, mediaType, pathArgs), expectedStatus); + } catch (Exception e) { + throw handle(e); + } + } + /** * Perform a file upload with the specified File instance and path objects, returning * a ClientResponse instance with the data returned from the endpoint. @@ -413,7 +432,7 @@ protected Response upload(Response.Status expectedStatus, String name, File file * @param expectedStatus the HTTP status that should be returned from the server * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaType the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaType unused; will be removed in the next major version * @param url the fully formed path to the GitLab API endpoint * @return a ClientResponse instance with the data returned from the endpoint * @throws GitLabApiException if any exception occurs during execution @@ -433,7 +452,7 @@ protected Response upload(Response.Status expectedStatus, String name, File file * @param expectedStatus the HTTP status that should be returned from the server * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaType the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaType unused; will be removed in the next major version * @param formData the Form containing the name/value pairs * @param url the fully formed path to the GitLab API endpoint * @return a ClientResponse instance with the data returned from the endpoint diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationSettingsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationSettingsApi.java index b2047d141d..a7ce6ec37f 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationSettingsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationSettingsApi.java @@ -61,7 +61,7 @@ public static final ApplicationSettings parseApplicationSettings(JsonNode root) String fieldName = fieldNames.next(); switch (fieldName) { case "id": - appSettings.setId(root.path(fieldName).asInt()); + appSettings.setId(root.path(fieldName).asLong()); break; case "created_at": diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationsApi.java index b7360aa5c8..5ec6d693c8 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ApplicationsApi.java @@ -25,7 +25,6 @@ ********************************************************************************/ package org.aoju.bus.gitlab; -import org.aoju.bus.core.lang.Symbol; import org.aoju.bus.gitlab.models.Application; import javax.ws.rs.core.GenericType; @@ -135,7 +134,7 @@ public Application createApplication(String name, String redirectUri, List getAuditEvents(Date created_after, Date created_before, String entityType, Integer entityId) throws GitLabApiException { + public List getAuditEvents(Date created_after, Date created_before, String entityType, Long entityId) throws GitLabApiException { return (getAuditEvents(created_after, created_before, entityType, entityId, getDefaultPerPage()).all()); } @@ -73,7 +73,7 @@ public List getAuditEvents(Date created_after, Date created_before, * @return a Pager of group Audit events * @throws GitLabApiException if any exception occurs */ - public Pager getAuditEvents(Date created_after, Date created_before, String entityType, Integer entityId, int itemsPerPage) throws GitLabApiException { + public Pager getAuditEvents(Date created_after, Date created_before, String entityType, Long entityId, int itemsPerPage) throws GitLabApiException { Form form = new GitLabApiForm() .withParam("created_before", ISO8601.toString(created_before, false)) .withParam("created_after", ISO8601.toString(created_after, false)) @@ -94,7 +94,7 @@ public Pager getAuditEvents(Date created_after, Date created_before, * @return a Stream of group Audit events * @throws GitLabApiException if any exception occurs */ - public Stream getAuditEventsStream(Date created_after, Date created_before, String entityType, Integer entityId) throws GitLabApiException { + public Stream getAuditEventsStream(Date created_after, Date created_before, String entityType, Long entityId) throws GitLabApiException { return (getAuditEvents(created_after, created_before, entityType, entityId, getDefaultPerPage()).stream()); } @@ -107,7 +107,7 @@ public Stream getAuditEventsStream(Date created_after, Date created_ * @return the group Audit event * @throws GitLabApiException if any exception occurs */ - public AuditEvent getAuditEvent(Integer auditEventId) throws GitLabApiException { + public AuditEvent getAuditEvent(Long auditEventId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "audit_events", auditEventId); return (response.readEntity(AuditEvent.class)); } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AwardEmojiApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AwardEmojiApi.java index cd92510012..b1797477aa 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AwardEmojiApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/AwardEmojiApi.java @@ -53,7 +53,7 @@ public AwardEmojiApi(GitLabApi gitLabApi) { * @return a list of AwardEmoji for the specified issue * @throws GitLabApiException if any exception occurs */ - public List getIssueAwardEmojis(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public List getIssueAwardEmojis(Object projectIdOrPath, Long issueIid) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "award_emoji"); return response.readEntity(new GenericType>() { @@ -70,7 +70,7 @@ public List getIssueAwardEmojis(Object projectIdOrPath, Integer issu * @return a list of AwardEmoji for the specified merge request * @throws GitLabApiException if any exception occurs */ - public List getMergeRequestAwardEmojis(Object projectIdOrPath, Integer mergeRequestIid) throws GitLabApiException { + public List getMergeRequestAwardEmojis(Object projectIdOrPath, Long mergeRequestIid) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "award_emoji"); return response.readEntity(new GenericType>() { @@ -87,7 +87,7 @@ public List getMergeRequestAwardEmojis(Object projectIdOrPath, Integ * @return a list of AwardEmoji for the specified snippet * @throws GitLabApiException if any exception occurs */ - public List getSnippetAwardEmojis(Object projectIdOrPath, Integer snippetId) throws GitLabApiException { + public List getSnippetAwardEmojis(Object projectIdOrPath, Long snippetId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "snippets", snippetId, "award_emoji"); return response.readEntity(new GenericType>() { @@ -95,7 +95,7 @@ public List getSnippetAwardEmojis(Object projectIdOrPath, Integer sn } /** - * Get a list of award emoji for the specified note. + * Get a list of award emoji for the specified issue note. * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji
* @@ -105,13 +105,46 @@ public List getSnippetAwardEmojis(Object projectIdOrPath, Integer sn * @return a list of AwardEmoji for the specified note * @throws GitLabApiException if any exception occurs */ - public List getNoteAwardEmojis(Object projectIdOrPath, Integer issueIid, Integer noteId) throws GitLabApiException { + public List getIssueNoteAwardEmojis(Object projectIdOrPath, Long issueIid, Long noteId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "notes", noteId, "award_emoji"); return response.readEntity(new GenericType>() { }); } + /** + * Get a list of award emoji for the specified issue note. + * + *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param issueIid the issue IID of the issue that owns the note + * @param noteId the note ID to get the award emojis for + * @return a list of AwardEmoji for the specified note + * @throws GitLabApiException if any exception occurs + */ + public List getNoteAwardEmojis(Object projectIdOrPath, Long issueIid, Long noteId) throws GitLabApiException { + return getIssueNoteAwardEmojis(projectIdOrPath, issueIid, noteId); + } + + /** + * Get a list of award emoji for the specified merge request note. + * + *
GitLab Endpoint: GET /projects/:id/merge_requests/:merge_request_iid/notes/:note_id/award_emoji
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param mergeRequestIid the merge request IID of the merge request that owns the note + * @param noteId the note ID to get the award emojis for + * @return a list of AwardEmoji for the specified note + * @throws GitLabApiException if any exception occurs + */ + public List getMergeRequestNoteAwardEmojis(Object projectIdOrPath, Long mergeRequestIid, Long noteId) throws GitLabApiException { + Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), + "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "notes", noteId, "award_emoji"); + return response.readEntity(new GenericType>() { + }); + } + /** * Get the specified award emoji for the specified issue. * @@ -123,7 +156,7 @@ public List getNoteAwardEmojis(Object projectIdOrPath, Integer issue * @return an AwardEmoji instance for the specified award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji getIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, Integer awardId) throws GitLabApiException { + public AwardEmoji getIssueAwardEmoji(Object projectIdOrPath, Long issueIid, Long awardId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "award_emoji", awardId); return (response.readEntity(AwardEmoji.class)); @@ -140,7 +173,7 @@ public AwardEmoji getIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, I * @return an AwardEmoji instance for the specified award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji getMergeRequestAwardEmoji(Object projectIdOrPath, Integer mergeRequestIid, Integer awardId) throws GitLabApiException { + public AwardEmoji getMergeRequestAwardEmoji(Object projectIdOrPath, Long mergeRequestIid, Long awardId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "award_emoji", awardId); return (response.readEntity(AwardEmoji.class)); @@ -157,14 +190,14 @@ public AwardEmoji getMergeRequestAwardEmoji(Object projectIdOrPath, Integer merg * @return an AwardEmoji instance for the specified award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji getSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId, Integer awardId) throws GitLabApiException { + public AwardEmoji getSnippetAwardEmoji(Object projectIdOrPath, Long snippetId, Long awardId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "snippets", snippetId, "award_emoji", awardId); return (response.readEntity(AwardEmoji.class)); } /** - * Get the specified award emoji for the specified note. + * Get the specified award emoji for the specified issue note. * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji/:award_id
* @@ -175,12 +208,48 @@ public AwardEmoji getSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId * @return an AwardEmoji instance for the specified award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji getNoteAwardEmoji(Object projectIdOrPath, Integer issueIid, Integer noteId, Integer awardId) throws GitLabApiException { + public AwardEmoji getIssueNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, Long awardId) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "notes", noteId, "award_emoji", awardId); return (response.readEntity(AwardEmoji.class)); } + /** + * Get the specified award emoji for the specified issue note. + * + *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji/:award_id
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param issueIid the issue IID of the issue that owns the note + * @param noteId the note ID to get the award emoji from + * @param awardId the ID of the award emoji to get + * @return an AwardEmoji instance for the specified award emoji + * @throws GitLabApiException if any exception occurs + * @deprecated use {@link #getIssueNoteAwardEmoji(Object, Long, Long, Long)} instead + */ + @Deprecated + public AwardEmoji getNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, Long awardId) throws GitLabApiException { + return getIssueNoteAwardEmoji(projectIdOrPath, issueIid, noteId, awardId); + } + + /** + * Get the specified award emoji for the specified merge request note. + * + *
GitLab Endpoint: GET /projects/:id/merge_requests/:merge_request_iid/notes/:note_id/award_emoji/:award_id
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param mergeRequestIid the merge request IID of the merge request that owns the note + * @param noteId the note ID to get the award emoji from + * @param awardId the ID of the award emoji to get + * @return an AwardEmoji instance for the specified award emoji + * @throws GitLabApiException if any exception occurs + */ + public AwardEmoji getMergeRequestNoteAwardEmoji(Object projectIdOrPath, Long mergeRequestIid, Long noteId, Long awardId) throws GitLabApiException { + Response response = get(Response.Status.OK, getPageQueryParams(1, getDefaultPerPage()), + "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "notes", noteId, "award_emoji", awardId); + return (response.readEntity(AwardEmoji.class)); + } + /** * Add an award emoji for the specified issue. * @@ -192,7 +261,7 @@ public AwardEmoji getNoteAwardEmoji(Object projectIdOrPath, Integer issueIid, In * @return an AwardEmoji instance for the added award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji addIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, String name) throws GitLabApiException { + public AwardEmoji addIssueAwardEmoji(Object projectIdOrPath, Long issueIid, String name) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm().withParam("name", name, true); Response response = post(Response.Status.CREATED, form.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "award_emoji"); @@ -210,7 +279,7 @@ public AwardEmoji addIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, S * @return an AwardEmoji instance for the added award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji addMergeRequestAwardEmoji(Object projectIdOrPath, Integer mergeRequestIid, String name) throws GitLabApiException { + public AwardEmoji addMergeRequestAwardEmoji(Object projectIdOrPath, Long mergeRequestIid, String name) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm().withParam("name", name, true); Response response = post(Response.Status.CREATED, form.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "award_emoji"); @@ -228,7 +297,7 @@ public AwardEmoji addMergeRequestAwardEmoji(Object projectIdOrPath, Integer merg * @return an AwardEmoji instance for the added award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji addSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId, String name) throws GitLabApiException { + public AwardEmoji addSnippetAwardEmoji(Object projectIdOrPath, Long snippetId, String name) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm().withParam("name", name, true); Response response = post(Response.Status.CREATED, form.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "snippets", snippetId, "award_emoji"); @@ -236,7 +305,7 @@ public AwardEmoji addSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId } /** - * Add an award emoji for the specified note. + * Add an award emoji for the specified issue note. * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/notes/:noteId/award_emoji
* @@ -247,13 +316,50 @@ public AwardEmoji addSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId * @return an AwardEmoji instance for the added award emoji * @throws GitLabApiException if any exception occurs */ - public AwardEmoji addNoteAwardEmoji(Object projectIdOrPath, Integer issueIid, Integer noteId, String name) throws GitLabApiException { + public AwardEmoji addIssueNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, String name) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm().withParam("name", name, true); Response response = post(Response.Status.CREATED, form.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "notes", noteId, "award_emoji"); return (response.readEntity(AwardEmoji.class)); } + /** + * Add an award emoji for the specified issue note. + * + *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/notes/:noteId/award_emoji
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param issueIid the issue IID of the issue that owns the note + * @param noteId the note ID to add the award emoji to + * @param name the name of the award emoji to add + * @return an AwardEmoji instance for the added award emoji + * @throws GitLabApiException if any exception occurs + * @deprecated use {@link #addIssueNoteAwardEmoji(Object, Long, Long, String)} + */ + @Deprecated + public AwardEmoji addNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, String name) throws GitLabApiException { + return addIssueNoteAwardEmoji(projectIdOrPath, issueIid, noteId, name); + } + + /** + * Add an award emoji for the specified merge request note. + * + *
GitLab Endpoint: POST /projects/:id/merge_requests/:merge_request_iid/notes/:noteId/award_emoji
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param mergeRequestIid the merge request IID of the merge request that owns the note + * @param noteId the note ID to add the award emoji to + * @param name the name of the award emoji to add + * @return an AwardEmoji instance for the added award emoji + * @throws GitLabApiException if any exception occurs + */ + public AwardEmoji addMergeRequestAwardEmoji(Object projectIdOrPath, Integer mergeRequestIid, Integer noteId, String name) throws GitLabApiException { + GitLabApiForm form = new GitLabApiForm().withParam("name", name, true); + Response response = post(Response.Status.CREATED, form.asMap(), + "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "notes", noteId, "award_emoji"); + return (response.readEntity(AwardEmoji.class)); + } + /** * Delete an award emoji from the specified issue. * @@ -264,7 +370,7 @@ public AwardEmoji addNoteAwardEmoji(Object projectIdOrPath, Integer issueIid, In * @param awardId the ID of the award emoji to delete * @throws GitLabApiException if any exception occurs */ - public void deleteIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, Integer awardId) throws GitLabApiException { + public void deleteIssueAwardEmoji(Object projectIdOrPath, Long issueIid, Long awardId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "award_emoji", awardId); } @@ -279,7 +385,7 @@ public void deleteIssueAwardEmoji(Object projectIdOrPath, Integer issueIid, Inte * @param awardId the ID of the award emoji to delete * @throws GitLabApiException if any exception occurs */ - public void deleteMergeRequestAwardEmoji(Object projectIdOrPath, Integer mergeRequestIid, Integer awardId) throws GitLabApiException { + public void deleteMergeRequestAwardEmoji(Object projectIdOrPath, Long mergeRequestIid, Long awardId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "award_emoji", awardId); } @@ -294,13 +400,13 @@ public void deleteMergeRequestAwardEmoji(Object projectIdOrPath, Integer mergeRe * @param awardId the ID of the award emoji to delete * @throws GitLabApiException if any exception occurs */ - public void deleteSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId, Integer awardId) throws GitLabApiException { + public void deleteSnippetAwardEmoji(Object projectIdOrPath, Long snippetId, Long awardId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "snippets", snippetId, "award_emoji", awardId); } /** - * Delete an award emoji from the specified note. + * Delete an award emoji from the specified issue note. * *
GitLab Endpoint: DELETE /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji/:award_id
* @@ -310,8 +416,41 @@ public void deleteSnippetAwardEmoji(Object projectIdOrPath, Integer snippetId, I * @param awardId the ID of the award emoji to delete * @throws GitLabApiException if any exception occurs */ - public void deleteNoteAwardEmoji(Object projectIdOrPath, Integer issueIid, Integer noteId, Integer awardId) throws GitLabApiException { + public void deleteIssueNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, Long awardId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "notes", noteId, "award_emoji", awardId); } + + /** + * Delete an award emoji from the specified issue note. + * + *
GitLab Endpoint: DELETE /projects/:id/issues/:issue_iid/notes/:note_id/award_emoji/:award_id
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param issueIid the issue IID that owns the note + * @param noteId the note ID of the note to delete the award emoji from + * @param awardId the ID of the award emoji to delete + * @throws GitLabApiException if any exception occurs + * @deprecated use {@link #deleteIssueNoteAwardEmoji(Object, Long, Long, Long)} instead + */ + @Deprecated + public void deleteNoteAwardEmoji(Object projectIdOrPath, Long issueIid, Long noteId, Long awardId) throws GitLabApiException { + deleteIssueNoteAwardEmoji(projectIdOrPath, issueIid, noteId, awardId); + } + + /** + * Delete an award emoji from the specified merge request note. + * + *
GitLab Endpoint: DELETE /projects/:id/merge_requests/:merge_request_iid/notes/:note_id/award_emoji/:award_id
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param mergeRequestIid the merge request IID of the merge request that owns the note + * @param noteId the note ID of the note to delete the award emoji from + * @param awardId the ID of the award emoji to delete + * @throws GitLabApiException if any exception occurs + */ + public void deleteMergeRequestNoteAwardEmoji(Object projectIdOrPath, Long mergeRequestIid, Long noteId, Long awardId) throws GitLabApiException { + delete(Response.Status.NO_CONTENT, null, + "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "notes", noteId, "award_emoji", awardId); + } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/BoardsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/BoardsApi.java index 59daf3f204..c5d7c28766 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/BoardsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/BoardsApi.java @@ -53,7 +53,7 @@ public BoardsApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: GET /projects/:id/boards
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of project's issue boards * @throws GitLabApiException if any exception occurs */ @@ -66,7 +66,7 @@ public List getBoards(Object projectIdOrPath) throws GitLabApiException { * *
GitLab Endpoint: GET /projects/:id/boards
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param page the page to get * @param perPage the number of items per page * @return a list of project's Boards in the specified range @@ -75,7 +75,7 @@ public List getBoards(Object projectIdOrPath) throws GitLabApiException { public List getBoards(Object projectIdOrPath, int page, int perPage) throws GitLabApiException { Response response = get(javax.ws.rs.core.Response.Status.OK, getPageQueryParams(page, perPage), "projects", getProjectIdOrPath(projectIdOrPath), "boards"); - return (response.readEntity(new GenericType>() { + return (response.readEntity(new GenericType<>() { })); } @@ -84,13 +84,13 @@ public List getBoards(Object projectIdOrPath, int page, int perPage) thro * *
GitLab Endpoint: GET /projects/:id/boards
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param itemsPerPage the number of items per page * @return a Pager of project's issue boards * @throws GitLabApiException if any exception occurs */ public Pager getBoards(Object projectIdOrPath, int itemsPerPage) throws GitLabApiException { - return (new Pager(this, Board.class, itemsPerPage, null, + return (new Pager<>(this, Board.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards")); } @@ -99,7 +99,7 @@ public Pager getBoards(Object projectIdOrPath, int itemsPerPage) throws G * *
GitLab Endpoint: GET /projects/:id/boards
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a Stream of project's issue boards * @throws GitLabApiException if any exception occurs */ @@ -112,12 +112,12 @@ public Stream getBoardsStream(Object projectIdOrPath) throws GitLabApiExc * *
GitLab Endpoint: GET /projects/:id/boards/:board_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @return a Board instance for the specified board ID * @throws GitLabApiException if any exception occurs */ - public Board getBoard(Object projectIdOrPath, Integer boardId) throws GitLabApiException { + public Board getBoard(Object projectIdOrPath, Long boardId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId); return (response.readEntity(Board.class)); @@ -128,11 +128,11 @@ public Board getBoard(Object projectIdOrPath, Integer boardId) throws GitLabApiE * *
GitLab Endpoint: GET /projects/:id/boards/:board_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @return the Board instance for the specified board ID as an Optional instance */ - public Optional getOptionalBoard(Object projectIdOrPath, Integer boardId) { + public Optional getOptionalBoard(Object projectIdOrPath, Long boardId) { try { return (Optional.ofNullable(getBoard(projectIdOrPath, boardId))); } catch (GitLabApiException glae) { @@ -147,7 +147,7 @@ public Optional getOptionalBoard(Object projectIdOrPath, Integer boardId) * *
GitLab Endpoint: POST /projects/:id/boards
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param name the name for the new board * @return the created Board instance * @throws GitLabApiException if any exception occurs @@ -165,7 +165,7 @@ public Board createBoard(Object projectIdOrPath, String name) throws GitLabApiEx * *
GitLab Endpoint: PUT /projects/:id/boards/:board_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param boardId the ID of the board, required * @param name the new name of the board, optional (can be null) * @param assigneeId the assignee the board should be scoped to, optional (can be null) @@ -175,8 +175,8 @@ public Board createBoard(Object projectIdOrPath, String name) throws GitLabApiEx * @return the updated Board instance * @throws GitLabApiException if any exception occurs */ - public BoardList updateBoard(Object projectIdOrPath, Integer boardId, String name, - Integer assigneeId, Integer milestoneId, String labels, Integer weight) throws GitLabApiException { + public BoardList updateBoard(Object projectIdOrPath, Long boardId, String name, + Long assigneeId, Long milestoneId, String labels, Integer weight) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("name", name) .withParam("assignee_id", assigneeId) @@ -195,11 +195,11 @@ public BoardList updateBoard(Object projectIdOrPath, Integer boardId, String nam * *
GitLab Endpoint: DELETE /projects/:id/boards/:board_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @throws GitLabApiException if any exception occurs */ - public void deleteBoard(Object projectIdOrPath, Integer boardId) throws GitLabApiException { + public void deleteBoard(Object projectIdOrPath, Long boardId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId); } @@ -208,12 +208,12 @@ public void deleteBoard(Object projectIdOrPath, Integer boardId) throws GitLabAp * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @return a list of the issue board's lists * @throws GitLabApiException if any exception occurs */ - public List getBoardLists(Object projectIdOrPath, Integer boardId) throws GitLabApiException { + public List getBoardLists(Object projectIdOrPath, Long boardId) throws GitLabApiException { return (getBoardLists(projectIdOrPath, boardId, getDefaultPerPage()).all()); } @@ -223,14 +223,14 @@ public List getBoardLists(Object projectIdOrPath, Integer boardId) th * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param page the page to get * @param perPage the number of Boards per page * @return a list of the issue board's lists in the specified range * @throws GitLabApiException if any exception occurs */ - public List getBoardLists(Object projectIdOrPath, Integer boardId, int page, int perPage) throws GitLabApiException { + public List getBoardLists(Object projectIdOrPath, Long boardId, int page, int perPage) throws GitLabApiException { Response response = get(javax.ws.rs.core.Response.Status.OK, getPageQueryParams(page, perPage), "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists"); return (response.readEntity(new GenericType>() { @@ -242,13 +242,13 @@ public List getBoardLists(Object projectIdOrPath, Integer boardId, in * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param itemsPerPage the number of Board instances that will be fetched per page * @return a Pager of the issue board's lists * @throws GitLabApiException if any exception occurs */ - public Pager getBoardLists(Object projectIdOrPath, Integer boardId, int itemsPerPage) throws GitLabApiException { + public Pager getBoardLists(Object projectIdOrPath, Long boardId, int itemsPerPage) throws GitLabApiException { return (new Pager(this, BoardList.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists")); } @@ -258,12 +258,12 @@ public Pager getBoardLists(Object projectIdOrPath, Integer boardId, i * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @return a Stream of the issue board's lists * @throws GitLabApiException if any exception occurs */ - public Stream getBoardsListsStream(Object projectIdOrPath, Integer boardId) throws GitLabApiException { + public Stream getBoardsListsStream(Object projectIdOrPath, Long boardId) throws GitLabApiException { return (getBoardLists(projectIdOrPath, boardId, getDefaultPerPage()).stream()); } @@ -272,13 +272,13 @@ public Stream getBoardsListsStream(Object projectIdOrPath, Integer bo * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists/:list_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param listId the ID of the board lists to get * @return a BoardList instance for the specified board ID and list ID * @throws GitLabApiException if any exception occurs */ - public BoardList getBoardList(Object projectIdOrPath, Integer boardId, Integer listId) throws GitLabApiException { + public BoardList getBoardList(Object projectIdOrPath, Long boardId, Long listId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists", listId); return (response.readEntity(BoardList.class)); @@ -289,12 +289,12 @@ public BoardList getBoardList(Object projectIdOrPath, Integer boardId, Integer l * *
GitLab Endpoint: GET /projects/:id/boards/:board_id/lists/:list_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param listId the ID of the board lists to get * @return a BoardList instance for the specified board ID and list ID as an Optional instance */ - public Optional getOptionalBoardList(Object projectIdOrPath, Integer boardId, Integer listId) { + public Optional getOptionalBoardList(Object projectIdOrPath, Long boardId, Long listId) { try { return (Optional.ofNullable(getBoardList(projectIdOrPath, boardId, listId))); } catch (GitLabApiException glae) { @@ -307,13 +307,13 @@ public Optional getOptionalBoardList(Object projectIdOrPath, Integer * *
GitLab Endpoint: POST /projects/:id/boards/:board_id/lists
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param labelId the ID of the label * @return the created BoardList instance * @throws GitLabApiException if any exception occurs */ - public BoardList createBoardList(Object projectIdOrPath, Integer boardId, Integer labelId) throws GitLabApiException { + public BoardList createBoardList(Object projectIdOrPath, Long boardId, Long labelId) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("label_id", labelId, true); Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists"); @@ -325,14 +325,14 @@ public BoardList createBoardList(Object projectIdOrPath, Integer boardId, Intege * *
GitLab Endpoint: PUT /projects/:id/boards/:board_id/lists/:list_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param listId the ID of the list * @param position the new position for the list * @return the updated BoardList instance * @throws GitLabApiException if any exception occurs */ - public BoardList updateBoardList(Object projectIdOrPath, Integer boardId, Integer listId, Integer position) throws GitLabApiException { + public BoardList updateBoardList(Object projectIdOrPath, Long boardId, Long listId, Integer position) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("position", position, true); Response response = putWithFormData(Response.Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists", listId); @@ -344,12 +344,12 @@ public BoardList updateBoardList(Object projectIdOrPath, Integer boardId, Intege * *
GitLab Endpoint: DELETE /projects/:id/boards/:board_id/lists/:list_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param boardId the ID of the board * @param listId the ID of the list * @throws GitLabApiException if any exception occurs */ - public void deleteBoardList(Object projectIdOrPath, Integer boardId, Integer listId) throws GitLabApiException { + public void deleteBoardList(Object projectIdOrPath, Long boardId, Long listId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "boards", boardId, "lists", listId); } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/CommitsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/CommitsApi.java index 4738ecf917..9497678539 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/CommitsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/CommitsApi.java @@ -53,7 +53,7 @@ public CommitsApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list containing the commits for the specified project ID * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ @@ -61,12 +61,29 @@ public List getCommits(Object projectIdOrPath) throws GitLabApiException return (getCommits(projectIdOrPath, null, null, null, null, true, null, null, getDefaultPerPage()).all()); } + /** + * Get a list of repository commits in a project. + * + *
GitLab Endpoint: GET /projects/:id/repository/commits
+ * + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance + * @param page the page to get + * @param perPage the number of commits per page + * @return a list containing the commits for the specified project ID + * @throws GitLabApiException GitLabApiException if any exception occurs during execution + * @deprecated + */ + @Deprecated + public List getCommits(Object projectIdOrPath, int page, int perPage) throws GitLabApiException { + return (getCommits(projectIdOrPath, null, null, null, page, perPage)); + } + /** * Get a Pager of all repository commits in a project. * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param itemsPerPage the number of Commit instances that will be fetched per page * @return a Pager containing the commits for the specified project ID * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -80,7 +97,7 @@ public Pager getCommits(Object projectIdOrPath, int itemsPerPage) throws * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a Stream containing the commits for the specified project ID * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ @@ -93,7 +110,7 @@ public Stream getCommitStream(Object projectIdOrPath) throws GitLabApiEx * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -110,7 +127,7 @@ public List getCommits(Object projectIdOrPath, String ref, Date since, D * *
GitLab Endpoint: GET /projects/:id/repository/commits?path=:file_path
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param path the path to file of a project * @return a list containing the commits for the specified project ID and file @@ -125,7 +142,7 @@ public List getCommits(Object projectIdOrPath, String ref, String path) * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -136,12 +153,32 @@ public List getCommits(Object projectIdOrPath, String ref, Date since, D return (getCommits(projectIdOrPath, ref, since, until, null, null, null, null, getDefaultPerPage()).all()); } + /** + * Get a list of repository commits in a project. + * + *
GitLab Endpoint: GET /projects/:id/repository/commits
+ * + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance + * @param ref the name of a repository branch or tag or if not given the default branch + * @param since only commits after or on this date will be returned + * @param until only commits before or on this date will be returned + * @param page the page to get + * @param perPage the number of commits per page + * @return a list containing the commits for the specified project ID + * @throws GitLabApiException GitLabApiException if any exception occurs during execution + * @deprecated + */ + @Deprecated + public List getCommits(Object projectIdOrPath, String ref, Date since, Date until, int page, int perPage) throws GitLabApiException { + return (getCommits(projectIdOrPath, ref, since, until, null, page, perPage)); + } + /** * Get a Stream of repository commits in a project. * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -157,7 +194,7 @@ public Stream getCommitsStream(Object projectIdOrPath, String ref, Date * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -169,12 +206,42 @@ public Stream getCommitsStream(Object projectIdOrPath, String ref, Date return (getCommits(projectIdOrPath, ref, since, until, path, null, null, null, getDefaultPerPage()).stream()); } + /** + * Get a list of repository commits in a project. + * + *
GitLab Endpoint: GET /projects/:id/repository/commits
+ * + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance + * @param ref the name of a repository branch or tag or if not given the default branch + * @param since only commits after or on this date will be returned + * @param until only commits before or on this date will be returned + * @param path the path to file of a project + * @param page the page to get + * @param perPage the number of commits per page + * @return a list containing the commits for the specified project ID + * @throws GitLabApiException GitLabApiException if any exception occurs during execution + * @deprecated + */ + @Deprecated + public List getCommits(Object projectIdOrPath, String ref, Date since, Date until, String path, int page, int perPage) throws GitLabApiException { + Form formData = new GitLabApiForm() + .withParam("ref_name", ref) + .withParam("since", ISO8601.toString(since, false)) + .withParam("until", ISO8601.toString(until, false)) + .withParam("path", (path == null ? null : urlEncode(path))) + .withParam(PAGE_PARAM, page) + .withParam(PER_PAGE_PARAM, perPage); + Response response = get(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "repository", "commits"); + return (response.readEntity(new GenericType>() { + })); + } + /** * Get a Pager of repository commits in a project. * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -191,7 +258,7 @@ public Pager getCommits(Object projectIdOrPath, String ref, Date since, * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -209,7 +276,7 @@ public Pager getCommits(Object projectIdOrPath, String ref, Date since, * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -230,7 +297,7 @@ public List getCommits(Object projectIdOrPath, String ref, Date since, D * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -260,7 +327,7 @@ public Pager getCommits(Object projectIdOrPath, String ref, Date since, * *
GitLab Endpoint: GET /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param ref the name of a repository branch or tag or if not given the default branch * @param since only commits after or on this date will be returned * @param until only commits before or on this date will be returned @@ -281,7 +348,7 @@ public Stream getCommitsStream(Object projectIdOrPath, String ref, Date * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return the Commit instance for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -296,7 +363,7 @@ public Commit getCommit(Object projectIdOrPath, String sha) throws GitLabApiExce * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return the Commit for the specified project ID/sha pair as an Optional instance */ @@ -313,7 +380,7 @@ public Optional getOptionalCommit(Object projectIdOrPath, String sha) { * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a List of all references (from branches or tags) a commit is pushed to * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -328,7 +395,7 @@ public List getCommitRefs(Object projectIdOrPath, String sha) throws * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs?type=:refType
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param itemsPerPage the number of Commit instances that will be fetched per page * @return a Pager of references (from branches or tags) a commit is pushed to @@ -344,7 +411,7 @@ public Pager getCommitRefs(Object projectIdOrPath, String sha, int it * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a Stream of all references (from branches or tags) a commit is pushed to * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -359,7 +426,7 @@ public Stream getCommitRefsStream(Object projectIdOrPath, String sha) * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs?type=:refType
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param refType the scope of commits. Possible values branch, tag, all. Default is all. * @return a List of all references (from branches or tags) a commit is pushed to @@ -375,7 +442,7 @@ public List getCommitRefs(Object projectIdOrPath, String sha, CommitR * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs?type=:refType
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param refType the scope of commits. Possible values branch, tag, all. Default is all. * @param itemsPerPage the number of Commit instances that will be fetched per page @@ -393,7 +460,7 @@ public Pager getCommitRefs(Object projectIdOrPath, String sha, Commit * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/refs?type=:refType
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param refType the scope of commits. Possible values branch, tag, all. Default is all. * @return a Stream of all references (from branches or tags) a commit is pushed to @@ -409,7 +476,7 @@ public Stream getCommitRefsStream(Object projectIdOrPath, String sha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/statuses
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA * @param filter the commit statuses file, contains ref, stage, name, all * @return a List containing the commit statuses for the specified project and sha that meet the provided filter @@ -424,7 +491,7 @@ public List getCommitStatuses(Object projectIdOrPath, String sha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/statuses
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA * @param filter the commit statuses file, contains ref, stage, name, all * @param page the page to get @@ -456,7 +523,7 @@ public List getCommitStatuses(Object projectIdOrPath, String sha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/statuses
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA * @param filter the commit statuses file, contains ref, stage, name, all * @param itemsPerPage the number of CommitStatus instances that will be fetched per page @@ -484,7 +551,7 @@ public Pager getCommitStatuses(Object projectIdOrPath, String sha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/statuses
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA * @param filter the commit statuses file, contains ref, stage, name, all * @return a Stream containing the commit statuses for the specified project and sha that meet the provided filter @@ -507,7 +574,7 @@ public Stream getCommitStatusesStream(Object projectIdOrPath, Stri * *
GitLab Endpoint: POST /projects/:id/statuses/:sha
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance (required) + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance (required) * @param sha a commit SHA (required) * @param state the state of the status. Can be one of the following: PENDING, RUNNING, SUCCESS, FAILED, CANCELED (required) * @param status the CommitSatus instance hoilding the optional parms: ref, name, target_url, description, and coverage @@ -531,7 +598,7 @@ public CommitStatus addCommitStatus(Object projectIdOrPath, String sha, CommitBu * *
GitLab Endpoint: POST /projects/:id/statuses/:sha
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance (required) + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance (required) * @param sha a commit SHA (required) * @param state the state of the status. Can be one of the following: PENDING, RUNNING, SUCCESS, FAILED, CANCELED (required) * @param pipelineId The ID of the pipeline to set status. Use in case of several pipeline on same SHA (optional) @@ -539,7 +606,7 @@ public CommitStatus addCommitStatus(Object projectIdOrPath, String sha, CommitBu * @return a CommitStatus instance with the updated info * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public CommitStatus addCommitStatus(Object projectIdOrPath, String sha, CommitBuildState state, Integer pipelineId, CommitStatus status) throws GitLabApiException { + public CommitStatus addCommitStatus(Object projectIdOrPath, String sha, CommitBuildState state, Long pipelineId, CommitStatus status) throws GitLabApiException { if (projectIdOrPath == null) { throw new RuntimeException("projectIdOrPath cannot be null"); @@ -571,7 +638,7 @@ public CommitStatus addCommitStatus(Object projectIdOrPath, String sha, CommitBu * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/diff
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a List of Diff instances for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -585,7 +652,7 @@ public List getDiff(Object projectIdOrPath, String sha) throws GitLabApiEx * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/diff
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param itemsPerPage the number of Diff instances that will be fetched per page * @return a Pager of Diff instances for the specified project ID/sha pair @@ -610,7 +677,7 @@ public Pager getDiff(Object projectIdOrPath, String sha, int itemsPerPage) * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/diff
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a Stream of Diff instances for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -624,7 +691,7 @@ public Stream getDiffStream(Object projectIdOrPath, String sha) throws Git * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/comments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a List of Comment instances for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -638,7 +705,7 @@ public List getComments(Object projectIdOrPath, String sha) throws GitL * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/comments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param itemsPerPage the number of Comment instances that will be fetched per page * @return a List of Comment instances for the specified project ID/sha pair @@ -653,7 +720,7 @@ public Pager getComments(Object projectIdOrPath, String sha, int itemsP * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/comments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return a Stream of Comment instances for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -668,7 +735,7 @@ public Stream getCommentsStream(Object projectIdOrPath, String sha) thr * *
GitLab Endpoint: POST /projects/:id/repository/commits/:sha/comments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param note the text of the comment, required * @param path the file path relative to the repository, optional @@ -692,7 +759,7 @@ public Comment addComment(Object projectIdOrPath, String sha, String note, Strin * *
GitLab Endpoint: POST /projects/:id/repository/commits/:sha/comments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @param note the text of the comment, required * @return a Comment instance for the posted comment @@ -707,7 +774,7 @@ public Comment addComment(Object projectIdOrPath, String sha, String note) throw * *
GitLab Endpoint: POST /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param branch tame of the branch to commit into. To create a new branch, also provide startBranch * @param commitMessage the commit message * @param startBranch the name of the branch to start the new commit from @@ -734,7 +801,7 @@ public Commit createCommit(Object projectIdOrPath, String branch, String commitM * *
GitLab Endpoint: POST /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param branch tame of the branch to commit into. To create a new branch, also provide startBranch * @param commitMessage the commit message * @param startBranch the name of the branch to start the new commit from @@ -762,7 +829,7 @@ public Commit createCommit(Object projectIdOrPath, String branch, String commitM * *
GitLab Endpoint: POST /projects/:id/repository/commits
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param payload a CommitPayload instance holding the parameters for the commit * @return the created Commit instance * @throws GitLabApiException if any exception occurs during execution @@ -801,7 +868,7 @@ public Commit createCommit(Object projectIdOrPath, CommitPayload payload) throws * *
GitLab Endpoint: POST /projects/:id/repository/commits/:sha/revert
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA to revert * @param branch the target branch to revert the commit on * @return a Commit instance holding the reverted commit @@ -820,7 +887,7 @@ public Commit revertCommit(Object projectIdOrPath, String sha, String branch) th * *
GitLab Endpoint: POST /projects/:id/repository/commits/:sha/cherry_pick
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA to cherry pick * @param branch the target branch to cherry pick the commit on * @return a Commit instance holding the cherry picked commit @@ -839,7 +906,7 @@ public Commit cherryPickCommit(Object projectIdOrPath, String sha, String branch * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA to get merge requests for * @return a list containing the MergeRequest instances for the specified project/SHA * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -853,7 +920,7 @@ public List getMergeRequests(Object projectIdOrPath, String sha) t * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA to get merge requests for * @param itemsPerPage the number of Commit instances that will be fetched per page * @return a Pager containing the MergeRequest instances for the specified project/SHA @@ -869,7 +936,7 @@ public Pager getMergeRequests(Object projectIdOrPath, String sha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha the commit SHA to get merge requests for * @return a Stream containing the MergeRequest instances for the specified project/SHA * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -883,7 +950,7 @@ public Stream getMergeRequestsStream(Object projectIdOrPath, Strin * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/signature
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return the GpgSignature instance for the specified project ID/sha pair * @throws GitLabApiException GitLabApiException if any exception occurs during execution @@ -899,7 +966,7 @@ public GpgSignature getGpgSignature(Object projectIdOrPath, String sha) throws G * *
GitLab Endpoint: GET /projects/:id/repository/commits/:sha/signature
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param sha a commit hash or name of a branch or tag * @return the GpgSignature for the specified project ID/sha pair as an Optional instance */ diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/Constants.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/Constants.java index 04b0ac84d1..d0156cfa19 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/Constants.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/Constants.java @@ -181,6 +181,56 @@ public String toString() { } } + /** + * Enum to use for ordering the results of getPackages(). + */ + public enum PackageOrderBy { + + NAME, CREATED_AT, VERSION, TYPE, PROJECT_PATH; + + private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(PackageOrderBy.class); + + @JsonCreator + public static PackageOrderBy forValue(String value) { + return enumHelper.forValue(value); + } + + @JsonValue + public String toValue() { + return (enumHelper.toString(this)); + } + + @Override + public String toString() { + return (enumHelper.toString(this)); + } + } + + /** + * Enum to use for filtering the results of getPackages(). + */ + public enum PackageStatus { + + DEFAULT, HIDDEN, PROCESSING; + + private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(PackageStatus.class); + + @JsonCreator + public static PackageStatus forValue(String value) { + return enumHelper.forValue(value); + } + + @JsonValue + public String toValue() { + return (enumHelper.toString(this)); + } + + @Override + public String toString() { + return (enumHelper.toString(this)); + } + } + /** * Enum to use for ordering the results of getProjects(). */ @@ -327,6 +377,31 @@ public String toString() { } } + /** + * Enum to use for ordering the results of getContibutors(). + */ + public enum ContributorOrderBy { + + NAME, EMAIL, COMMITS; + + private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(ContributorOrderBy.class); + + @JsonCreator + public static ContributorOrderBy forValue(String value) { + return enumHelper.forValue(value); + } + + @JsonValue + public String toValue() { + return (enumHelper.toString(this)); + } + + @Override + public String toString() { + return (enumHelper.toString(this)); + } + } + /** * Enum to use for specifying the scope when calling getPipelines(). */ @@ -555,7 +630,7 @@ public String toString() { */ public enum ActionType { - CREATED, UPDATED, CLOSED, REOPENED, PUSHED, COMMENTED, MERGED, JOINED, LEFT, DESTROYED, EXPIRED, REMOVED; + CREATED, UPDATED, OPENED, CLOSED, REOPENED, PUSHED, COMMENTED, MERGED, JOINED, LEFT, DESTROYED, EXPIRED, REMOVED, DELETED, APPROVED, ACCEPTED, IMPORTED; private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(ActionType.class); @@ -1045,5 +1120,29 @@ public String toString() { return (enumHelper.toString(this)); } } + + /** + * Enum to use for specifying the Event scope. + */ + public enum EventScope { + ALL; + + private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(EventScope.class); + + @JsonCreator + public static EventScope forValue(String value) { + return enumHelper.forValue(value); + } + + @JsonValue + public String toValue() { + return (enumHelper.toString(this)); + } + + @Override + public String toString() { + return (enumHelper.toString(this)); + } + } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ContainerRegistryApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ContainerRegistryApi.java index a81b8847cc..4ecf0e9dc9 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ContainerRegistryApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ContainerRegistryApi.java @@ -22,7 +22,29 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * * THE SOFTWARE. * * * - ********************************************************************************/ + ********************************************************************************//* + * The MIT License (MIT) + * + * Copyright (c) 2017 Greg Messner + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + package org.aoju.bus.gitlab; import org.aoju.bus.gitlab.models.RegistryRepository; @@ -50,7 +72,7 @@ public ContainerRegistryApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: GET /projects/:id/registry/repositories
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of pages in the project's registry repositories * @throws GitLabApiException if any exception occurs */ @@ -63,7 +85,7 @@ public List getRepositories(Object projectIdOrPath) throws G * *
GitLab Endpoint: GET /projects/:id/registry/repositories
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param page the page to get * @param perPage the number of Package instances per page * @return a list of registry repositories for the specified range @@ -81,7 +103,7 @@ public List getRepositories(Object projectIdOrPath, int page * *
GitLab Endpoint: GET /projects/:id/registry/repositories
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param itemsPerPage the number of RegistryRepository instances per page * @return a Pager of registry repositories for the specified range * @throws GitLabApiException if any exception occurs @@ -96,7 +118,7 @@ public Pager getRepositories(Object projectIdOrPath, int ite * *
GitLab Endpoint: GET /projects/:id/registry/repositories
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a Stream of pages in the project's registry repositories * @throws GitLabApiException if any exception occurs */ @@ -111,11 +133,11 @@ public Stream getRepositoriesStream(Object projectIdOrPath) * *
GitLab Endpoint: DELETE /projects/:id/registry/repositories/:repository_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @throws GitLabApiException if any exception occurs */ - public void deleteRepository(Object projectIdOrPath, Integer repositoryId) throws GitLabApiException { + public void deleteRepository(Object projectIdOrPath, Long repositoryId) throws GitLabApiException { if (repositoryId == null) { throw new RuntimeException("repositoryId cannot be null"); @@ -129,12 +151,12 @@ public void deleteRepository(Object projectIdOrPath, Integer repositoryId) throw * *
GitLab Endpoint: GET /projects/:id/registry/repositories/:repository_id/tags
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @return a list of Repository Tags for the specified repository ID * @throws GitLabApiException if any exception occurs */ - public List getRepositoryTags(Object projectIdOrPath, Integer repositoryId) throws GitLabApiException { + public List getRepositoryTags(Object projectIdOrPath, Long repositoryId) throws GitLabApiException { return getRepositoryTags(projectIdOrPath, repositoryId, getDefaultPerPage()).all(); } @@ -143,13 +165,13 @@ public List getRepositoryTags(Object projectIdOrPath, Int * *
GitLab Endpoint: GET /projects/:id/registry/repositories/:repository_id/tags
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @param itemsPerPage the number of RegistryRepositoryTag instances per page * @return a Pager of Repository Tags for the specified repository ID * @throws GitLabApiException if any exception occurs */ - public Pager getRepositoryTags(Object projectIdOrPath, Integer repositoryId, int itemsPerPage) throws GitLabApiException { + public Pager getRepositoryTags(Object projectIdOrPath, Long repositoryId, int itemsPerPage) throws GitLabApiException { return (new Pager<>(this, RegistryRepositoryTag.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "registry", "repositories", repositoryId, "tags")); } @@ -159,12 +181,12 @@ public Pager getRepositoryTags(Object projectIdOrPath, In * *
GitLab Endpoint: GET /projects/:id/registry/repositories/:repository_id/tags
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @return a list of Repository Tags for the specified repository ID * @throws GitLabApiException if any exception occurs */ - public Stream getRepositoryTagsStream(Object projectIdOrPath, Integer repositoryId) throws GitLabApiException { + public Stream getRepositoryTagsStream(Object projectIdOrPath, Long repositoryId) throws GitLabApiException { return getRepositoryTags(projectIdOrPath, repositoryId, getDefaultPerPage()).stream(); } @@ -173,13 +195,13 @@ public Stream getRepositoryTagsStream(Object projectIdOrP * *
GitLab Endpoint: GET /projects/:id/registry/repositories/:repository_id/tags/:tag_name
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @param tagName the name of tag * @return the Repository Tag for the specified repository ID * @throws GitLabApiException if any exception occurs */ - public RegistryRepositoryTag getRepositoryTag(Object projectIdOrPath, Integer repositoryId, String tagName) throws GitLabApiException { + public RegistryRepositoryTag getRepositoryTag(Object projectIdOrPath, Long repositoryId, String tagName) throws GitLabApiException { Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "registry", "repositories", repositoryId, "tags", tagName); return response.readEntity(new GenericType() { @@ -191,12 +213,12 @@ public RegistryRepositoryTag getRepositoryTag(Object projectIdOrPath, Integer re * *
GitLab Endpoint: GET /projects/:id/registry/repositories/:repository_id/tags/:tag_name
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @param tagName the name of tag * @return the Repository Tag for the specified repository ID as the value of the Optional */ - public Optional getOptionalRepositoryTag(Object projectIdOrPath, Integer repositoryId, String tagName) { + public Optional getOptionalRepositoryTag(Object projectIdOrPath, Long repositoryId, String tagName) { try { return (Optional.ofNullable(getRepositoryTag(projectIdOrPath, repositoryId, tagName))); } catch (GitLabApiException glae) { @@ -209,12 +231,12 @@ public Optional getOptionalRepositoryTag(Object projectId * *
GitLab Endpoint: DELETE /projects/:id/registry/repositories/:repository_id/tags/:tag_name
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @param tagName the name of the tag to delete * @throws GitLabApiException if any exception occurs */ - public void deleteRepositoryTag(Object projectIdOrPath, Integer repositoryId, String tagName) throws GitLabApiException { + public void deleteRepositoryTag(Object projectIdOrPath, Long repositoryId, String tagName) throws GitLabApiException { if (repositoryId == null) { throw new RuntimeException("repositoryId cannot be null"); @@ -242,7 +264,7 @@ public void deleteRepositoryTag(Object projectIdOrPath, Integer repositoryId, St * These operations are executed asynchronously and it might take time to get executed. You can run this at most * once an hour for a given container repository. * - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param repositoryId the ID of registry repository * @param nameRegex the regex of the name to delete. To delete all tags specify .*. * @param keepN the amount of latest tags of given name to keep. @@ -250,7 +272,7 @@ public void deleteRepositoryTag(Object projectIdOrPath, Integer repositoryId, St * 1h, 1d, 1month. * @throws GitLabApiException if any exception occurs */ - public void deleteRepositoryTags(Object projectIdOrPath, Integer repositoryId, String nameRegex, Integer keepN, String olderThan) throws GitLabApiException { + public void deleteRepositoryTags(Object projectIdOrPath, Long repositoryId, String nameRegex, Integer keepN, String olderThan) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("name_regex", nameRegex, true) diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployKeysApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployKeysApi.java index 8f3ab4718b..cb21de0ce7 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployKeysApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployKeysApi.java @@ -102,7 +102,7 @@ public Stream getDeployKeysStream() throws GitLabApiException { * *
GitLab Endpoint: GET /projects/:id/deploy_keys
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of DeployKey * @throws GitLabApiException if any exception occurs */ @@ -116,7 +116,7 @@ public List getProjectDeployKeys(Object projectIdOrPath) throws GitLa * *
GitLab Endpoint: GET /projects/:id/deploy_keys
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param page the page to get * @param perPage the number of deploy keys per page * @return the list of DeployKey in the specified range @@ -134,7 +134,7 @@ public List getProjectDeployKeys(Object projectIdOrPath, int page, in * *
GitLab Endpoint: GET /projects/:id/deploy_keys
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance@param projectId the ID of the project + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance@param projectId the ID of the project * @param itemsPerPage the number of DeployKey instances that will be fetched per page * @return a Pager of DeployKey * @throws GitLabApiException if any exception occurs @@ -149,7 +149,7 @@ public Pager getProjectDeployKeys(Object projectIdOrPath, int itemsPe * *
GitLab Endpoint: GET /projects/:id/deploy_keys
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of DeployKey * @throws GitLabApiException if any exception occurs */ @@ -162,12 +162,12 @@ public Stream getProjectDeployKeysStream(Object projectIdOrPath) thro * *
GitLab Endpoint: GET /projects/:id/deploy_keys/:key_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param keyId the ID of the deploy key to delete * @return the DeployKey instance for the specified project ID and key ID * @throws GitLabApiException if any exception occurs */ - public DeployKey getDeployKey(Object projectIdOrPath, Integer keyId) throws GitLabApiException { + public DeployKey getDeployKey(Object projectIdOrPath, Long keyId) throws GitLabApiException { if (keyId == null) { throw new RuntimeException("keyId cannot be null"); @@ -183,11 +183,11 @@ public DeployKey getDeployKey(Object projectIdOrPath, Integer keyId) throws GitL * *
GitLab Endpoint: GET /projects/:id/deploy_keys/:key_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param keyId the ID of the deploy key to delete * @return the DeployKey for the specified project ID and key ID as an Optional instance */ - public Optional getOptionalDeployKey(Object projectIdOrPath, Integer keyId) { + public Optional getOptionalDeployKey(Object projectIdOrPath, Long keyId) { try { return (Optional.ofNullable(getDeployKey(projectIdOrPath, keyId))); } catch (GitLabApiException glae) { @@ -200,7 +200,7 @@ public Optional getOptionalDeployKey(Object projectIdOrPath, Integer * *
GitLab Endpoint: POST /projects/:id/deploy_keys
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param title the new deploy key's title, required * @param key the new deploy key, required * @param canPush can deploy key push to the project's repository, optional @@ -223,14 +223,14 @@ public DeployKey addDeployKey(Object projectIdOrPath, String title, String key, * *
GitLab Endpoint: PUT /projects/:id/deploy_keys/:key_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deployKeyId the ID of the deploy key to update, required * @param title the title for the deploy key, optional * @param canPush can deploy key push to the project's repository, optional * @return an updated DeployKey instance * @throws GitLabApiException if any exception occurs */ - public DeployKey updateDeployKey(Object projectIdOrPath, Integer deployKeyId, String title, Boolean canPush) throws GitLabApiException { + public DeployKey updateDeployKey(Object projectIdOrPath, Long deployKeyId, String title, Boolean canPush) throws GitLabApiException { if (deployKeyId == null) { throw new RuntimeException("deployKeyId cannot be null"); @@ -250,11 +250,11 @@ public DeployKey updateDeployKey(Object projectIdOrPath, Integer deployKeyId, St * *
GitLab Endpoint: DELETE /projects/:id/deploy_keys/:key_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param keyId the ID of the deploy key to delete * @throws GitLabApiException if any exception occurs */ - public void deleteDeployKey(Object projectIdOrPath, Integer keyId) throws GitLabApiException { + public void deleteDeployKey(Object projectIdOrPath, Long keyId) throws GitLabApiException { if (keyId == null) { throw new RuntimeException("keyId cannot be null"); @@ -268,12 +268,12 @@ public void deleteDeployKey(Object projectIdOrPath, Integer keyId) throws GitLab * *
GitLab Endpoint: POST /projects/:id/deploy_keys/:key_id/enable
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param keyId the ID of the deploy key to enable * @return an DeployKey instance with info on the enabled deploy key * @throws GitLabApiException if any exception occurs */ - public DeployKey enableDeployKey(Object projectIdOrPath, Integer keyId) throws GitLabApiException { + public DeployKey enableDeployKey(Object projectIdOrPath, Long keyId) throws GitLabApiException { if (keyId == null) { throw new RuntimeException("keyId cannot be null"); diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployTokensApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployTokensApi.java index e29e62e8bb..993ac34d9f 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployTokensApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeployTokensApi.java @@ -44,6 +44,10 @@ public DeployTokensApi(GitLabApi gitLabApi) { super(gitLabApi); } + /* ************************************************************************************************ + * Global Deploy Token API + */ + /** * Get a list of all deploy tokens across the GitLab instance. This endpoint requires admin access. * @@ -90,7 +94,7 @@ public Stream getDeployTokensStream() throws GitLabApiException { * *
GitLab Endpoint: GET /projects/:id/deploy_tokens
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of DeployToken * @throws GitLabApiException if any exception occurs */ @@ -103,7 +107,7 @@ public List getProjectDeployTokens(Object projectIdOrPath) throws G * *
GitLab Endpoint: GET /projects/:id/deploy_tokens
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance@param projectId the ID of the project + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance@param projectId the ID of the project * @param itemsPerPage the number of DeployToken instances that will be fetched per page * @return a Pager of DeployToken * @throws GitLabApiException if any exception occurs @@ -118,7 +122,7 @@ public Pager getProjectDeployTokens(Object projectIdOrPath, int ite * *
GitLab Endpoint: GET /projects/:id/deploy_tokens
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of DeployToken * @throws GitLabApiException if any exception occurs */ @@ -131,11 +135,11 @@ public Stream getProjectDeployTokensStream(Object projectIdOrPath) * *
GitLab Endpoint: POST /projects/:id/deploy_tokens
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param name the new deploy token’s name, required * @param expiresAt expiration date for the deploy token. Currently documented as not required but api fails if not provided. Does not expire if no value is provided. * @param username the username for deploy token. Currently documented as not required but api fails if not provided. Default is gitlab+deploy-token-{n} - * @param scopes indicates the deploy token scopes. Must be at least one of {@link Constants.DeployTokenScope}. + * @param scopes indicates the deploy token scopes. Must be at least one of {@link DeployTokenScope}. * @return an DeployToken instance with info on the added deploy token * @throws GitLabApiException if any exception occurs */ @@ -155,11 +159,11 @@ public DeployToken addProjectDeployToken(Object projectIdOrPath, String name, Da * *
GitLab Endpoint: DELETE /projects/:id/deploy_tokens/:token_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param tokenId the ID of the deploy token to delete * @throws GitLabApiException if any exception occurs */ - public void deleteProjectDeployToken(Object projectIdOrPath, Integer tokenId) throws GitLabApiException { + public void deleteProjectDeployToken(Object projectIdOrPath, Long tokenId) throws GitLabApiException { if (tokenId == null) { throw new RuntimeException("tokenId cannot be null"); @@ -177,7 +181,7 @@ public void deleteProjectDeployToken(Object projectIdOrPath, Integer tokenId) th * *
GitLab Endpoint: GET /groups/:id/deploy_tokens
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @return a list of DeployToken * @throws GitLabApiException if any exception occurs */ @@ -190,7 +194,7 @@ public List getGroupDeployTokens(Object groupIdOrPath) throws GitLa * *
GitLab Endpoint: GET /groups/:id/deploy_tokens
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance@param groupId the ID of the group + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance@param groupId the ID of the group * @param itemsPerPage the number of DeployToken instances that will be fetched per page * @return a Pager of DeployToken * @throws GitLabApiException if any exception occurs @@ -205,7 +209,7 @@ public Pager getGroupDeployTokens(Object groupIdOrPath, int itemsPe * *
GitLab Endpoint: GET /groups/:id/deploy_tokens
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @return a list of DeployToken * @throws GitLabApiException if any exception occurs */ @@ -218,11 +222,11 @@ public Stream getGroupDeployTokensStream(Object groupIdOrPath) thro * *
GitLab Endpoint: POST /groups/:id/deploy_tokens
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param name the new deploy token’s name, required * @param expiresAt expiration date for the deploy token. Currently documented as not required but api fails if not provided. Does not expire if no value is provided. * @param username the username for deploy token. Currently documented as not required but api fails if not provided. Default is gitlab+deploy-token-{n} - * @param scopes indicates the deploy token scopes. Must be at least one of {@link Constants.DeployTokenScope}. + * @param scopes indicates the deploy token scopes. Must be at least one of {@link DeployTokenScope}. * @return an DeployToken instance with info on the added deploy token * @throws GitLabApiException if any exception occurs */ @@ -242,11 +246,11 @@ public DeployToken addGroupDeployToken(Object groupIdOrPath, String name, Date e * *
GitLab Endpoint: DELETE /groups/:id/deploy_tokens/:token_id
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param tokenId the ID of the deploy token to delete * @throws GitLabApiException if any exception occurs */ - public void deleteGroupDeployToken(Object groupIdOrPath, Integer tokenId) throws GitLabApiException { + public void deleteGroupDeployToken(Object groupIdOrPath, Long tokenId) throws GitLabApiException { if (tokenId == null) { throw new RuntimeException("tokenId cannot be null"); diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeploymentsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeploymentsApi.java index ead286d64b..01923f1045 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeploymentsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DeploymentsApi.java @@ -49,7 +49,7 @@ public DeploymentsApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of Deployments * @throws GitLabApiException if any exception occurs */ @@ -62,7 +62,7 @@ public List getProjectDeployments(Object projectIdOrPath) throws Git * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param itemsPerPage the number of Deployments instances that will be fetched per page * @return a Pager of Deployment * @throws GitLabApiException if any exception occurs @@ -76,7 +76,7 @@ public Pager getProjectDeployments(Object projectIdOrPath, int items * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link DeploymentFilter} a DeploymentFilter instance with the filter settings * @return a Pager of Deployment * @throws GitLabApiException if any exception occurs @@ -90,7 +90,7 @@ public Pager getProjectDeployments(Object projectIdOrPath, Deploymen * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link DeploymentFilter} a DeploymentFilter instance with the filter settings * @param itemsPerPage the number of Deployments instances that will be fetched per page * @return a Pager of Deployment @@ -107,7 +107,7 @@ public Pager getProjectDeployments(Object projectIdOrPath, Deploymen * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of Deployment * @throws GitLabApiException if any exception occurs */ @@ -120,7 +120,7 @@ public Stream getProjectDeploymentsStream(Object projectIdOrPath) th * *
GitLab Endpoint: GET /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link DeploymentFilter} a DeploymentFilter instance with the filter settings * @return a list of Deployment * @throws GitLabApiException if any exception occurs @@ -134,12 +134,12 @@ public Stream getProjectDeploymentsStream(Object projectIdOrPath, De * *
GitLab Endpoint: GET /projects/:id/deployments/:deployment_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId the ID of a project's deployment * @return the specified Deployment instance * @throws GitLabApiException if any exception occurs */ - public Deployment getDeployment(Object projectIdOrPath, Integer deploymentId) throws GitLabApiException { + public Deployment getDeployment(Object projectIdOrPath, Long deploymentId) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "deployments", deploymentId); return (response.readEntity(Deployment.class)); @@ -150,11 +150,11 @@ public Deployment getDeployment(Object projectIdOrPath, Integer deploymentId) th * *
GitLab Endpoint: GET /projects/:id/deployments/:deployment_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId the ID of a project's deployment * @return the specified Deployment as an Optional instance */ - public Optional getOptionalDeployment(Object projectIdOrPath, Integer deploymentId) { + public Optional getOptionalDeployment(Object projectIdOrPath, Long deploymentId) { try { return (Optional.ofNullable(getDeployment(projectIdOrPath, deploymentId))); } catch (GitLabApiException glae) { @@ -167,7 +167,7 @@ public Optional getOptionalDeployment(Object projectIdOrPath, Intege * *
GitLab Endpoint: POST /projects/:id/deployments
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param environment The name of the environment to create the deployment for, required * @param sha The SHA of the commit that is deployed, required * @param ref The name of the branch or tag that is deployed, required @@ -195,13 +195,13 @@ public Deployment addDeployment(Object projectIdOrPath, String environment, Stri * *
GitLab Endpoint: PUT /projects/:id/deployments/:key_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId The ID of the deployment to update, required * @param status The new status of the deployment, required * @return an updated Deployment instance * @throws GitLabApiException if any exception occurs */ - public Deployment updateDeployment(Object projectIdOrPath, Integer deploymentId, DeploymentStatus status) throws GitLabApiException { + public Deployment updateDeployment(Object projectIdOrPath, Long deploymentId, DeploymentStatus status) throws GitLabApiException { if (deploymentId == null) { throw new RuntimeException("deploymentId cannot be null"); @@ -220,12 +220,12 @@ public Deployment updateDeployment(Object projectIdOrPath, Integer deploymentId, * *
GitLab Endpoint: GET /projects/:id/deployments/:deployment_id/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId The ID of the deployment to update, required * @return a list containing the MergeRequest instances shipped with a given deployment * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public List getMergeRequests(Object projectIdOrPath, Integer deploymentId) throws GitLabApiException { + public List getMergeRequests(Object projectIdOrPath, Long deploymentId) throws GitLabApiException { return (getMergeRequests(projectIdOrPath, deploymentId, getDefaultPerPage()).all()); } @@ -234,15 +234,15 @@ public List getMergeRequests(Object projectIdOrPath, Integer deplo * *
GitLab Endpoint: GET /projects/:id/deployments/:deployment_id/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId The ID of the deployment to update, required * @param itemsPerPage the number of Commit instances that will be fetched per page * @return a Pager containing the MergeRequest instances shipped with a given deployment * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public Pager getMergeRequests(Object projectIdOrPath, Integer deploymentId, int itemsPerPage) throws GitLabApiException { + public Pager getMergeRequests(Object projectIdOrPath, Long deploymentId, int itemsPerPage) throws GitLabApiException { return (new Pager(this, MergeRequest.class, itemsPerPage, null, - "projects", getProjectIdOrPath(projectIdOrPath), "repository", "commits", deploymentId, "merge_requests")); + "projects", getProjectIdOrPath(projectIdOrPath), "deployments", deploymentId, "merge_requests")); } /** @@ -250,12 +250,12 @@ public Pager getMergeRequests(Object projectIdOrPath, Integer depl * *
GitLab Endpoint: GET /projects/:id/deployments/:deployment_id/merge_requests
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param deploymentId The ID of the deployment to update, required * @return a Stream containing the MergeRequest instances shipped with a given deployment * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public Stream getMergeRequestsStream(Object projectIdOrPath, Integer deploymentId) throws GitLabApiException { + public Stream getMergeRequestsStream(Object projectIdOrPath, Long deploymentId) throws GitLabApiException { return (getMergeRequests(projectIdOrPath, deploymentId, getDefaultPerPage()).stream()); } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DiscussionsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DiscussionsApi.java index d4e6c6c54e..74f789f0ac 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DiscussionsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/DiscussionsApi.java @@ -51,12 +51,12 @@ public DiscussionsApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of the issue * @return a list containing all the discussions for the specified issue * @throws GitLabApiException if any exception occurs during execution */ - public List getIssueDiscussions(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public List getIssueDiscussions(Object projectIdOrPath, Long issueIid) throws GitLabApiException { Pager pager = getIssueDiscussionsPager(projectIdOrPath, issueIid, getDefaultPerPage()); return (pager.all()); } @@ -66,13 +66,13 @@ public List getIssueDiscussions(Object projectIdOrPath, Integer issu * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of the issue * @param maxItems the maximum number of Discussion instances to get, if < 1 will fetch all Discussion instances for the issue * @return a list containing the discussions for the specified issue * @throws GitLabApiException if any exception occurs during execution */ - public List getIssueDiscussions(Object projectIdOrPath, Integer issueIid, int maxItems) throws GitLabApiException { + public List getIssueDiscussions(Object projectIdOrPath, Long issueIid, int maxItems) throws GitLabApiException { if (maxItems < 1) { return (getIssueDiscussions(projectIdOrPath, issueIid)); } else { @@ -88,13 +88,13 @@ public List getIssueDiscussions(Object projectIdOrPath, Integer issu * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of the issue * @param itemsPerPage the number of Discussion instances that will be fetched per page * @return a Pager containing the Discussion instances for the specified issue * @throws GitLabApiException if any exception occurs during execution */ - public Pager getIssueDiscussionsPager(Object projectIdOrPath, Integer issueIid, int itemsPerPage) throws GitLabApiException { + public Pager getIssueDiscussionsPager(Object projectIdOrPath, Long issueIid, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Discussion.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "discussions")); } @@ -104,12 +104,12 @@ public Pager getIssueDiscussionsPager(Object projectIdOrPath, Intege * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of the issue * @return a Stream instance containing the Discussion instances for the specified issue * @throws GitLabApiException if any exception occurs during execution */ - public Stream getIssueDiscussionsStream(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Stream getIssueDiscussionsStream(Object projectIdOrPath, Long issueIid) throws GitLabApiException { Pager pager = getIssueDiscussionsPager(projectIdOrPath, issueIid, getDefaultPerPage()); return (pager.stream()); } @@ -119,12 +119,12 @@ public Stream getIssueDiscussionsStream(Object projectIdOrPath, Inte * *
GitLab Endpoint: GET /projects/:id/snippets/:snippet_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param snippetId the ID of the snippet * @return a list containing all the discussions for the specified snippet * @throws GitLabApiException if any exception occurs during execution */ - public List getSnippetDiscussions(Object projectIdOrPath, Integer snippetId) throws GitLabApiException { + public List getSnippetDiscussions(Object projectIdOrPath, Long snippetId) throws GitLabApiException { Pager pager = getSnippetDiscussionsPager(projectIdOrPath, snippetId, getDefaultPerPage()); return (pager.all()); } @@ -134,13 +134,13 @@ public List getSnippetDiscussions(Object projectIdOrPath, Integer sn * *
GitLab Endpoint: GET /projects/:id/snippets/:snippet_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param snippetId the ID of the snippet * @param maxItems the maximum number of Discussion instances to get, if < 1 will fetch all Discussion instances for the snippet * @return a list containing the discussions for the specified snippet * @throws GitLabApiException if any exception occurs during execution */ - public List getSnippetDiscussions(Object projectIdOrPath, Integer snippetId, int maxItems) throws GitLabApiException { + public List getSnippetDiscussions(Object projectIdOrPath, Long snippetId, int maxItems) throws GitLabApiException { if (maxItems < 1) { return (getSnippetDiscussions(projectIdOrPath, snippetId)); } else { @@ -156,13 +156,13 @@ public List getSnippetDiscussions(Object projectIdOrPath, Integer sn * *
GitLab Endpoint: GET /projects/:id/snippets/:snippet_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param snippetId the ID of the snippet * @param itemsPerPage the number of Discussion instances that will be fetched per page * @return a Pager containing the Discussion instances for the specified snippet * @throws GitLabApiException if any exception occurs during execution */ - public Pager getSnippetDiscussionsPager(Object projectIdOrPath, Integer snippetId, int itemsPerPage) throws GitLabApiException { + public Pager getSnippetDiscussionsPager(Object projectIdOrPath, Long snippetId, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Discussion.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "snippets", snippetId, "discussions")); } @@ -172,12 +172,12 @@ public Pager getSnippetDiscussionsPager(Object projectIdOrPath, Inte * *
GitLab Endpoint: GET /projects/:id/snippets/:snippet_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param snippetId the ID of the snippet * @return a Stream instance containing the Discussion instances for the specified snippet * @throws GitLabApiException if any exception occurs during execution */ - public Stream getSnippetDiscussionsStream(Object projectIdOrPath, Integer snippetId) throws GitLabApiException { + public Stream getSnippetDiscussionsStream(Object projectIdOrPath, Long snippetId) throws GitLabApiException { Pager pager = getSnippetDiscussionsPager(projectIdOrPath, snippetId, getDefaultPerPage()); return (pager.stream()); } @@ -188,12 +188,12 @@ public Stream getSnippetDiscussionsStream(Object projectIdOrPath, In * *
GitLab Endpoint: GET /projects/:id/epics/:epic_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param epicId the internal ID of the epic * @return a list containing all the discussions for the specified epic * @throws GitLabApiException if any exception occurs during execution */ - public List getEpicDiscussions(Object projectIdOrPath, Integer epicId) throws GitLabApiException { + public List getEpicDiscussions(Object projectIdOrPath, Long epicId) throws GitLabApiException { Pager pager = getEpicDiscussionsPager(projectIdOrPath, epicId, getDefaultPerPage()); return (pager.all()); } @@ -203,13 +203,13 @@ public List getEpicDiscussions(Object projectIdOrPath, Integer epicI * *
GitLab Endpoint: GET /projects/:id/epics/:epic_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param epicId the internal ID of the epic * @param maxItems the maximum number of Discussion instances to get, if < 1 will fetch all Discussion instances for the epic * @return a list containing the discussions for the specified epic * @throws GitLabApiException if any exception occurs during execution */ - public List getEpicDiscussions(Object projectIdOrPath, Integer epicId, int maxItems) throws GitLabApiException { + public List getEpicDiscussions(Object projectIdOrPath, Long epicId, int maxItems) throws GitLabApiException { if (maxItems < 1) { return (getEpicDiscussions(projectIdOrPath, epicId)); } else { @@ -225,13 +225,13 @@ public List getEpicDiscussions(Object projectIdOrPath, Integer epicI * *
GitLab Endpoint: GET /projects/:id/epics/:epic_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param epicId the internal ID of the epic * @param itemsPerPage the number of Discussion instances that will be fetched per page * @return a Pager containing the Discussion instances for the specified epic * @throws GitLabApiException if any exception occurs during execution */ - public Pager getEpicDiscussionsPager(Object projectIdOrPath, Integer epicId, int itemsPerPage) throws GitLabApiException { + public Pager getEpicDiscussionsPager(Object projectIdOrPath, Long epicId, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Discussion.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "epics", epicId, "discussions")); } @@ -241,12 +241,12 @@ public Pager getEpicDiscussionsPager(Object projectIdOrPath, Integer * *
GitLab Endpoint: GET /projects/:id/epics/:epic_id/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param epicId the internal ID of the epic * @return a Stream instance containing the Discussion instances for the specified epic * @throws GitLabApiException if any exception occurs during execution */ - public Stream getEpicDiscussionsStream(Object projectIdOrPath, Integer epicId) throws GitLabApiException { + public Stream getEpicDiscussionsStream(Object projectIdOrPath, Long epicId) throws GitLabApiException { Pager pager = getEpicDiscussionsPager(projectIdOrPath, epicId, getDefaultPerPage()); return (pager.stream()); } @@ -256,12 +256,12 @@ public Stream getEpicDiscussionsStream(Object projectIdOrPath, Integ * *
GitLab Endpoint: GET /projects/:id/merge_requests/:merge_request_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid the internal ID of the merge request * @return a list containing all the discussions for the specified merge request * @throws GitLabApiException if any exception occurs during execution */ - public List getMergeRequestDiscussions(Object projectIdOrPath, Integer mergeRequestIid) throws GitLabApiException { + public List getMergeRequestDiscussions(Object projectIdOrPath, Long mergeRequestIid) throws GitLabApiException { Pager pager = getMergeRequestDiscussionsPager(projectIdOrPath, mergeRequestIid, getDefaultPerPage()); return (pager.all()); } @@ -271,13 +271,13 @@ public List getMergeRequestDiscussions(Object projectIdOrPath, Integ * *
GitLab Endpoint: GET /projects/:id/merge_requests/:merge_request_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid the internal ID of the merge request * @param maxItems the maximum number of Discussion instances to get, if < 1 will fetch all Discussion instances for the merge request * @return a list containing the discussions for the specified merge request * @throws GitLabApiException if any exception occurs during execution */ - public List getMergeRequestDiscussions(Object projectIdOrPath, Integer mergeRequestIid, int maxItems) throws GitLabApiException { + public List getMergeRequestDiscussions(Object projectIdOrPath, Long mergeRequestIid, int maxItems) throws GitLabApiException { if (maxItems < 1) { return (getMergeRequestDiscussions(projectIdOrPath, mergeRequestIid)); } else { @@ -293,13 +293,13 @@ public List getMergeRequestDiscussions(Object projectIdOrPath, Integ * *
GitLab Endpoint: GET /projects/:id/merge_requests/:merge_request_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid the internal ID of the merge request * @param itemsPerPage the number of Discussion instances that will be fetched per page * @return a Pager containing the Discussion instances for the specified merge request * @throws GitLabApiException if any exception occurs during execution */ - public Pager getMergeRequestDiscussionsPager(Object projectIdOrPath, Integer mergeRequestIid, int itemsPerPage) throws GitLabApiException { + public Pager getMergeRequestDiscussionsPager(Object projectIdOrPath, Long mergeRequestIid, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Discussion.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "discussions")); } @@ -309,12 +309,12 @@ public Pager getMergeRequestDiscussionsPager(Object projectIdOrPath, * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid the internal ID of the merge request * @return a Stream instance containing the Discussion instances for the specified issue * @throws GitLabApiException if any exception occurs during execution */ - public Stream getMergeRequestDiscussionsStream(Object projectIdOrPath, Integer mergeRequestIid) throws GitLabApiException { + public Stream getMergeRequestDiscussionsStream(Object projectIdOrPath, Long mergeRequestIid) throws GitLabApiException { Pager pager = getMergeRequestDiscussionsPager(projectIdOrPath, mergeRequestIid, getDefaultPerPage()); return (pager.stream()); } @@ -325,7 +325,7 @@ public Stream getMergeRequestDiscussionsStream(Object projectIdOrPat * *
GitLab Endpoint: POST /projects/:id/merge_requests/:merge_request_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param body the content of a discussion * @param createdAt date the discussion was created (requires admin or project/group owner rights) @@ -334,7 +334,7 @@ public Stream getMergeRequestDiscussionsStream(Object projectIdOrPat * @return a Discussion instance containing the newly created discussion * @throws GitLabApiException if any exception occurs during execution */ - public Discussion createMergeRequestDiscussion(Object projectIdOrPath, Integer mergeRequestIid, + public Discussion createMergeRequestDiscussion(Object projectIdOrPath, Long mergeRequestIid, String body, Date createdAt, String positionHash, Position position) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() @@ -367,14 +367,14 @@ public Discussion createMergeRequestDiscussion(Object projectIdOrPath, Integer m * *
GitLab Endpoint: PUT /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param discussionId the ID of a discussion * @param resolved resolve/unresolve the discussion * @return the updated DIscussion instance * @throws GitLabApiException if any exception occurs during execution */ - public Discussion resolveMergeRequestDiscussion(Object projectIdOrPath, Integer mergeRequestIid, + public Discussion resolveMergeRequestDiscussion(Object projectIdOrPath, Long mergeRequestIid, String discussionId, Boolean resolved) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("resolved", resolved, true); Response response = put(Response.Status.OK, formData.asMap(), @@ -387,14 +387,14 @@ public Discussion resolveMergeRequestDiscussion(Object projectIdOrPath, Integer * *
GitLab Endpoint: DELETE /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param discussionId the ID of a discussion * @param noteId the note ID to delete * @throws GitLabApiException if any exception occurs during execution */ - public void deleteMergeRequestDiscussionNote(Object projectIdOrPath, Integer mergeRequestIid, - String discussionId, Integer noteId) throws GitLabApiException { + public void deleteMergeRequestDiscussionNote(Object projectIdOrPath, Long mergeRequestIid, + String discussionId, Long noteId) throws GitLabApiException { delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "discussions", discussionId, "notes", noteId); } @@ -404,7 +404,7 @@ public void deleteMergeRequestDiscussionNote(Object projectIdOrPath, Integer mer * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @return a list containing all the discussions for the specified commit * @throws GitLabApiException if any exception occurs during execution @@ -419,7 +419,7 @@ public List getCommitDiscussions(Object projectIdOrPath, String comm * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @param maxItems the maximum number of Discussion instances to get, if < 1 will fetch all Discussion instances for the commit * @return a list containing the discussions for the specified commit @@ -441,7 +441,7 @@ public List getCommitDiscussions(Object projectIdOrPath, String comm * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @param itemsPerPage the number of Discussion instances that will be fetched per page * @return a Pager containing the Discussion instances for the specified commit @@ -457,7 +457,7 @@ public Pager getCommitDiscussionsPager(Object projectIdOrPath, Strin * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @return a Stream instance containing the Discussion instances for the specified commit * @throws GitLabApiException if any exception occurs during execution @@ -472,7 +472,7 @@ public Stream getCommitDiscussionsStream(Object projectIdOrPath, Str * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @param discussionId the ID of the discussion * @return the Discussion instance specified by discussionId for the specified commit @@ -489,7 +489,7 @@ public Discussion getCommitDiscussion(Object projectIdOrPath, String commitSha, * *
GitLab Endpoint: GET /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the SHA of the commit to get discussions for * @param discussionId the ID of the discussion * @return an Optional instance with the specified Discussion instance as a value @@ -508,7 +508,7 @@ public Optional getOptionalCommitDiscussion(Object projectIdOrPath, * *
GitLab Endpoint: POST /projects/:id/repository/commits/:commit_sha/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the commit SHA to create the discussion for * @param body the content of a discussion * @param createdAt date the discussion was created (requires admin or project/group owner rights) @@ -551,7 +551,7 @@ public Discussion createCommitDiscussion(Object projectIdOrPath, String commitSh * *
GitLab Endpoint: POST /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id/notes
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the commit SHA to create the discussion for * @param discussionId the ID of a discussion * @param body the content of a discussion @@ -577,7 +577,7 @@ public Note addCommitDiscussionNote(Object projectIdOrPath, String commitSha, St * *
GitLab Endpoint: PUT /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id/notes
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the commit SHA to delete the discussion from * @param discussionId the ID of a discussion * @param noteId the note ID to modify @@ -586,7 +586,7 @@ public Note addCommitDiscussionNote(Object projectIdOrPath, String commitSha, St * @throws GitLabApiException if any exception occurs during execution */ public Note modifyCommitDiscussionNote(Object projectIdOrPath, - String commitSha, String discussionId, Integer noteId, String body) throws GitLabApiException { + String commitSha, String discussionId, Long noteId, String body) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("body", body, true); Response response = this.putWithFormData(Response.Status.OK, formData, @@ -600,7 +600,7 @@ public Note modifyCommitDiscussionNote(Object projectIdOrPath, * *
GitLab Endpoint: PUT /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id/notes
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the commit SHA to delete the discussion from * @param discussionId the ID of a discussion * @param noteId the note ID to resolve or unresolve @@ -609,7 +609,7 @@ public Note modifyCommitDiscussionNote(Object projectIdOrPath, * @throws GitLabApiException if any exception occurs during execution */ public Note resolveCommitDiscussionNote(Object projectIdOrPath, - String commitSha, String discussionId, Integer noteId, Boolean resolved) throws GitLabApiException { + String commitSha, String discussionId, Long noteId, Boolean resolved) throws GitLabApiException { GitLabApiForm queryParams = new GitLabApiForm().withParam("resolved", resolved); Response response = this.put(Response.Status.OK, queryParams.asMap(), @@ -623,14 +623,14 @@ public Note resolveCommitDiscussionNote(Object projectIdOrPath, * *
GitLab Endpoint: DELETE /projects/:id/repository/commits/:commit_sha/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param commitSha the commit SHA to delete the discussion from * @param discussionId the ID of a discussion * @param noteId the note ID to delete * @throws GitLabApiException if any exception occurs during execution */ public void deleteCommitDiscussionNote(Object projectIdOrPath, String commitSha, - String discussionId, Integer noteId) throws GitLabApiException { + String discussionId, Long noteId) throws GitLabApiException { delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "repository", "commits", commitSha, "discussions", discussionId, "notes", noteId); } @@ -640,7 +640,7 @@ public void deleteCommitDiscussionNote(Object projectIdOrPath, String commitSha, * *
GitLab Endpoint: POST /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id/notes
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param discussionId the ID of a discussion * @param body the content of a discussion @@ -648,7 +648,7 @@ public void deleteCommitDiscussionNote(Object projectIdOrPath, String commitSha, * @return a Note instance containing the newly created discussion note * @throws GitLabApiException if any exception occurs during execution */ - public Note addMergeRequestThreadNote(Object projectIdOrPath, Integer mergeRequestIid, + public Note addMergeRequestThreadNote(Object projectIdOrPath, Long mergeRequestIid, String discussionId, String body, Date createdAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() @@ -665,7 +665,7 @@ public Note addMergeRequestThreadNote(Object projectIdOrPath, Integer mergeReque * *
GitLab Endpoint: PUT /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param discussionId the ID of a discussion * @param noteId the note ID to modify @@ -674,8 +674,8 @@ public Note addMergeRequestThreadNote(Object projectIdOrPath, Integer mergeReque * @return a Note instance containing the updated discussion note * @throws GitLabApiException if any exception occurs during execution */ - public Note modifyMergeRequestThreadNote(Object projectIdOrPath, Integer mergeRequestIid, - String discussionId, Integer noteId, String body, Boolean resolved) throws GitLabApiException { + public Note modifyMergeRequestThreadNote(Object projectIdOrPath, Long mergeRequestIid, + String discussionId, Long noteId, String body, Boolean resolved) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("body", body).withParam("resolved", resolved); Response response = this.putWithFormData(Response.Status.OK, formData, @@ -689,14 +689,14 @@ public Note modifyMergeRequestThreadNote(Object projectIdOrPath, Integer mergeRe * *
GitLab Endpoint: DELETE /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param mergeRequestIid mergeRequestIid the internal ID of the merge request * @param discussionId the ID of a discussion * @param noteId the note ID to delete * @throws GitLabApiException if any exception occurs during execution */ - public void deleteMergeRequestThreadNote(Object projectIdOrPath, Integer mergeRequestIid, - String discussionId, Integer noteId) throws GitLabApiException { + public void deleteMergeRequestThreadNote(Object projectIdOrPath, Long mergeRequestIid, + String discussionId, Long noteId) throws GitLabApiException { delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "discussions", discussionId, "notes", noteId); } @@ -706,14 +706,14 @@ public void deleteMergeRequestThreadNote(Object projectIdOrPath, Integer mergeRe * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/discussions
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid The IID of an issue * @param body the content of the discussion * @param createdAt (optional) date the discussion was created (requires admin or project/group owner rights) * @return a Discussion instance containing the newly created discussion * @throws GitLabApiException if any exception occurs during execution */ - public Discussion createIssueDiscussion(Object projectIdOrPath, Integer issueIid, String body, Date createdAt) throws GitLabApiException { + public Discussion createIssueDiscussion(Object projectIdOrPath, Long issueIid, String body, Date createdAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("body", body, true) .withParam("created_at", createdAt); @@ -727,7 +727,7 @@ public Discussion createIssueDiscussion(Object projectIdOrPath, Integer issueIid * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/discussions/:discussion_id/notes
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid The IID of an issue * @param discussionId the id of discussion * @param body the content of the note @@ -735,7 +735,7 @@ public Discussion createIssueDiscussion(Object projectIdOrPath, Integer issueIid * @return a Note instance containing the newly created note * @throws GitLabApiException if any exception occurs during execution */ - public Note addIssueThreadNote(Object projectIdOrPath, Integer issueIid, + public Note addIssueThreadNote(Object projectIdOrPath, Long issueIid, String discussionId, String body, Date createdAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("body", body, true) @@ -750,7 +750,7 @@ public Note addIssueThreadNote(Object projectIdOrPath, Integer issueIid, * *
GitLab Endpoint: PUT /projects/:id/issues/:issue_iid/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid The IID of an issue * @param discussionId the id of discussion * @param noteId the id of the note @@ -758,8 +758,8 @@ public Note addIssueThreadNote(Object projectIdOrPath, Integer issueIid, * @return a Note instance containing the modified note * @throws GitLabApiException if any exception occurs during execution */ - public Note modifyIssueThreadNote(Object projectIdOrPath, Integer issueIid, - String discussionId, Integer noteId, String body) throws GitLabApiException { + public Note modifyIssueThreadNote(Object projectIdOrPath, Long issueIid, + String discussionId, Long noteId, String body) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("body", body, true); Response response = putWithFormData(Response.Status.OK, formData, @@ -772,14 +772,14 @@ public Note modifyIssueThreadNote(Object projectIdOrPath, Integer issueIid, * *
GitLab Endpoint: DELETE /projects/:id/issues/:issue_iid/discussions/:discussion_id/notes/:note_id
* - * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid The IID of an issue * @param discussionId the id of discussion * @param noteId the id of the note * @throws GitLabApiException if any exception occurs during execution */ - public void deleteIssueThreadNote(Object projectIdOrPath, Integer issueIid, - String discussionId, Integer noteId) throws GitLabApiException { + public void deleteIssueThreadNote(Object projectIdOrPath, Long issueIid, + String discussionId, Long noteId) throws GitLabApiException { delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "discussions", discussionId, "notes", noteId); } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EnvironmentsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EnvironmentsApi.java index 87ae6d5199..e2cdb7c96a 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EnvironmentsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EnvironmentsApi.java @@ -94,7 +94,7 @@ public Pager getEnvironments(Object projectIdOrPath, int itemsPerPa * @return an Environment instance * @throws GitLabApiException if any exception occurs */ - public Environment getEnvironment(Object projectIdOrPath, Integer environmentId) throws GitLabApiException { + public Environment getEnvironment(Object projectIdOrPath, Long environmentId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "environments", environmentId); return (response.readEntity(Environment.class)); @@ -109,7 +109,7 @@ public Environment getEnvironment(Object projectIdOrPath, Integer environmentId) * @param environmentId the ID of the environment to get * @return the Environment as an Optional instance */ - public Optional getOptionalEnvironment(Object projectIdOrPath, Integer environmentId) { + public Optional getOptionalEnvironment(Object projectIdOrPath, Long environmentId) { try { return (Optional.ofNullable(getEnvironment(projectIdOrPath, environmentId))); } catch (GitLabApiException glae) { @@ -147,7 +147,7 @@ public Environment createEnvironment(Object projectIdOrPath, String name, String * @return the created Environment instance * @throws GitLabApiException if any exception occurs */ - public Environment updateEnvironment(Object projectIdOrPath, Integer environmentId, String name, String externalUrl) throws GitLabApiException { + public Environment updateEnvironment(Object projectIdOrPath, Long environmentId, String name, String externalUrl) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("name", name).withParam("external_url", externalUrl); Response response = putWithFormData(Response.Status.OK, formData, formData, "projects", getProjectIdOrPath(projectIdOrPath), "environments", environmentId); @@ -164,7 +164,7 @@ public Environment updateEnvironment(Object projectIdOrPath, Integer environment * @return the stopped Environment instance * @throws GitLabApiException if any exception occurs */ - public Environment stopEnvironment(Object projectIdOrPath, Integer environmentId) throws GitLabApiException { + public Environment stopEnvironment(Object projectIdOrPath, Long environmentId) throws GitLabApiException { Response response = post(Response.Status.OK, (GitLabApiForm) null, "projects", getProjectIdOrPath(projectIdOrPath), "environments", environmentId, "stop"); return (response.readEntity(Environment.class)); @@ -179,7 +179,7 @@ public Environment stopEnvironment(Object projectIdOrPath, Integer environmentId * @param environmentId the ID of the environment to delete * @throws GitLabApiException if any exception occurs */ - public void deleteEnvironment(Object projectIdOrPath, Integer environmentId) throws GitLabApiException { + public void deleteEnvironment(Object projectIdOrPath, Long environmentId) throws GitLabApiException { delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "environments", environmentId); } @@ -194,7 +194,7 @@ public void deleteEnvironment(Object projectIdOrPath, Integer environmentId) thr * @return the Environment instance of the stopped environment * @throws GitLabApiException if any exception occurs */ - public Environment createEnvironment(Object projectIdOrPath, Integer environmentId) throws GitLabApiException { + public Environment createEnvironment(Object projectIdOrPath, Long environmentId) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm(); Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "environments", environmentId, "stop"); diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EpicsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EpicsApi.java index bacfcb802c..aec7270ff6 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EpicsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EpicsApi.java @@ -124,7 +124,7 @@ public Stream getEpicsStream(Object groupIdOrPath) throws GitLabApiExcepti * @return a list of matching epics of the requested group and its subgroups * @throws GitLabApiException if any exception occurs */ - public List getEpics(Object groupIdOrPath, Integer authorId, String labels, EpicOrderBy orderBy, + public List getEpics(Object groupIdOrPath, Long authorId, String labels, EpicOrderBy orderBy, SortOrder sortOrder, String search) throws GitLabApiException { return (getEpics(groupIdOrPath, authorId, labels, orderBy, sortOrder, search, getDefaultPerPage()).all()); } @@ -146,7 +146,7 @@ public List getEpics(Object groupIdOrPath, Integer authorId, String labels * @return a list of matching epics of the requested group and its subgroups in the specified range * @throws GitLabApiException if any exception occurs */ - public List getEpics(Object groupIdOrPath, Integer authorId, String labels, + public List getEpics(Object groupIdOrPath, Long authorId, String labels, EpicOrderBy orderBy, SortOrder sortOrder, String search, int page, int perPage) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm(page, perPage) .withParam("author_id", authorId) @@ -175,7 +175,7 @@ public List getEpics(Object groupIdOrPath, Integer authorId, String labels * @return the Pager of matching epics of the requested group and its subgroups * @throws GitLabApiException if any exception occurs */ - public Pager getEpics(Object groupIdOrPath, Integer authorId, String labels, + public Pager getEpics(Object groupIdOrPath, Long authorId, String labels, EpicOrderBy orderBy, SortOrder sortOrder, String search, int itemsPerPage) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("author_id", authorId) @@ -201,7 +201,7 @@ public Pager getEpics(Object groupIdOrPath, Integer authorId, String label * @return a Stream of matching epics of the requested group and its subgroups * @throws GitLabApiException if any exception occurs */ - public Stream getEpicsStream(Object groupIdOrPath, Integer authorId, String labels, EpicOrderBy orderBy, + public Stream getEpicsStream(Object groupIdOrPath, Long authorId, String labels, EpicOrderBy orderBy, SortOrder sortOrder, String search) throws GitLabApiException { return (getEpics(groupIdOrPath, authorId, labels, orderBy, sortOrder, search, getDefaultPerPage()).stream()); } @@ -216,7 +216,7 @@ public Stream getEpicsStream(Object groupIdOrPath, Integer authorId, Strin * @return an Epic instance for the specified Epic * @throws GitLabApiException if any exception occurs */ - public Epic getEpic(Object groupIdOrPath, Integer epicIid) throws GitLabApiException { + public Epic getEpic(Object groupIdOrPath, Long epicIid) throws GitLabApiException { Response response = get(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid); return (response.readEntity(Epic.class)); } @@ -230,7 +230,7 @@ public Epic getEpic(Object groupIdOrPath, Integer epicIid) throws GitLabApiExcep * @param epicIid the IID of the epic to get * @return an Optional instance with the specified Epic as a value */ - public Optional getOptionalEpic(Object groupIdOrPath, Integer epicIid) { + public Optional getOptionalEpic(Object groupIdOrPath, Long epicIid) { try { return (Optional.ofNullable(getEpic(groupIdOrPath, epicIid))); } catch (GitLabApiException glae) { @@ -310,7 +310,7 @@ public Epic createEpic(Object groupIdOrPath, Epic epic) throws GitLabApiExceptio * @return an Epic instance containing info on the newly created epic * @throws GitLabApiException if any exception occurs */ - public Epic updateEpic(Object groupIdOrPath, Integer epicIid, String title, String labels, String description, + public Epic updateEpic(Object groupIdOrPath, Long epicIid, String title, String labels, String description, Date startDate, Date endDate) throws GitLabApiException { Form formData = new GitLabApiForm() .withParam("title", title, true) @@ -341,7 +341,7 @@ public Epic updateEpic(Object groupIdOrPath, Integer epicIid, String title, Stri * @return an Epic instance containing info on the updated epic * @throws GitLabApiException if any exception occurs */ - public Epic updateEpic(Object groupIdOrPath, Integer epicIid, Epic epic) throws GitLabApiException { + public Epic updateEpic(Object groupIdOrPath, Long epicIid, Epic epic) throws GitLabApiException { Form formData = new GitLabApiForm() .withParam("title", epic.getTitle(), true) .withParam("labels", epic.getLabels()) @@ -362,7 +362,7 @@ public Epic updateEpic(Object groupIdOrPath, Integer epicIid, Epic epic) throws * @param epicIid the IID of the epic to delete * @throws GitLabApiException if any exception occurs */ - public void deleteEpic(Object groupIdOrPath, Integer epicIid) throws GitLabApiException { + public void deleteEpic(Object groupIdOrPath, Long epicIid) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid); } @@ -376,7 +376,7 @@ public void deleteEpic(Object groupIdOrPath, Integer epicIid) throws GitLabApiEx * @return a list of all epic issues belonging to the specified epic * @throws GitLabApiException if any exception occurs */ - public List getEpicIssues(Object groupIdOrPath, Integer epicIid) throws GitLabApiException { + public List getEpicIssues(Object groupIdOrPath, Long epicIid) throws GitLabApiException { return (getEpicIssues(groupIdOrPath, epicIid, getDefaultPerPage()).all()); } @@ -393,7 +393,7 @@ public List getEpicIssues(Object groupIdOrPath, Integer epicIid) throws Gi * @return a list of all epic issues belonging to the specified epic in the specified range * @throws GitLabApiException if any exception occurs */ - public List getEpicIssues(Object groupIdOrPath, Integer epicIid, int page, int perPage) throws GitLabApiException { + public List getEpicIssues(Object groupIdOrPath, Long epicIid, int page, int perPage) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(page, perPage), "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid, "issues"); return (response.readEntity(new GenericType>() { })); @@ -410,7 +410,7 @@ public List getEpicIssues(Object groupIdOrPath, Integer epicIid, int page, * @return the Pager of all epic issues belonging to the specified epic * @throws GitLabApiException if any exception occurs */ - public Pager getEpicIssues(Object groupIdOrPath, Integer epicIid, int itemsPerPage) throws GitLabApiException { + public Pager getEpicIssues(Object groupIdOrPath, Long epicIid, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Epic.class, itemsPerPage, null, "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid, "issues")); } @@ -424,7 +424,7 @@ public Pager getEpicIssues(Object groupIdOrPath, Integer epicIid, int item * @return a Stream of all epic issues belonging to the specified epic * @throws GitLabApiException if any exception occurs */ - public Stream getEpicIssuesStream(Object groupIdOrPath, Integer epicIid) throws GitLabApiException { + public Stream getEpicIssuesStream(Object groupIdOrPath, Long epicIid) throws GitLabApiException { return (getEpicIssues(groupIdOrPath, epicIid, getDefaultPerPage()).stream()); } @@ -440,7 +440,7 @@ public Stream getEpicIssuesStream(Object groupIdOrPath, Integer epicIid) t * @return an EpicIssue instance containing info on the newly assigned epic issue * @throws GitLabApiException if any exception occurs */ - public EpicIssue assignIssue(Object groupIdOrPath, Integer epicIid, Integer issueIid) throws GitLabApiException { + public EpicIssue assignIssue(Object groupIdOrPath, Long epicIid, Long issueIid) throws GitLabApiException { Response response = post(Response.Status.CREATED, (Form) null, "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid, "issues", issueIid); return (response.readEntity(EpicIssue.class)); @@ -457,7 +457,7 @@ public EpicIssue assignIssue(Object groupIdOrPath, Integer epicIid, Integer issu * @return an EpicIssue instance containing info on the removed issue * @throws GitLabApiException if any exception occurs */ - public EpicIssue removeIssue(Object groupIdOrPath, Integer epicIid, Integer issueIid) throws GitLabApiException { + public EpicIssue removeIssue(Object groupIdOrPath, Long epicIid, Long issueIid) throws GitLabApiException { Response response = delete(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "epics", epicIid, "issues", issueIid); return (response.readEntity(EpicIssue.class)); @@ -476,7 +476,7 @@ public EpicIssue removeIssue(Object groupIdOrPath, Integer epicIid, Integer issu * @return an EpicIssue instance containing info on the newly assigned epic issue * @throws GitLabApiException if any exception occurs */ - public EpicIssue updateIssue(Object groupIdOrPath, Integer epicIid, Integer issueIid, Integer moveBeforeId, Integer moveAfterId) throws GitLabApiException { + public EpicIssue updateIssue(Object groupIdOrPath, Long epicIid, Long issueIid, Long moveBeforeId, Long moveAfterId) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm() .withParam("move_before_id", moveBeforeId) .withParam("move_after_id", moveAfterId); diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EventsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EventsApi.java index dfbd76cf70..42f09d4d75 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EventsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/EventsApi.java @@ -60,6 +60,24 @@ public List getAuthenticatedUserEvents(ActionType action, TargetType targ return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, getDefaultPerPage()).all()); } + /** + * Get a list of all events for the authenticated user, across all of the user's projects. + * + *
GitLab Endpoint: GET /events
+ * + * @param action include only events of a particular action type, optional + * @param targetType include only events of a particular target type, optional + * @param before include only events created before a particular date, optional + * @param after include only events created after a particular date, optional + * @param sortOrder sort events in ASC or DESC order by created_at. Default is DESC, optional + * @return a list of events for the authenticated user and matching the supplied parameters + * @throws GitLabApiException if any exception occurs + */ + public List getAllAuthenticatedUserEvents(ActionType action, TargetType targetType, + Date before, Date after, SortOrder sortOrder) throws GitLabApiException { + return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, getDefaultPerPage(), EventScope.ALL).all()); + } + /** * Get a list of events for the authenticated user and in the specified page range. * @@ -77,6 +95,27 @@ public List getAuthenticatedUserEvents(ActionType action, TargetType targ */ public List getAuthenticatedUserEvents(ActionType action, TargetType targetType, Date before, Date after, SortOrder sortOrder, int page, int perPage) throws GitLabApiException { + return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, page, perPage, null)); + } + + /** + * Get a list of events for the authenticated user and in the specified page range. + * + *
GitLab Endpoint: GET /events
+ * + * @param action include only events of a particular action type, optional + * @param targetType include only events of a particular target type, optional + * @param before include only events created before a particular date, optional + * @param after include only events created after a particular date, optional + * @param sortOrder sort events in ASC or DESC order by created_at. Default is DESC, optional + * @param page the page to get + * @param perPage the number of projects per page + * @param scope include all events across a user’s projects, optional + * @return a list of events for the authenticated user and matching the supplied parameters + * @throws GitLabApiException if any exception occurs + */ + public List getAuthenticatedUserEvents(ActionType action, TargetType targetType, + Date before, Date after, SortOrder sortOrder, int page, int perPage, EventScope scope) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("action", action) @@ -85,7 +124,8 @@ public List getAuthenticatedUserEvents(ActionType action, TargetType targ .withParam("after", after) .withParam("sort", sortOrder) .withParam(PAGE_PARAM, page) - .withParam(PER_PAGE_PARAM, perPage); + .withParam(PER_PAGE_PARAM, perPage) + .withParam("scope", scope != null ? scope.toValue().toLowerCase() : null); Response response = get(Response.Status.OK, formData.asMap(), "events"); return (response.readEntity(new GenericType>() { @@ -108,13 +148,34 @@ public List getAuthenticatedUserEvents(ActionType action, TargetType targ */ public Pager getAuthenticatedUserEvents(ActionType action, TargetType targetType, Date before, Date after, SortOrder sortOrder, int itemsPerPage) throws GitLabApiException { + return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, itemsPerPage, null)); + } + + /** + * Get a list of events for the authenticated user and in the specified page range. + * + *
GitLab Endpoint: GET /events
+ * + * @param action include only events of a particular action type, optional + * @param targetType include only events of a particular target type, optional + * @param before include only events created before a particular date, optional + * @param after include only events created after a particular date, optional + * @param sortOrder sort events in ASC or DESC order by created_at. Default is DESC, optional + * @param itemsPerPage the number of Event instances that will be fetched per page + * @param scope include all events across a user’s projects, optional + * @return a Pager of events for the authenticated user and matching the supplied parameters + * @throws GitLabApiException if any exception occurs + */ + public Pager getAuthenticatedUserEvents(ActionType action, TargetType targetType, Date before, Date after, + SortOrder sortOrder, int itemsPerPage, EventScope scope) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("action", action) .withParam("target_type", targetType != null ? targetType.toValue().toLowerCase() : null) .withParam("before", before) .withParam("after", after) - .withParam("sort", sortOrder); + .withParam("sort", sortOrder) + .withParam("scope", scope != null ? scope.toValue().toLowerCase() : null); return (new Pager(this, Event.class, itemsPerPage, formData.asMap(), "events")); } @@ -134,7 +195,25 @@ public Pager getAuthenticatedUserEvents(ActionType action, TargetType tar */ public Stream getAuthenticatedUserEventsStream(ActionType action, TargetType targetType, Date before, Date after, SortOrder sortOrder) throws GitLabApiException { - return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, getDefaultPerPage()).stream()); + return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, getDefaultPerPage(), null).stream()); + } + + /** + * Get a Stream of all events for the authenticated user, across all of the user's projects. + * + *
GitLab Endpoint: GET /events
+ * + * @param action include only events of a particular action type, optional + * @param targetType include only events of a particular target type, optional + * @param before include only events created before a particular date, optional + * @param after include only events created after a particular date, optional + * @param sortOrder sort events in ASC or DESC order by created_at. Default is DESC, optional + * @return a Stream of events for the authenticated user and matching the supplied parameters + * @throws GitLabApiException if any exception occurs + */ + public Stream getAllAuthenticatedUserEventsStream(ActionType action, TargetType targetType, + Date before, Date after, SortOrder sortOrder) throws GitLabApiException { + return (getAuthenticatedUserEvents(action, targetType, before, after, sortOrder, getDefaultPerPage(), EventScope.ALL).stream()); } /** @@ -243,7 +322,7 @@ public Stream getUserEventsStream(Object userIdOrUsername, ActionType act * *
GitLab Endpoint: GET /:projectId/events
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param action include only events of a particular action type, optional * @param targetType include only events of a particular target type, optional * @param before include only events created before a particular date, optional @@ -262,7 +341,7 @@ public List getProjectEvents(Object projectIdOrPath, ActionType action, T * *
GitLab Endpoint: GET /projects/:projectId/events
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param action include only events of a particular action type, optional * @param targetType include only events of a particular target type, optional * @param before include only events created before a particular date, optional @@ -273,7 +352,7 @@ public List getProjectEvents(Object projectIdOrPath, ActionType action, T * @return a list of events for the specified project and matching the supplied parameters * @throws GitLabApiException if any exception occurs */ - public List getProjectEvents(Integer projectIdOrPath, ActionType action, TargetType targetType, + public List getProjectEvents(Long projectIdOrPath, ActionType action, TargetType targetType, Date before, Date after, SortOrder sortOrder, int page, int perPage) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() @@ -296,7 +375,7 @@ public List getProjectEvents(Integer projectIdOrPath, ActionType action, * *
GitLab Endpoint: GET /projects/:projectId/events
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param action include only events of a particular action type, optional * @param targetType include only events of a particular target type, optional * @param before include only events created before a particular date, optional @@ -325,7 +404,7 @@ public Pager getProjectEvents(Object projectIdOrPath, ActionType action, * *
GitLab Endpoint: GET /:projectId/events
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param action include only events of a particular action type, optional * @param targetType include only events of a particular target type, optional * @param before include only events created before a particular date, optional diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApi.java index fa3c85b11a..23c0a6f1f3 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApi.java @@ -35,6 +35,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.*; +import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; @@ -53,12 +54,10 @@ public class GitLabApi implements AutoCloseable { private static final Map optionalExceptionMap = Collections.synchronizedMap(new WeakHashMap()); GitLabApiClient apiClient; - private DeploymentsApi deploymentsApi; private ApiVersion apiVersion; private String gitLabServerUrl; private Map clientConfigProperties; private int defaultPerPage = DEFAULT_PER_PAGE; - private ApplicationsApi applicationsApi; private ApplicationSettingsApi applicationSettingsApi; private AuditEventApi auditEventApi; @@ -68,6 +67,7 @@ public class GitLabApi implements AutoCloseable { private ContainerRegistryApi containerRegistryApi; private DiscussionsApi discussionsApi; private DeployKeysApi deployKeysApi; + private DeploymentsApi deploymentsApi; private DeployTokensApi deployTokensApi; private EnvironmentsApi environmentsApi; private EpicsApi epicsApi; @@ -94,6 +94,7 @@ public class GitLabApi implements AutoCloseable { private RepositoryApi repositoryApi; private RepositoryFileApi repositoryFileApi; private ResourceLabelEventsApi resourceLabelEventsApi; + private ResourceStateEventsApi resourceStateEventsApi; private RunnersApi runnersApi; private SearchApi searchApi; private ServicesApi servicesApi; @@ -103,6 +104,19 @@ public class GitLabApi implements AutoCloseable { private TodosApi todosApi; private UserApi userApi; private WikisApi wikisApi; + private KeysApi keysApi; + + /** + * Constructs a GitLabApi instance set up to interact with the GitLab server + * using GitLab API version 4. This is the primary way to authenticate with + * the GitLab REST API. + * + * @param hostUrl the URL of the GitLab server + * @param personalAccessToken the private token to use for access to the API + */ + public GitLabApi(String hostUrl, String personalAccessToken) { + this(ApiVersion.V4, hostUrl, personalAccessToken, null); + } /** * Constructs a GitLabApi instance set up to interact with the GitLab server using GitLab API version 4. @@ -126,18 +140,6 @@ public GitLabApi(ApiVersion apiVersion, String hostUrl, String personalAccessTok this(apiVersion, hostUrl, personalAccessToken, null); } - /** - * Constructs a GitLabApi instance set up to interact with the GitLab server - * using GitLab API version 4. This is the primary way to authenticate with - * the GitLab REST API. - * - * @param hostUrl the URL of the GitLab server - * @param personalAccessToken the private token to use for access to the API - */ - public GitLabApi(String hostUrl, String personalAccessToken) { - this(ApiVersion.V4, hostUrl, personalAccessToken, null); - } - /** * Constructs a GitLabApi instance set up to interact with the GitLab server using the specified GitLab API version. * @@ -264,43 +266,43 @@ public GitLabApi(ApiVersion apiVersion, String hostUrl, Constants.TokenType toke apiClient = new GitLabApiClient(apiVersion, hostUrl, tokenType, authToken, secretToken, clientConfigProperties); } + /** + * Get the GitLab4J shared Logger instance. + * + * @return the GitLab4J shared Logger instance + */ + public static final Logger getLogger() { + return (LOGGER); + } + /** *

Logs into GitLab using OAuth2 with the provided {@code username} and {@code password}, * and creates a new {@code GitLabApi} instance using returned access token.

* - * @param url GitLab URL - * @param username user name for which private token should be obtained - * @param password a CharSequence containing the password for a given {@code username} - * @param secretToken use this token to validate received payloads - * @param clientConfigProperties Map instance with additional properties for the Jersey client connection - * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors + * @param url GitLab URL + * @param username user name for which private token should be obtained + * @param password a CharSequence containing the password for a given {@code username} * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, CharSequence password, String secretToken, - Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, secretToken, clientConfigProperties, ignoreCertificateErrors)); + public static GitLabApi oauth2Login(String url, String username, CharSequence password) throws GitLabApiException { + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, null, null, false)); } /** *

Logs into GitLab using OAuth2 with the provided {@code username} and {@code password}, * and creates a new {@code GitLabApi} instance using returned access token.

* - * @param url GitLab URL - * @param username user name for which private token should be obtained - * @param password a char array holding the password for a given {@code username} - * @param secretToken use this token to validate received payloads - * @param clientConfigProperties Map instance with additional properties for the Jersey client connection - * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors + * @param url GitLab URL + * @param username user name for which private token should be obtained + * @param password a char array holding the password for a given {@code username} * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, char[] password, String secretToken, - Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { + public static GitLabApi oauth2Login(String url, String username, char[] password) throws GitLabApiException { try (SecretString secretPassword = new SecretString(password)) { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, - secretToken, clientConfigProperties, ignoreCertificateErrors)); + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, null, null, false)); } } @@ -309,62 +311,50 @@ public static GitLabApi oauth2Login(String url, String username, char[] password * and creates a new {@code GitLabApi} instance using returned access token.

* * @param url GitLab URL - * @param apiVersion the ApiVersion specifying which version of the API to use * @param username user name for which private token should be obtained - * @param password a char array holding the password for a given {@code username} - * @param secretToken use this token to validate received payloads - * @param clientConfigProperties Map instance with additional properties for the Jersey client connection + * @param password a CharSequence containing the password for a given {@code username} * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(ApiVersion apiVersion, String url, String username, char[] password, String secretToken, - Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { - - try (SecretString secretPassword = new SecretString(password)) { - return (GitLabApi.oauth2Login(apiVersion, url, username, secretPassword, - secretToken, clientConfigProperties, ignoreCertificateErrors)); - } - } - - /** - * Get the GitLab4J shared Logger instance. - * - * @return the GitLab4J shared Logger instance - */ - public static final Logger getLogger() { - return (LOGGER); + public static GitLabApi oauth2Login(String url, String username, CharSequence password, boolean ignoreCertificateErrors) throws GitLabApiException { + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, null, null, ignoreCertificateErrors)); } /** *

Logs into GitLab using OAuth2 with the provided {@code username} and {@code password}, * and creates a new {@code GitLabApi} instance using returned access token.

* - * @param url GitLab URL - * @param username user name for which private token should be obtained - * @param password a CharSequence containing the password for a given {@code username} + * @param url GitLab URL + * @param username user name for which private token should be obtained + * @param password a char array holding the password for a given {@code username} + * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, CharSequence password) throws GitLabApiException { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, null, null, false)); + public static GitLabApi oauth2Login(String url, String username, char[] password, boolean ignoreCertificateErrors) throws GitLabApiException { + + try (SecretString secretPassword = new SecretString(password)) { + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, null, null, ignoreCertificateErrors)); + } } /** *

Logs into GitLab using OAuth2 with the provided {@code username} and {@code password}, * and creates a new {@code GitLabApi} instance using returned access token.

* - * @param url GitLab URL - * @param username user name for which private token should be obtained - * @param password a char array holding the password for a given {@code username} + * @param url GitLab URL + * @param username user name for which private token should be obtained + * @param password a CharSequence containing the password for a given {@code username} + * @param secretToken use this token to validate received payloads + * @param clientConfigProperties Map instance with additional properties for the Jersey client connection + * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, char[] password) throws GitLabApiException { - - try (SecretString secretPassword = new SecretString(password)) { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, null, null, false)); - } + public static GitLabApi oauth2Login(String url, String username, CharSequence password, String secretToken, + Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, secretToken, clientConfigProperties, ignoreCertificateErrors)); } /** @@ -373,13 +363,20 @@ public static GitLabApi oauth2Login(String url, String username, char[] password * * @param url GitLab URL * @param username user name for which private token should be obtained - * @param password a CharSequence containing the password for a given {@code username} + * @param password a char array holding the password for a given {@code username} + * @param secretToken use this token to validate received payloads + * @param clientConfigProperties Map instance with additional properties for the Jersey client connection * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, CharSequence password, boolean ignoreCertificateErrors) throws GitLabApiException { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, password, null, null, ignoreCertificateErrors)); + public static GitLabApi oauth2Login(String url, String username, char[] password, String secretToken, + Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { + + try (SecretString secretPassword = new SecretString(password)) { + return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, + secretToken, clientConfigProperties, ignoreCertificateErrors)); + } } /** @@ -387,16 +384,21 @@ public static GitLabApi oauth2Login(String url, String username, CharSequence pa * and creates a new {@code GitLabApi} instance using returned access token.

* * @param url GitLab URL + * @param apiVersion the ApiVersion specifying which version of the API to use * @param username user name for which private token should be obtained * @param password a char array holding the password for a given {@code username} + * @param secretToken use this token to validate received payloads + * @param clientConfigProperties Map instance with additional properties for the Jersey client connection * @param ignoreCertificateErrors if true will set up the Jersey system ignore SSL certificate errors * @return new {@code GitLabApi} instance configured for a user-specific token * @throws GitLabApiException GitLabApiException if any exception occurs during execution */ - public static GitLabApi oauth2Login(String url, String username, char[] password, boolean ignoreCertificateErrors) throws GitLabApiException { + public static GitLabApi oauth2Login(ApiVersion apiVersion, String url, String username, char[] password, String secretToken, + Map clientConfigProperties, boolean ignoreCertificateErrors) throws GitLabApiException { try (SecretString secretPassword = new SecretString(password)) { - return (GitLabApi.oauth2Login(ApiVersion.V4, url, username, secretPassword, null, null, ignoreCertificateErrors)); + return (GitLabApi.oauth2Login(apiVersion, url, username, secretPassword, + secretToken, clientConfigProperties, ignoreCertificateErrors)); } } @@ -499,7 +501,7 @@ public static final T orElseThrow(Optional optional) throws GitLabApiExce */ public final GitLabApi duplicate() { - Integer sudoUserId = this.getSudoAsId(); + Long sudoUserId = this.getSudoAsId(); GitLabApi gitLabApi = new GitLabApi(apiVersion, gitLabServerUrl, getTokenType(), getAuthToken(), getSecretToken(), clientConfigProperties); if (sudoUserId != null) { @@ -581,18 +583,6 @@ public GitLabApi withRequestResponseLogging(Logger logger, Level level) { return (this); } - /** - * Enable the logging of the requests to and the responses from the GitLab server API using the - * specified logger. Logging will NOT include entity logging and will mask PRIVATE-TOKEN - * and Authorization headers.. - * - * @param logger the Logger instance to log to - * @param level the logging level (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST) - */ - public void enableRequestResponseLogging(Logger logger, Level level) { - enableRequestResponseLogging(logger, level, 0); - } - /** * Enable the logging of the requests to and the responses from the GitLab server API * using the GitLab4J shared Logger instance and Level.FINE as the level. @@ -612,6 +602,18 @@ public void enableRequestResponseLogging(Level level) { enableRequestResponseLogging(LOGGER, level, 0); } + /** + * Enable the logging of the requests to and the responses from the GitLab server API using the + * specified logger. Logging will NOT include entity logging and will mask PRIVATE-TOKEN + * and Authorization headers.. + * + * @param logger the Logger instance to log to + * @param level the logging level (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST) + */ + public void enableRequestResponseLogging(Logger logger, Level level) { + enableRequestResponseLogging(logger, level, 0); + } + /** * Enable the logging of the requests to and the responses from the GitLab server API using the * GitLab4J shared Logger instance. Logging will mask PRIVATE-TOKEN and Authorization headers. @@ -662,6 +664,35 @@ public void enableRequestResponseLogging(Logger logger, Level level, List maskedHeaderNames) { + apiClient.enableRequestResponseLogging(LOGGER, level, maxEntitySize, maskedHeaderNames); + } + + /** + * Enable the logging of the requests to and the responses from the GitLab server API using the + * specified logger. + * + * @param logger the Logger instance to log to + * @param level the logging level (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST) + * @param maxEntitySize maximum number of entity bytes to be logged. When logging if the maxEntitySize + * is reached, the entity logging will be truncated at maxEntitySize and "...more..." will be added at + * the end of the log entry. If maxEntitySize is <= 0, entity logging will be disabled + * @param maskedHeaderNames a list of header names that should have the values masked + */ + public void enableRequestResponseLogging(Logger logger, Level level, int maxEntitySize, List maskedHeaderNames) { + apiClient.enableRequestResponseLogging(logger, level, maxEntitySize, maskedHeaderNames); + } + /** * Sets up all future calls to the GitLab API to be done as another user specified by sudoAsUsername. * To revert back to normal non-sudo operation you must call unsudo(), or pass null as the username. @@ -682,7 +713,7 @@ public void sudo(String sudoAsUsername) throws GitLabApiException { throw new GitLabApiException("the specified username was not found"); } - Integer sudoAsId = user.getId(); + Long sudoAsId = user.getId(); apiClient.setSudoAsId(sudoAsId); } @@ -694,17 +725,35 @@ public void unsudo() { } /** - * Enable the logging of the requests to and the responses from the GitLab server API using the - * GitLab4J shared Logger instance. + * Get the current sudo as ID, will return null if not in sudo mode. * - * @param level the logging level (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST) - * @param maxEntitySize maximum number of entity bytes to be logged. When logging if the maxEntitySize - * is reached, the entity logging will be truncated at maxEntitySize and "...more..." will be added at - * the end of the log entry. If maxEntitySize is <= 0, entity logging will be disabled - * @param maskedHeaderNames a list of header names that should have the values masked + * @return the current sudo as ID, will return null if not in sudo mode */ - public void enableRequestResponseLogging(Level level, int maxEntitySize, List maskedHeaderNames) { - apiClient.enableRequestResponseLogging(LOGGER, level, maxEntitySize, maskedHeaderNames); + public Long getSudoAsId() { + return (apiClient.getSudoAsId()); + } + + /** + * Sets up all future calls to the GitLab API to be done as another user specified by provided user ID. + * To revert back to normal non-sudo operation you must call unsudo(), or pass null as the sudoAsId. + * + * @param sudoAsId the ID of the user to sudo as, null will turn off sudo + * @throws GitLabApiException if any exception occurs + */ + public void setSudoAsId(Long sudoAsId) throws GitLabApiException { + + if (sudoAsId == null) { + apiClient.setSudoAsId(null); + return; + } + + // Get the User specified by the sudoAsId, if you are not an admin or the username is not found, this will fail + User user = getUserApi().getUser(sudoAsId); + if (user == null || !user.getId().equals(sudoAsId)) { + throw new GitLabApiException("the specified user ID was not found"); + } + + apiClient.setSudoAsId(sudoAsId); } /** @@ -716,6 +765,15 @@ public String getAuthToken() { return (apiClient.getAuthToken()); } + /** + * Set auth token supplier for gitlab api client. + * + * @param authTokenSupplier - supplier which provide actual auth token + */ + public void setAuthTokenSupplier(Supplier authTokenSupplier) { + apiClient.setAuthTokenSupplier(authTokenSupplier); + } + /** * Get the secret token. * @@ -726,18 +784,12 @@ public String getSecretToken() { } /** - * Enable the logging of the requests to and the responses from the GitLab server API using the - * specified logger. + * Get the TokenType this client is using. * - * @param logger the Logger instance to log to - * @param level the logging level (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST) - * @param maxEntitySize maximum number of entity bytes to be logged. When logging if the maxEntitySize - * is reached, the entity logging will be truncated at maxEntitySize and "...more..." will be added at - * the end of the log entry. If maxEntitySize is <= 0, entity logging will be disabled - * @param maskedHeaderNames a list of header names that should have the values masked + * @return the TokenType this client is using */ - public void enableRequestResponseLogging(Logger logger, Level level, int maxEntitySize, List maskedHeaderNames) { - apiClient.enableRequestResponseLogging(logger, level, maxEntitySize, maskedHeaderNames); + public Constants.TokenType getTokenType() { + return (apiClient.getTokenType()); } /** @@ -975,44 +1027,41 @@ public DeployKeysApi getDeployKeysApi() { } /** - * Get the current sudo as ID, will return null if not in sudo mode. - * - * @return the current sudo as ID, will return null if not in sudo mode - */ - public Integer getSudoAsId() { - return (apiClient.getSudoAsId()); - } - - /** - * Sets up all future calls to the GitLab API to be done as another user specified by provided user ID. - * To revert back to normal non-sudo operation you must call unsudo(), or pass null as the sudoAsId. + * Gets the DeployKeysApi instance owned by this GitLabApi instance. The DeploymentsApi is used + * to perform all deployment related API calls. * - * @param sudoAsId the ID of the user to sudo as, null will turn off sudo - * @throws GitLabApiException if any exception occurs + * @return the DeploymentsApi instance owned by this GitLabApi instance */ - public void setSudoAsId(Integer sudoAsId) throws GitLabApiException { - - if (sudoAsId == null) { - apiClient.setSudoAsId(null); - return; - } + public DeploymentsApi getDeploymentsApi() { - // Get the User specified by the sudoAsId, if you are not an admin or the username is not found, this will fail - User user = getUserApi().getUser(sudoAsId); - if (user == null || !user.getId().equals(sudoAsId)) { - throw new GitLabApiException("the specified user ID was not found"); + if (deploymentsApi == null) { + synchronized (this) { + if (deploymentsApi == null) { + deploymentsApi = new DeploymentsApi(this); + } + } } - apiClient.setSudoAsId(sudoAsId); + return (deploymentsApi); } /** - * Get the TokenType this client is using. + * Gets the DeployTokensApi instance owned by this GitLabApi instance. The DeployTokensApi is used + * to perform all deploy token related API calls. * - * @return the TokenType this client is using + * @return the DeployTokensApi instance owned by this GitLabApi instance */ - public Constants.TokenType getTokenType() { - return (apiClient.getTokenType()); + public DeployTokensApi getDeployTokensApi() { + + if (deployTokensApi == null) { + synchronized (this) { + if (deployTokensApi == null) { + deployTokensApi = new DeployTokensApi(this); + } + } + } + + return (deployTokensApi); } /** @@ -1237,7 +1286,6 @@ public LicenseTemplatesApi getLicenseTemplatesApi() { return (licenseTemplatesApi); } - /** * Gets the MarkdownApi instance owned by this GitLabApi instance. The MarkdownApi is used * to perform all markdown related API calls. @@ -1503,6 +1551,25 @@ public ResourceLabelEventsApi getResourceLabelEventsApi() { return (resourceLabelEventsApi); } + /** + * Gets the ResourceStateEventsApi instance owned by this GitLabApi instance. The ResourceStateEventsApi + * is used to perform all Resource State Events related API calls. + * + * @return the ResourceStateEventsApi instance owned by this GitLabApi instance + */ + public ResourceStateEventsApi getResourceStateEventsApi() { + + if (resourceStateEventsApi == null) { + synchronized (this) { + if (resourceStateEventsApi == null) { + resourceStateEventsApi = new ResourceStateEventsApi(this); + } + } + } + + return (resourceStateEventsApi); + } + /** * Gets the RunnersApi instance owned by this GitLabApi instance. The RunnersApi is used * to perform all Runner related API calls. @@ -1670,41 +1737,17 @@ public WikisApi getWikisApi() { } /** - * Gets the DeployKeysApi instance owned by this GitLabApi instance. The DeploymentsApi is used - * to perform all deployment related API calls. - * - * @return the DeploymentsApi instance owned by this GitLabApi instance - */ - public DeploymentsApi getDeploymentsApi() { - - if (deploymentsApi == null) { - synchronized (this) { - if (deploymentsApi == null) { - deploymentsApi = new DeploymentsApi(this); - } - } - } - - return (deploymentsApi); - } - - /** - * Gets the DeployTokensApi instance owned by this GitLabApi instance. The DeployTokensApi is used - * to perform all deploy token related API calls. + * Gets the KeysApi instance owned by this GitLabApi instance. The KeysApi is used to look up users by their ssh key signatures * - * @return the DeployTokensApi instance owned by this GitLabApi instance + * @return the KeysApi instance owned by this GitLabApi instance */ - public DeployTokensApi getDeployTokensApi() { - - if (deployTokensApi == null) { - synchronized (this) { - if (deployTokensApi == null) { - deployTokensApi = new DeployTokensApi(this); - } + public KeysApi getKeysAPI() { + synchronized (this) { + if (keysApi == null) { + keysApi = new KeysApi(this); } } - - return (deployTokensApi); + return keysApi; } /** diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApiClient.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApiClient.java index 723d94e71e..cc1759d7cf 100755 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApiClient.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GitLabApiClient.java @@ -25,25 +25,23 @@ ********************************************************************************/ package org.aoju.bus.gitlab; -import org.aoju.bus.core.lang.Header; -import org.aoju.bus.gitlab.GitLabApi.ApiVersion; import org.aoju.bus.gitlab.support.JacksonJson; import org.aoju.bus.gitlab.support.MaskingLoggingFilter; import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.JerseyClientBuilder; -import org.glassfish.jersey.media.multipart.Boundary; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.glassfish.jersey.media.multipart.MultiPart; -import org.glassfish.jersey.media.multipart.MultiPartFeature; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.media.multipart.*; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; +import org.glassfish.jersey.media.multipart.file.StreamDataBodyPart; import javax.net.ssl.*; import javax.ws.rs.client.*; import javax.ws.rs.core.*; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.Socket; import java.net.URL; import java.security.GeneralSecurityException; @@ -52,6 +50,7 @@ import java.security.cert.X509Certificate; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; @@ -63,7 +62,7 @@ public class GitLabApiClient implements AutoCloseable { protected static final String PRIVATE_TOKEN_HEADER = "PRIVATE-TOKEN"; protected static final String SUDO_HEADER = "Sudo"; - protected static final String AUTHORIZATION_HEADER = Header.AUTHORIZATION; + protected static final String AUTHORIZATION_HEADER = "Authorization"; protected static final String X_GITLAB_TOKEN_HEADER = "X-Gitlab-Token"; private ClientConfig clientConfig; @@ -71,12 +70,12 @@ public class GitLabApiClient implements AutoCloseable { private String baseUrl; private String hostUrl; private Constants.TokenType tokenType = Constants.TokenType.PRIVATE; - private String authToken; + private Supplier authToken; private String secretToken; private boolean ignoreCertificateErrors; private SSLContext openSslContext; private HostnameVerifier openHostnameVerifier; - private Integer sudoAsId; + private Long sudoAsId; private Integer connectTimeout; private Integer readTimeout; @@ -88,7 +87,7 @@ public class GitLabApiClient implements AutoCloseable { * @param hostUrl the URL to the GitLab API server * @param privateToken the private token to authenticate with */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToken) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, String privateToken) { this(apiVersion, hostUrl, Constants.TokenType.PRIVATE, privateToken, null); } @@ -101,7 +100,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToke * @param tokenType the type of auth the token is for, PRIVATE or ACCESS * @param authToken the token to authenticate with */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken) { this(apiVersion, hostUrl, tokenType, authToken, null); } @@ -113,7 +112,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenTyp * @param privateToken the private token to authenticate with */ public GitLabApiClient(String hostUrl, String privateToken) { - this(ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, null); + this(GitLabApi.ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, null); } /** @@ -125,7 +124,7 @@ public GitLabApiClient(String hostUrl, String privateToken) { * @param authToken the token to authenticate with */ public GitLabApiClient(String hostUrl, Constants.TokenType tokenType, String authToken) { - this(ApiVersion.V4, hostUrl, tokenType, authToken, null); + this(GitLabApi.ApiVersion.V4, hostUrl, tokenType, authToken, null); } /** @@ -137,7 +136,7 @@ public GitLabApiClient(String hostUrl, Constants.TokenType tokenType, String aut * @param privateToken the private token to authenticate with * @param secretToken use this token to validate received payloads */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToken, String secretToken) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, String privateToken, String secretToken) { this(apiVersion, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, null); } @@ -151,7 +150,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToke * @param authToken the token to authenticate with * @param secretToken use this token to validate received payloads */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken, String secretToken) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken, String secretToken) { this(apiVersion, hostUrl, tokenType, authToken, secretToken, null); } @@ -164,7 +163,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenTyp * @param secretToken use this token to validate received payloads */ public GitLabApiClient(String hostUrl, String privateToken, String secretToken) { - this(ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, null); + this(GitLabApi.ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, null); } /** @@ -177,7 +176,7 @@ public GitLabApiClient(String hostUrl, String privateToken, String secretToken) * @param secretToken use this token to validate received payloads */ public GitLabApiClient(String hostUrl, Constants.TokenType tokenType, String authToken, String secretToken) { - this(ApiVersion.V4, hostUrl, tokenType, authToken, secretToken, null); + this(GitLabApi.ApiVersion.V4, hostUrl, tokenType, authToken, secretToken, null); } /** @@ -190,7 +189,7 @@ public GitLabApiClient(String hostUrl, Constants.TokenType tokenType, String aut * @param clientConfigProperties the properties given to Jersey's clientconfig */ public GitLabApiClient(String hostUrl, String privateToken, String secretToken, Map clientConfigProperties) { - this(ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, clientConfigProperties); + this(GitLabApi.ApiVersion.V4, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, clientConfigProperties); } /** @@ -203,7 +202,7 @@ public GitLabApiClient(String hostUrl, String privateToken, String secretToken, * @param secretToken use this token to validate received payloads * @param clientConfigProperties the properties given to Jersey's clientconfig */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToken, String secretToken, Map clientConfigProperties) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, String privateToken, String secretToken, Map clientConfigProperties) { this(apiVersion, hostUrl, Constants.TokenType.PRIVATE, privateToken, secretToken, clientConfigProperties); } @@ -218,7 +217,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, String privateToke * @param secretToken use this token to validate received payloads * @param clientConfigProperties the properties given to Jersey's clientconfig */ - public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken, String secretToken, Map clientConfigProperties) { + public GitLabApiClient(GitLabApi.ApiVersion apiVersion, String hostUrl, Constants.TokenType tokenType, String authToken, String secretToken, Map clientConfigProperties) { // Remove the trailing "/" from the hostUrl if present this.hostUrl = (hostUrl.endsWith("/") ? hostUrl.replaceAll("/$", "") : hostUrl); @@ -226,7 +225,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenTyp this.hostUrl += apiVersion.getApiNamespace(); this.tokenType = tokenType; - this.authToken = authToken; + this.authToken = () -> authToken; if (secretToken != null) { secretToken = secretToken.trim(); @@ -253,6 +252,7 @@ public GitLabApiClient(ApiVersion apiVersion, String hostUrl, Constants.TokenTyp clientConfig.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true); clientConfig.register(JacksonJson.class); + clientConfig.register(JacksonFeature.class); clientConfig.register(MultiPartFeature.class); } @@ -304,7 +304,7 @@ void setRequestTimeout(Integer connectTimeout, Integer readTimeout) { * @return the auth token being used by this client */ String getAuthToken() { - return (authToken); + return (authToken.get()); } /** @@ -328,7 +328,7 @@ Constants.TokenType getTokenType() { /** * Set the ID of the user to sudo as. */ - Integer getSudoAsId() { + Long getSudoAsId() { return (sudoAsId); } @@ -337,7 +337,7 @@ Integer getSudoAsId() { * * @param sudoAsId the ID of the user to sudo as */ - void setSudoAsId(Integer sudoAsId) { + void setSudoAsId(Long sudoAsId) { this.sudoAsId = sudoAsId; } @@ -570,14 +570,13 @@ protected Response post(StreamingOutput stream, String mediaType, Object... path * * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaTypeString the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaTypeString unused; will be removed in the next major version * @param pathArgs variable list of arguments used to build the URI * @return a ClientResponse instance with the data returned from the endpoint * @throws IOException if an error occurs while constructing the URL */ protected Response upload(String name, File fileToUpload, String mediaTypeString, Object... pathArgs) throws IOException { - URL url = getApiUrl(pathArgs); - return (upload(name, fileToUpload, mediaTypeString, null, url)); + return upload(name, fileToUpload, mediaTypeString, null, pathArgs); } /** @@ -586,7 +585,7 @@ protected Response upload(String name, File fileToUpload, String mediaTypeString * * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaTypeString the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaTypeString unused; will be removed in the next major version * @param formData the Form containing the name/value pairs * @param pathArgs variable list of arguments used to build the URI * @return a ClientResponse instance with the data returned from the endpoint @@ -603,30 +602,38 @@ protected Response upload(String name, File fileToUpload, String mediaTypeString * * @param name the name for the form field that contains the file name * @param fileToUpload a File instance pointing to the file to upload - * @param mediaTypeString the content-type of the uploaded file, if null will be determined from fileToUpload + * @param mediaTypeString unused; will be removed in the next major version * @param formData the Form containing the name/value pairs * @param url the fully formed path to the GitLab API endpoint * @return a ClientResponse instance with the data returned from the endpoint * @throws IOException if an error occurs while constructing the URL */ protected Response upload(String name, File fileToUpload, String mediaTypeString, Form formData, URL url) throws IOException { + FileDataBodyPart filePart = new FileDataBodyPart(name, fileToUpload); + return upload(filePart, formData, url); + } - MediaType mediaType = (mediaTypeString != null ? MediaType.valueOf(mediaTypeString) : null); - try (FormDataMultiPart multiPart = new FormDataMultiPart()) { + protected Response upload(String name, InputStream inputStream, String filename, String mediaTypeString, Object... pathArgs) throws IOException { + URL url = getApiUrl(pathArgs); + return (upload(name, inputStream, filename, mediaTypeString, null, url)); + } + + protected Response upload(String name, InputStream inputStream, String filename, String mediaTypeString, Form formData, URL url) throws IOException { + StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart(name, inputStream, filename); + return upload(streamDataBodyPart, formData, url); + } + protected Response upload(BodyPart bodyPart, Form formData, URL url) throws IOException { + try (FormDataMultiPart multiPart = new FormDataMultiPart()) { if (formData != null) { - MultivaluedMap formParams = formData.asMap(); - formParams.forEach((key, values) -> { + formData.asMap().forEach((key, values) -> { if (values != null) { values.forEach(value -> multiPart.field(key, value)); } }); } - FileDataBodyPart filePart = mediaType != null ? - new FileDataBodyPart(name, fileToUpload, mediaType) : - new FileDataBodyPart(name, fileToUpload); - multiPart.bodyPart(filePart); + multiPart.bodyPart(bodyPart); final Entity entity = Entity.entity(multiPart, Boundary.addBoundary(multiPart.getMediaType())); return (invocation(url, null).post(entity)); } @@ -778,6 +785,7 @@ protected Client createApiClient() { // Register JacksonJson as the ObjectMapper provider. clientBuilder.register(JacksonJson.class); + clientBuilder.register(JacksonFeature.class); if (ignoreCertificateErrors) { clientBuilder.sslContext(openSslContext).hostnameVerifier(openHostnameVerifier); @@ -801,7 +809,7 @@ protected Invocation.Builder invocation(URL url, MultivaluedMap } String authHeader = (tokenType == Constants.TokenType.OAUTH2_ACCESS ? AUTHORIZATION_HEADER : PRIVATE_TOKEN_HEADER); - String authValue = (tokenType == Constants.TokenType.OAUTH2_ACCESS ? "Bearer " + authToken : authToken); + String authValue = (tokenType == Constants.TokenType.OAUTH2_ACCESS ? "Bearer " + authToken.get() : authToken.get()); Invocation.Builder builder = target.request(); if (accept == null || accept.trim().length() == 0) { builder = builder.header(authHeader, authValue); @@ -914,6 +922,7 @@ public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngi // Ignore differences between given hostname and certificate hostname HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override public boolean verify(String hostname, SSLSession session) { return true; } @@ -932,4 +941,13 @@ public boolean verify(String hostname, SSLSession session) { return (true); } + + /** + * Set auth token supplier for gitlab api client. + * + * @param authTokenSupplier - supplier which provide actual auth token + */ + public void setAuthTokenSupplier(Supplier authTokenSupplier) { + this.authToken = authTokenSupplier; + } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GroupApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GroupApi.java index 8585283a7b..9bc481069f 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GroupApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/GroupApi.java @@ -25,7 +25,6 @@ ********************************************************************************/ package org.aoju.bus.gitlab; -import org.aoju.bus.gitlab.GitLabApi.ApiVersion; import org.aoju.bus.gitlab.models.*; import org.aoju.bus.gitlab.support.ISO8601; @@ -35,6 +34,7 @@ import java.io.File; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; @@ -552,7 +552,7 @@ public Group addGroup(Group group) throws GitLabApiException { .withParam("visibility", group.getVisibility()) .withParam("lfs_enabled", group.getLfsEnabled()) .withParam("request_access_enabled", group.getRequestAccessEnabled()) - .withParam("parent_id", isApiVersion(ApiVersion.V3) ? null : group.getParentId()); + .withParam("parent_id", isApiVersion(GitLabApi.ApiVersion.V3) ? null : group.getParentId()); Response response = post(Response.Status.CREATED, formData, "groups"); return (response.readEntity(Group.class)); } @@ -573,7 +573,7 @@ public Group addGroup(Group group) throws GitLabApiException { * @throws GitLabApiException if any exception occurs */ public Group addGroup(String name, String path, String description, Visibility visibility, - Boolean lfsEnabled, Boolean requestAccessEnabled, Integer parentId) throws GitLabApiException { + Boolean lfsEnabled, Boolean requestAccessEnabled, Long parentId) throws GitLabApiException { Form formData = new GitLabApiForm() .withParam("name", name, true) @@ -582,7 +582,7 @@ public Group addGroup(String name, String path, String description, Visibility v .withParam("visibility", visibility) .withParam("lfs_enabled", lfsEnabled) .withParam("request_access_enabled", requestAccessEnabled) - .withParam("parent_id", isApiVersion(ApiVersion.V3) ? null : parentId); + .withParam("parent_id", isApiVersion(GitLabApi.ApiVersion.V3) ? null : parentId); Response response = post(Response.Status.CREATED, formData, "groups"); return (response.readEntity(Group.class)); } @@ -604,7 +604,7 @@ public Group updateGroup(Group group) throws GitLabApiException { .withParam("visibility", group.getVisibility()) .withParam("lfs_enabled", group.getLfsEnabled()) .withParam("request_access_enabled", group.getRequestAccessEnabled()) - .withParam("parent_id", isApiVersion(ApiVersion.V3) ? null : group.getParentId()); + .withParam("parent_id", isApiVersion(GitLabApi.ApiVersion.V3) ? null : group.getParentId()); Response response = put(Response.Status.OK, formData.asMap(), "groups", group.getId()); return (response.readEntity(Group.class)); } @@ -626,7 +626,7 @@ public Group updateGroup(Group group) throws GitLabApiException { * @throws GitLabApiException if any exception occurs */ public Group updateGroup(Object groupIdOrPath, String name, String path, String description, Visibility visibility, - Boolean lfsEnabled, Boolean requestAccessEnabled, Integer parentId) throws GitLabApiException { + Boolean lfsEnabled, Boolean requestAccessEnabled, Long parentId) throws GitLabApiException { Form formData = new GitLabApiForm() .withParam("name", name) @@ -635,7 +635,88 @@ public Group updateGroup(Object groupIdOrPath, String name, String path, String .withParam("visibility", visibility) .withParam("lfs_enabled", lfsEnabled) .withParam("request_access_enabled", requestAccessEnabled) - .withParam("parent_id", isApiVersion(ApiVersion.V3) ? null : parentId); + .withParam("parent_id", isApiVersion(GitLabApi.ApiVersion.V3) ? null : parentId); + Response response = put(Response.Status.OK, formData.asMap(), "groups", getGroupIdOrPath(groupIdOrPath)); + return (response.readEntity(Group.class)); + } + + /** + * Creates a new project group. Available only for users who can create groups. + * + *
GitLab Endpoint: POST /groups
+ * + * @param name the name of the group to add + * @param path the path for the group + * @param description (optional) - The group's description + * @param membershipLock (optional, boolean) - Prevent adding new members to project membership within this group + * @param shareWithGroupLock (optional, boolean) - Prevent sharing a project with another group within this group + * @param visibility (optional) - The group's visibility. Can be private, internal, or public. + * @param lfsEnabled (optional) - Enable/disable Large File Storage (LFS) for the projects in this group + * @param requestAccessEnabled (optional) - Allow users to request member access. + * @param parentId (optional) - The parent group id for creating nested group. + * @param sharedRunnersMinutesLimit (optional) - (admin-only) Pipeline minutes quota for this group + * @return the created Group instance + * @throws GitLabApiException if any exception occurs + * @deprecated Will be removed in version 6.0, replaced by {@link #addGroup(String, String, String, Visibility, + * Boolean, Boolean, Long)} + */ + @Deprecated + public Group addGroup(String name, String path, String description, Boolean membershipLock, + Boolean shareWithGroupLock, Visibility visibility, Boolean lfsEnabled, Boolean requestAccessEnabled, + Long parentId, Integer sharedRunnersMinutesLimit) throws GitLabApiException { + + Form formData = new GitLabApiForm() + .withParam("name", name) + .withParam("path", path) + .withParam("description", description) + .withParam("membership_lock", membershipLock) + .withParam("share_with_group_lock", shareWithGroupLock) + .withParam("visibility", visibility) + .withParam("lfs_enabled", lfsEnabled) + .withParam("request_access_enabled", requestAccessEnabled) + .withParam("parent_id", parentId) + .withParam("shared_runners_minutes_limit", sharedRunnersMinutesLimit); + Response response = post(Response.Status.CREATED, formData, "groups"); + return (response.readEntity(Group.class)); + } + + /** + * Updates a project group. Available only for users who can create groups. + * + *
GitLab Endpoint: PUT /groups
+ * + * @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path + * @param name the name of the group to add + * @param path the path for the group + * @param description (optional) - The group's description + * @param membershipLock (optional, boolean) - Prevent adding new members to project membership within this group + * @param shareWithGroupLock (optional, boolean) - Prevent sharing a project with another group within this group + * @param visibility (optional) - The group's visibility. Can be private, internal, or public. + * @param lfsEnabled (optional) - Enable/disable Large File Storage (LFS) for the projects in this group + * @param requestAccessEnabled (optional) - Allow users to request member access + * @param parentId (optional) - The parent group id for creating nested group + * @param sharedRunnersMinutesLimit (optional) - (admin-only) Pipeline minutes quota for this group + * @return the updated Group instance + * @throws GitLabApiException if any exception occurs + * @deprecated Will be removed in version 6.0, replaced by {@link #updateGroup(Object, String, String, String, + * Visibility, Boolean, Boolean, Long)} + */ + @Deprecated + public Group updateGroup(Object groupIdOrPath, String name, String path, String description, Boolean membershipLock, + Boolean shareWithGroupLock, Visibility visibility, Boolean lfsEnabled, Boolean requestAccessEnabled, + Long parentId, Integer sharedRunnersMinutesLimit) throws GitLabApiException { + + Form formData = new GitLabApiForm() + .withParam("name", name) + .withParam("path", path) + .withParam("description", description) + .withParam("membership_lock", membershipLock) + .withParam("share_with_group_lock", shareWithGroupLock) + .withParam("visibility", visibility) + .withParam("lfs_enabled", lfsEnabled) + .withParam("request_access_enabled", requestAccessEnabled) + .withParam("parent_id", parentId) + .withParam("shared_runners_minutes_limit", sharedRunnersMinutesLimit); Response response = put(Response.Status.OK, formData.asMap(), "groups", getGroupIdOrPath(groupIdOrPath)); return (response.readEntity(Group.class)); } @@ -649,7 +730,7 @@ public Group updateGroup(Object groupIdOrPath, String name, String path, String * @throws GitLabApiException if any exception occurs */ public void deleteGroup(Object groupIdOrPath) throws GitLabApiException { - Response.Status expectedStatus = (isApiVersion(ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT); + Response.Status expectedStatus = (isApiVersion(GitLabApi.ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT); delete(expectedStatus, null, "groups", getGroupIdOrPath(groupIdOrPath)); } @@ -720,7 +801,7 @@ public Stream getMembersStream(Object groupIdOrPath) throws GitLabApiExc * @return a member viewable by the authenticated user * @throws GitLabApiException if any exception occurs */ - public Member getMember(Object groupIdOrPath, int userId) throws GitLabApiException { + public Member getMember(Object groupIdOrPath, long userId) throws GitLabApiException { return (getMember(groupIdOrPath, userId, false)); } @@ -733,7 +814,7 @@ public Member getMember(Object groupIdOrPath, int userId) throws GitLabApiExcept * @param userId the member ID of the member to get * @return a member viewable by the authenticated user as an Optional instance */ - public Optional getOptionalMember(Object groupIdOrPath, int userId) { + public Optional getOptionalMember(Object groupIdOrPath, long userId) { try { return (Optional.ofNullable(getMember(groupIdOrPath, userId, false))); } catch (GitLabApiException glae) { @@ -752,7 +833,7 @@ public Optional getOptionalMember(Object groupIdOrPath, int userId) { * @return the member specified by the project ID/user ID pair * @throws GitLabApiException if any exception occurs */ - public Member getMember(Object groupIdOrPath, Integer userId, Boolean includeInherited) throws GitLabApiException { + public Member getMember(Object groupIdOrPath, Long userId, Boolean includeInherited) throws GitLabApiException { Response response; if (includeInherited) { response = get(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "members", "all", userId); @@ -772,7 +853,7 @@ public Member getMember(Object groupIdOrPath, Integer userId, Boolean includeInh * @param includeInherited if true will the member even if inherited thru an ancestor group * @return the member specified by the group ID/user ID pair as the value of an Optional */ - public Optional getOptionalMember(Object groupIdOrPath, Integer userId, Boolean includeInherited) { + public Optional getOptionalMember(Object groupIdOrPath, Long userId, Boolean includeInherited) { try { return (Optional.ofNullable(getMember(groupIdOrPath, userId, includeInherited))); } catch (GitLabApiException glae) { @@ -796,6 +877,29 @@ public List getAllMembers(Object groupIdOrPath) throws GitLabApiExceptio return (getAllMembers(groupIdOrPath, null, null)); } + /** + * Gets a list of group members viewable by the authenticated user, including inherited members + * through ancestor groups. Returns multiple times the same user (with different member attributes) + * when the user is a member of the group and of one or more ancestor group. + * + *
GitLab Endpoint: GET /groups/:id/members/all
+ * + * @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path + * @param page the page to get + * @param perPage the number of Member instances per page + * @return a list of group members viewable by the authenticated user, including inherited members + * through ancestor groups in the specified page range + * @throws GitLabApiException if any exception occurs + * @deprecated Will be removed in version 6.0 + */ + @Deprecated + public List getAllMembers(Object groupIdOrPath, int page, int perPage) throws GitLabApiException { + Response response = get(Response.Status.OK, getPageQueryParams(page, perPage), + "groups", getGroupIdOrPath(groupIdOrPath), "members", "all"); + return (response.readEntity(new GenericType>() { + })); + } + /** * Gets a Pager of group members viewable by the authenticated user, including inherited members * through ancestor groups. Returns multiple times the same user (with different member attributes) @@ -843,7 +947,7 @@ public Stream getAllMembersStream(Object groupIdOrPath) throws GitLabApi * @return the group members viewable by the authenticated user, including inherited members through ancestor groups * @throws GitLabApiException if any exception occurs */ - public List getAllMembers(Object groupIdOrPath, String query, List userIds) throws GitLabApiException { + public List getAllMembers(Object groupIdOrPath, String query, List userIds) throws GitLabApiException { return (getAllMembers(groupIdOrPath, query, userIds, getDefaultPerPage()).all()); } @@ -862,7 +966,7 @@ public List getAllMembers(Object groupIdOrPath, String query, List getAllMembers(Object groupIdOrPath, String query, List userIds, int itemsPerPage) throws GitLabApiException { + public Pager getAllMembers(Object groupIdOrPath, String query, List userIds, int itemsPerPage) throws GitLabApiException { GitLabApiForm form = new GitLabApiForm().withParam("query", query).withParam("user_ids", userIds); return (new Pager(this, Member.class, itemsPerPage, form.asMap(), "groups", getGroupIdOrPath(groupIdOrPath), "members", "all")); @@ -882,7 +986,7 @@ public Pager getAllMembers(Object groupIdOrPath, String query, List getAllMembersStream(Object groupIdOrPath, String query, List userIds) throws GitLabApiException { + public Stream getAllMembersStream(Object groupIdOrPath, String query, List userIds) throws GitLabApiException { return (getAllMembers(groupIdOrPath, query, userIds, getDefaultPerPage()).stream()); } @@ -897,7 +1001,7 @@ public Stream getAllMembersStream(Object groupIdOrPath, String query, Li * @return a Member instance for the added user * @throws GitLabApiException if any exception occurs */ - public Member addMember(Object groupIdOrPath, Integer userId, Integer accessLevel) throws GitLabApiException { + public Member addMember(Object groupIdOrPath, Long userId, Integer accessLevel) throws GitLabApiException { return (addMember(groupIdOrPath, userId, accessLevel, null)); } @@ -912,7 +1016,7 @@ public Member addMember(Object groupIdOrPath, Integer userId, Integer accessLeve * @return a Member instance for the added user * @throws GitLabApiException if any exception occurs */ - public Member addMember(Object groupIdOrPath, Integer userId, AccessLevel accessLevel) throws GitLabApiException { + public Member addMember(Object groupIdOrPath, Long userId, AccessLevel accessLevel) throws GitLabApiException { return (addMember(groupIdOrPath, userId, accessLevel.toValue(), null)); } @@ -928,7 +1032,7 @@ public Member addMember(Object groupIdOrPath, Integer userId, AccessLevel access * @return a Member instance for the added user * @throws GitLabApiException if any exception occurs */ - public Member addMember(Object groupIdOrPath, Integer userId, AccessLevel accessLevel, Date expiresAt) throws GitLabApiException { + public Member addMember(Object groupIdOrPath, Long userId, AccessLevel accessLevel, Date expiresAt) throws GitLabApiException { return (addMember(groupIdOrPath, userId, accessLevel.toValue(), expiresAt)); } @@ -944,7 +1048,7 @@ public Member addMember(Object groupIdOrPath, Integer userId, AccessLevel access * @return a Member instance for the added user * @throws GitLabApiException if any exception occurs */ - public Member addMember(Object groupIdOrPath, Integer userId, Integer accessLevel, Date expiresAt) throws GitLabApiException { + public Member addMember(Object groupIdOrPath, Long userId, Integer accessLevel, Date expiresAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("user_id", userId, true) @@ -965,7 +1069,7 @@ public Member addMember(Object groupIdOrPath, Integer userId, Integer accessLeve * @return the updated member * @throws GitLabApiException if any exception occurs */ - public Member updateMember(Object groupIdOrPath, Integer userId, Integer accessLevel) throws GitLabApiException { + public Member updateMember(Object groupIdOrPath, Long userId, Integer accessLevel) throws GitLabApiException { return (updateMember(groupIdOrPath, userId, accessLevel, null)); } @@ -980,7 +1084,7 @@ public Member updateMember(Object groupIdOrPath, Integer userId, Integer accessL * @return the updated member * @throws GitLabApiException if any exception occurs */ - public Member updateMember(Object groupIdOrPath, Integer userId, AccessLevel accessLevel) throws GitLabApiException { + public Member updateMember(Object groupIdOrPath, Long userId, AccessLevel accessLevel) throws GitLabApiException { return (updateMember(groupIdOrPath, userId, accessLevel.toValue(), null)); } @@ -996,7 +1100,7 @@ public Member updateMember(Object groupIdOrPath, Integer userId, AccessLevel acc * @return the updated member * @throws GitLabApiException if any exception occurs */ - public Member updateMember(Object groupIdOrPath, Integer userId, AccessLevel accessLevel, Date expiresAt) throws GitLabApiException { + public Member updateMember(Object groupIdOrPath, Long userId, AccessLevel accessLevel, Date expiresAt) throws GitLabApiException { return (updateMember(groupIdOrPath, userId, accessLevel.toValue(), expiresAt)); } @@ -1012,7 +1116,7 @@ public Member updateMember(Object groupIdOrPath, Integer userId, AccessLevel acc * @return the updated member * @throws GitLabApiException if any exception occurs */ - public Member updateMember(Object groupIdOrPath, Integer userId, Integer accessLevel, Date expiresAt) throws GitLabApiException { + public Member updateMember(Object groupIdOrPath, Long userId, Integer accessLevel, Date expiresAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("access_level", accessLevel, true) .withParam("expires_at", expiresAt, false); @@ -1029,8 +1133,8 @@ public Member updateMember(Object groupIdOrPath, Integer userId, Integer accessL * @param userId the user ID of the member to remove * @throws GitLabApiException if any exception occurs */ - public void removeMember(Object groupIdOrPath, Integer userId) throws GitLabApiException { - Response.Status expectedStatus = (isApiVersion(ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT); + public void removeMember(Object groupIdOrPath, Long userId) throws GitLabApiException { + Response.Status expectedStatus = (isApiVersion(GitLabApi.ApiVersion.V3) ? Response.Status.OK : Response.Status.NO_CONTENT); delete(expectedStatus, null, "groups", getGroupIdOrPath(groupIdOrPath), "members", userId); } @@ -1315,7 +1419,7 @@ public void deleteVariable(Object groupIdOrPath, String key) throws GitLabApiExc *
GitLab Endpoint: POST /groups/:id/projects/:project_id
* * @param groupIdOrPath the group ID, path of the group, or a Group instance holding the group ID or path, required - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @return the transferred Project instance * @throws GitLabApiException if any exception occurs during execution */ @@ -1385,7 +1489,7 @@ public Stream getAuditEventsStream(Object groupIdOrPath, Date create * @return the group Audit event * @throws GitLabApiException if any exception occurs */ - public AuditEvent getAuditEvent(Object groupIdOrPath, Integer auditEventId) throws GitLabApiException { + public AuditEvent getAuditEvent(Object groupIdOrPath, Long auditEventId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "audit_events", auditEventId); return (response.readEntity(AuditEvent.class)); } @@ -1456,7 +1560,7 @@ public AccessRequest requestAccess(Object groupIdOrPath) throws GitLabApiExcepti * @return the approved AccessRequest instance * @throws GitLabApiException if any exception occurs */ - public AccessRequest approveAccessRequest(Object groupIdOrPath, Integer userId, AccessLevel accessLevel) throws GitLabApiException { + public AccessRequest approveAccessRequest(Object groupIdOrPath, Long userId, AccessLevel accessLevel) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("access_level", accessLevel); Response response = this.putWithFormData(Response.Status.CREATED, formData, "groups", getGroupIdOrPath(groupIdOrPath), "access_requests", userId, "approve"); @@ -1472,7 +1576,7 @@ public AccessRequest approveAccessRequest(Object groupIdOrPath, Integer userId, * @param userId the user ID to deny access for * @throws GitLabApiException if any exception occurs */ - public void denyAccessRequest(Object groupIdOrPath, Integer userId) throws GitLabApiException { + public void denyAccessRequest(Object groupIdOrPath, Long userId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "groups", getGroupIdOrPath(groupIdOrPath), "access_requests", userId); } @@ -1502,7 +1606,7 @@ public List getBadges(Object groupIdOrPath) throws GitLabApiException { * @return a Badge instance for the specified group/badge ID pair * @throws GitLabApiException if any exception occurs */ - public Badge getBadge(Object groupIdOrPath, Integer badgeId) throws GitLabApiException { + public Badge getBadge(Object groupIdOrPath, Long badgeId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "badges", badgeId); return (response.readEntity(Badge.class)); } @@ -1516,7 +1620,7 @@ public Badge getBadge(Object groupIdOrPath, Integer badgeId) throws GitLabApiExc * @param badgeId the ID of the badge to get * @return an Optional instance with the specified badge as the value */ - public Optional getOptionalBadge(Object groupIdOrPath, Integer badgeId) { + public Optional getOptionalBadge(Object groupIdOrPath, Long badgeId) { try { return (Optional.ofNullable(getBadge(groupIdOrPath, badgeId))); } catch (GitLabApiException glae) { @@ -1555,7 +1659,7 @@ public Badge addBadge(Object groupIdOrPath, String linkUrl, String imageUrl) thr * @return a Badge instance for the editted badge * @throws GitLabApiException if any exception occurs */ - public Badge editBadge(Object groupIdOrPath, Integer badgeId, String linkUrl, String imageUrl) throws GitLabApiException { + public Badge editBadge(Object groupIdOrPath, Long badgeId, String linkUrl, String imageUrl) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("link_url", linkUrl, false) .withParam("image_url", imageUrl, false); @@ -1572,7 +1676,7 @@ public Badge editBadge(Object groupIdOrPath, Integer badgeId, String linkUrl, St * @param badgeId the ID of the badge to remove * @throws GitLabApiException if any exception occurs */ - public void removeBadge(Object groupIdOrPath, Integer badgeId) throws GitLabApiException { + public void removeBadge(Object groupIdOrPath, Long badgeId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "groups", getGroupIdOrPath(groupIdOrPath), "badges", badgeId); } @@ -1623,7 +1727,7 @@ public Group setGroupAvatar(Object groupIdOrPath, File avatarFile) throws GitLab * @return a Group instance holding the details of the shared group * @throws GitLabApiException if any exception occurs */ - public Group shareGroup(Object groupIdOrPath, Integer shareWithGroupId, AccessLevel groupAccess, Date expiresAt) throws GitLabApiException { + public Group shareGroup(Object groupIdOrPath, Long shareWithGroupId, AccessLevel groupAccess, Date expiresAt) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("group_id", shareWithGroupId, true) .withParam("group_access", groupAccess, true) @@ -1641,8 +1745,127 @@ public Group shareGroup(Object groupIdOrPath, Integer shareWithGroupId, AccessLe * @param sharedWithGroupId the ID of the group to unshare with, required * @throws GitLabApiException if any exception occurs */ - public void unshareGroup(Object groupIdOrPath, Integer sharedWithGroupId) throws GitLabApiException { + public void unshareGroup(Object groupIdOrPath, Long sharedWithGroupId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "groups", getGroupIdOrPath(groupIdOrPath), "share", sharedWithGroupId); } + + /** + * Get all custom attributes for the specified group. + * + *
GitLab Endpoint: GET /groups/:id/custom_attributes
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @return a list of group's CustomAttributes + * @throws GitLabApiException if any exception occurs + */ + public List getCustomAttributes(final Object groupIdOrPath) throws GitLabApiException { + return (getCustomAttributes(groupIdOrPath, getDefaultPerPage()).all()); + } + + /** + * Get a Pager of custom attributes for the specified group. + * + *
GitLab Endpoint: GET /groups/:id/custom_attributes
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @param itemsPerPage the number of items per page + * @return a Pager of group's custom attributes + * @throws GitLabApiException if any exception occurs + */ + public Pager getCustomAttributes(final Object groupIdOrPath, int itemsPerPage) throws GitLabApiException { + return (new Pager(this, CustomAttribute.class, itemsPerPage, null, + "groups", getGroupIdOrPath(groupIdOrPath), "custom_attributes")); + } + + /** + * Get a Stream of all custom attributes for the specified group. + * + *
GitLab Endpoint: GET /groups/:id/custom_attributes
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @return a Stream of group's custom attributes + * @throws GitLabApiException if any exception occurs + */ + public Stream getCustomAttributesStream(final Object groupIdOrPath) throws GitLabApiException { + return (getCustomAttributes(groupIdOrPath, getDefaultPerPage()).stream()); + } + + /** + * Get a single custom attribute for the specified group. + * + *
GitLab Endpoint: GET /groups/:id/custom_attributes/:key
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @param key the key for the custom attribute + * @return a CustomAttribute instance for the specified key + * @throws GitLabApiException if any exception occurs + */ + public CustomAttribute getCustomAttribute(final Object groupIdOrPath, final String key) throws GitLabApiException { + Response response = get(Response.Status.OK, null, + "groups", getGroupIdOrPath(groupIdOrPath), "custom_attributes", key); + return (response.readEntity(CustomAttribute.class)); + } + + /** + * Get an Optional instance with the value for a single custom attribute for the specified group. + * + *
GitLab Endpoint: GET /groups/:id/custom_attributes/:key
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance, required + * @param key the key for the custom attribute, required + * @return an Optional instance with the value for a single custom attribute for the specified group + */ + public Optional geOptionalCustomAttribute(final Object groupIdOrPath, final String key) { + try { + return (Optional.ofNullable(getCustomAttribute(groupIdOrPath, key))); + } catch (GitLabApiException glae) { + return (GitLabApi.createOptionalFromException(glae)); + } + } + + /** + * Set a custom attribute for the specified group. The attribute will be updated if it already exists, + * or newly created otherwise. + * + *
GitLab Endpoint: PUT /groups/:id/custom_attributes/:key
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @param key the key for the custom attribute + * @param value the value for the customAttribute + * @return a CustomAttribute instance for the updated or created custom attribute + * @throws GitLabApiException if any exception occurs + */ + public CustomAttribute setCustomAttribute(final Object groupIdOrPath, final String key, final String value) throws GitLabApiException { + + if (Objects.isNull(key) || key.trim().isEmpty()) { + throw new IllegalArgumentException("Key cannot be null or empty"); + } + if (Objects.isNull(value) || value.trim().isEmpty()) { + throw new IllegalArgumentException("Value cannot be null or empty"); + } + + GitLabApiForm formData = new GitLabApiForm().withParam("value", value); + Response response = putWithFormData(Response.Status.OK, formData, + "groups", getGroupIdOrPath(groupIdOrPath), "custom_attributes", key); + return (response.readEntity(CustomAttribute.class)); + } + + /** + * Delete a custom attribute for the specified group. + * + *
GitLab Endpoint: DELETE /groups/:id/custom_attributes/:key
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @param key the key of the custom attribute to delete + * @throws GitLabApiException if any exception occurs + */ + public void deleteCustomAttribute(final Object groupIdOrPath, final String key) throws GitLabApiException { + + if (Objects.isNull(key) || key.trim().isEmpty()) { + throw new IllegalArgumentException("Key can't be null or empty"); + } + + delete(Response.Status.OK, null, "groups", getGroupIdOrPath(groupIdOrPath), "custom_attributes", key); + } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HealthCheckApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HealthCheckApi.java index 8d2bd7f84d..f97fa55aa9 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HealthCheckApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HealthCheckApi.java @@ -25,10 +25,87 @@ ********************************************************************************/ package org.aoju.bus.gitlab; +import org.aoju.bus.gitlab.models.HealthCheckInfo; + +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.net.URL; + public class HealthCheckApi extends AbstractApi { public HealthCheckApi(GitLabApi gitLabApi) { super(gitLabApi); } + /** + * Get Health Checks from the liveness endpoint. + *

+ * Requires ip_whitelist, see the following link for more info: + * See https://docs.gitlab.com/ee/administration/monitoring/ip_whitelist.html + * + *

GitLab Endpoint: GET /-/liveness
+ * + * @return HealthCheckInfo instance + * @throws GitLabApiException if any exception occurs + */ + public HealthCheckInfo getLiveness() throws GitLabApiException { + return (getLiveness(null)); + } + + /** + * Get Health Checks from the liveness endpoint. + * + *
GitLab Endpoint: GET /-/liveness
+ * + * @param token Health Status token + * @return HealthCheckInfo instance + * @throws GitLabApiException if any exception occurs + * @deprecated + */ + public HealthCheckInfo getLiveness(String token) throws GitLabApiException { + try { + URL livenessUrl = getApiClient().getUrlWithBase("-", "liveness"); + GitLabApiForm formData = new GitLabApiForm().withParam("token", token, false); + Response response = get(Response.Status.OK, formData.asMap(), livenessUrl); + return (response.readEntity(HealthCheckInfo.class)); + } catch (IOException ioe) { + throw (new GitLabApiException(ioe)); + } + } + + /** + * Get Health Checks from the readiness endpoint. + *

+ * Requires ip_whitelist, see the following link for more info: + * See https://docs.gitlab.com/ee/administration/monitoring/ip_whitelist.html + * + *

GitLab Endpoint: GET /-/readiness
+ * + * @return HealthCheckInfo instance + * @throws GitLabApiException if any exception occurs + */ + public HealthCheckInfo getReadiness() throws GitLabApiException { + return (getReadiness(null)); + } + + /** + * Get Health Checks from the readiness endpoint. + * + *
GitLab Endpoint: GET /-/readiness
+ * + * @param token Health Status token + * @return HealthCheckInfo instance + * @throws GitLabApiException if any exception occurs + * @deprecated + */ + public HealthCheckInfo getReadiness(String token) throws GitLabApiException { + try { + URL readinessUrl = getApiClient().getUrlWithBase("-", "readiness"); + GitLabApiForm formData = new GitLabApiForm().withParam("token", token, false); + Response response = get(Response.Status.OK, formData.asMap(), readinessUrl); + return (response.readEntity(HealthCheckInfo.class)); + } catch (IOException ioe) { + throw (new GitLabApiException(ioe)); + } + } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HookManager.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HookManager.java index 2a35ccf1e8..157ea82000 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HookManager.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/HookManager.java @@ -25,7 +25,7 @@ ********************************************************************************/ package org.aoju.bus.gitlab; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; /** * This interface provides a base class handler for processing GitLab Web Hook and System Hook callouts. diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ImportExportApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ImportExportApi.java index a61dd1302a..b5bca2b43e 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ImportExportApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/ImportExportApi.java @@ -57,7 +57,7 @@ public ImportExportApi(GitLabApi gitLabApi) { * *
GitLab Endpoint: POST /projects/:id/export
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @throws GitLabApiException if any exception occurs */ public void scheduleExport(Object projectIdOrPath) throws GitLabApiException { @@ -69,7 +69,7 @@ public void scheduleExport(Object projectIdOrPath) throws GitLabApiException { * *
GitLab Endpoint: POST /projects/:id/export
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param description overrides the project description, optional * @throws GitLabApiException if any exception occurs */ @@ -82,7 +82,7 @@ public void scheduleExport(Object projectIdOrPath, String description) throws Gi * *
GitLab Endpoint: POST /projects/:id/export
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param description overrides the project description, optional * @param upload Mao that contains the information to upload the exported project to a web server * @param uploadUrl the URL to upload the project @@ -106,7 +106,7 @@ public void scheduleExport(Object projectIdOrPath, String description, * *
GitLab Endpoint: GET /projects/:id/export
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return an ExportStatus instance holding information on the export status * @throws GitLabApiException if any exception occurs */ @@ -120,7 +120,7 @@ public ExportStatus getExportStatus(Object projectIdOrPath) throws GitLabApiExce * *
GitLab Endpoint: GET /projects/:id/export/download
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param directory the File instance of the directory to save the export file to, if null will use "java.io.tmpdir" * @return a File instance pointing to the download of the project export file * @throws GitLabApiException if any exception occurs @@ -134,7 +134,7 @@ public File downloadExport(Object projectIdOrPath, File directory) throws GitLab * *
GitLab Endpoint: GET /projects/:id/export/download
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param directory the File instance of the directory to save the export file to, if null will use "java.io.tmpdir" * @param filename Name to give to the downloaded file. If null then we try to get from Content-Disposition header * or to compute one from parameters @@ -276,7 +276,7 @@ public ImportStatus startImport(Object namespaceIdOrPath, File exportFile, Strin * *
GitLab Endpoint: GET /projects/:id/import
* - * @param projectIdOrPath the new (imported) project identifier in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the new (imported) project identifier in the form of an Long(ID), String(path), or Project instance * @return an ImportStatus instance holding information on the import status * @throws GitLabApiException if any exception occurs */ diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/IssuesApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/IssuesApi.java index 958666f608..f3cb4a7df1 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/IssuesApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/IssuesApi.java @@ -44,10 +44,106 @@ */ public class IssuesApi extends AbstractApi implements Constants { + private static final int[] TIME_UNIT_MULTIPLIERS = { + 60 * 60 * 8 * 5 * 4, // 4 weeks = 1 month + 60 * 60 * 8 * 5, // 5 days = 1 week + 60 * 60 * 8, // 8 hours = 1 day + 60 * 60, // 60 minutes = 1 hours + 60, // 60 seconds = 1 minute + 1 + }; + public IssuesApi(GitLabApi gitLabApi) { super(gitLabApi); } + /** + * Create a human readable duration string from seconds. + * + * @param durationSeconds the total number of seconds in the duration + * @param includeMonths when true will include months "mo", in the string otherwise + * uses "4w" for each month + * @return a human readable string representing the duration + */ + public static final String toString(int durationSeconds, boolean includeMonths) { + + int seconds = durationSeconds; + int months = (includeMonths ? seconds / TIME_UNIT_MULTIPLIERS[0] : 0); + seconds -= months * TIME_UNIT_MULTIPLIERS[0]; + int weeks = seconds / TIME_UNIT_MULTIPLIERS[1]; + seconds -= weeks * TIME_UNIT_MULTIPLIERS[1]; + int days = seconds / TIME_UNIT_MULTIPLIERS[2]; + seconds -= days * TIME_UNIT_MULTIPLIERS[2]; + int hours = seconds / 3600; + seconds -= hours * 3600; + int minutes = seconds / 60; + seconds -= minutes * 60; + + StringBuilder buf = new StringBuilder(); + if (months > 0) { + + buf.append(months).append("mo"); + if (weeks > 0) { + buf.append(weeks).append('w'); + } + + if (seconds > 0) { + buf.append(days).append('d').append(hours).append('h').append(minutes).append('m').append(seconds).append('s'); + } else if (minutes > 0) { + buf.append(days).append('d').append(hours).append('h').append(minutes).append('m'); + } else if (hours > 0) { + buf.append(days).append('d').append(hours).append('h'); + } else if (days > 0) { + buf.append(days).append('d'); + } + + } else if (weeks > 0) { + + buf.append(weeks).append('w'); + if (seconds > 0) { + buf.append(days).append('d').append(hours).append('h').append(minutes).append('m').append(seconds).append('s'); + } else if (minutes > 0) { + buf.append(days).append('d').append(hours).append('h').append(minutes).append('m'); + } else if (hours > 0) { + buf.append(days).append('d').append(hours).append('h'); + } else if (days > 0) { + buf.append(days).append('d'); + } + + } else if (days > 0) { + + buf.append(days).append('d'); + if (seconds > 0) { + buf.append(hours).append('h').append(minutes).append('m').append(seconds).append('s'); + } else if (minutes > 0) { + buf.append(hours).append('h').append(minutes).append('m'); + } else if (hours > 0) { + buf.append(hours).append('h'); + } + + } else if (hours > 0) { + + buf.append(hours).append('h'); + if (seconds > 0) { + buf.append(minutes).append('m').append(seconds).append('s'); + } else if (minutes > 0) { + buf.append(minutes).append('m'); + } + + } else if (minutes > 0) { + + buf.append(minutes).append('m'); + if (seconds > 0) { + buf.append(seconds).append('s'); + } + + } else { + buf.append(' ').append(seconds).append('s'); + } + + return (buf.toString()); + } + /** * Get all issues the authenticated user has access to. Only returns issues created by the current user. * @@ -107,7 +203,7 @@ public Stream getIssuesStream() throws GitLabApiException { * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of project's issues * @throws GitLabApiException if any exception occurs */ @@ -120,7 +216,7 @@ public List getIssues(Object projectIdOrPath) throws GitLabApiException { * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param page the page to get * @param perPage the number of issues per page * @return the list of issues in the specified range @@ -137,7 +233,7 @@ public List getIssues(Object projectIdOrPath, int page, int perPage) thro * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param itemsPerPage the number of issues per page * @return the Pager of issues in the specified range * @throws GitLabApiException if any exception occurs @@ -151,7 +247,7 @@ public Pager getIssues(Object projectIdOrPath, int itemsPerPage) throws G * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a Stream of project's issues * @throws GitLabApiException if any exception occurs */ @@ -164,7 +260,7 @@ public Stream getIssuesStream(Object projectIdOrPath) throws GitLabApiExc * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings * @return the list of issues in the specified range. * @throws GitLabApiException if any exception occurs @@ -178,7 +274,7 @@ public List getIssues(Object projectIdOrPath, IssueFilter filter) throws * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings. * @param page the page to get. * @param perPage the number of projects per page. @@ -197,7 +293,7 @@ public List getIssues(Object projectIdOrPath, IssueFilter filter, int pag * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings. * @param itemsPerPage the number of Project instances that will be fetched per page. * @return the Pager of issues in the specified range. @@ -213,7 +309,7 @@ public Pager getIssues(Object projectIdOrPath, IssueFilter filter, int it * *
GitLab Endpoint: GET /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings * @return a Stream of issues in the specified range. * @throws GitLabApiException if any exception occurs @@ -290,7 +386,7 @@ public Stream getIssuesStream(IssueFilter filter) throws GitLabApiExcepti * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @return a List of issues for the specified group * @throws GitLabApiException if any exception occurs */ @@ -303,7 +399,7 @@ public List getGroupIssues(Object groupIdOrPath) throws GitLabApiExceptio * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param itemsPerPage the number of Issue instances that will be fetched per page. * @return the Pager of issues for the specified group * @throws GitLabApiException if any exception occurs @@ -317,7 +413,7 @@ public Pager getGroupIssues(Object groupIdOrPath, int itemsPerPage) throw * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @return a Stream of issues for the specified group and filter * @throws GitLabApiException if any exception occurs */ @@ -330,7 +426,7 @@ public Stream getGroupIssuesStream(Object groupIdOrPath) throws GitLabApi * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings. * @return a List of issues for the specified group and filter * @throws GitLabApiException if any exception occurs @@ -344,7 +440,7 @@ public List getGroupIssues(Object groupIdOrPath, IssueFilter filter) thro * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings. * @param itemsPerPage the number of Issue instances that will be fetched per page. * @return the Pager of issues for the specified group and filter @@ -361,7 +457,7 @@ public Pager getGroupIssues(Object groupIdOrPath, IssueFilter filter, int * *
GitLab Endpoint: GET /groups/:id/issues
* - * @param groupIdOrPath the group in the form of an Integer(ID), String(path), or Group instance + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance * @param filter {@link IssueFilter} a IssueFilter instance with the filter settings. * @return a Stream of issues for the specified group and filter * @throws GitLabApiException if any exception occurs @@ -375,12 +471,12 @@ public Stream getGroupIssuesStream(Object groupIdOrPath, IssueFilter filt * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return the specified Issue instance * @throws GitLabApiException if any exception occurs */ - public Issue getIssue(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Issue getIssue(Object projectIdOrPath, Long issueIid) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid); return (response.readEntity(Issue.class)); @@ -391,11 +487,11 @@ public Issue getIssue(Object projectIdOrPath, Integer issueIid) throws GitLabApi * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return the specified Issue as an Optional instance */ - public Optional getOptionalIssue(Object projectIdOrPath, Integer issueIid) { + public Optional getOptionalIssue(Object projectIdOrPath, Long issueIid) { try { return (Optional.ofNullable(getIssue(projectIdOrPath, issueIid))); } catch (GitLabApiException glae) { @@ -408,7 +504,7 @@ public Optional getOptionalIssue(Object projectIdOrPath, Integer issueIid * *
GitLab Endpoint: POST /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param title the title of an issue, required * @param description the description of an issue, optional * @return an instance of Issue @@ -423,7 +519,7 @@ public Issue createIssue(Object projectIdOrPath, String title, String descriptio * *
GitLab Endpoint: POST /projects/:id/issues
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param title the issue title of an issue, required * @param description the description of an issue, optional * @param confidential set the issue to be confidential, default is false, optional @@ -439,8 +535,8 @@ public Issue createIssue(Object projectIdOrPath, String title, String descriptio * @return an instance of Issue * @throws GitLabApiException if any exception occurs */ - public Issue createIssue(Object projectIdOrPath, String title, String description, Boolean confidential, List assigneeIds, Integer milestoneId, String labels, - Date createdAt, Date dueDate, Integer mergeRequestToResolveId, Integer discussionToResolveId) throws GitLabApiException { + public Issue createIssue(Object projectIdOrPath, String title, String description, Boolean confidential, List assigneeIds, Long milestoneId, String labels, + Date createdAt, Date dueDate, Long mergeRequestToResolveId, Long discussionToResolveId) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("title", title, true) @@ -462,12 +558,12 @@ public Issue createIssue(Object projectIdOrPath, String title, String descriptio * *
GitLab Endpoint: PUT /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the issue IID to update, required * @return an instance of the updated Issue * @throws GitLabApiException if any exception occurs */ - public Issue closeIssue(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Issue closeIssue(Object projectIdOrPath, Long issueIid) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -483,7 +579,7 @@ public Issue closeIssue(Object projectIdOrPath, Integer issueIid) throws GitLabA * *
GitLab Endpoint: PUT /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the issue IID to update, required * @param title the title of an issue, optional * @param description the description of an issue, optional @@ -497,8 +593,8 @@ public Issue closeIssue(Object projectIdOrPath, Integer issueIid) throws GitLabA * @return an instance of the updated Issue * @throws GitLabApiException if any exception occurs */ - public Issue updateIssue(Object projectIdOrPath, Integer issueIid, String title, String description, Boolean confidential, List assigneeIds, - Integer milestoneId, String labels, StateEvent stateEvent, Date updatedAt, Date dueDate) throws GitLabApiException { + public Issue updateIssue(Object projectIdOrPath, Long issueIid, String title, String description, Boolean confidential, List assigneeIds, + Long milestoneId, String labels, StateEvent stateEvent, Date updatedAt, Date dueDate) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -523,13 +619,13 @@ public Issue updateIssue(Object projectIdOrPath, Integer issueIid, String title, * *
GitLab Endpoint: PUT /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the issue IID to update, required * @param assigneeId the ID of the user to assign issue to, required * @return an instance of the updated Issue * @throws GitLabApiException if any exception occurs */ - public Issue assignIssue(Object projectIdOrPath, Integer issueIid, Integer assigneeId) throws GitLabApiException { + public Issue assignIssue(Object projectIdOrPath, Long issueIid, Long assigneeId) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -545,11 +641,11 @@ public Issue assignIssue(Object projectIdOrPath, Integer issueIid, Integer assig * *
GitLab Endpoint: DELETE /projects/:id/issues/:issue_iid
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the internal ID of a project's issue * @throws GitLabApiException if any exception occurs */ - public void deleteIssue(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public void deleteIssue(Object projectIdOrPath, Long issueIid) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -564,13 +660,13 @@ public void deleteIssue(Object projectIdOrPath, Integer issueIid) throws GitLabA * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/time_estimate
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the internal ID of a project's issue * @param duration estimated time in seconds * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, int duration) throws GitLabApiException { + public TimeStats estimateTime(Object projectIdOrPath, Long issueIid, int duration) throws GitLabApiException { return (estimateTime(projectIdOrPath, issueIid, new Duration(duration))); } @@ -579,13 +675,13 @@ public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, int dura * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/time_estimate
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the internal ID of a project's issue * @param duration Human readable format, e.g. 3h30m * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, String duration) throws GitLabApiException { + public TimeStats estimateTime(Object projectIdOrPath, Long issueIid, String duration) throws GitLabApiException { return (estimateTime(projectIdOrPath, issueIid, new Duration(duration))); } @@ -594,19 +690,19 @@ public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, String d * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/time_estimate
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @param duration set the estimate of time to this duration * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, Duration duration) throws GitLabApiException { + public TimeStats estimateTime(Object projectIdOrPath, Long issueIid, Duration duration) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); } - String durationString = (duration != null ? Duration.toString(duration.getSeconds(), false) : null); + String durationString = (duration != null ? toString(duration.getSeconds(), false) : null); GitLabApiForm formData = new GitLabApiForm().withParam("duration", durationString, true); Response response = post(Response.Status.OK, formData.asMap(), @@ -619,12 +715,12 @@ public TimeStats estimateTime(Object projectIdOrPath, Integer issueIid, Duration * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/reset_time_estimate
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats resetEstimatedTime(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public TimeStats resetEstimatedTime(Object projectIdOrPath, Long issueIid) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -640,13 +736,13 @@ public TimeStats resetEstimatedTime(Object projectIdOrPath, Integer issueIid) th * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/add_spent_time
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @param duration the duration in seconds * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, int duration) throws GitLabApiException { + public TimeStats addSpentTime(Object projectIdOrPath, Long issueIid, int duration) throws GitLabApiException { return (addSpentTime(projectIdOrPath, issueIid, new Duration(duration))); } @@ -655,13 +751,13 @@ public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, int dura * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/add_spent_time
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @param duration Human readable format, e.g. 3h30m * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, String duration) throws GitLabApiException { + public TimeStats addSpentTime(Object projectIdOrPath, Long issueIid, String duration) throws GitLabApiException { return (addSpentTime(projectIdOrPath, issueIid, new Duration(duration))); } @@ -670,19 +766,19 @@ public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, String d * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/add_spent_time
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @param duration the duration of time spent * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, Duration duration) throws GitLabApiException { + public TimeStats addSpentTime(Object projectIdOrPath, Long issueIid, Duration duration) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); } - String durationString = (duration != null ? Duration.toString(duration.getSeconds(), false) : null); + String durationString = (duration != null ? toString(duration.getSeconds(), false) : null); GitLabApiForm formData = new GitLabApiForm().withParam("duration", durationString, true); Response response = post(Response.Status.CREATED, formData.asMap(), @@ -695,12 +791,12 @@ public TimeStats addSpentTime(Object projectIdOrPath, Integer issueIid, Duration * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/reset_spent_time
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a TimeSTats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats resetSpentTime(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public TimeStats resetSpentTime(Object projectIdOrPath, Long issueIid) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -716,12 +812,12 @@ public TimeStats resetSpentTime(Object projectIdOrPath, Integer issueIid) throws * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/time_stats
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a TimeStats instance * @throws GitLabApiException if any exception occurs */ - public TimeStats getTimeTrackingStats(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public TimeStats getTimeTrackingStats(Object projectIdOrPath, Long issueIid) throws GitLabApiException { if (issueIid == null) { throw new RuntimeException("issue IID cannot be null"); @@ -737,11 +833,11 @@ public TimeStats getTimeTrackingStats(Object projectIdOrPath, Integer issueIid) * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/time_stats
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a TimeStats as an Optional instance */ - public Optional getOptionalTimeTrackingStats(Object projectIdOrPath, Integer issueIid) { + public Optional getOptionalTimeTrackingStats(Object projectIdOrPath, Long issueIid) { try { return (Optional.ofNullable(getTimeTrackingStats(projectIdOrPath, issueIid))); } catch (GitLabApiException glae) { @@ -759,7 +855,7 @@ public Optional getOptionalTimeTrackingStats(Object projectIdOrPath, * @return a List containing all the merge requests what will close the issue when merged. * @throws GitLabApiException if any exception occurs */ - public List getClosedByMergeRequests(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public List getClosedByMergeRequests(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getClosedByMergeRequests(projectIdOrPath, issueIid, getDefaultPerPage()).all()); } @@ -775,7 +871,7 @@ public List getClosedByMergeRequests(Object projectIdOrPath, Integ * @return a List containing all the merge requests what will close the issue when merged. * @throws GitLabApiException if any exception occurs */ - public List getClosedByMergeRequests(Object projectIdOrPath, Integer issueIid, int page, int perPage) throws GitLabApiException { + public List getClosedByMergeRequests(Object projectIdOrPath, Long issueIid, int page, int perPage) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(page, perPage), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "closed_by"); return (response.readEntity(new GenericType>() { @@ -793,7 +889,7 @@ public List getClosedByMergeRequests(Object projectIdOrPath, Integ * @return a Pager containing all the issues that would be closed by merging the provided merge request * @throws GitLabApiException if any exception occurs */ - public Pager getClosedByMergeRequests(Object projectIdOrPath, Integer issueIid, int itemsPerPage) throws GitLabApiException { + public Pager getClosedByMergeRequests(Object projectIdOrPath, Long issueIid, int itemsPerPage) throws GitLabApiException { return new Pager(this, MergeRequest.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "closed_by"); } @@ -808,7 +904,7 @@ public Pager getClosedByMergeRequests(Object projectIdOrPath, Inte * @return a List containing all the merge requests what will close the issue when merged. * @throws GitLabApiException if any exception occurs */ - public Stream getClosedByMergeRequestsStream(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Stream getClosedByMergeRequestsStream(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getClosedByMergeRequests(projectIdOrPath, issueIid, getDefaultPerPage()).stream()); } @@ -820,12 +916,12 @@ public Stream getClosedByMergeRequestsStream(Object projectIdOrPat * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/links
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a list of related issues of a given issue, sorted by the relationship creation datetime (ascending) * @throws GitLabApiException if any exception occurs */ - public List getIssueLinks(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public List getIssueLinks(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getIssueLinks(projectIdOrPath, issueIid, getDefaultPerPage()).all()); } @@ -837,13 +933,13 @@ public List getIssueLinks(Object projectIdOrPath, Integer issueIid) throw * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/links
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @param itemsPerPage the number of issues per page * @return a Pager of related issues of a given issue, sorted by the relationship creation datetime (ascending) * @throws GitLabApiException if any exception occurs */ - public Pager getIssueLinks(Object projectIdOrPath, Integer issueIid, int itemsPerPage) throws GitLabApiException { + public Pager getIssueLinks(Object projectIdOrPath, Long issueIid, int itemsPerPage) throws GitLabApiException { return (new Pager(this, Issue.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "links")); } @@ -856,12 +952,12 @@ public Pager getIssueLinks(Object projectIdOrPath, Integer issueIid, int * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/links
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue * @return a Stream of related issues of a given issue, sorted by the relationship creation datetime (ascending) * @throws GitLabApiException if any exception occurs */ - public Stream getIssueLinksStream(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Stream getIssueLinksStream(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getIssueLinks(projectIdOrPath, issueIid, getDefaultPerPage()).stream()); } @@ -872,15 +968,15 @@ public Stream getIssueLinksStream(Object projectIdOrPath, Integer issueIi * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/links
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue - * @param targetProjectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance of the target project + * @param targetProjectIdOrPath the project in the form of an Long(ID), String(path), or Project instance of the target project * @param targetIssueIid the internal ID of a target project’s issue * @return an instance of IssueLink holding the link relationship * @throws GitLabApiException if any exception occurs */ - public IssueLink createIssueLink(Object projectIdOrPath, Integer issueIid, - Object targetProjectIdOrPath, Integer targetIssueIid) throws GitLabApiException { + public IssueLink createIssueLink(Object projectIdOrPath, Long issueIid, + Object targetProjectIdOrPath, Long targetIssueIid) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("target_project_id", getProjectIdOrPath(targetProjectIdOrPath), true) @@ -898,13 +994,13 @@ public IssueLink createIssueLink(Object projectIdOrPath, Integer issueIid, * *
GitLab Endpoint: POST /projects/:id/issues/:issue_iid/links/:issue_link_id
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the internal ID of a project's issue, required * @param issueLinkId the ID of an issue relationship, required * @return an instance of IssueLink holding the deleted link relationship * @throws GitLabApiException if any exception occurs */ - public IssueLink deleteIssueLink(Object projectIdOrPath, Integer issueIid, Integer issueLinkId) throws GitLabApiException { + public IssueLink deleteIssueLink(Object projectIdOrPath, Long issueIid, Long issueLinkId) throws GitLabApiException { Response response = delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "links", issueLinkId); return (response.readEntity(IssueLink.class)); @@ -915,12 +1011,12 @@ public IssueLink deleteIssueLink(Object projectIdOrPath, Integer issueIid, Integ * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/participants
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the IID of the issue to get the participants for * @return a List containing all participants for the specified issue * @throws GitLabApiException if any exception occurs */ - public List getParticipants(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public List getParticipants(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getParticipants(projectIdOrPath, issueIid, getDefaultPerPage()).all()); } @@ -929,14 +1025,14 @@ public List getParticipants(Object projectIdOrPath, Integer issueIi * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/participants
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the IID of the issue to get the participants for * @param page the page to get * @param perPage the number of projects per page * @return a List containing all participants for the specified issue * @throws GitLabApiException if any exception occurs */ - public List getParticipants(Object projectIdOrPath, Integer issueIid, int page, int perPage) throws GitLabApiException { + public List getParticipants(Object projectIdOrPath, Long issueIid, int page, int perPage) throws GitLabApiException { Response response = get(Response.Status.OK, getPageQueryParams(page, perPage), "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "participants"); return (response.readEntity(new GenericType>() { @@ -948,13 +1044,13 @@ public List getParticipants(Object projectIdOrPath, Integer issueIi * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/participants
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the IID of the issue to get the participants for * @param itemsPerPage the number of Participant instances that will be fetched per page * @return a Pager containing all participants for the specified issue * @throws GitLabApiException if any exception occurs */ - public Pager getParticipants(Object projectIdOrPath, Integer issueIid, int itemsPerPage) throws GitLabApiException { + public Pager getParticipants(Object projectIdOrPath, Long issueIid, int itemsPerPage) throws GitLabApiException { return new Pager(this, Participant.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "participants"); } @@ -964,12 +1060,12 @@ public Pager getParticipants(Object projectIdOrPath, Integer issueI * *
GitLab Endpoint: GET /projects/:id/issues/:issue_iid/participants
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @param issueIid the IID of the issue to get the participants for * @return a Stream containing all participants for the specified issue * @throws GitLabApiException if any exception occurs */ - public Stream getParticipantsStream(Object projectIdOrPath, Integer issueIid) throws GitLabApiException { + public Stream getParticipantsStream(Object projectIdOrPath, Long issueIid) throws GitLabApiException { return (getParticipants(projectIdOrPath, issueIid, getDefaultPerPage()).stream()); } @@ -1010,7 +1106,7 @@ public IssuesStatistics getGroupIssuesStatistics(Object groupIdOrPath, IssuesSta * *
GitLab Endpoint: GET /projects/:projectId/issues_statistics
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param filter {@link IssuesStatisticsFilter} a IssuesStatisticsFilter instance with the filter settings. * @return an IssuesStatistics instance with the statistics for the matched issues * @throws GitLabApiException if any exception occurs @@ -1031,16 +1127,17 @@ public IssuesStatistics geProjectIssuesStatistics(Object projectIdOrPath, Issues * *
GitLab Endpoint: POST /projects/:projectId/issues/:issue_iid/move
* - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance, required * @param issueIid the IID of the issue to move * @param toProjectId the ID of the project to move the issue to * @return an Issue instance for the moved issue * @throws GitLabApiException if any exception occurs */ - public Issue moveIssue(Object projectIdOrPath, Integer issueIid, Object toProjectId) throws GitLabApiException { + public Issue moveIssue(Object projectIdOrPath, Long issueIid, Object toProjectId) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm().withParam("to_project_id", toProjectId, true); Response response = post(Response.Status.OK, formData, "projects", this.getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "move"); return (response.readEntity(Issue.class)); } + } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/JobApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/JobApi.java index 4d4cb91086..25e968fda2 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/JobApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/JobApi.java @@ -164,7 +164,7 @@ public Stream getJobsStream(Object projectIdOrPath, JobScope scope) throws * @return a list containing the jobs for the specified project ID and pipeline ID * @throws GitLabApiException if any exception occurs during execution */ - public List getJobsForPipeline(Object projectIdOrPath, int pipelineId) throws GitLabApiException { + public List getJobsForPipeline(Object projectIdOrPath, long pipelineId) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs"); return (response.readEntity(new GenericType>() { @@ -172,50 +172,50 @@ public List getJobsForPipeline(Object projectIdOrPath, int pipelineId) thro } /** - * Get a Pager of jobs in a pipeline. + * Get a list of jobs in a pipeline. * *
GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
* * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for * @param pipelineId the pipeline ID to get the list of jobs for - * @param itemsPerPage the number of Job instances that will be fetched per page + * @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL * @return a list containing the jobs for the specified project ID and pipeline ID * @throws GitLabApiException if any exception occurs during execution */ - public Pager getJobsForPipeline(Object projectIdOrPath, int pipelineId, int itemsPerPage) throws GitLabApiException { - return (new Pager(this, Job.class, itemsPerPage, getDefaultPerPageParam(), - "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs")); + public List getJobsForPipeline(Object projectIdOrPath, long pipelineId, JobScope scope) throws GitLabApiException { + GitLabApiForm formData = new GitLabApiForm().withParam("scope", scope).withParam(PER_PAGE_PARAM, getDefaultPerPage()); + Response response = get(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs"); + return (response.readEntity(new GenericType>() { + })); } /** - * Get a Stream of jobs in a pipeline. + * Get a Pager of jobs in a pipeline. + * *
GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
* - * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for * @param pipelineId the pipeline ID to get the list of jobs for - * @return a Stream containing the jobs for the specified project ID + * @param itemsPerPage the number of Job instances that will be fetched per page + * @return a list containing the jobs for the specified project ID and pipeline ID * @throws GitLabApiException if any exception occurs during execution */ - public Stream getJobsStream(Object projectIdOrPath, int pipelineId) throws GitLabApiException { - return (getJobsForPipeline(projectIdOrPath, pipelineId, getDefaultPerPage()).stream()); + public Pager getJobsForPipeline(Object projectIdOrPath, long pipelineId, int itemsPerPage) throws GitLabApiException { + return (new Pager(this, Job.class, itemsPerPage, getDefaultPerPageParam(), + "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs")); } /** - * Get a list of jobs in a pipeline. - * + * Get a Stream of jobs in a pipeline. *
GitLab Endpoint: GET /projects/:id/pipelines/:pipeline_id/jobs
* - * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path to get the pipelines for + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path * @param pipelineId the pipeline ID to get the list of jobs for - * @param scope the scope of jobs, one of: CREATED, PENDING, RUNNING, FAILED, SUCCESS, CANCELED, SKIPPED, MANUAL - * @return a list containing the jobs for the specified project ID and pipeline ID + * @return a Stream containing the jobs for the specified project ID * @throws GitLabApiException if any exception occurs during execution */ - public List getJobsForPipeline(Object projectIdOrPath, int pipelineId, JobScope scope) throws GitLabApiException { - GitLabApiForm formData = new GitLabApiForm().withParam("scope", scope).withParam(PER_PAGE_PARAM, getDefaultPerPage()); - Response response = get(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "pipelines", pipelineId, "jobs"); - return (response.readEntity(new GenericType>() { - })); + public Stream getJobsStream(Object projectIdOrPath, long pipelineId) throws GitLabApiException { + return (getJobsForPipeline(projectIdOrPath, pipelineId, getDefaultPerPage()).stream()); } /** @@ -228,7 +228,7 @@ public List getJobsForPipeline(Object projectIdOrPath, int pipelineId, JobS * @return a single job for the specified project ID * @throws GitLabApiException if any exception occurs during execution */ - public Job getJob(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job getJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId); return (response.readEntity(Job.class)); } @@ -242,7 +242,7 @@ public Job getJob(Object projectIdOrPath, Integer jobId) throws GitLabApiExcepti * @param jobId the job ID to get * @return a single job for the specified project ID as an Optional intance */ - public Optional getOptionalJob(Object projectIdOrPath, Integer jobId) { + public Optional getOptionalJob(Object projectIdOrPath, Long jobId) { try { return (Optional.ofNullable(getJob(projectIdOrPath, jobId))); } catch (GitLabApiException glae) { @@ -320,7 +320,7 @@ public InputStream downloadArtifactsFile(Object projectIdOrPath, String ref, Str * @return a File instance pointing to the download of the specified job artifacts file * @throws GitLabApiException if any exception occurs */ - public File downloadArtifactsFile(Object projectIdOrPath, Integer jobId, File directory) throws GitLabApiException { + public File downloadArtifactsFile(Object projectIdOrPath, Long jobId, File directory) throws GitLabApiException { Response response = getWithAccepts(Response.Status.OK, null, MediaType.MEDIA_TYPE_WILDCARD, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts"); @@ -351,7 +351,7 @@ public File downloadArtifactsFile(Object projectIdOrPath, Integer jobId, File di * @return an InputStream to read the specified job artifacts file * @throws GitLabApiException if any exception occurs */ - public InputStream downloadArtifactsFile(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public InputStream downloadArtifactsFile(Object projectIdOrPath, Long jobId) throws GitLabApiException { Response response = getWithAccepts(Response.Status.OK, null, MediaType.MEDIA_TYPE_WILDCARD, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts"); return (response.readEntity(InputStream.class)); @@ -371,7 +371,7 @@ public InputStream downloadArtifactsFile(Object projectIdOrPath, Integer jobId) * @return a File instance pointing to the download of the specified artifacts file * @throws GitLabApiException if any exception occurs */ - public File downloadArtifactsFile(Object projectIdOrPath, Integer jobId, ArtifactsFile artifactsFile, File directory) throws GitLabApiException { + public File downloadArtifactsFile(Object projectIdOrPath, Long jobId, ArtifactsFile artifactsFile, File directory) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", artifactsFile.getFilename()); @@ -405,7 +405,7 @@ public File downloadArtifactsFile(Object projectIdOrPath, Integer jobId, Artifac * @return an InputStream to read the specified artifacts file from * @throws GitLabApiException if any exception occurs */ - public InputStream downloadArtifactsFile(Object projectIdOrPath, Integer jobId, ArtifactsFile artifactsFile) throws GitLabApiException { + public InputStream downloadArtifactsFile(Object projectIdOrPath, Long jobId, ArtifactsFile artifactsFile) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", artifactsFile.getFilename()); return (response.readEntity(InputStream.class)); @@ -425,7 +425,7 @@ public InputStream downloadArtifactsFile(Object projectIdOrPath, Integer jobId, * @return a File instance pointing to the download of the specified artifacts file * @throws GitLabApiException if any exception occurs */ - public File downloadSingleArtifactsFile(Object projectIdOrPath, Integer jobId, Path artifactPath, File directory) throws GitLabApiException { + public File downloadSingleArtifactsFile(Object projectIdOrPath, Long jobId, Path artifactPath, File directory) throws GitLabApiException { String path = artifactPath.toString().replace("\\", "/"); Response response = get(Response.Status.OK, getDefaultPerPageParam(), @@ -460,7 +460,7 @@ public File downloadSingleArtifactsFile(Object projectIdOrPath, Integer jobId, P * @return an InputStream to read the specified artifacts file from * @throws GitLabApiException if any exception occurs */ - public InputStream downloadSingleArtifactsFile(Object projectIdOrPath, Integer jobId, Path artifactPath) throws GitLabApiException { + public InputStream downloadSingleArtifactsFile(Object projectIdOrPath, Long jobId, Path artifactPath) throws GitLabApiException { String path = artifactPath.toString().replace("\\", "/"); Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts", path); @@ -478,12 +478,28 @@ public InputStream downloadSingleArtifactsFile(Object projectIdOrPath, Integer j * @return a String containing the specified job's trace * @throws GitLabApiException if any exception occurs during execution */ - public String getTrace(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public String getTrace(Object projectIdOrPath, Long jobId) throws GitLabApiException { Response response = get(Response.Status.OK, getDefaultPerPageParam(), "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "trace"); return (response.readEntity(String.class)); } + /** + * Cancel specified job in a project. + * + *
GitLab Endpoint: POST /projects/:id/jobs/:job_id/cancel
+ * + * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path + * @param jobId the ID to cancel job + * @return job instance which just canceled + * @throws GitLabApiException if any exception occurs during execution + * @deprecated replaced by {@link #cancelJob(Object, Long)} + */ + @Deprecated + public Job cancleJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { + return (cancelJob(projectIdOrPath, jobId)); + } + /** * Cancel specified job in a project. * @@ -494,7 +510,7 @@ public String getTrace(Object projectIdOrPath, Integer jobId) throws GitLabApiEx * @return job instance which just canceled * @throws GitLabApiException if any exception occurs during execution */ - public Job cancelJob(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job cancelJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { GitLabApiForm formData = null; Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "cancel"); return (response.readEntity(Job.class)); @@ -510,7 +526,7 @@ public Job cancelJob(Object projectIdOrPath, Integer jobId) throws GitLabApiExce * @return job instance which just retried * @throws GitLabApiException if any exception occurs during execution */ - public Job retryJob(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job retryJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { GitLabApiForm formData = null; Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "retry"); return (response.readEntity(Job.class)); @@ -526,7 +542,7 @@ public Job retryJob(Object projectIdOrPath, Integer jobId) throws GitLabApiExcep * @return job instance which just erased * @throws GitLabApiException if any exception occurs during execution */ - public Job eraseJob(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job eraseJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { GitLabApiForm formData = null; Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "erase"); return (response.readEntity(Job.class)); @@ -542,7 +558,7 @@ public Job eraseJob(Object projectIdOrPath, Integer jobId) throws GitLabApiExcep * @return job instance which just played * @throws GitLabApiException if any exception occurs during execution */ - public Job playJob(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job playJob(Object projectIdOrPath, Long jobId) throws GitLabApiException { GitLabApiForm formData = null; Response response = post(Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "play"); return (response.readEntity(Job.class)); @@ -558,7 +574,7 @@ public Job playJob(Object projectIdOrPath, Integer jobId) throws GitLabApiExcept * @return the Job instance that was just modified * @throws GitLabApiException if any exception occurs during execution */ - public Job keepArtifacts(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public Job keepArtifacts(Object projectIdOrPath, Long jobId) throws GitLabApiException { GitLabApiForm formData = null; Response response = post(Status.OK, formData, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "keep"); return (response.readEntity(Job.class)); @@ -573,7 +589,7 @@ public Job keepArtifacts(Object projectIdOrPath, Integer jobId) throws GitLabApi * @param jobId the ID to delete artifacts for * @throws GitLabApiException if any exception occurs during execution */ - public void deleteArtifacts(Object projectIdOrPath, Integer jobId) throws GitLabApiException { + public void deleteArtifacts(Object projectIdOrPath, Long jobId) throws GitLabApiException { delete(Status.NO_CONTENT, null, "projects", getProjectIdOrPath(projectIdOrPath), "jobs", jobId, "artifacts"); } } diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/KeysApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/KeysApi.java new file mode 100644 index 0000000000..4a91c736f9 --- /dev/null +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/KeysApi.java @@ -0,0 +1,55 @@ +/********************************************************************************* + * * + * The MIT License (MIT) * + * * + * Copyright (c) 2015-2022 aoju.org Greg Messner and other contributors. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * + * THE SOFTWARE. * + * * + ********************************************************************************/ +package org.aoju.bus.gitlab; + +import org.aoju.bus.gitlab.models.Key; + +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import java.util.Collections; + +/** + * See: + * https://docs.gitlab.com/ee/api/keys.html#get-user-by-fingerprint-of-ssh-key + */ +public class KeysApi extends AbstractApi { + public KeysApi(GitLabApi gitLabApi) { + super(gitLabApi); + } + + /** + * @param fingerprint The md5 hash of a ssh public key with : separating the bytes Or SHA256:$base64hash + * @return The Key which includes the user who owns the key + * @throws GitLabApiException If anything goes wrong + */ + public Key getUserBySSHKeyFingerprint(String fingerprint) throws GitLabApiException { + MultivaluedMap queryParams = new MultivaluedHashMap<>(); + queryParams.put("fingerprint", Collections.singletonList(fingerprint)); + Response response = get(Response.Status.OK, queryParams, "keys"); + return response.readEntity(Key.class); + } +} diff --git a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/LabelsApi.java b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/LabelsApi.java index c8a2b87ffd..cbbd1f7158 100644 --- a/bus-gitlab/src/main/java/org/aoju/bus/gitlab/LabelsApi.java +++ b/bus-gitlab/src/main/java/org/aoju/bus/gitlab/LabelsApi.java @@ -27,6 +27,7 @@ import org.aoju.bus.gitlab.models.Label; +import javax.ws.rs.core.GenericType; import javax.ws.rs.core.Response; import java.util.List; import java.util.Optional; @@ -47,7 +48,7 @@ public LabelsApi(GitLabApi gitLabApi) { /** * Get all labels of the specified project. * - * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance * @return a list of project's labels * @throws GitLabApiException if any exception occurs */ @@ -58,7 +59,7 @@ public List