From 0ac8f19de38cdf2edd937bd7f8befcc987d064e2 Mon Sep 17 00:00:00 2001 From: icanci Date: Thu, 1 Dec 2022 21:16:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 28 +- .../biz/service/impl/BaseDataServiceImpl.java | 5 +- .../service/impl/DataSourceServiceImpl.java | 19 +- .../biz/service/impl/DomainServiceImpl.java | 6 +- .../biz/service/impl/MetadataServiceImpl.java | 6 +- .../biz/service/impl/StrategyServiceImpl.java | 7 +- .../icanci/rec/admin/biz/test/HutoolTest.java | 31 ++ .../icanci/rec/admin/dal/utils/IDHolder.java | 4 +- .../dal/utils/service/IDGeneratorService.java | 2 +- .../admin/dal/utils/service/SnowFlake.java | 108 ---- .../service/impl/IDGeneratorServiceImpl.java | 12 +- .../common/utils/DateFormatDeserializer.java | 76 --- .../cn/icanci/rec/common/utils/DateUtils.java | 150 ++--- .../icanci/rec/common/utils/FastBase64.java | 522 ------------------ .../rec/common/utils/FastJsonUtils.java | 286 ---------- .../cn/icanci/rec/common/utils/GZipUtils.java | 200 ------- .../test/RecScriptEngineManagerTest.java | 3 +- .../engine/sdk/http/spi/AbstractLoadSPI.java | 4 +- .../AbstractFactor.java} | 4 +- .../ContainFactor.java} | 6 +- .../EQCondition.java => factor/EQFactor.java} | 9 +- .../Condition.java => factor/Factor.java} | 4 +- .../FactorBean.java} | 4 +- .../FactorSupport.java} | 18 +- .../GTEFactor.java} | 10 +- .../GTCondition.java => factor/GTFactor.java} | 10 +- .../IncludedFactor.java} | 6 +- .../LTEFactor.java} | 22 +- .../LTCondition.java => factor/LTFactor.java} | 10 +- .../NECondition.java => factor/NEFactor.java} | 10 +- .../UnContainFactor.java} | 6 +- .../rec/engine/sdk/rule/EngineExecutor.java | 14 +- .../sdk/server/RecNettyClientHandler.java | 3 +- .../rec/engine/sdk/server/RegisterClient.java | 4 +- .../rec/spi/event/DefaultEventDispatcher.java | 18 +- 35 files changed, 218 insertions(+), 1409 deletions(-) create mode 100644 rec-admin/rec-admin-biz/src/test/java/cn/icanci/rec/admin/biz/test/HutoolTest.java delete mode 100644 rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/SnowFlake.java delete mode 100644 rec-common/src/main/java/cn/icanci/rec/common/utils/DateFormatDeserializer.java delete mode 100644 rec-common/src/main/java/cn/icanci/rec/common/utils/FastBase64.java delete mode 100644 rec-common/src/main/java/cn/icanci/rec/common/utils/FastJsonUtils.java delete mode 100644 rec-common/src/main/java/cn/icanci/rec/common/utils/GZipUtils.java rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/AbstractCondition.java => factor/AbstractFactor.java} (94%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/ContainCondition.java => factor/ContainFactor.java} (88%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/EQCondition.java => factor/EQFactor.java} (80%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/Condition.java => factor/Factor.java} (85%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/ConditionBean.java => factor/FactorBean.java} (82%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/ConditionSupport.java => factor/FactorSupport.java} (55%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/GTECondition.java => factor/GTEFactor.java} (75%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/GTCondition.java => factor/GTFactor.java} (75%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/IncludedCondition.java => factor/IncludedFactor.java} (89%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/LTECondition.java => factor/LTEFactor.java} (75%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/LTCondition.java => factor/LTFactor.java} (75%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/NECondition.java => factor/NEFactor.java} (79%) rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{condition/UnContainCondition.java => factor/UnContainFactor.java} (87%) diff --git a/pom.xml b/pom.xml index f0680e7..5717ef8 100644 --- a/pom.xml +++ b/pom.xml @@ -38,14 +38,6 @@ UTF-8 8 8 - - 2.2.2.RELEASE - - 3.4 - 2.4 - 3.10.0 - 4.3 - 19.0 4.13.2 @@ -54,12 +46,20 @@ 2.13.3 2.13.3 3.3.4 + + 2.2.2.RELEASE + + 3.4 + 2.4 + 3.10.0 + 4.3 + 19.0 2.11.2 1.2.70 1.4.2.Final - + 5.4.2 2.4.7.Final @@ -177,6 +177,12 @@ mapstruct ${mapstruct.version} + + + cn.hutool + hutool-all + ${hutool.version} + org.mvel @@ -248,6 +254,10 @@ com.fasterxml.jackson.core jackson-databind + + cn.hutool + hutool-all + diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java index 7425d9b..309c353 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.BaseDataMapper; import cn.icanci.rec.admin.biz.model.BaseDataDebugResult; @@ -61,10 +62,10 @@ public class BaseDataServiceImpl implements BaseDataService { if (doInsert(baseData)) { BaseDataDO insert = baseDataMapper.vo2do(baseData); baseDataDAO.insert(insert); - eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_BASE_DATA, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_BASE_DATA, JSONUtil.toJsonStr(insert), LogOperatorTypeEnum.CREATE)); } else { baseDataDAO.update(baseDataMapper.vo2do(baseData)); - eventDispatcher.fire(new LogEvent(baseData.getUuid(), ModuleTypeEnum.REC_BASE_DATA, FastJsonUtils.toJSONString(baseData), LogOperatorTypeEnum.UPDATE)); + eventDispatcher.fire(new LogEvent(baseData.getUuid(), ModuleTypeEnum.REC_BASE_DATA, JSONUtil.toJsonStr(baseData), LogOperatorTypeEnum.UPDATE)); } } diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java index 4eae568..a8f9335 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.DataSourceMapper; import cn.icanci.rec.admin.biz.model.DataSourceDebugResult; @@ -38,19 +39,19 @@ import com.google.common.collect.Lists; @Service public class DataSourceServiceImpl implements DataSourceService { @Resource - private DataSourceDAO dataSourceDAO; + private DataSourceDAO dataSourceDAO; @Resource - private DataSourceMapper dataSourceMapper; + private DataSourceMapper dataSourceMapper; @Resource - private EventDispatcher eventDispatcher; + private EventDispatcher eventDispatcher; - private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); /** label 格式化 */ - String DELETED_TYPE_FORMAT = "[无效] [%s] %s"; + protected static final String DELETED_TYPE_FORMAT = "[无效] [%s] %s"; /** label 格式化 */ - String NOT_DELETED_TYPE_FORMAT = "[有效] [%s] %s"; + protected static final String NOT_DELETED_TYPE_FORMAT = "[有效] [%s] %s"; @Override public List queryAll() { @@ -62,10 +63,10 @@ public class DataSourceServiceImpl implements DataSourceService { if (doInsert(dataSource)) { DataSourceDO insert = dataSourceMapper.vo2do(dataSource); dataSourceDAO.insert(insert); - eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_DATA_SOURCE, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_DATA_SOURCE, JSONUtil.toJsonStr(insert), LogOperatorTypeEnum.CREATE)); } else { dataSourceDAO.update(dataSourceMapper.vo2do(dataSource)); - eventDispatcher.fire(new LogEvent(dataSource.getUuid(), ModuleTypeEnum.REC_DATA_SOURCE, FastJsonUtils.toJSONString(dataSource), LogOperatorTypeEnum.UPDATE)); + eventDispatcher.fire(new LogEvent(dataSource.getUuid(), ModuleTypeEnum.REC_DATA_SOURCE, JSONUtil.toJsonStr(dataSource), LogOperatorTypeEnum.UPDATE)); } } @@ -130,7 +131,7 @@ public class DataSourceServiceImpl implements DataSourceService { result.setRealResult(context.getRealRetVal()); } else if (realRetVal instanceof Map) { result.setSuccess(true); - result.setRealResult(FastJsonUtils.toJSONString(context.getRealRetVal())); + result.setRealResult(JSONUtil.toJsonStr(context.getRealRetVal())); } else { result.setSuccess(false); result.setExceptionMessage("脚本执行返回类型为:" + realRetVal.getClass().getName()); diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DomainServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DomainServiceImpl.java index fd5688c..78cc2e6 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DomainServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DomainServiceImpl.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.DomainMapper; import cn.icanci.rec.admin.biz.service.DomainService; @@ -10,7 +11,6 @@ import cn.icanci.rec.common.enums.LogOperatorTypeEnum; import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.DomainVO; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.spi.event.EventDispatcher; import java.util.List; @@ -47,10 +47,10 @@ public class DomainServiceImpl implements DomainService { if (doInsert(domain)) { DomainDO insert = domainMapper.vo2do(domain); domainDAO.insert(insert); - eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_DOMAIN, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_DOMAIN, JSONUtil.toJsonStr(insert), LogOperatorTypeEnum.CREATE)); } else { domainDAO.update(domainMapper.vo2do(domain)); - eventDispatcher.fire(new LogEvent(domain.getUuid(), ModuleTypeEnum.REC_DOMAIN, FastJsonUtils.toJSONString(domain), LogOperatorTypeEnum.UPDATE)); + eventDispatcher.fire(new LogEvent(domain.getUuid(), ModuleTypeEnum.REC_DOMAIN, JSONUtil.toJsonStr(domain), LogOperatorTypeEnum.UPDATE)); } } diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/MetadataServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/MetadataServiceImpl.java index b36f1d0..7d1f3c5 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/MetadataServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/MetadataServiceImpl.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.MetadataMapper; import cn.icanci.rec.admin.biz.service.MetadataService; @@ -10,7 +11,6 @@ import cn.icanci.rec.common.enums.LogOperatorTypeEnum; import cn.icanci.rec.common.enums.ModuleTypeEnum; import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.MetadataVO; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.spi.event.EventDispatcher; import java.util.List; @@ -45,10 +45,10 @@ public class MetadataServiceImpl implements MetadataService { if (doInsert(metadata)) { MetadataDO insert = metadataMapper.vo2do(metadata); metadataDAO.insert(insert); - eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_METADATA, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_METADATA, JSONUtil.toJsonStr(insert), LogOperatorTypeEnum.CREATE)); } else { metadataDAO.update(metadataMapper.vo2do(metadata)); - eventDispatcher.fire(new LogEvent(metadata.getUuid(), ModuleTypeEnum.REC_METADATA, FastJsonUtils.toJSONString(metadata), LogOperatorTypeEnum.UPDATE)); + eventDispatcher.fire(new LogEvent(metadata.getUuid(), ModuleTypeEnum.REC_METADATA, JSONUtil.toJsonStr(metadata), LogOperatorTypeEnum.UPDATE)); } } diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java index 9eb57e0..eed88a2 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java @@ -1,5 +1,6 @@ package cn.icanci.rec.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.StrategyMapper; import cn.icanci.rec.admin.biz.mapper.config.StrategyVoDtoMapper; @@ -74,10 +75,10 @@ public class StrategyServiceImpl implements StrategyService { if (doInsert(strategy)) { StrategyDO insert = strategyMapper.vo2do(strategy); strategyDAO.insert(insert); - eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_STRATEGY, FastJsonUtils.toJSONString(insert), LogOperatorTypeEnum.CREATE)); + eventDispatcher.fire(new LogEvent(insert.getUuid(), ModuleTypeEnum.REC_STRATEGY, JSONUtil.toJsonStr(insert), LogOperatorTypeEnum.CREATE)); } else { strategyDAO.update(strategyMapper.vo2do(strategy)); - eventDispatcher.fire(new LogEvent(strategy.getUuid(), ModuleTypeEnum.REC_STRATEGY, FastJsonUtils.toJSONString(strategy), LogOperatorTypeEnum.UPDATE)); + eventDispatcher.fire(new LogEvent(strategy.getUuid(), ModuleTypeEnum.REC_STRATEGY, JSONUtil.toJsonStr(strategy), LogOperatorTypeEnum.UPDATE)); } } @@ -140,7 +141,7 @@ public class StrategyServiceImpl implements StrategyService { // 9.构建执行返回结果 result.setSuccess(execute.isSuccess()); result.setRetValue(execute.getResult()); - result.setExecutorParam(FastJsonUtils.toJSONString(execute.getBindings())); + result.setExecutorParam(JSONUtil.toJsonStr(execute.getBindings())); result.setExceptionMessage(execute.isSuccess() ? StringUtils.EMPTY : execute.getErrorMessage()); } catch (Throwable e) { result.setSuccess(false); diff --git a/rec-admin/rec-admin-biz/src/test/java/cn/icanci/rec/admin/biz/test/HutoolTest.java b/rec-admin/rec-admin-biz/src/test/java/cn/icanci/rec/admin/biz/test/HutoolTest.java new file mode 100644 index 0000000..918ba0f --- /dev/null +++ b/rec-admin/rec-admin-biz/src/test/java/cn/icanci/rec/admin/biz/test/HutoolTest.java @@ -0,0 +1,31 @@ +package cn.icanci.rec.admin.biz.test; +import cn.hutool.json.JSONUtil; +import cn.icanci.rec.common.model.config.DomainVO; + +import java.util.Date; + +import org.junit.Test; + +/** + * @author icanci + * @since 1.0 Created in 2022/12/01 08:50 + */ +public class HutoolTest { + @Test + public void testJsonUtil(){ + DomainVO domainVO = new DomainVO(); + domainVO.setDomainName(""); + domainVO.setDomainCode(""); + domainVO.setId(""); + domainVO.setUuid(""); + domainVO.setDesc(""); + domainVO.setCreateTime(new Date()); + domainVO.setUpdateTime(new Date()); + domainVO.setIsDelete(0); + domainVO.setEnv(""); + String json = JSONUtil.toJsonStr(domainVO); + System.out.println(json); + DomainVO domainVO1 = JSONUtil.toBean(json, DomainVO.class); + System.out.println(domainVO1); + } +} diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/IDHolder.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/IDHolder.java index f211add..a3719d6 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/IDHolder.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/IDHolder.java @@ -25,7 +25,7 @@ public class IDHolder { * @return id */ public static String generateNoBySnowFlake(String prefix) { - return idGeneratorService.generateNoBySnowFlake(prefix); + return idGeneratorService.generateBySnowFlake(prefix); } /** @@ -34,7 +34,7 @@ public class IDHolder { * @return id */ public static String generateNoBySnowFlakeDefaultPrefix() { - return idGeneratorService.generateNoBySnowFlake(DEFAULT_PREFIX); + return idGeneratorService.generateBySnowFlake(DEFAULT_PREFIX); } } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/IDGeneratorService.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/IDGeneratorService.java index 610f205..343149f 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/IDGeneratorService.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/IDGeneratorService.java @@ -11,5 +11,5 @@ public interface IDGeneratorService { * @param prefix 前缀 * @return id */ - String generateNoBySnowFlake(String prefix); + String generateBySnowFlake(String prefix); } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/SnowFlake.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/SnowFlake.java deleted file mode 100644 index 10bdd65..0000000 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/SnowFlake.java +++ /dev/null @@ -1,108 +0,0 @@ -package cn.icanci.rec.admin.dal.utils.service; - -/** - * id生成器-雪花算法 - * - * snowflake的结构如下(每部分用-分开): - * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 - * 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) - * 一共加起来刚好64位,为一个Long型。(转换成字符串长度为18) - * snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。据说:snowflake每秒能够产生26万个ID。 - * - * @author icanci - * @since 1.0 Created in 2022/10/30 07:04 - */ -public class SnowFlake { - /** 起始的时间戳 */ - private static final long START_STAMP = 1480166465631L; - - /** 序列号占用的位数 */ - private static final long SEQUENCE_BIT = 12; - - /** 机器标识占用的位数 */ - private static final long MACHINE_BIT = 5; - - /** 数据中心占用的位数 */ - private static final long DATACENTER_BIT = 5; - - /** 每一部分的最大值 */ - private static final long MAX_DATACENTER_NUM = ~(-1L << DATACENTER_BIT); - - private static final long MAX_MACHINE_NUM = ~(-1L << MACHINE_BIT); - - private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT); - - /** 每一部分向左的位移 */ - private static final long MACHINE_LEFT = SEQUENCE_BIT; - - private static final long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; - - private static final long TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; - - /** 数据中心 */ - private final long datacenterId; - - /** 机器标识 */ - private final long machineId; - - /** 序列号 */ - private long sequence = 0L; - - /** 上一次时间戳 */ - private long lastStamp = -1L; - - public SnowFlake(long datacenterId, long machineId) { - if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { - throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); - } - if (machineId > MAX_MACHINE_NUM || machineId < 0) { - throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); - } - this.datacenterId = datacenterId; - this.machineId = machineId; - } - - /** - * 产生下一个ID - * - * @return 下一个ID - */ - public synchronized long nextId() { - long currStamp = getNewStamp(); - if (currStamp < lastStamp) { - throw new RuntimeException("Clock moved backwards. Refusing to generate id"); - } - if (currStamp == lastStamp) { - //相同毫秒内,序列号自增 - sequence = (sequence + 1) & MAX_SEQUENCE; - //同一毫秒的序列数已经达到最大 - if (sequence == 0L) { - currStamp = getNextMill(); - } - } else { - //不同毫秒内,序列号置为0 - sequence = 0L; - } - lastStamp = currStamp; - return //时间戳部分 - (currStamp - START_STAMP) << TIMESTAMP_LEFT - //数据中心部分 - | datacenterId << DATACENTER_LEFT - //机器标识部分 - | machineId << MACHINE_LEFT - //序列号部分 - | sequence; - } - - private long getNextMill() { - long mill = getNewStamp(); - while (mill <= lastStamp) { - mill = getNewStamp(); - } - return mill; - } - - private long getNewStamp() { - return System.currentTimeMillis(); - } -} \ No newline at end of file diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/impl/IDGeneratorServiceImpl.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/impl/IDGeneratorServiceImpl.java index 1548f8e..02e3f2c 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/impl/IDGeneratorServiceImpl.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/utils/service/impl/IDGeneratorServiceImpl.java @@ -1,13 +1,13 @@ package cn.icanci.rec.admin.dal.utils.service.impl; -import cn.icanci.rec.admin.dal.utils.IDHolder; -import cn.icanci.rec.admin.dal.utils.service.IDGeneratorService; -import cn.icanci.rec.admin.dal.utils.service.SnowFlake; - import org.apache.commons.lang3.RandomUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; +import cn.hutool.core.lang.Snowflake; +import cn.icanci.rec.admin.dal.utils.IDHolder; +import cn.icanci.rec.admin.dal.utils.service.IDGeneratorService; + /** * 分布式ID生成器 * @@ -17,10 +17,10 @@ import org.springframework.stereotype.Service; @Service public class IDGeneratorServiceImpl implements IDGeneratorService, InitializingBean { /** 雪花序列号生成算法 */ - private final static SnowFlake SNOW_FLAKE = new SnowFlake(RandomUtils.nextInt(1, 9), RandomUtils.nextInt(1, 9)); + private static final Snowflake SNOW_FLAKE = new Snowflake(RandomUtils.nextInt(1, 9), RandomUtils.nextInt(1, 9)); @Override - public String generateNoBySnowFlake(String prefix) { + public String generateBySnowFlake(String prefix) { return prefix + SNOW_FLAKE.nextId(); } diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/DateFormatDeserializer.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/DateFormatDeserializer.java deleted file mode 100644 index 5feaa0a..0000000 --- a/rec-common/src/main/java/cn/icanci/rec/common/utils/DateFormatDeserializer.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.icanci.rec.common.utils; - -import java.lang.reflect.Type; -import java.text.ParseException; -import java.text.SimpleDateFormat; - -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.parser.DefaultJSONParser; -import com.alibaba.fastjson.parser.JSONToken; -import com.alibaba.fastjson.parser.deserializer.AbstractDateDeserializer; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/13 20:26 - */ -public class DateFormatDeserializer extends AbstractDateDeserializer { - /** 日期格式*/ - private String format; - - /** - * - * @param format - */ - public DateFormatDeserializer(String format) { - super(); - this.format = format; - } - - @Override - public int getFastMatchToken() { - return JSONToken.LITERAL_INT; - } - - /** - * @see com.alibaba.fastjson.parser.deserializer.DateFormatDeserializer#cast(com.alibaba.fastjson.parser.DefaultJSONParser, java.lang.reflect.Type, java.lang.Object, java.lang.Object) - */ - @SuppressWarnings("unchecked") - @Override - protected Date cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object val) { - if (format == null) { - format = "yyyy-MM-dd HH:mm:ss"; - } - if (val instanceof String) { - String strVal = (String) val; - if (strVal.length() == 0) { - return null; - } - - try { - return (Date) new SimpleDateFormat(format).parse((String) val); - } catch (ParseException e) { - throw new JSONException("parse error"); - } - } - throw new JSONException("parse error"); - } - - /** - * Getter method for property myFormat. - * - * @return property value of myFormat - */ - public String getMyFormat() { - return format; - } - - /** - * Setter method for property myFormat. - * - * @param myFormat value to be assigned to property myFormat - */ - public void setMyFormat(String myFormat) { - this.format = myFormat; - } - -} diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/DateUtils.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/DateUtils.java index 69ef64b..9eccbae 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/utils/DateUtils.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/utils/DateUtils.java @@ -1,9 +1,8 @@ package cn.icanci.rec.common.utils; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; +import cn.hutool.core.date.DateUtil; + +import java.util.Date; import org.apache.commons.lang3.StringUtils; @@ -15,133 +14,78 @@ import org.apache.commons.lang3.StringUtils; * @since 1.0 Created in 2022/11/16 23:06 */ public final class DateUtils { - /** YYYY */ - public final static String YYYY = "yyyy"; - /** MM_DD */ - public final static String MM_DD = "MM-dd"; + public enum FormatType { + /** YYYY */ + YYYY("yyyy"), + + /** MM_DD */ + MM_DD("MM-dd"), + + /** HH_MM */ + HH_MM("HH:mm"), + + /** HH_MM_SS */ + HH_MM_SS("HH:mm:ss"), - /** HH_MM_SS */ - public final static String HH_MM = "HH:mm"; + /** YYYY_MM */ + YYYY_MM("yyyy-MM"), - /** HH_MM_SS */ - public final static String HH_MM_SS = "HH:mm:ss"; + /** YYYY_MM_DD */ + YYYY_MM_DD("yyyy-MM-dd"), - /** YYYY_MM */ - public static final String YYYY_MM = "yyyy-MM"; + /** YYYY_MM_DD_HH */ + YYYY_MM_DD_HH("yyyy-MM-dd HH"), - /** YYYY_MM_DD */ - public static final String YYYY_MM_DD = "yyyy-MM-dd"; + /** YYYY_MM_DD_HH_MM */ + YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"), - /** YYYY_MM_DD_HH */ - public final static String YYYY_MM_DD_HH = "yyyy-MM-dd HH"; + /** YYYY_MM_DD_HH_MM_SS */ + YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"), - /** YYYY_MM_DD_HH_MM */ - public final static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; + ; - /** YYYY_MM_DD_HH_MM_SS */ - public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + private final String code; - /** 本地线程日期格式 */ - private final static ThreadLocal> THREAD_LOCAL_FORMATTERS = ThreadLocal.withInitial(() -> { - Map map = new HashMap<>(16); - map.put(YYYY, new SimpleDateFormat(YYYY)); - map.put(YYYY_MM, new SimpleDateFormat(YYYY_MM)); - map.put(MM_DD, new SimpleDateFormat(MM_DD)); - map.put(HH_MM, new SimpleDateFormat(HH_MM)); - map.put(HH_MM_SS, new SimpleDateFormat(HH_MM_SS)); - map.put(YYYY_MM_DD, new SimpleDateFormat(YYYY_MM_DD)); - map.put(YYYY_MM_DD_HH, new SimpleDateFormat(YYYY_MM_DD_HH)); - map.put(YYYY_MM_DD_HH_MM, new SimpleDateFormat(YYYY_MM_DD_HH_MM)); - map.put(YYYY_MM_DD_HH_MM_SS, new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS)); - return map; - }); + public String getCode() { + return code; + } + + FormatType(String code) { + this.code = code; + } + } /** - * YYYY 转换日期 - * + * 转换日期 + * TODO Hutool 的时间格式化是线程安全的,因为每次都创建一个SimpleDateFormat对象,但是性能略差 + * * @param dateString the time - * @param format format - * @return date date + * @param formatType formatType + * @return date */ - public static Date parse(String dateString, String format) { + public static Date parse(String dateString, FormatType formatType) { if (StringUtils.isBlank(dateString)) { return null; } - try { - return getFormat(format).parse(dateString); - } catch (ParseException e) { - return null; - } + return DateUtil.parse(dateString, formatType.getCode()); } /** * 格式化日期 * * @param date the time - * @param format format - * @return date date + * @param formatType formatType + * @return date */ - public static String format(Date date, String format) { - if (StringUtils.isBlank(format)) { + public static String format(Date date, FormatType formatType) { + if (formatType == null) { return null; } try { - return getFormat(format).format(date); + return DateUtil.format(date, formatType.getCode()); } catch (Exception e) { return null; } } - - /** - * 获取格式化配置 - * - * @param format 格式化 - * @return 配置 - */ - private static SimpleDateFormat getFormat(String format) { - return THREAD_LOCAL_FORMATTERS.get().get(format); - } - - /** - * 获取差异天数 - * - * @param one date - * @param two date - * @return 差异天数 - */ - public static long getDiffDays(Date one, Date two) { - long minutes = getDiffMinutes(one, two); - return BigDecimal.valueOf(Math.ceil(minutes / (60 * 24 * 1.0))).longValue(); - } - - /** - * 获取差异分钟数 - * - * @param one date - * @param two date - * @return 差异分钟数 - */ - public static long getDiffMinutes(Date one, Date two) { - Calendar sysDate = new GregorianCalendar(); - sysDate.setTime(one); - Calendar failDate = new GregorianCalendar(); - failDate.setTime(two); - return (sysDate.getTimeInMillis() - failDate.getTimeInMillis()) / (60 * 1000); - } - - /** - * 取得两个日期间隔秒数(日期1-日期2) - * - * @param one 日期1 - * @param two 日期2 - * @return 间隔秒数 - */ - public static long getDiffSeconds(Date one, Date two) { - Calendar sysDate = new GregorianCalendar(); - sysDate.setTime(one); - Calendar failDate = new GregorianCalendar(); - failDate.setTime(two); - return (sysDate.getTimeInMillis() - failDate.getTimeInMillis()) / 1000; - } } \ No newline at end of file diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/FastBase64.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/FastBase64.java deleted file mode 100644 index 132b8ad..0000000 --- a/rec-common/src/main/java/cn/icanci/rec/common/utils/FastBase64.java +++ /dev/null @@ -1,522 +0,0 @@ -package cn.icanci.rec.common.utils; - -import java.util.Arrays; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/20 15:36 - */ -public class FastBase64 { - private static final char[] CA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); - private static final int[] IA = new int[256]; - - static { - Arrays.fill(IA, -1); - for (int i = 0, iS = CA.length; i < iS; i++) - IA[CA[i]] = i; - IA['='] = 0; - } - - // **************************************************************************************** - // * char[] version - // **************************************************************************************** - - /** Encodes a raw byte array into a BASE64 char[] representation i accordance with RFC 2045. - * @param sArr The bytes to convert. If null or length 0 an empty array will be returned. - * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
- * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a - * little faster. - * @return A BASE64 encoded array. Never null. - */ - public final static char[] encodeToChar(byte[] sArr, boolean lineSep) { - // Check special case - int sLen = sArr != null ? sArr.length : 0; - if (sLen == 0) - return new char[0]; - - int eLen = (sLen / 3) * 3; // Length of even 24-bits. - int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count - int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array - char[] dArr = new char[dLen]; - - // Encode even 24-bits - for (int s = 0, d = 0, cc = 0; s < eLen;) { - // Copy next three bytes into lower 24 bits of int, paying attension to sign. - int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff); - - // Encode the int into four chars - dArr[d++] = CA[(i >>> 18) & 0x3f]; - dArr[d++] = CA[(i >>> 12) & 0x3f]; - dArr[d++] = CA[(i >>> 6) & 0x3f]; - dArr[d++] = CA[i & 0x3f]; - - // Add optional line separator - if (lineSep && ++cc == 19 && d < dLen - 2) { - dArr[d++] = '\r'; - dArr[d++] = '\n'; - cc = 0; - } - } - - // Pad and encode last bits if source isn't even 24 bits. - int left = sLen - eLen; // 0 - 2. - if (left > 0) { - // Prepare the int - int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0); - - // Set last four chars - dArr[dLen - 4] = CA[i >> 12]; - dArr[dLen - 3] = CA[(i >>> 6) & 0x3f]; - dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '='; - dArr[dLen - 1] = '='; - } - return dArr; - } - - /** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with - * and without line separators. - * @param sArr The source array. null or length 0 will return an empty array. - * @return The decoded array of bytes. May be of length 0. Will be null if the legal characters - * (including '=') isn't divideable by 4. (I.e. definitely corrupted). - */ - public final static byte[] decode(char[] sArr) { - // Check special case - int sLen = sArr != null ? sArr.length : 0; - if (sLen == 0) - return new byte[0]; - - // Count illegal characters (including '\r', '\n') to know what size the returned array will be, - // so we don't have to reallocate & copy it later. - int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...) - for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out. - if (IA[sArr[i]] < 0) - sepCnt++; - - // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045. - if ((sLen - sepCnt) % 4 != 0) - return null; - - int pad = 0; - for (int i = sLen; i > 1 && IA[sArr[--i]] <= 0;) - if (sArr[i] == '=') - pad++; - - int len = ((sLen - sepCnt) * 6 >> 3) - pad; - - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - for (int s = 0, d = 0; d < len;) { - // Assemble three bytes into an int from four "valid" characters. - int i = 0; - for (int j = 0; j < 4; j++) { // j only increased if a valid char was found. - int c = IA[sArr[s++]]; - if (c >= 0) - i |= c << (18 - j * 6); - else - j--; - } - // Add the bytes - dArr[d++] = (byte) (i >> 16); - if (d < len) { - dArr[d++] = (byte) (i >> 8); - if (d < len) - dArr[d++] = (byte) i; - } - } - return dArr; - } - - /** Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as - * fast as {@link #decode(char[])}. The preconditions are:
- * + The array must have a line length of 76 chars OR no line separators at all (one line).
- * + Line separator must be "\r\n", as specified in RFC 2045 - * + The array must not contain illegal characters within the encoded string
- * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.
- * @param sArr The source array. Length 0 will return an empty array. null will throw an exception. - * @return The decoded array of bytes. May be of length 0. - */ - public final static byte[] decodeFast(char[] sArr) { - // Check special case - int sLen = sArr.length; - if (sLen == 0) - return new byte[0]; - - int sIx = 0, eIx = sLen - 1; // Start and end index after trimming. - - // Trim illegal chars from start - while (sIx < eIx && IA[sArr[sIx]] < 0) - sIx++; - - // Trim illegal chars from end - while (eIx > 0 && IA[sArr[eIx]] < 0) - eIx--; - - // get the padding count (=) (0, 1 or 2) - int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end. - int cCnt = eIx - sIx + 1; // Content count including possible separators - int sepCnt = sLen > 76 ? (sArr[76] == '\r' ? cCnt / 78 : 0) << 1 : 0; - - int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - // Decode all but the last 0 - 2 bytes. - int d = 0; - for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) { - // Assemble three bytes into an int from four "valid" characters. - int i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]]; - - // Add the bytes - dArr[d++] = (byte) (i >> 16); - dArr[d++] = (byte) (i >> 8); - dArr[d++] = (byte) i; - - // If line separator, jump over it. - if (sepCnt > 0 && ++cc == 19) { - sIx += 2; - cc = 0; - } - } - - if (d < len) { - // Decode last 1-3 bytes (incl '=') into 1-3 bytes - int i = 0; - for (int j = 0; sIx <= eIx - pad; j++) - i |= IA[sArr[sIx++]] << (18 - j * 6); - - for (int r = 16; d < len; r -= 8) - dArr[d++] = (byte) (i >> r); - } - - return dArr; - } - - // **************************************************************************************** - // * byte[] version - // **************************************************************************************** - - /** Encodes a raw byte array into a BASE64 byte[] representation i accordance with RFC 2045. - * @param sArr The bytes to convert. If null or length 0 an empty array will be returned. - * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
- * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a - * little faster. - * @return A BASE64 encoded array. Never null. - */ - public final static byte[] encodeToByte(byte[] sArr, boolean lineSep) { - return encodeToByte(sArr, 0, sArr != null ? sArr.length : 0, lineSep); - } - - /** Encodes a raw byte array into a BASE64 byte[] representation i accordance with RFC 2045. - * @param sArr The bytes to convert. If null an empty array will be returned. - * @param sOff The starting position in the bytes to convert. - * @param sLen The number of bytes to convert. If 0 an empty array will be returned. - * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
- * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a - * little faster. - * @return A BASE64 encoded array. Never null. - */ - public final static byte[] encodeToByte(byte[] sArr, int sOff, int sLen, boolean lineSep) { - // Check special case - if (sArr == null || sLen == 0) - return new byte[0]; - - int eLen = (sLen / 3) * 3; // Length of even 24-bits. - int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count - int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array - byte[] dArr = new byte[dLen]; - - // Encode even 24-bits - for (int s = sOff, d = 0, cc = 0; s < sOff + eLen;) { - // Copy next three bytes into lower 24 bits of int, paying attension to sign. - int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff); - - // Encode the int into four chars - dArr[d++] = (byte) CA[(i >>> 18) & 0x3f]; - dArr[d++] = (byte) CA[(i >>> 12) & 0x3f]; - dArr[d++] = (byte) CA[(i >>> 6) & 0x3f]; - dArr[d++] = (byte) CA[i & 0x3f]; - - // Add optional line separator - if (lineSep && ++cc == 19 && d < dLen - 2) { - dArr[d++] = '\r'; - dArr[d++] = '\n'; - cc = 0; - } - } - - // Pad and encode last bits if source isn't an even 24 bits. - int left = sLen - eLen; // 0 - 2. - if (left > 0) { - // Prepare the int - int i = ((sArr[sOff + eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sOff + sLen - 1] & 0xff) << 2) : 0); - - // Set last four chars - dArr[dLen - 4] = (byte) CA[i >> 12]; - dArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f]; - dArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '='; - dArr[dLen - 1] = '='; - } - return dArr; - } - - /** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with - * and without line separators. - * @param sArr The source array. Length 0 will return an empty array. null will throw an exception. - * @return The decoded array of bytes. May be of length 0. Will be null if the legal characters - * (including '=') isn't divideable by 4. (I.e. definitely corrupted). - */ - public final static byte[] decode(byte[] sArr) { - return decode(sArr, 0, sArr.length); - } - - /** Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with - * and without line separators. - * @param sArr The source array. null will throw an exception. - * @param sOff The starting position in the source array. - * @param sLen The number of bytes to decode from the source array. Length 0 will return an empty array. - * @return The decoded array of bytes. May be of length 0. Will be null if the legal characters - * (including '=') isn't divideable by 4. (I.e. definitely corrupted). - */ - public final static byte[] decode(byte[] sArr, int sOff, int sLen) { - // Count illegal characters (including '\r', '\n') to know what size the returned array will be, - // so we don't have to reallocate & copy it later. - int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...) - for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out. - if (IA[sArr[sOff + i] & 0xff] < 0) - sepCnt++; - - // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045. - if ((sLen - sepCnt) % 4 != 0) - return null; - - int pad = 0; - for (int i = sLen; i > 1 && IA[sArr[sOff + --i] & 0xff] <= 0;) - if (sArr[sOff + i] == '=') - pad++; - - int len = ((sLen - sepCnt) * 6 >> 3) - pad; - - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - for (int s = 0, d = 0; d < len;) { - // Assemble three bytes into an int from four "valid" characters. - int i = 0; - for (int j = 0; j < 4; j++) { // j only increased if a valid char was found. - int c = IA[sArr[sOff + s++] & 0xff]; - if (c >= 0) - i |= c << (18 - j * 6); - else - j--; - } - - // Add the bytes - dArr[d++] = (byte) (i >> 16); - if (d < len) { - dArr[d++] = (byte) (i >> 8); - if (d < len) - dArr[d++] = (byte) i; - } - } - - return dArr; - } - - /** Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as - * fast as {@link #decode(byte[])}. The preconditions are:
- * + The array must have a line length of 76 chars OR no line separators at all (one line).
- * + Line separator must be "\r\n", as specified in RFC 2045 - * + The array must not contain illegal characters within the encoded string
- * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.
- * @param sArr The source array. Length 0 will return an empty array. null will throw an exception. - * @return The decoded array of bytes. May be of length 0. - */ - public final static byte[] decodeFast(byte[] sArr) { - // Check special case - int sLen = sArr.length; - if (sLen == 0) - return new byte[0]; - - int sIx = 0, eIx = sLen - 1; // Start and end index after trimming. - - // Trim illegal chars from start - while (sIx < eIx && IA[sArr[sIx] & 0xff] < 0) - sIx++; - - // Trim illegal chars from end - while (eIx > 0 && IA[sArr[eIx] & 0xff] < 0) - eIx--; - - // get the padding count (=) (0, 1 or 2) - int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end. - int cCnt = eIx - sIx + 1; // Content count including possible separators - int sepCnt = sLen > 76 ? (sArr[76] == '\r' ? cCnt / 78 : 0) << 1 : 0; - - int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - // Decode all but the last 0 - 2 bytes. - int d = 0; - for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) { - // Assemble three bytes into an int from four "valid" characters. - int i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]]; - - // Add the bytes - dArr[d++] = (byte) (i >> 16); - dArr[d++] = (byte) (i >> 8); - dArr[d++] = (byte) i; - - // If line separator, jump over it. - if (sepCnt > 0 && ++cc == 19) { - sIx += 2; - cc = 0; - } - } - - if (d < len) { - // Decode last 1-3 bytes (incl '=') into 1-3 bytes - int i = 0; - for (int j = 0; sIx <= eIx - pad; j++) - i |= IA[sArr[sIx++]] << (18 - j * 6); - - for (int r = 16; d < len; r -= 8) - dArr[d++] = (byte) (i >> r); - } - - return dArr; - } - - // **************************************************************************************** - // * String version - // **************************************************************************************** - - /** Encodes a raw byte array into a BASE64 String representation i accordance with RFC 2045. - * @param sArr The bytes to convert. If null or length 0 an empty array will be returned. - * @param lineSep Optional "\r\n" after 76 characters, unless end of file.
- * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a - * little faster. - * @return A BASE64 encoded array. Never null. - */ - public final static String encodeToString(byte[] sArr, boolean lineSep) { - // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower. - return new String(encodeToChar(sArr, lineSep)); - } - - /** Decodes a BASE64 encoded String. All illegal characters will be ignored and can handle both strings with - * and without line separators.
- * Note! It can be up to about 2x the speed to call decode(str.toCharArray()) instead. That - * will create a temporary array though. This version will use str.charAt(i) to iterate the string. - * @param str The source string. null or length 0 will return an empty array. - * @return The decoded array of bytes. May be of length 0. Will be null if the legal characters - * (including '=') isn't divideable by 4. (I.e. definitely corrupted). - */ - public final static byte[] decode(String str) { - // Check special case - int sLen = str != null ? str.length() : 0; - if (sLen == 0) - return new byte[0]; - - // Count illegal characters (including '\r', '\n') to know what size the returned array will be, - // so we don't have to reallocate & copy it later. - int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...) - for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out. - if (IA[str.charAt(i)] < 0) - sepCnt++; - - // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045. - if ((sLen - sepCnt) % 4 != 0) - return null; - - // Count '=' at end - int pad = 0; - for (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0;) - if (str.charAt(i) == '=') - pad++; - - int len = ((sLen - sepCnt) * 6 >> 3) - pad; - - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - for (int s = 0, d = 0; d < len;) { - // Assemble three bytes into an int from four "valid" characters. - int i = 0; - for (int j = 0; j < 4; j++) { // j only increased if a valid char was found. - int c = IA[str.charAt(s++)]; - if (c >= 0) - i |= c << (18 - j * 6); - else - j--; - } - // Add the bytes - dArr[d++] = (byte) (i >> 16); - if (d < len) { - dArr[d++] = (byte) (i >> 8); - if (d < len) - dArr[d++] = (byte) i; - } - } - return dArr; - } - - /** Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as - * fast as {@link #decode(String)}. The preconditions are:
- * + The array must have a line length of 76 chars OR no line separators at all (one line).
- * + Line separator must be "\r\n", as specified in RFC 2045 - * + The array must not contain illegal characters within the encoded string
- * + The array CAN have illegal characters at the beginning and end, those will be dealt with appropriately.
- * @param s The source string. Length 0 will return an empty array. null will throw an exception. - * @return The decoded array of bytes. May be of length 0. - */ - public final static byte[] decodeFast(String s) { - // Check special case - int sLen = s.length(); - if (sLen == 0) - return new byte[0]; - - int sIx = 0, eIx = sLen - 1; // Start and end index after trimming. - - // Trim illegal chars from start - while (sIx < eIx && IA[s.charAt(sIx) & 0xff] < 0) - sIx++; - - // Trim illegal chars from end - while (eIx > 0 && IA[s.charAt(eIx) & 0xff] < 0) - eIx--; - - // get the padding count (=) (0, 1 or 2) - int pad = s.charAt(eIx) == '=' ? (s.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end. - int cCnt = eIx - sIx + 1; // Content count including possible separators - int sepCnt = sLen > 76 ? (s.charAt(76) == '\r' ? cCnt / 78 : 0) << 1 : 0; - - int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes - byte[] dArr = new byte[len]; // Preallocate byte[] of exact length - - // Decode all but the last 0 - 2 bytes. - int d = 0; - for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) { - // Assemble three bytes into an int from four "valid" characters. - int i = IA[s.charAt(sIx++)] << 18 | IA[s.charAt(sIx++)] << 12 | IA[s.charAt(sIx++)] << 6 | IA[s.charAt(sIx++)]; - - // Add the bytes - dArr[d++] = (byte) (i >> 16); - dArr[d++] = (byte) (i >> 8); - dArr[d++] = (byte) i; - - // If line separator, jump over it. - if (sepCnt > 0 && ++cc == 19) { - sIx += 2; - cc = 0; - } - } - - if (d < len) { - // Decode last 1-3 bytes (incl '=') into 1-3 bytes - int i = 0; - for (int j = 0; sIx <= eIx - pad; j++) - i |= IA[s.charAt(sIx++)] << (18 - j * 6); - - for (int r = 16; d < len; r -= 8) - dArr[d++] = (byte) (i >> r); - } - - return dArr; - } -} diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/FastJsonUtils.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/FastJsonUtils.java deleted file mode 100644 index 5e87775..0000000 --- a/rec-common/src/main/java/cn/icanci/rec/common/utils/FastJsonUtils.java +++ /dev/null @@ -1,286 +0,0 @@ -package cn.icanci.rec.common.utils; - -import java.lang.reflect.Type; -import java.nio.charset.CharsetDecoder; -import java.util.Date; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.alibaba.fastjson.parser.Feature; -import com.alibaba.fastjson.parser.ParserConfig; -import com.alibaba.fastjson.serializer.SerializeConfig; -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/13 20:24 - */ -public class FastJsonUtils { - - /** 序列化属性 */ - private static final SerializerFeature[] SERIALIZER_FEATURES = { SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, - SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullBooleanAsFalse, - SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.SortField, - SerializerFeature.SkipTransientField }; - - /** 空值序列化属性 */ - private static final SerializerFeature[] SERIALIZER_FEATURES_NULL_VALUE = { SerializerFeature.WriteMapNullValue, SerializerFeature.SortField, - SerializerFeature.SkipTransientField }; - - /** 反序列化属性 */ - private static final Feature[] DE_SERIALIZER_FEATURES = { Feature.AllowUnQuotedFieldNames, Feature.AllowSingleQuotes, Feature.InternFieldNames, - Feature.AllowArbitraryCommas, Feature.IgnoreNotMatch }; - - /** 日期类型默认序列化格式 */ - private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; - - /** 序列化配置 */ - private static final SerializeConfig MAPPING = new SerializeConfig(); - - static { - MAPPING.put(Date.class, new SimpleDateFormatSerializer(DEFAULT_DATE_FORMAT)); - } - - /** - * 构造函数 - */ - private FastJsonUtils() { - } - - /** - * java对象序列化为字符串 - * - * @param obj 待序列化的java对象 - * @return - */ - public static String toJSONString(Object obj) { - return toJSONString(obj, null); - } - - /** - * Java对象转换为JSON字符串 - * - * @param obj Java对象 - * @param dateFormat 日期格式 - * @return 序列化后的JSON字符串 - */ - public static String toJSONString(Object obj, String dateFormat) { - if (StringUtils.isBlank(dateFormat)) { - return JSON.toJSONString(obj, MAPPING, SERIALIZER_FEATURES); - } - return JSON.toJSONStringWithDateFormat(obj, dateFormat, SERIALIZER_FEATURES); - } - - /** - * java对象序列化为字符串 - * - * @param obj 待序列化的java对象 - * @return - */ - public static String toJSONStringNullValue(Object obj) { - return toJSONStringNullValue(obj, null); - } - - /** - * Java对象转换为JSON字符串,空值输出,适用某些日志的原样输出的场景 - * - * @param obj obj - * @param dateFormat 日期格式 - * @return {@link String} - */ - public static String toJSONStringNullValue(Object obj, String dateFormat) { - if (StringUtils.isBlank(dateFormat)) { - return JSON.toJSONString(obj, MAPPING, SERIALIZER_FEATURES_NULL_VALUE); - } - return JSON.toJSONStringWithDateFormat(obj, dateFormat, SERIALIZER_FEATURES_NULL_VALUE); - } - - /** - * Java对象转换为二进制数据 - * - * @param obj Java对象 - * @return 序列化后的JSON二进制数据 - */ - public static byte[] toJSONStringBytes(Object obj) { - return toJSONStringBytes(obj, null); - } - - /** - * Java对象转换为二进制数据 - * - * @param obj Java对象 - * @param dateFormat 日期格式 - * @return 序列化后的JSON字符串 - */ - public static byte[] toJSONStringBytes(Object obj, String dateFormat) { - if (!StringUtils.isBlank(dateFormat)) { - MAPPING.put(Date.class, new SimpleDateFormatSerializer(dateFormat)); - } - return JSON.toJSONBytes(obj, MAPPING, SERIALIZER_FEATURES); - } - - /** - * JSON字符串反序列化为Java对象 - * - * @param json JSON字符串 - * @param clazz 反序列化对象类型 - * @return 反序列化对象 - */ - public static T fromJSONString(String json, Class clazz) { - return JSON.parseObject(json, clazz, DE_SERIALIZER_FEATURES); - } - - /** - * JSON字符串反序列化为Java对象 - * - * @param json JSON字符串 - * @param clazz 反序列化对象类型 - * @return 反序列化对象 - */ - public static List fromJSON2List(String json, Class clazz) { - return JSON.parseArray(json, clazz); - } - - /** - * JSON字符串反序列化为Java对象 - * - * @param json JSON字符串 - * @param type 反序列化对象类型 - * @return 反序列化对象 - */ - public static T fromJSONString(String json, Type type) { - return JSON.parseObject(json, type, DE_SERIALIZER_FEATURES); - } - - /** - * JSON字符串反序列化为Java对象 - * @param json JSON字符串 - * @param clazz 反序列化对象类型 - * @param dateFormat 日期格式 - * @return 反序列化对象 - */ - public static T fromJSONString(String json, Class clazz, String dateFormat) { - if (StringUtils.isNotBlank(dateFormat)) { - ParserConfig config = new ParserConfig(); - config.putDeserializer(Date.class, new DateFormatDeserializer(dateFormat)); - return JSON.parseObject(json, clazz, config, JSON.DEFAULT_PARSER_FEATURE, DE_SERIALIZER_FEATURES); - } - return JSON.parseObject(json, clazz, DE_SERIALIZER_FEATURES); - } - - /** - * JSON字符串反序列化为Java对象 - * - * @param json JSON字符串 - * @param ref 反序列化对象类型 - * @return 反序列化对象 - */ - public static T fromJSONString(String json, TypeReference ref) { - return JSON.parseObject(json, ref, DE_SERIALIZER_FEATURES); - } - - /** - * JSON字符串反序列化为Java对象 - * - * @param json JSON字符串 - * @param ref 反序列化对象类型 - * @param dateFormat 日期格式 - * @return 反序列化对象 - */ - public static T fromJSONString(String json, TypeReference ref, String dateFormat) { - if (StringUtils.isNotBlank(dateFormat)) { - ParserConfig config = new ParserConfig(); - config.putDeserializer(Date.class, new DateFormatDeserializer(dateFormat)); - return JSON.parseObject(json, ref.getType(), config, JSON.DEFAULT_PARSER_FEATURE, DE_SERIALIZER_FEATURES); - } - return JSON.parseObject(json, ref, DE_SERIALIZER_FEATURES); - } - - /** - * JSON二进制数据反序列化为Java对象 - * - * @param bytes JSON二进制数据 - * @param clazz 反序列化对象类型 - * @return 反序列化对象 - */ - public static T fromJSONString(byte[] bytes, Class clazz) { - return JSON. parseObject(bytes, clazz, DE_SERIALIZER_FEATURES); - } - - /** - * JSON二进制数据反序列化为Java对象 - * - * @param bytes JSON二进制数据 - * @param clazz 反序列化对象类型 - * @param dateFormat 日期格式 - * @return 反序列化对象 - */ - public static T fromJSONString(byte[] bytes, Class clazz, String dateFormat) { - return JSON.parseObject(bytes, clazz, DE_SERIALIZER_FEATURES); - } - - /** - * JSON二进制数据反序列化为Java对象 - * - * @param bytes JSON二进制数据 - * @param off 二进制数据起始字节数组下标 - * @param len 需要反序列化二进制数据的长度 - * @param charsetDecoder 反序列化数据的字符编码类型 - * @param clazz 反序列化对象类型 - * @return 反序列化对象 - */ - public static T fromJSONString(byte[] bytes, int off, int len, CharsetDecoder charsetDecoder, Class clazz) { - return JSON. parseObject(bytes, off, len, charsetDecoder, clazz, DE_SERIALIZER_FEATURES); - } - - /** - * JSON字符串简单添加Entry功能,只能再第一次数据添加key-value,不支持嵌套类型 - * @param json JSON字符串 - * @param key 添加的Entry key - * @param value 添加的Entry value - * @param addDelimiter 是否需要添加逗号分隔符 - * @return 添加Entry后的JSON字符串 - */ - public static String addEntry(String json, String key, String value, boolean addDelimiter) { - StringBuilder buff = new StringBuilder(); - buff.append("{").append("\"").append(key).append("\"").append(":").append("\"").append(value).append("\""); - if (addDelimiter) { - buff.append(","); - } - buff.append(json.substring(1)); - return buff.toString(); - } - - /** - * 判断字符串是否是JSON - * Tip: 会出现数字返回ture的情况,此处如果是数字,返回false - * 会出现 boolean 值返回true的情况,需要处理 - * - * @param str str - * @return 返回字符串是否是JSON - */ - public static boolean isJson(String str) { - if (StringUtils.isBlank(str)) { - return false; - } - str = str.trim(); - - if (NumberUtils.isNumber(str)) { - return false; - } - if (StringUtils.equals(Boolean.TRUE.toString(), str)) { - return false; - } - try { - JSON.parse(str); - return true; - } catch (Exception e) { - return false; - } - } -} diff --git a/rec-common/src/main/java/cn/icanci/rec/common/utils/GZipUtils.java b/rec-common/src/main/java/cn/icanci/rec/common/utils/GZipUtils.java deleted file mode 100644 index ba402a3..0000000 --- a/rec-common/src/main/java/cn/icanci/rec/common/utils/GZipUtils.java +++ /dev/null @@ -1,200 +0,0 @@ -package cn.icanci.rec.common.utils; - -import java.io.*; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -import org.apache.commons.io.IOUtils; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/20 15:37 - */ -public abstract class GZipUtils { - public static final int BUFF = 1024; - public static final String EXT = ".gz"; - - /********************************************************************************** - * 压缩 - **********************************************************************************/ - - /** - * 压缩二进制数据 - * @param data 待压缩数据 - * @return byte[] 压缩数据 - * @throws Exception - */ - public static byte[] compress(byte[] data) throws Exception { - ByteArrayInputStream bais = new ByteArrayInputStream(data); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - compress(bais, baos); - - data = baos.toByteArray(); - - baos.flush(); - IOUtils.closeQuietly(baos); - IOUtils.closeQuietly(bais); - - return data; - } - - /** - * 文件压缩 - * @param path 源文件路径 - * @throws Exception - */ - public static void compress(String path) throws Exception { - compress(path, true); - } - - /** - * 文件压缩 - * @param path 源文件路径 - * @param delete 是否删除源文件,压缩成功后 - * @throws Exception - */ - public static void compress(String path, boolean delete) throws Exception { - File file = new File(path); - compress(file, delete); - } - - /** - * 压缩文件 - * @param file 源文件 - * @throws Exception - */ - public static void compress(File file) throws Exception { - compress(file, true); - } - - /** - * 压缩文件 - * @param file 源文件 - * @param delete 是否删除源文件,压缩成功后 - * @throws Exception - */ - public static void compress(File file, boolean delete) throws Exception { - FileInputStream fis = new FileInputStream(file); - FileOutputStream fos = new FileOutputStream(file.getPath() + EXT); - - compress(fis, fos); - - fos.flush(); - IOUtils.closeQuietly(fos); - IOUtils.closeQuietly(fis); - - if (delete) { - file.delete(); - } - } - - /** - * 二进制数据压缩 - * @param in 输入流 - * @param out 输出流 - * @throws Exception - */ - public static void compress(InputStream in, OutputStream out) throws Exception { - GZIPOutputStream gos = new GZIPOutputStream(out); - - byte[] data = new byte[BUFF]; - for (int count = in.read(data, 0, BUFF); count != -1; count = in.read(data, 0, BUFF)) { - gos.write(data, 0, count); - } - - gos.finish(); - gos.flush(); - IOUtils.closeQuietly(gos); - } - - /********************************************************************************** - * 解压缩 - **********************************************************************************/ - - /** - * 解压缩二进制数据 - * @param data 压缩的二进制数据 - * @return byte[] 解压缩的二进制数据 - * @throws Exception - */ - public static byte[] decompress(byte[] data) throws Exception { - ByteArrayInputStream bais = new ByteArrayInputStream(data); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - decompress(bais, baos); - - data = baos.toByteArray(); - - baos.flush(); - IOUtils.closeQuietly(baos); - IOUtils.closeQuietly(bais); - return data; - } - - /** - * 解压缩文件 - * @param file 源文件 - * @throws Exception - */ - public static void decompress(File file) throws Exception { - decompress(file, true); - } - - /** - * 解压缩文件 - * @param path 源文件路径 - * @throws Exception - */ - public static void decompress(String path) throws Exception { - decompress(path, true); - } - - /** - * 解压缩文件 - * @param path 源文件路径 - * @param delete 是否删除源文件,解压缩完成 - * @throws Exception - */ - public static void decompress(String path, boolean delete) throws Exception { - decompress(new File(path), delete); - } - - /** - * 解压缩文件 - * @param file 源文件 - * @param delete 解压缩完成后,是否删除源文件 - * @throws Exception - */ - public static void decompress(File file, boolean delete) throws Exception { - FileInputStream in = new FileInputStream(file); - FileOutputStream out = new FileOutputStream(file.getPath().replace(EXT, "")); - - decompress(in, out); - - out.flush(); - IOUtils.closeQuietly(out); - IOUtils.closeQuietly(in); - - if (delete) { - file.delete(); - } - } - - /** - * 解压缩文件 - * @param in 输入流 - * @param out 输出流 - * @throws Exception - */ - public static void decompress(InputStream in, OutputStream out) throws Exception { - GZIPInputStream gis = new GZIPInputStream(in); - - byte[] data = new byte[BUFF]; - for (int count = gis.read(data, 0, BUFF); count != -1; count = gis.read(data, 0, BUFF)) { - out.write(data, 0, count); - } - - IOUtils.closeQuietly(gis); - } -} diff --git a/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java b/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java index dbf6fa5..be65726 100644 --- a/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java +++ b/rec-engine/rec-engine-script/src/test/java/cn/icanci/rec/engine/script/test/RecScriptEngineManagerTest.java @@ -1,5 +1,6 @@ package cn.icanci.rec.engine.script.test; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.enums.HttpRequestTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.common.utils.FastJsonUtils; @@ -38,7 +39,7 @@ public class RecScriptEngineManagerTest { request.setEnv("test"); request.setFileName("hello"); - HttpResponseWrapper eval = recScriptEngine.httpEval(HttpRequestTypeEnum.POST, reqUrl, FastJsonUtils.toJSONString(request), 3); + HttpResponseWrapper eval = recScriptEngine.httpEval(HttpRequestTypeEnum.POST, reqUrl, JSONUtil.toJsonStr(request), 3); if (eval.isSuccess()) { System.out.println(eval.isJson()); System.out.println(eval.getResponseForMap()); diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java index ec714b5..0cf35b8 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -1,8 +1,8 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.WebApiResponse; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.common.utils.PropertiesUtil; import cn.icanci.rec.engine.script.client.Client; import cn.icanci.rec.engine.script.client.http.HttpMethod; @@ -90,6 +90,6 @@ public abstract class AbstractLoadSPI { TimeUnit.SECONDS, 3, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); List ret = CLIENT.call(rpcRequest, WebApiResponse.class).getRet(); - return new WebApiResponse<>(FastJsonUtils.fromJSON2List(FastJsonUtils.toJSONString(ret), clazz)); + return new WebApiResponse<>(JSONUtil.toList(JSONUtil.parseArray(ret), clazz)); } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/AbstractFactor.java similarity index 94% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/AbstractFactor.java index 871b469..2cdb6bd 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/AbstractFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.enums.ResultTypeEnum; @@ -17,7 +17,7 @@ import javax.script.CompiledScript; * @author icanci * @since 1.0 Created in 2022/11/16 22:48 */ -public abstract class AbstractCondition implements Condition { +public abstract class AbstractFactor implements Factor { /** 推送仓储 */ @Resource protected EngineRepositoryHolder engineRepositoryHolder; diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/ContainFactor.java similarity index 88% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/ContainFactor.java index f6b3413..0923b29 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/ContainFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -14,8 +14,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/17 09:24 */ @Component -@ConditionBean(OperatorEnum.CONTAIN) -public class ContainCondition extends AbstractCondition { +@FactorBean(OperatorEnum.CONTAIN) +public class ContainFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/EQCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/EQFactor.java similarity index 80% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/EQCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/EQFactor.java index bcb88ce..c4d900e 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/EQCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/EQFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -7,6 +7,7 @@ import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; import java.math.BigDecimal; +import java.util.Objects; import javax.script.Bindings; @@ -18,8 +19,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/16 22:35 */ @Component -@ConditionBean(OperatorEnum.EQ) -public class EQCondition extends AbstractCondition { +@FactorBean(OperatorEnum.EQ) +public class EQFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { @@ -31,7 +32,7 @@ public class EQCondition extends AbstractCondition { case BOOLEAN: return StringUtils.equalsIgnoreCase(leftValue, rightValue); case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) == 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)).compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) == 0; case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) == 0; case STRING: diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/Condition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/Factor.java similarity index 85% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/Condition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/Factor.java index f18ae48..dd42a96 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/Condition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/Factor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -8,7 +8,7 @@ import javax.script.Bindings; * @author icanci * @since 1.0 Created in 2022/11/16 22:03 */ -public interface Condition { +public interface Factor { /** * 是否匹配 * diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionBean.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorBean.java similarity index 82% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionBean.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorBean.java index e07eeda..54c86e2 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionBean.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorBean.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.enums.OperatorEnum; @@ -13,6 +13,6 @@ import java.lang.annotation.Target; */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -public @interface ConditionBean { +public @interface FactorBean { OperatorEnum value(); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionSupport.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorSupport.java similarity index 55% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionSupport.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorSupport.java index 11feea5..8447b5c 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ConditionSupport.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/FactorSupport.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.enums.OperatorEnum; @@ -18,17 +18,17 @@ import com.google.common.collect.Maps; * @since 1.0 Created in 2022/11/16 22:05 */ @Service -public class ConditionSupport implements ApplicationContextAware { +public class FactorSupport implements ApplicationContextAware { /** 执行存储单元 */ - private static final Map REPOSITORY = Maps.newHashMap(); + private static final Map REPOSITORY = Maps.newHashMap(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - Map beansOfTypeMap = applicationContext.getBeansOfType(Condition.class); - Collection conditions = beansOfTypeMap.values(); - for (Condition condition : conditions) { - ConditionBean conditionBean = AopUtils.getTargetClass(condition).getAnnotation(ConditionBean.class); - REPOSITORY.put(conditionBean.value(), condition); + Map beansOfTypeMap = applicationContext.getBeansOfType(Factor.class); + Collection factors = beansOfTypeMap.values(); + for (Factor factor : factors) { + FactorBean factorBean = AopUtils.getTargetClass(factor).getAnnotation(FactorBean.class); + REPOSITORY.put(factorBean.value(), factor); } } @@ -38,7 +38,7 @@ public class ConditionSupport implements ApplicationContextAware { * @param operator operator * @return 返回Condition */ - public Condition getCondition(OperatorEnum operator) { + public Factor getFactor(OperatorEnum operator) { return REPOSITORY.get(operator); } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTEFactor.java similarity index 75% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTEFactor.java index 5535a10..d357a00 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTEFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -7,6 +7,7 @@ import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; import java.math.BigDecimal; +import java.util.Objects; import javax.script.Bindings; @@ -17,8 +18,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/17 09:22 */ @Component -@ConditionBean(OperatorEnum.GTE) -public class GTECondition extends AbstractCondition { +@FactorBean(OperatorEnum.GTE) +public class GTEFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { @@ -30,7 +31,8 @@ public class GTECondition extends AbstractCondition { case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) >= 0; case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) >= 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) + .compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) >= 0; default: // no op } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTFactor.java similarity index 75% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTFactor.java index de86dc5..83070f1 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/GTFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -7,6 +7,7 @@ import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; import java.math.BigDecimal; +import java.util.Objects; import javax.script.Bindings; @@ -17,8 +18,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/16 23:08 */ @Component -@ConditionBean(OperatorEnum.GT) -public class GTCondition extends AbstractCondition { +@FactorBean(OperatorEnum.GT) +public class GTFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { @@ -30,7 +31,8 @@ public class GTCondition extends AbstractCondition { case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) > 0; case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) > 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) + .compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) > 0; default: // no op } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/IncludedFactor.java similarity index 89% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/IncludedFactor.java index 5a1d3d3..44f01fa 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/IncludedFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -17,8 +17,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/17 09:24 */ @Component -@ConditionBean(OperatorEnum.INCLUDED) -public class IncludedCondition extends AbstractCondition { +@FactorBean(OperatorEnum.INCLUDED) +public class IncludedFactor extends AbstractFactor { /** 右值分隔符 */ private static final String RIGHT_SPLIT = "::"; diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTEFactor.java similarity index 75% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTEFactor.java index ae87554..d2e7601 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTEFactor.java @@ -1,10 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; - -import java.math.BigDecimal; - -import javax.script.Bindings; - -import org.springframework.stereotype.Component; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -12,13 +6,20 @@ import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; +import java.math.BigDecimal; +import java.util.Objects; + +import javax.script.Bindings; + +import org.springframework.stereotype.Component; + /** * @author icanci * @since 1.0 Created in 2022/11/17 09:22 */ @Component -@ConditionBean(OperatorEnum.LTE) -public class LTECondition extends AbstractCondition { +@FactorBean(OperatorEnum.LTE) +public class LTEFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { @@ -30,7 +31,8 @@ public class LTECondition extends AbstractCondition { case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) <= 0; case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) <= 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) + .compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) <= 0; default: // no op } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTFactor.java similarity index 75% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTFactor.java index 0333efb..4d839fb 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/LTFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -7,6 +7,7 @@ import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; import java.math.BigDecimal; +import java.util.Objects; import javax.script.Bindings; @@ -17,8 +18,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/16 23:08 */ @Component -@ConditionBean(OperatorEnum.LT) -public class LTCondition extends AbstractCondition { +@FactorBean(OperatorEnum.LT) +public class LTFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { @@ -30,7 +31,8 @@ public class LTCondition extends AbstractCondition { case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) < 0; case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) < 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) + .compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) < 0; default: // no op } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/NEFactor.java similarity index 79% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/NEFactor.java index 8f0d571..f8cf800 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/NEFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -7,6 +7,7 @@ import cn.icanci.rec.common.enums.OperatorEnum; import cn.icanci.rec.common.utils.DateUtils; import java.math.BigDecimal; +import java.util.Objects; import javax.script.Bindings; @@ -18,8 +19,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/17 09:23 */ @Component -@ConditionBean(OperatorEnum.NE) -public class NECondition extends AbstractCondition { +@FactorBean(OperatorEnum.NE) +public class NEFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); @@ -35,7 +36,8 @@ public class NECondition extends AbstractCondition { case NUMBER: return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) != 0; case DATE: - return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) != 0; + return Objects.requireNonNull(DateUtils.parse(leftValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) + .compareTo(DateUtils.parse(rightValue, DateUtils.FormatType.YYYY_MM_DD_HH_MM_SS)) != 0; default: // no op } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/UnContainFactor.java similarity index 87% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/UnContainFactor.java index 97c8fbe..57ad983 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/factor/UnContainFactor.java @@ -1,4 +1,4 @@ -package cn.icanci.rec.engine.sdk.condition; +package cn.icanci.rec.engine.sdk.factor; import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; @@ -14,8 +14,8 @@ import org.springframework.stereotype.Component; * @since 1.0 Created in 2022/11/17 09:24 */ @Component -@ConditionBean(OperatorEnum.UN_CONTAIN) -public class UnContainCondition extends AbstractCondition { +@FactorBean(OperatorEnum.UN_CONTAIN) +public class UnContainFactor extends AbstractFactor { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java index 8154fac..a852a20 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java @@ -1,17 +1,17 @@ package cn.icanci.rec.engine.sdk.rule; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.aggregation.model.DataSourceDTO; import cn.icanci.rec.common.aggregation.model.DomainDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; import cn.icanci.rec.common.enums.*; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; -import cn.icanci.rec.engine.sdk.condition.ConditionSupport; +import cn.icanci.rec.engine.sdk.factor.FactorSupport; import cn.icanci.rec.engine.sdk.exception.ValidatorException; import cn.icanci.rec.engine.sdk.rule.pool.ScriptExecutorPoolHolder; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; @@ -46,7 +46,7 @@ public final class EngineExecutor { private ScriptExecutorPoolHolder scriptExecutorPoolHolder; @Resource - private ConditionSupport conditionSupport; + private FactorSupport factorSupport; /** * 执行入口 @@ -201,7 +201,7 @@ public final class EngineExecutor { } for (StrategyDTO.SingleCondition sc : group) { OperatorEnum operator = OperatorEnum.valueOf(sc.getOperator()); - boolean match = conditionSupport.getCondition(operator).match(bindings, sc, domainCode); + boolean match = factorSupport.getFactor(operator).match(bindings, sc, domainCode); // 命中中断条件的返回值 if (match && ruleMode == RuleModeEnum.COMPLEX && InterruptEnum.valueOf(sc.getInterrupt()) == InterruptEnum.TRUE) { // 执行中断 @@ -264,7 +264,7 @@ public final class EngineExecutor { httpInfo.getTimeout()); if (wrapper.isSuccess()) { String response = wrapper.getResponse(); - if (FastJsonUtils.isJson(response)) { + if (JSONUtil.isJson(response)) { bindings.putAll(wrapper.getResponseForMap()); } else { throw new IllegalArgumentException( @@ -301,12 +301,12 @@ public final class EngineExecutor { return (Map) eval; } else if (eval instanceof String) { String str = String.valueOf(eval); - boolean isJson = FastJsonUtils.isJson(str); + boolean isJson = JSONUtil.isJson(str); if (!isJson) { throw new IllegalArgumentException( ErrorMessageFormat.dataSourceExecutorFail(domain.getDomainName(), strategy.getStrategyName(), dataSource.getDataSourceName(), "脚本执行结果不是Json")); } else { - return FastJsonUtils.fromJSONString(str, Map.class); + return JSONUtil.toBean(str, Map.class); } } else { throw new IllegalArgumentException( diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java index 8b06623..0a65391 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RecNettyClientHandler.java @@ -1,5 +1,6 @@ package cn.icanci.rec.engine.sdk.server; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.model.socket.PublishDTO; import cn.icanci.rec.common.model.socket.SocketMessage; import cn.icanci.rec.common.model.socket.UriConstant; @@ -54,7 +55,7 @@ public class RecNettyClientHandler extends SimpleChannelInboundHandler { Object responseObj = process(httpMethod, uri, requestData); - String responseJson = FastJsonUtils.toJSONString(responseObj); + String responseJson = JSONUtil.toJsonStr(responseObj); writeResponse(ctx, keepAlive, responseJson); }); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java index 5da4376..ad694b7 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java @@ -1,9 +1,9 @@ package cn.icanci.rec.engine.sdk.server; +import cn.hutool.json.JSONUtil; import cn.icanci.rec.common.model.socket.RegisterDTO; import cn.icanci.rec.common.model.socket.UriConstant; import cn.icanci.rec.common.result.R; -import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.common.utils.IPUtils; import cn.icanci.rec.engine.script.client.Client; import cn.icanci.rec.engine.script.client.RemoteException; @@ -150,7 +150,7 @@ public class RegisterClient implements InitializingBean { R call = CLIENT.call(rpcRequest, R.class); - logger.info("Register result:{}", FastJsonUtils.toJSONString(call)); + logger.info("Register result:{}", JSONUtil.toJsonStr(call)); return call; } diff --git a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java index af9d2b3..1d40b0f 100644 --- a/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java +++ b/rec-spi/src/main/java/cn/icanci/rec/spi/event/DefaultEventDispatcher.java @@ -5,6 +5,7 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -20,18 +21,17 @@ public class DefaultEventDispatcher extends AbstractEventDispatcher { * 注册事件和监听器 */ @Override + @SuppressWarnings("all") protected void register() { - String[] names = applicationContext.getBeanDefinitionNames(); - for (String name : names) { - Object bean = applicationContext.getBean(name); - if (bean instanceof BaseEvent) { - eventClasses.add(bean.getClass()); - } - if (bean instanceof BaseEventListener) { - listeners.add((BaseEventListener) bean); - } + Map eventMap = applicationContext.getBeansOfType(BaseEvent.class); + for (BaseEvent bean : eventMap.values()) { + eventClasses.add(bean.getClass()); } + Map listenerMap = applicationContext.getBeansOfType(BaseEventListener.class); + for (BaseEventListener bean : listenerMap.values()) { + listeners.add(bean); + } postEventListenerMapper(); } -- Gitee