From 22ce599a26e15a6a0ea6f7cbbcca65436838ff32 Mon Sep 17 00:00:00 2001 From: icanci Date: Wed, 16 Nov 2022 08:27:02 +0800 Subject: [PATCH] rec-engine-sdk --- README.md | 3 +- .../rec/admin/biz/config/RecAdminConfig.java | 2 +- .../dal/mongodb/dateobject/DataSourceDO.java | 13 +- .../rec/admin/web/model/DataSource.java | 12 + .../admin/web/webapi/WebApiController.java | 30 ++ .../common/aggregation/RuleAggregation.java | 6 +- .../{BaseDataDO.java => BaseDataDTO.java} | 2 +- .../aggregation/model/DataSourceDTO.java | 13 +- .../rec/common/model/config/DataSourceVO.java | 13 +- rec-core/pom.xml | 34 ++- .../resources/rec-http-spi-load.properties | 6 + .../resources/rec-netty-spi-load.properties | 1 + rec-engine/pom.xml | 3 +- .../engine/rule/RuleAggregationCluster.java | 12 - .../rule/impl/RuleAggregationClusterImpl.java | 14 - .../icanci/rec/engine/rule/package-info.java | 7 - .../pom.xml | 26 +- .../rec/engine/sdk/http/PropertiesUtil.java | 56 ++++ .../rec/engine/sdk/http/package-info.java | 5 + .../engine/sdk/http/spi/AbstractLoadSPI.java | 24 ++ .../engine/sdk/http/spi/HttpBaseDataSPI.java | 24 ++ .../sdk/http/spi/HttpDataSourceSPI.java | 28 ++ .../engine/sdk/http/spi}/HttpDomainSPI.java | 17 +- .../engine/sdk/http/spi/HttpMetadataSPI.java | 23 ++ .../rec/engine/sdk/http/spi/HttpSceneSPI.java | 28 ++ .../engine/sdk/http/spi/HttpStrategySPI.java | 28 ++ .../cn.icanci.rec.engine.sdk.spi.BaseDataSPI | 1 + ...cn.icanci.rec.engine.sdk.spi.DataSourceSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.DomainSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.MetadataSPI | 1 + .../rec/cn.icanci.rec.engine.sdk.spi.SceneSPI | 1 + .../cn.icanci.rec.engine.sdk.spi.StrategySPI | 1 + rec-engine/rec-engine-sdk-netty/pom.xml | 26 ++ .../rec/engine/sdk/netty/package-info.java | 5 + rec-engine/rec-engine-sdk/pom.xml | 11 + .../engine/sdk/RecEngineSDKAutoConfig.java | 163 ++++++++++ .../{ => actuator}/RecRuleEngineActuator.java | 5 +- .../actuator/RecRuleEngineActuatorImpl.java | 15 - .../impl/RecRuleEngineActuatorImpl.java | 25 ++ .../exception/RuleAggregationException.java | 29 ++ .../sdk/extensions/RecExtensionLoader.java | 117 +++++++ .../rec/engine/sdk/extensions/RecSpi.java | 15 + .../rec/engine/sdk/rule/EngineExecutor.java | 21 ++ .../sdk/rule/EngineRepositoryLoader.java | 72 +++++ .../sdk/rule/RuleAggregationCluster.java | 31 ++ .../rule/impl/EngineRepositoryLoaderImpl.java | 81 +++++ .../rule/impl/RuleAggregationClusterImpl.java | 58 ++++ .../sdk/rule/repository/EngineRepository.java | 86 ++++++ .../engine/sdk/rule/runtime/BaseCompiled.java | 100 ++++++ .../sdk/rule/runtime/BaseDataCompiled.java | 132 ++++++++ .../sdk/rule/runtime/DataSourceCompiled.java | 255 ++++++++++++++++ .../sdk/rule/runtime/DomainCompiled.java | 34 +++ .../sdk/rule/runtime/MetadataCompiled.java | 76 +++++ .../rule/runtime/RuleAggregationCompiled.java | 96 ++++++ .../sdk/rule/runtime/SceneCompiled.java | 64 ++++ .../sdk/rule/runtime/StrategyCompiled.java | 285 ++++++++++++++++++ .../rec/engine/sdk/spi/BaseDataSPI.java | 6 +- .../rec/engine/sdk/spi/DataSourceSPI.java | 15 +- .../icanci/rec/engine/sdk/spi/DomainSPI.java | 13 +- .../rec/engine/sdk/spi/MetadataSPI.java | 6 +- .../rec/engine/sdk/spi/RecSupportSPI.java | 6 +- .../icanci/rec/engine/sdk/spi/SceneSPI.java | 14 +- .../rec/engine/sdk/spi/StrategySPI.java | 15 +- .../engine/sdk/spi/mongo/MongoDomainSPI.java | 23 -- .../main/resources/META-INF/spring.factories | 1 + 65 files changed, 2206 insertions(+), 131 deletions(-) create mode 100644 rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/webapi/WebApiController.java rename rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/{BaseDataDO.java => BaseDataDTO.java} (98%) create mode 100644 rec-core/src/main/resources/rec-http-spi-load.properties create mode 100644 rec-core/src/main/resources/rec-netty-spi-load.properties delete mode 100644 rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/RuleAggregationCluster.java delete mode 100644 rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/impl/RuleAggregationClusterImpl.java delete mode 100644 rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/package-info.java rename rec-engine/{rec-engine-rule => rec-engine-sdk-http}/pom.xml (48%) create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/package-info.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java rename rec-engine/{rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/http => rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi}/HttpDomainSPI.java (33%) create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI create mode 100644 rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI create mode 100644 rec-engine/rec-engine-sdk-netty/pom.xml create mode 100644 rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/package-info.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java rename rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/{ => actuator}/RecRuleEngineActuator.java (67%) delete mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuatorImpl.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/RuleAggregationException.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecExtensionLoader.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseDataCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DataSourceCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DomainCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/MetadataCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/RuleAggregationCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/SceneCompiled.java create mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/StrategyCompiled.java delete mode 100644 rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/mongo/MongoDomainSPI.java create mode 100755 rec-engine/rec-engine-sdk/src/main/resources/META-INF/spring.factories diff --git a/README.md b/README.md index 6ab610c..73cfd05 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,10 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - rec-core:核心独立部署服务 - 加载所有域进行流程处理,提供Facade接口和MQ的方式进行数据处理 - rec-engine:规则引擎处理器 - - rec-engine-rule:规则引擎规则处理 - rec-engine-script:规则引擎脚本处理器 - rec-engine-sdk:规则引擎SDK + - rec-engine-sdk-http:规则引擎SDK的SPI实现,加载数据,HTTP实现 + - rec-engine-sdk-netty:规则引擎SDK的SPI实现,加载数据,Netty实现 - rec-socket:rec通信管理 - rec-socket-client:rec通信客户端 - rec-socket-server:rec通信服务端 diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java index d2412d9..b830f7d 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/config/RecAdminConfig.java @@ -38,7 +38,7 @@ public class RecAdminConfig implements ApplicationContextAware { * @return 返回脚本执行引擎 */ @Bean("recScriptEngine") - public RecScriptEngine RecScriptEngine() { + public RecScriptEngine recScriptEngine() { return RecScriptEngineManager.getRecScriptEngine(); } diff --git a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/dateobject/DataSourceDO.java b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/dateobject/DataSourceDO.java index 313e66d..379bf33 100644 --- a/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/dateobject/DataSourceDO.java +++ b/rec-admin/rec-admin-dal/src/main/java/cn/icanci/rec/admin/dal/mongodb/dateobject/DataSourceDO.java @@ -9,7 +9,10 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; * @since 1.0 Created in 2022/11/11 11:43 */ public class DataSourceDO extends BaseDO { - + /** + * 域Code + */ + private String domainCode; /** * 数据源名称 */ @@ -173,6 +176,14 @@ public class DataSourceDO extends BaseDO { } } + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + public String getDataSourceName() { return dataSourceName; } diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/model/DataSource.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/model/DataSource.java index 2dddeb1..65e7a14 100644 --- a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/model/DataSource.java +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/model/DataSource.java @@ -11,6 +11,10 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; public class DataSource extends Base { private static final long serialVersionUID = -5499193647522360887L; + /** + * 域Code + */ + private String domainCode; /** * 数据源名称 */ @@ -174,6 +178,14 @@ public class DataSource extends Base { } } + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + public String getDataSourceName() { return dataSourceName; } diff --git a/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/webapi/WebApiController.java b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/webapi/WebApiController.java new file mode 100644 index 0000000..b7cbeaf --- /dev/null +++ b/rec-admin/rec-admin-web/src/main/java/cn/icanci/rec/admin/web/webapi/WebApiController.java @@ -0,0 +1,30 @@ +package cn.icanci.rec.admin.web.webapi; + +import cn.icanci.rec.common.enums.DataSourceTypeEnum; +import cn.icanci.rec.common.model.TextValue; +import cn.icanci.rec.common.result.R; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:51 + */ +@RestController +@RequestMapping("/rec/webapi") +public class WebApiController { + + // TODO + @GetMapping("dataSourceType") + public R dataSourceType() { + List textValues = Arrays.stream(DataSourceTypeEnum.values()).map(x -> new TextValue(x.getDesc(), x.name())).collect(Collectors.toList()); + return R.builderOk().data("textValues", textValues).build(); + } + +} diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java index 339eca3..7dfc384 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java @@ -18,7 +18,7 @@ public class RuleAggregation { /** 场景 */ private SceneDTO.ScenePair scenePair; /** 基础数据 */ - private List baseDatas; + private List baseDatas; /** 元数据 */ private List metadatas; /** 数据源 */ @@ -42,11 +42,11 @@ public class RuleAggregation { this.scenePair = scenePair; } - public List getBaseDatas() { + public List getBaseDatas() { return baseDatas; } - public void setBaseDatas(List baseDatas) { + public void setBaseDatas(List baseDatas) { this.baseDatas = baseDatas; } diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDO.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java similarity index 98% rename from rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDO.java rename to rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java index 0abb228..fe8ebd3 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDO.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java @@ -8,7 +8,7 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; * @author icanci * @since 1.0 Created in 2022/11/15 17:14 */ -public class BaseDataDO extends BaseDTO { +public class BaseDataDTO extends BaseDTO { private static final long serialVersionUID = -509622609203854310L; /** * 域Code diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java index 9ede3d6..ee1476f 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java @@ -10,7 +10,10 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; */ public class DataSourceDTO extends BaseDTO { private static final long serialVersionUID = -236906855236316919L; - + /** + * 域Code + */ + private String domainCode; /** * 数据源名称 */ @@ -174,6 +177,14 @@ public class DataSourceDTO extends BaseDTO { } } + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + public String getDataSourceName() { return dataSourceName; } diff --git a/rec-common/src/main/java/cn/icanci/rec/common/model/config/DataSourceVO.java b/rec-common/src/main/java/cn/icanci/rec/common/model/config/DataSourceVO.java index ac3975f..29206e7 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/model/config/DataSourceVO.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/model/config/DataSourceVO.java @@ -11,7 +11,10 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; * @since 1.0 Created in 2022/10/30 08:05 */ public class DataSourceVO extends BaseVO { - + /** + * 域Code + */ + private String domainCode; /** * 数据源名称 */ @@ -33,6 +36,14 @@ public class DataSourceVO extends BaseVO { */ private SqlInfo sqlInfo; + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + public String getDataSourceName() { return dataSourceName; } diff --git a/rec-core/pom.xml b/rec-core/pom.xml index 7259977..aed63f7 100644 --- a/rec-core/pom.xml +++ b/rec-core/pom.xml @@ -34,9 +34,40 @@ rec-common ${revision} + + cn.icanci.rec + rec-engine-sdk + ${revision} + + + cn.icanci.rec + rec-engine-sdk-http + ${revision} + + + + org.mvel + mvel2 + + + org.codehaus.groovy + groovy-all + pom + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + com.google.guava + guava + - @@ -65,6 +96,7 @@ **/*.yml **/*.xml + **/*.properties diff --git a/rec-core/src/main/resources/rec-http-spi-load.properties b/rec-core/src/main/resources/rec-http-spi-load.properties new file mode 100644 index 0000000..46b31fc --- /dev/null +++ b/rec-core/src/main/resources/rec-http-spi-load.properties @@ -0,0 +1,6 @@ +# ???? +rec-http-request-url=http://localhost:9999/rec/webapi/dataSourceType +# ?????????true???????????????false????rec-load-domains?? +rec-load-all=true +# ?rec-load-all?false????rec-load-domains????????????,?? +rec-load-domains=xxx,xxx,xxx \ No newline at end of file diff --git a/rec-core/src/main/resources/rec-netty-spi-load.properties b/rec-core/src/main/resources/rec-netty-spi-load.properties new file mode 100644 index 0000000..cac9075 --- /dev/null +++ b/rec-core/src/main/resources/rec-netty-spi-load.properties @@ -0,0 +1 @@ +rec-http-request-url=http://localhost:9999/rec/webapi/dataSourceType \ No newline at end of file diff --git a/rec-engine/pom.xml b/rec-engine/pom.xml index 9dadbc6..92b3072 100644 --- a/rec-engine/pom.xml +++ b/rec-engine/pom.xml @@ -13,8 +13,9 @@ pom rec-engine-script - rec-engine-rule rec-engine-sdk + rec-engine-sdk-http + rec-engine-sdk-netty diff --git a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/RuleAggregationCluster.java b/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/RuleAggregationCluster.java deleted file mode 100644 index afb1787..0000000 --- a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/RuleAggregationCluster.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.icanci.rec.engine.rule; - -/** - * 规则聚合簇 - * - * @author icanci - * @since 1.0 Created in 2022/11/15 15:32 - */ -public interface RuleAggregationCluster { - - void build(); -} diff --git a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/impl/RuleAggregationClusterImpl.java b/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/impl/RuleAggregationClusterImpl.java deleted file mode 100644 index a4ae384..0000000 --- a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/impl/RuleAggregationClusterImpl.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.icanci.rec.engine.rule.impl; - -import cn.icanci.rec.engine.rule.RuleAggregationCluster; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/15 15:36 - */ -public class RuleAggregationClusterImpl implements RuleAggregationCluster { - @Override - public void build() { - - } -} diff --git a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/package-info.java b/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/package-info.java deleted file mode 100644 index bc92a5d..0000000 --- a/rec-engine/rec-engine-rule/src/main/java/cn/icanci/rec/engine/rule/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 规则引擎-规则 - * - * @author icanci - * @since 1.0 Created in 2022/11/12 22:40 - */ -package cn.icanci.rec.engine.rule; \ No newline at end of file diff --git a/rec-engine/rec-engine-rule/pom.xml b/rec-engine/rec-engine-sdk-http/pom.xml similarity index 48% rename from rec-engine/rec-engine-rule/pom.xml rename to rec-engine/rec-engine-sdk-http/pom.xml index 70e35c0..b925fb7 100644 --- a/rec-engine/rec-engine-rule/pom.xml +++ b/rec-engine/rec-engine-sdk-http/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - rec-engine-rule + rec-engine-sdk-http 8 @@ -19,30 +19,8 @@ cn.icanci.rec - rec-common + rec-engine-sdk ${revision} - - - org.mvel - mvel2 - - - org.codehaus.groovy - groovy-all - pom - - - org.apache.commons - commons-lang3 - - - org.apache.commons - commons-collections4 - - - com.google.guava - guava - \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java new file mode 100644 index 0000000..ff1ecb1 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/PropertiesUtil.java @@ -0,0 +1,56 @@ +package cn.icanci.rec.engine.sdk.http; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:38 + */ +public class PropertiesUtil { + /** + * The constant confProperties. + */ + private static Properties confProperties; + + /** + * 初始化 + * + * @param classLoader classLoader + * @param sourcePath sourcePath + */ + private static void init(ClassLoader classLoader, String sourcePath) { + if (confProperties == null) { + confProperties = new Properties(); + + try (InputStream in = classLoader.getResourceAsStream(sourcePath)) { + confProperties.load(in); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * Get string. + * + * @param classLoader 类加载器 + * @return the string + */ + public static Map getPropertyMap(ClassLoader classLoader, String sourcePath) { + // 初始化加载 + init(classLoader, sourcePath); + + Map propertyMap = new HashMap<>(); + Iterator> iterator = confProperties.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry next = iterator.next(); + propertyMap.put((String) next.getKey(), (String) next.getValue()); + } + return propertyMap; + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/package-info.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/package-info.java new file mode 100644 index 0000000..78f6f83 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:02 + */ +package cn.icanci.rec.engine.sdk.http; \ No newline at end of file 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 new file mode 100644 index 0000000..6130ee1 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import cn.icanci.rec.engine.sdk.http.PropertiesUtil; + +import java.util.Map; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:35 + */ +public abstract class AbstractLoadSPI { + + private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; + + private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + + protected static final String REQ_HTTP_PATH; + + static { + // 加载数据 + Map propertyMap = PropertiesUtil.getPropertyMap(Thread.currentThread().getContextClassLoader(), PROPERTIES_NAME); + REQ_HTTP_PATH = propertyMap.get(REQ_HTTP_PATH_PROP); + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java new file mode 100644 index 0000000..0765075 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpBaseDataSPI.java @@ -0,0 +1,24 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; +import cn.icanci.rec.engine.sdk.spi.BaseDataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:26 + */ +public class HttpBaseDataSPI extends AbstractLoadSPI implements BaseDataSPI { + + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java new file mode 100644 index 0000000..895ba79 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import cn.icanci.rec.common.aggregation.model.DataSourceDTO; +import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:26 + */ +public class HttpDataSourceSPI extends AbstractLoadSPI implements DataSourceSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + + @Override + public DataSourceDTO loadOne(String domain, String uuid) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/http/HttpDomainSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java similarity index 33% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/http/HttpDomainSPI.java rename to rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java index 83e1ca1..db0bc12 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/http/HttpDomainSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java @@ -1,6 +1,6 @@ -package cn.icanci.rec.engine.sdk.spi.http; +package cn.icanci.rec.engine.sdk.http.spi; -import cn.icanci.rec.common.model.config.DomainVO; +import cn.icanci.rec.common.aggregation.model.DomainDTO; import cn.icanci.rec.engine.sdk.spi.DomainSPI; import java.util.List; @@ -8,17 +8,22 @@ import java.util.Set; /** * @author icanci - * @since 1.0 Created in 2022/11/13 09:18 + * @since 1.0 Created in 2022/11/15 21:02 */ -public class HttpDomainSPI implements DomainSPI { +public class HttpDomainSPI extends AbstractLoadSPI implements DomainSPI { @Override - public List load(Set domains) { + public DomainDTO loadOne(String domain) { return null; } @Override - public List load(String domain) { + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { return null; } } diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java new file mode 100644 index 0000000..8426dd1 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpMetadataSPI.java @@ -0,0 +1,23 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import cn.icanci.rec.common.aggregation.model.MetadataDTO; +import cn.icanci.rec.engine.sdk.spi.MetadataSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:27 + */ +public class HttpMetadataSPI extends AbstractLoadSPI implements MetadataSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java new file mode 100644 index 0000000..9a62b82 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpSceneSPI.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import cn.icanci.rec.common.aggregation.model.SceneDTO; +import cn.icanci.rec.engine.sdk.spi.SceneSPI; + +import java.util.List; +import java.util.Set; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:28 + */ +public class HttpSceneSPI extends AbstractLoadSPI implements SceneSPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + + @Override + public SceneDTO loadOne(String domainCode) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java new file mode 100644 index 0000000..d5f4c93 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java @@ -0,0 +1,28 @@ +package cn.icanci.rec.engine.sdk.http.spi; + +import java.util.List; +import java.util.Set; + +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.engine.sdk.spi.StrategySPI; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:29 + */ +public class HttpStrategySPI extends AbstractLoadSPI implements StrategySPI { + @Override + public List load(Set domains) { + return null; + } + + @Override + public List load(String domain) { + return null; + } + + @Override + public StrategyDTO loadOne(String domain, String sceneCode) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI new file mode 100644 index 0000000..4c377b5 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.BaseDataSPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpBaseDataSPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI new file mode 100644 index 0000000..3c077e8 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DataSourceSPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpDataSourceSPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI new file mode 100644 index 0000000..a28aee9 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.DomainSPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpDomainSPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI new file mode 100644 index 0000000..75be0ef --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.MetadataSPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpMetadataSPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI new file mode 100644 index 0000000..65ed2f2 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.SceneSPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpSceneSPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI new file mode 100644 index 0000000..cd77166 --- /dev/null +++ b/rec-engine/rec-engine-sdk-http/src/main/resources/META-INF/rec/cn.icanci.rec.engine.sdk.spi.StrategySPI @@ -0,0 +1 @@ +cn.icanci.rec.engine.sdk.http.spi.HttpStrategySPI \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-netty/pom.xml b/rec-engine/rec-engine-sdk-netty/pom.xml new file mode 100644 index 0000000..079e37d --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/pom.xml @@ -0,0 +1,26 @@ + + + + rec-engine + cn.icanci.rec + ${revision} + + 4.0.0 + + rec-engine-sdk-netty + + + 8 + 8 + + + + + cn.icanci.rec + rec-engine-sdk + ${revision} + + + \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/package-info.java b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/package-info.java new file mode 100644 index 0000000..fc2ce78 --- /dev/null +++ b/rec-engine/rec-engine-sdk-netty/src/main/java/cn/icanci/rec/engine/sdk/netty/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:22 + */ +package cn.icanci.rec.engine.sdk.netty; \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk/pom.xml b/rec-engine/rec-engine-sdk/pom.xml index 73cb972..56f642e 100644 --- a/rec-engine/rec-engine-sdk/pom.xml +++ b/rec-engine/rec-engine-sdk/pom.xml @@ -32,6 +32,17 @@ rec-engine-script ${revision} + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + org.mvel diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java new file mode 100644 index 0000000..86c6fef --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java @@ -0,0 +1,163 @@ +package cn.icanci.rec.engine.sdk; + +import org.springframework.beans.BeansException; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; +import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; +import cn.icanci.rec.engine.sdk.actuator.impl.RecRuleEngineActuatorImpl; +import cn.icanci.rec.engine.sdk.extensions.RecExtensionLoader; +import cn.icanci.rec.engine.sdk.rule.EngineExecutor; +import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; +import cn.icanci.rec.engine.sdk.rule.RuleAggregationCluster; +import cn.icanci.rec.engine.sdk.rule.impl.EngineRepositoryLoaderImpl; +import cn.icanci.rec.engine.sdk.rule.impl.RuleAggregationClusterImpl; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.spi.*; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 20:34 + */ + +@Configuration +@ConditionalOnClass(RuleAggregationCluster.class) +public class RecEngineSDKAutoConfig implements ApplicationContextAware { + /** + * Spring 上下文 + */ + private ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + /** + * 执行引擎入口 + * + * @return 返回执行引擎入口 + */ + @Bean("recRuleEngineActuator") + public RecRuleEngineActuator recRuleEngineActuator() { + return new RecRuleEngineActuatorImpl(); + } + + /** + * 执行人 + * + * @return 返回执行人 + */ + @Bean("engineExecutor") + public EngineExecutor engineExecutor() { + return new EngineExecutor(); + } + + /** + * 执行引擎 + * + * @return 返回脚本执行引擎 + */ + @Bean("recScriptEngine") + public RecScriptEngine recScriptEngine() { + return RecScriptEngineManager.getRecScriptEngine(); + } + + /** + * 执行引擎 + * + * @return 返回脚本执行引擎 + */ + @Bean("ruleAggregationCluster") + public RuleAggregationCluster ruleAggregationCluster(EngineRepository engineRepository, RecScriptEngine engine) { + return new RuleAggregationClusterImpl(engineRepository, engine); + } + + /** + * 执行引擎 + * + * @return 返回脚本执行引擎 + */ + @Bean("engineRepository") + public EngineRepository engineRepository() { + return new EngineRepository(); + } + + // ============================== SPI ============================== + + /** + * 仓储加载执行引擎 + * + * @return 返回仓储加载执行引擎 + */ + @Bean("engineRepositoryLoader") + public EngineRepositoryLoader engineRepositoryLoader() { + return new EngineRepositoryLoaderImpl(); + } + + /** + * domainSPI + * + * @return domainSPI + */ + @Bean("domainSPI") + public DomainSPI domainSPI() { + return RecExtensionLoader.getExtensionLoader(DomainSPI.class).getExtension(); + } + + /** + * BaseDataSPI + * + * @return BaseDataSPI + */ + @Bean("baseDataSPI") + public BaseDataSPI baseDataSPI() { + return RecExtensionLoader.getExtensionLoader(BaseDataSPI.class).getExtension(); + } + + /** + * DataSourceSPI + * + * @return DataSourceSPI + */ + @Bean("dataSourceSPI") + public DataSourceSPI dataSourceSPI() { + return RecExtensionLoader.getExtensionLoader(DataSourceSPI.class).getExtension(); + } + + /** + * MetadataSPI + * + * @return 返回MetadataSPI脚本执行引擎 + */ + @Bean("metadataSPI") + public MetadataSPI metadataSPI() { + return RecExtensionLoader.getExtensionLoader(MetadataSPI.class).getExtension(); + } + + /** + * SceneSPI + * + * @return SceneSPI + */ + @Bean("sceneSPI") + public SceneSPI sceneSPI() { + return RecExtensionLoader.getExtensionLoader(SceneSPI.class).getExtension(); + } + + /** + * StrategySPI + * + * @return StrategySPI + */ + @Bean("strategySPI") + public StrategySPI strategySPI() { + return RecExtensionLoader.getExtensionLoader(StrategySPI.class).getExtension(); + } + +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecRuleEngineActuator.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuator.java similarity index 67% rename from rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecRuleEngineActuator.java rename to rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuator.java index 13ae897..3906f64 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecRuleEngineActuator.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuator.java @@ -1,7 +1,4 @@ -package cn.icanci.rec.engine.sdk; - -import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; -import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; +package cn.icanci.rec.engine.sdk.actuator; /** * 规则引擎执行器入口 diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuatorImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuatorImpl.java deleted file mode 100644 index 7fff05b..0000000 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RecRuleEngineActuatorImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.icanci.rec.engine.sdk.actuator; - -import cn.icanci.rec.engine.sdk.RecRuleEngineActuator; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/13 15:21 - */ -public class RecRuleEngineActuatorImpl implements RecRuleEngineActuator { - - @Override - public RuleEngineResponse executor(RuleEngineRequest request) { - return null; - } -} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java new file mode 100644 index 0000000..1e12445 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java @@ -0,0 +1,25 @@ +package cn.icanci.rec.engine.sdk.actuator.impl; + +import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; +import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; +import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; + +import javax.annotation.Resource; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/13 15:21 + */ +public class RecRuleEngineActuatorImpl implements RecRuleEngineActuator { + + @Resource + private EngineRepository engineRepository; + + @Override + public RuleEngineResponse executor(RuleEngineRequest request) { + RuleAggregationCompiled compiled = engineRepository.loadRuleAggregationCompiled(request.getDomainCode(), request.getSceneCode()); + return null; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/RuleAggregationException.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/RuleAggregationException.java new file mode 100644 index 0000000..1fe2d60 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/exception/RuleAggregationException.java @@ -0,0 +1,29 @@ +package cn.icanci.rec.engine.sdk.exception; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 19:03 + */ +public class RuleAggregationException extends RuntimeException { + private static final long serialVersionUID = 7174187020377141821L; + + public RuleAggregationException() { + super(); + } + + public RuleAggregationException(String message) { + super(message); + } + + public RuleAggregationException(String message, Throwable cause) { + super(message, cause); + } + + public RuleAggregationException(Throwable cause) { + super(cause); + } + + protected RuleAggregationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecExtensionLoader.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecExtensionLoader.java new file mode 100644 index 0000000..8af0096 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecExtensionLoader.java @@ -0,0 +1,117 @@ +package cn.icanci.rec.engine.sdk.extensions; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Enumeration; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:15 + */ +public class RecExtensionLoader { + /** + * 约定第三方实现配置文件目录 + **/ + private static final String SERVICE_DIRECTORY = "META-INF/rec/"; + + /** + * 接口的类型,用于获取此接口下的第三方实现 + **/ + private Class type; + + private RecExtensionLoader(Class type) { + this.type = type; + } + + /** + * 通过接口的{@link Class}对象获取其第三方实现类的加载器 + * + * @param type type + * @param + * @return ExtensionLoader 返回一个指定接口类型的类加载器辅助类 + */ + public static RecExtensionLoader getExtensionLoader(Class type) { + if (type == null) { + throw new IllegalArgumentException("SPI needs to know which third-party implementation you want to find"); + } + if (!type.isInterface()) { + throw new IllegalArgumentException("Only third-party implementations of interface types are supported!"); + } + if (type.getAnnotation(RecSpi.class) == null) { + throw new IllegalArgumentException("The target interface must be marked with @RecSpi annotation!"); + } + return new RecExtensionLoader<>(type); + } + + /** + * 获取这个接口指定名称的第三方实现对象 + * + * @return 返回目标实现 + */ + public T getExtension() { + // 加载到一个第三方实现 + Class clazz = loadExtensionFile(); + if (clazz == null) { + return null; + } + try { + return clazz.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException("Instantiation failed: " + clazz); + } + } + + /** + * 加载约定好的目录下方的名称为接口全路径的扩展文件 + * + * @return Class 返回目标第三方实现的{@link Class}对象 + */ + private Class loadExtensionFile() { + // 想要获取谁的实现类 + String fileName = RecExtensionLoader.SERVICE_DIRECTORY + type.getName(); + try { + Enumeration urls; + ClassLoader classLoader = RecExtensionLoader.class.getClassLoader(); + urls = classLoader.getResources(fileName); + if (urls != null) { + URL resourceUrl = urls.nextElement(); + return loadResource(classLoader, resourceUrl); + } + return null; + } catch (IOException e) { + return null; + } + } + + /** + * 读取扩展文件的内容,找到第三方实现的全路径,并获得其{@link Class}对象 + * + * @param classLoader 扩展类加载器辅助类的类加载器 + * @param resourceUrl 文件在资源{@code URL} + * @return Class 返回目标{@link Class}对象 + */ + @SuppressWarnings("unchecked") + private Class loadResource(ClassLoader classLoader, URL resourceUrl) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceUrl.openStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + // 可能是注释 + final int ci = line.indexOf('#'); + // 如果是第一个位置,则这一行都可以不用解析了 + if (ci == 0) { + continue; + } else if (ci > 0) { + // 如果非第一个位置,需要将注释前面的内容取出来,也就是将注释后面的内容截取 + line = line.substring(0, ci); + } + return (Class) classLoader.loadClass(line.trim()); + } + } catch (IOException | ClassNotFoundException e) { + return null; + } + return null; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java new file mode 100644 index 0000000..97f8dd2 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/extensions/RecSpi.java @@ -0,0 +1,15 @@ +package cn.icanci.rec.engine.sdk.extensions; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 21:16 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface RecSpi { +} 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 new file mode 100644 index 0000000..491f1ad --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java @@ -0,0 +1,21 @@ +package cn.icanci.rec.engine.sdk.rule; + +import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; +import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; + +import javax.annotation.Resource; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 23:17 + */ +public final class EngineExecutor { + + @Resource + private EngineRepository engineRepository; + + public RuleEngineResponse execute(RuleEngineRequest request) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java new file mode 100644 index 0000000..b14744d --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java @@ -0,0 +1,72 @@ +package cn.icanci.rec.engine.sdk.rule; + +import java.util.List; + +import cn.icanci.rec.common.aggregation.model.*; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 19:16 + */ +public interface EngineRepositoryLoader { + + /** + * 加载域信息 + * + * @param domainCode domainCode + * @return 返回加载域信息 + */ + DomainDTO loadDomain(String domainCode); + + /** + * 加载场景对信息 + * + * + * @param domainCode domainCode + * @param sceneCode sceneCode + * @return 返回场景对信息 + */ + SceneDTO.ScenePair loadScenePair(String domainCode, String sceneCode); + + /** + * 加载场景对信息 + * + * @param domainCode domainCode + * @return 返回场景对信息 + */ + List loadScenePairs(String domainCode); + + /** + * 加载基础数据 + * + * @param domainCode domainCode + * @return 返回基础数据 + */ + List loadBaseDatas(String domainCode); + + /** + * 加载元数据 + * + * @param domainCode domainCode + * @return 返回元数据 + */ + List loadMetadatas(String domainCode); + + /** + * 加载数据源信息 + * + * @param domainCode domainCode + * @param sceneCode sceneCode + * @return 返回数据源信息 + */ + DataSourceDTO loadDataSource(String domainCode, String sceneCode); + + /** + * 加载执行策略 + * + * @param domainCode domainCode + * @param sceneCode sceneCode + * @return 返回执行策略 + */ + StrategyDTO loadStrategy(String domainCode, String sceneCode); +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java new file mode 100644 index 0000000..143b076 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java @@ -0,0 +1,31 @@ +package cn.icanci.rec.engine.sdk.rule; + +import cn.icanci.rec.common.aggregation.RuleAggregation; +import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; + +/** + * 规则聚合簇 + * + * @author icanci + * @since 1.0 Created in 2022/11/15 15:32 + */ +public interface RuleAggregationCluster { + + /** + * 根据DomainCode构建聚合,一个聚合为一个规则构建与执行单元 + * + * @param domainCode domainCode + * @param sceneCode 场景Code + * @return 返回构建的聚合 + */ + RuleAggregation buildAgg(String domainCode, String sceneCode); + + /** + * 根据DomainCode构建编译之后的聚合,一个聚合为一个规则构建与执行单元 + * + * @param domainCode domainCode + * @param sceneCode 场景Code + * @return 返回编译之后的聚合 + */ + RuleAggregationCompiled compileAgg(String domainCode, String sceneCode); +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java new file mode 100644 index 0000000..a5ecfe9 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java @@ -0,0 +1,81 @@ +package cn.icanci.rec.engine.sdk.rule.impl; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import cn.icanci.rec.common.aggregation.model.*; +import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; +import cn.icanci.rec.engine.sdk.spi.*; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 19:28 + */ +@Service +public class EngineRepositoryLoaderImpl implements EngineRepositoryLoader { + + @Resource + private DomainSPI domainSPI; + @Resource + private SceneSPI sceneSPI; + @Resource + private BaseDataSPI baseDataSPI; + @Resource + private MetadataSPI metadataSPI; + @Resource + private DataSourceSPI dataSourceSPI; + @Resource + private StrategySPI strategySPI; + + private static final Map DOMAIN_DTO_MAP = new ConcurrentHashMap<>(); + + @Override + public DomainDTO loadDomain(String domainCode) { + return domainSPI.loadOne(domainCode); + } + + @Override + public SceneDTO.ScenePair loadScenePair(String domainCode, String sceneCode) { + SceneDTO scene = sceneSPI.loadOne(domainCode); + Optional optional = scene.getScenePairs().stream().filter(pair -> StringUtils.equals(pair.getSceneCode(), sceneCode)).findFirst(); + return optional.orElse(null); + } + + @Override + public List loadScenePairs(String domainCode) { + SceneDTO scene = sceneSPI.loadOne(domainCode); + return scene.getScenePairs(); + } + + @Override + public List loadBaseDatas(String domainCode) { + return baseDataSPI.load(domainCode); + } + + @Override + public List loadMetadatas(String domainCode) { + return metadataSPI.load(domainCode); + } + + @Override + public DataSourceDTO loadDataSource(String domainCode, String sceneCode) { + StrategyDTO strategy = loadStrategy(domainCode, sceneCode); + if (strategy == null || StringUtils.isBlank(strategy.getDataSourceUuid())) { + return null; + } + String dataSourceUuid = strategy.getDataSourceUuid(); + return dataSourceSPI.loadOne(domainCode, dataSourceUuid); + } + + @Override + public StrategyDTO loadStrategy(String domainCode, String sceneCode) { + return strategySPI.loadOne(domainCode, sceneCode); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java new file mode 100644 index 0000000..7e9cb71 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java @@ -0,0 +1,58 @@ +package cn.icanci.rec.engine.sdk.rule.impl; + +import cn.icanci.rec.common.aggregation.RuleAggregation; +import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.sdk.exception.RuleAggregationException; +import cn.icanci.rec.engine.sdk.rule.RuleAggregationCluster; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 15:36 + */ +public class RuleAggregationClusterImpl implements RuleAggregationCluster { + + /** 仓储的实现类 */ + private EngineRepository engineRepository; + + /** 编译执行引擎 */ + private RecScriptEngine engine; + + public RuleAggregationClusterImpl(EngineRepository engineRepository, RecScriptEngine engine) { + this.engineRepository = engineRepository; + this.engine = engine; + } + + @Override + public RuleAggregation buildAgg(String domainCode, String sceneCode) { + try { + RuleAggregation aggregation = new RuleAggregation(); + aggregation.setDomain(engineRepository.loadDomain(domainCode)); + aggregation.setScenePair(engineRepository.loadScenePair(domainCode, sceneCode)); + aggregation.setBaseDatas(engineRepository.loadBaseDatas(domainCode)); + aggregation.setMetadatas(engineRepository.loadMetadatas(domainCode)); + aggregation.setDataSource(engineRepository.loadDataSource(domainCode, sceneCode)); + aggregation.setStrategy(engineRepository.loadStrategy(domainCode, sceneCode)); + return aggregation; + } catch (Throwable e) { + return null; + } + } + + @Override + public RuleAggregationCompiled compileAgg(String domainCode, String sceneCode) { + try { + RuleAggregation agg = buildAgg(domainCode, sceneCode); + if (agg == null) { + throw new RuleAggregationException("Build RuleAggregation by domainCode: " + domainCode + " result is Null! Compilation failed!"); + } + DomainDTO domain = agg.getDomain(); + + return null; + } catch (Throwable e) { + throw new RuleAggregationException(e); + } + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java new file mode 100644 index 0000000..20a5b0f --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java @@ -0,0 +1,86 @@ +package cn.icanci.rec.engine.sdk.rule.repository; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; + +import com.google.common.collect.Maps; + +import cn.icanci.rec.common.aggregation.model.*; +import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; +import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; + +/** + * EngineRepository Local Cache + * + * @author icanci + * @since 1.0 Created in 2022/11/15 22:56 + */ +public final class EngineRepository { + @Resource + private EngineRepositoryLoader engineRepositoryLoader; + + /** 域缓存 */ + private static final Map DOMAIN_MAP = Maps.newConcurrentMap(); + + /** + * 刷新仓储 + * + * @param domainCodes domainCodes + */ + public void refresh(Set domainCodes) { + if (CollectionUtils.isEmpty(domainCodes)) { + return; + } + for (String domainCode : domainCodes) { + refresh(domainCode); + } + } + + /** + * 刷新仓储 + * + * @param domain domain + */ + private void refresh(String domain) { + List scenePairs = engineRepositoryLoader.loadScenePairs(domain); + if (CollectionUtils.isEmpty(scenePairs)) { + return; + } + // 刷新本地缓存 + // 刷新编译数据 + + } + + public DomainDTO loadDomain(String domainCode) { + return DOMAIN_MAP.get(domainCode); + } + + public SceneDTO.ScenePair loadScenePair(String domainCode, String sceneCode) { + + } + + public List loadBaseDatas(String domainCode) { + + } + + public List loadMetadatas(String domainCode) { + + } + + public DataSourceDTO loadDataSource(String domainCode, String sceneCode) { + + } + + public StrategyDTO loadStrategy(String domainCode, String sceneCode) { + + } + + public RuleAggregationCompiled loadRuleAggregationCompiled(String domainCode, String sceneCode) { + + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseCompiled.java new file mode 100644 index 0000000..01fcae4 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseCompiled.java @@ -0,0 +1,100 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import java.util.Date; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 19:13 + */ +public class BaseCompiled { + /** + * 文档id + */ + private String id; + + /** + * 雪花算法随机UUID + */ + private String uuid; + + /** + * 功能描述 + */ + private String desc; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 状态 0有效,1无效 + */ + private int isDelete; + + /** + * 环境 + */ + private String env; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public int getIsDelete() { + return isDelete; + } + + public void setIsDelete(int isDelete) { + this.isDelete = isDelete; + } + + public String getEnv() { + return env; + } + + public void setEnv(String env) { + this.env = env; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseDataCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseDataCompiled.java new file mode 100644 index 0000000..0ec4e8a --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/BaseDataCompiled.java @@ -0,0 +1,132 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import cn.icanci.rec.common.enums.DataTypeEnum; +import cn.icanci.rec.common.enums.ResultTypeEnum; +import cn.icanci.rec.common.enums.ScriptTypeEnum; + +import javax.script.CompiledScript; +import javax.script.ScriptEngine; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:34 + */ +public class BaseDataCompiled extends BaseCompiled { + /** + * 域Code + */ + private String domainCode; + /** + * 基础数据名称 + */ + private String fieldName; + /** + * 数据类型(布尔、字符串、数值、日期、元数据等) + * + * @see DataTypeEnum#name() + */ + private String dataType; + /** + * 关联的元数据uuid + * + * {@link DataTypeEnum#METADATA} + */ + private String metadataUuid; + /** + * 脚本执行类型 + * + * @see ScriptTypeEnum#name() + */ + private String scriptType; + /** + * 脚本内容 + */ + private String scriptContent; + /** + * 脚本执行返回类型(只能是基本数据类型) + * + * @see ResultTypeEnum#name() + */ + @Deprecated + private String resultType; + /** + * 脚本执行引擎 + */ + private transient ScriptEngine scriptEngine; + /** + * 通过 Compilable 编译 scriptContent 之后的实例对象 + */ + private transient CompiledScript compiledScript; + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getMetadataUuid() { + return metadataUuid; + } + + public void setMetadataUuid(String metadataUuid) { + this.metadataUuid = metadataUuid; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public String getScriptContent() { + return scriptContent; + } + + public void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public String getResultType() { + return resultType; + } + + public void setResultType(String resultType) { + this.resultType = resultType; + } + + public ScriptEngine getScriptEngine() { + return scriptEngine; + } + + public void setScriptEngine(ScriptEngine scriptEngine) { + this.scriptEngine = scriptEngine; + } + + public CompiledScript getCompiledScript() { + return compiledScript; + } + + public void setCompiledScript(CompiledScript compiledScript) { + this.compiledScript = compiledScript; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DataSourceCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DataSourceCompiled.java new file mode 100644 index 0000000..bb2dd67 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DataSourceCompiled.java @@ -0,0 +1,255 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import cn.icanci.rec.common.enums.DataSourceTypeEnum; +import cn.icanci.rec.common.enums.HttpRequestTypeEnum; +import cn.icanci.rec.common.enums.ScriptTypeEnum; + +import javax.script.CompiledScript; +import javax.script.ScriptEngine; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:37 + */ +public class DataSourceCompiled extends BaseCompiled { + /** + * 域Code + */ + private String domainCode; + /** + * 数据源名称 + */ + private String dataSourceName; + /** + * 数据源类型 + * @see DataSourceTypeEnum @name() + */ + private String dataSourceType; + /** + * 数据源为脚本的执行数据集 + */ + private ScriptInfo scriptInfo; + /** + * 数据源为HTTP的执行数据集 + */ + private HttpInfo httpInfo; + /** + * 数据源为SQL的执行数据集 + */ + private SqlInfo sqlInfo; + + /** + * 数据源为脚本的执行数据集 + */ + public static class ScriptInfo { + /** + * 脚本执行类型 + * + * @see ScriptTypeEnum#name() + * + */ + private String scriptType; + /** + * 脚本内容 + */ + private String scriptContent; + + /** + * 执行超时时间,秒 + * 为0则不做限制 + */ + private int timeout; + + /** + * 脚本执行引擎 + */ + private transient ScriptEngine scriptEngine; + + /** + * 通过 Compilable 编译 scriptContent 之后的实例对象 + */ + private transient CompiledScript compiledScript; + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public String getScriptContent() { + return scriptContent; + } + + public void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public ScriptEngine getScriptEngine() { + return scriptEngine; + } + + public void setScriptEngine(ScriptEngine scriptEngine) { + this.scriptEngine = scriptEngine; + } + + public CompiledScript getCompiledScript() { + return compiledScript; + } + + public void setCompiledScript(CompiledScript compiledScript) { + this.compiledScript = compiledScript; + } + } + + /** + * 数据源为HTTP的执行数据集 + */ + public static class HttpInfo { + /** + * 请求数据类型 + * + * @see HttpRequestTypeEnum#name() + */ + private String httpRequestType; + /** + * 请求接口 + */ + private String reqUrl; + /** + * 请求参数 + * + * @see HttpRequestTypeEnum#POST 时有效 + */ + private String reqParam; + + /** + * 请求超时时间,秒 + * 为0则不做限制,则最大超时时间为5s + */ + private int timeout; + + public String getHttpRequestType() { + return httpRequestType; + } + + public void setHttpRequestType(String httpRequestType) { + this.httpRequestType = httpRequestType; + } + + public String getReqUrl() { + return reqUrl; + } + + public void setReqUrl(String reqUrl) { + this.reqUrl = reqUrl; + } + + public String getReqParam() { + return reqParam; + } + + public void setReqParam(String reqParam) { + this.reqParam = reqParam; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + } + + /** + * 数据源为SQL的执行数据集 + */ + public static class SqlInfo { + /** + * SQL 语句,只支持查询语句 + * + * 查询默认数据库 rec_ext + */ + private String sql; + + /** + * 执行超时时间,秒 + * 为0则不作限制 + */ + private int timeout; + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + } + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public String getDataSourceName() { + return dataSourceName; + } + + public void setDataSourceName(String dataSourceName) { + this.dataSourceName = dataSourceName; + } + + public String getDataSourceType() { + return dataSourceType; + } + + public void setDataSourceType(String dataSourceType) { + this.dataSourceType = dataSourceType; + } + + public ScriptInfo getScriptInfo() { + return scriptInfo; + } + + public void setScriptInfo(ScriptInfo scriptInfo) { + this.scriptInfo = scriptInfo; + } + + public HttpInfo getHttpInfo() { + return httpInfo; + } + + public void setHttpInfo(HttpInfo httpInfo) { + this.httpInfo = httpInfo; + } + + public SqlInfo getSqlInfo() { + return sqlInfo; + } + + public void setSqlInfo(SqlInfo sqlInfo) { + this.sqlInfo = sqlInfo; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DomainCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DomainCompiled.java new file mode 100644 index 0000000..5031a4b --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/DomainCompiled.java @@ -0,0 +1,34 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +/** + * 域运行时对象 + * + * @author icanci + * @since 1.0 Created in 2022/11/15 19:12 + */ +public class DomainCompiled extends BaseCompiled { + /** + * 域名称 + */ + private String domainName; + /** + * 域Code + */ + private String domainCode; + + public String getDomainName() { + return domainName; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/MetadataCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/MetadataCompiled.java new file mode 100644 index 0000000..f42e60a --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/MetadataCompiled.java @@ -0,0 +1,76 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:38 + */ +public class MetadataCompiled extends BaseCompiled { + /** + * 域Code + */ + private String domainCode; + /** + * 元数据名称 + */ + private String metadataName; + /** + * 元数据对 + */ + private List metadataPairs; + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public String getMetadataName() { + return metadataName; + } + + public void setMetadataName(String metadataName) { + this.metadataName = metadataName; + } + + public List getMetadataPairs() { + return metadataPairs; + } + + public void setMetadataPairs(List metadataPairs) { + this.metadataPairs = metadataPairs; + } + + /** + * 元数据对 + */ + public static class MetadataPair { + /** + * key + */ + private String key; + /** + * value + */ + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/RuleAggregationCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/RuleAggregationCompiled.java new file mode 100644 index 0000000..890472c --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/RuleAggregationCompiled.java @@ -0,0 +1,96 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import java.util.Objects; +import java.util.StringJoiner; + +/** + * 规则运行时编译数据 + * + * @author icanci + * @since 1.0 Created in 2022/11/15 19:00 + */ +public class RuleAggregationCompiled { + /** 域 */ + private DomainCompiled domain; + /** 基础数据 */ + private BaseDataCompiled baseData; + /** 元数据 */ + private MetadataCompiled metadata; + /** 数据源 */ + private DataSourceCompiled dataSource; + /** 场景 */ + private SceneCompiled scene; + /** 策略 */ + private StrategyCompiled strategy; + // TODO 规则树的执行构建 + + public DomainCompiled getDomain() { + return domain; + } + + public void setDomain(DomainCompiled domain) { + this.domain = domain; + } + + public BaseDataCompiled getBaseData() { + return baseData; + } + + public void setBaseData(BaseDataCompiled baseData) { + this.baseData = baseData; + } + + public MetadataCompiled getMetadata() { + return metadata; + } + + public void setMetadata(MetadataCompiled metadata) { + this.metadata = metadata; + } + + public DataSourceCompiled getDataSource() { + return dataSource; + } + + public void setDataSource(DataSourceCompiled dataSource) { + this.dataSource = dataSource; + } + + public SceneCompiled getScene() { + return scene; + } + + public void setScene(SceneCompiled scene) { + this.scene = scene; + } + + public StrategyCompiled getStrategy() { + return strategy; + } + + public void setStrategy(StrategyCompiled strategy) { + this.strategy = strategy; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + RuleAggregationCompiled that = (RuleAggregationCompiled) o; + return Objects.equals(domain, that.domain) && Objects.equals(baseData, that.baseData) && Objects.equals(metadata, that.metadata) + && Objects.equals(dataSource, that.dataSource) && Objects.equals(scene, that.scene) && Objects.equals(strategy, that.strategy); + } + + @Override + public int hashCode() { + return Objects.hash(domain, baseData, metadata, dataSource, scene, strategy); + } + + @Override + public String toString() { + return new StringJoiner(",").add("domain=" + domain).add("baseData=" + baseData).add("metadata=" + metadata).add("dataSource=" + dataSource).add("scene=" + scene) + .add("strategy=" + strategy).toString(); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/SceneCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/SceneCompiled.java new file mode 100644 index 0000000..d476839 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/SceneCompiled.java @@ -0,0 +1,64 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:40 + */ +public class SceneCompiled extends BaseCompiled{ + /** + * 域Code + */ + private String domainCode; + /** + * 场景对 + */ + private List scenePairs; + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public List getScenePairs() { + return scenePairs; + } + + public void setScenePairs(List scenePairs) { + this.scenePairs = scenePairs; + } + + /** + * 场景对 + */ + public static class ScenePair { + /** + * 场景名称 + */ + private String sceneName; + /** + * 场景Code + */ + private String sceneCode; + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public String getSceneCode() { + return sceneCode; + } + + public void setSceneCode(String sceneCode) { + this.sceneCode = sceneCode; + } + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/StrategyCompiled.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/StrategyCompiled.java new file mode 100644 index 0000000..0b4ffb6 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/runtime/StrategyCompiled.java @@ -0,0 +1,285 @@ +package cn.icanci.rec.engine.sdk.rule.runtime; + +import cn.icanci.rec.common.enums.*; + +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/15 22:40 + */ +public class StrategyCompiled extends BaseCompiled { + /** + * 域Code + */ + private String domainCode; + /** + * 场景Code + */ + private String sceneCode; + /** + * 策略组名称 + */ + private String strategyName; + /** + * 数据源类型(脚本、接口、SQL) + * + * @see DataSourceTypeEnum#name() + */ + private String dataSourceType; + /** + * 数据源关联uuid + */ + private String dataSourceUuid; + /** + * 规则配置类型(默认为List) + * + * @see RuleTypeEnum#name() + */ + private String ruleType; + /** + * 规则配置类型为List时候的规则数据 + */ + private RuleListInfo ruleListInfo; + /** + * 规则配置类型为Tree时候的规则数据 + */ + private RuleTreeInfo ruleTreeInfo; + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public String getSceneCode() { + return sceneCode; + } + + public void setSceneCode(String sceneCode) { + this.sceneCode = sceneCode; + } + + public String getStrategyName() { + return strategyName; + } + + public void setStrategyName(String strategyName) { + this.strategyName = strategyName; + } + + public String getDataSourceType() { + return dataSourceType; + } + + public void setDataSourceType(String dataSourceType) { + this.dataSourceType = dataSourceType; + } + + public String getDataSourceUuid() { + return dataSourceUuid; + } + + public void setDataSourceUuid(String dataSourceUuid) { + this.dataSourceUuid = dataSourceUuid; + } + + public String getRuleType() { + return ruleType; + } + + public void setRuleType(String ruleType) { + this.ruleType = ruleType; + } + + public RuleListInfo getRuleListInfo() { + return ruleListInfo; + } + + public void setRuleListInfo(RuleListInfo ruleListInfo) { + this.ruleListInfo = ruleListInfo; + } + + public RuleTreeInfo getRuleTreeInfo() { + return ruleTreeInfo; + } + + public void setRuleTreeInfo(RuleTreeInfo ruleTreeInfo) { + this.ruleTreeInfo = ruleTreeInfo; + } + + /** + * 规则配置类型为List时候的规则数据 + */ + public static class RuleListInfo { + /** + * 平级结构 + * + * 多个conditions为或的关系 + */ + private List conditions; + + public List getConditions() { + return conditions; + } + + public void setConditions(List conditions) { + this.conditions = conditions; + } + } + + /** + * 平级结构 + */ + public static class Condition { + /** + * 组集合 + * 每一组内为且的关系 + */ + private List group; + + public List getGroup() { + return group; + } + + public void setGroup(List group) { + this.group = group; + } + } + + /** + * 单元结构 + */ + public static class SingleCondition { + + /** 单元名称 */ + private String name; + + /** 左值:基础数据uuid */ + private String leftValue; + + /** + * 操作符 + * + * @see OperatorEnum#name() + */ + private String operator; + + /** 右值 */ + private String rightValue; + + /** + * 是否中断执行 + * + * @see InterruptEnum#name() + */ + private String interrupt; + + /** + * 命中到当前条件的返回值类型 + * + * 满足 {@link InterruptEnum#TRUE } 时候返回值 + * @see ResultTypeEnum#name() + */ + private String resultType; + /** + * 命中到当前条件的返回值 + * + * 满足 {@link InterruptEnum#TRUE } 时候返回值 + */ + private String returnVal; + + /** + * 当前规则的子配置项 + * 一个规则自配置可以有多组,每组可能有多个,每组的每个也是一个配置项 + * + * Tree 结构的 SingleCondition#children 会存储值 + * 非Tree结构则为空数组 + */ + List children; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLeftValue() { + return leftValue; + } + + public void setLeftValue(String leftValue) { + this.leftValue = leftValue; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getRightValue() { + return rightValue; + } + + public void setRightValue(String rightValue) { + this.rightValue = rightValue; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getInterrupt() { + return interrupt; + } + + public void setInterrupt(String interrupt) { + this.interrupt = interrupt; + } + + public String getResultType() { + return resultType; + } + + public void setResultType(String resultType) { + this.resultType = resultType; + } + + public String getReturnVal() { + return returnVal; + } + + public void setReturnVal(String returnVal) { + this.returnVal = returnVal; + } + } + + /** + * 规则配置类型为Tree时候的规则数据 + */ + public static class RuleTreeInfo { + /** + * 多个conditions为或的关系 + */ + private List conditions; + + public List getConditions() { + return conditions; + } + + public void setConditions(List conditions) { + this.conditions = conditions; + } + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/BaseDataSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/BaseDataSPI.java index 124d802..277e6a8 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/BaseDataSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/BaseDataSPI.java @@ -1,10 +1,12 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.BaseDataVO; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * @author icanci * @since 1.0 Created in 2022/11/13 09:14 */ -public interface BaseDataSPI extends RecSupportSPI { +@RecSpi +public interface BaseDataSPI extends RecSupportSPI { } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java index 91f3e8c..e102c38 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java @@ -1,10 +1,21 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.DataSourceVO; +import cn.icanci.rec.common.aggregation.model.DataSourceDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * @author icanci * @since 1.0 Created in 2022/11/13 09:15 */ -public interface DataSourceSPI extends RecSupportSPI { +@RecSpi +public interface DataSourceSPI extends RecSupportSPI { + + /** + * 加载数据 + * + * @param domain 域 + * @param uuid uuid + * @return 返回相关的数据 + */ + DataSourceDTO loadOne(String domain,String uuid); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DomainSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DomainSPI.java index deecd2f..40cb7d6 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DomainSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DomainSPI.java @@ -1,6 +1,7 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.DomainVO; +import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * 域加载SPI @@ -8,6 +9,14 @@ import cn.icanci.rec.common.model.config.DomainVO; * @author icanci * @since 1.0 Created in 2022/11/13 09:11 */ -public interface DomainSPI extends RecSupportSPI { +@RecSpi +public interface DomainSPI extends RecSupportSPI { + /** + * 加载数据 + * + * @param domain 域 + * @return 返回相关的数据 + */ + DomainDTO loadOne(String domain); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/MetadataSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/MetadataSPI.java index 5b879f1..dfbf8bb 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/MetadataSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/MetadataSPI.java @@ -1,11 +1,13 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.MetadataVO; +import cn.icanci.rec.common.aggregation.model.MetadataDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * @author icanci * @since 1.0 Created in 2022/11/13 09:15 */ -public interface MetadataSPI extends RecSupportSPI { +@RecSpi +public interface MetadataSPI extends RecSupportSPI { } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/RecSupportSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/RecSupportSPI.java index 0e5556e..ea9d08b 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/RecSupportSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/RecSupportSPI.java @@ -1,15 +1,15 @@ package cn.icanci.rec.engine.sdk.spi; +import cn.icanci.rec.common.aggregation.model.BaseDTO; + import java.util.List; import java.util.Set; -import cn.icanci.rec.common.model.config.BaseVO; - /** * @author icanci * @since 1.0 Created in 2022/11/13 09:11 */ -public interface RecSupportSPI { +public interface RecSupportSPI { /** * 加载数据 * diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/SceneSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/SceneSPI.java index 3f4b141..7c0b1cc 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/SceneSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/SceneSPI.java @@ -1,10 +1,20 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.SceneVO; +import cn.icanci.rec.common.aggregation.model.SceneDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * @author icanci * @since 1.0 Created in 2022/11/13 09:16 */ -public interface SceneSPI extends RecSupportSPI { +@RecSpi +public interface SceneSPI extends RecSupportSPI { + + /** + * 加载数据 + * + * @param domainCode domainCode + * @return 返回相关的数据 + */ + SceneDTO loadOne(String domainCode); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java index 6c382d9..24011e5 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java @@ -1,10 +1,21 @@ package cn.icanci.rec.engine.sdk.spi; -import cn.icanci.rec.common.model.config.StrategyVO; +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.engine.sdk.extensions.RecSpi; /** * @author icanci * @since 1.0 Created in 2022/11/13 09:16 */ -public interface StrategySPI extends RecSupportSPI{ +@RecSpi +public interface StrategySPI extends RecSupportSPI { + + /** + * 加载数据 + * + * @param domain 域 + * @param sceneCode sceneCode + * @return 返回相关的数据 + */ + StrategyDTO loadOne(String domain, String sceneCode); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/mongo/MongoDomainSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/mongo/MongoDomainSPI.java deleted file mode 100644 index ed84246..0000000 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/mongo/MongoDomainSPI.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.icanci.rec.engine.sdk.spi.mongo; - -import cn.icanci.rec.common.model.config.DomainVO; -import cn.icanci.rec.engine.sdk.spi.DomainSPI; - -import java.util.List; -import java.util.Set; - -/** - * @author icanci - * @since 1.0 Created in 2022/11/13 09:19 - */ -public class MongoDomainSPI implements DomainSPI { - @Override - public List load(Set domains) { - return null; - } - - @Override - public List load(String domain) { - return null; - } -} diff --git a/rec-engine/rec-engine-sdk/src/main/resources/META-INF/spring.factories b/rec-engine/rec-engine-sdk/src/main/resources/META-INF/spring.factories new file mode 100755 index 0000000..101c3ef --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.icanci.rec.engine.sdk.RecEngineSDKAutoConfig \ No newline at end of file -- Gitee