From 4b8704e62154aec393f65d6fcc157f31d8710756 Mon Sep 17 00:00:00 2001 From: icanci Date: Wed, 18 Jan 2023 11:21:46 +0800 Subject: [PATCH] mock cloud --- README.en.md | 36 -- application/pom.xml | 37 ++ .../application/MockCloudApplication.java | 17 + .../src/main/resources/application.yml | 28 ++ application/src/main/resources/log4j2.xml | 63 +++ biz/pom.xml | 33 ++ .../amc/cloud/biz/aop/MockCallAop.java | 39 ++ .../cloud/biz/config/ConfigurationBeans.java | 24 + .../amc/cloud/biz/ddk/DDKResource.java | 44 ++ .../amc/cloud/biz/event/AmcCloudEvent.java | 11 + .../cloud/biz/event/call/MockCallEvent.java | 59 +++ .../biz/event/call/MockCallEventListener.java | 30 ++ .../exception/MockCallScriptException.java | 27 ++ .../loopstack/amc/cloud/biz/package-info.java | 5 + .../biz/repository/AmcMockCallHolder.java | 130 +++++ .../biz/repository/AmcMockCallRepository.java | 150 ++++++ .../cloud/biz/service/AppMockTestService.java | 21 + .../cloud/biz/service/MockCallService.java | 18 + .../service/impl/AppMockTestServiceImpl.java | 39 ++ .../biz/service/impl/MockCallServiceImpl.java | 65 +++ .../biz/repository/test/TestHandler.java | 184 +++++++ {trace => common}/pom.xml | 3 +- .../exception/UnSupportWrapperException.java | 27 ++ .../cloud/common/model/MockCallWrapper.java | 118 +++++ .../cloud/common/request/MockCallRequest.java | 46 ++ .../common/response/MockCallResponse.java | 65 +++ .../amc/cloud/common/utils/WrapperUtils.java | 269 +++++++++++ .../common/utils/test/WrapperUtilsTest.java | 18 + dal/pom.xml | 44 ++ .../exception/NotSupportAccessException.java | 27 ++ .../dal/mongodb/daointerface/AppDAO.java | 28 ++ .../mongodb/daointerface/AppMockCallDAO.java | 30 ++ .../daointerface/AppMockCallReportDAO.java | 21 + .../dal/mongodb/daointerface/BaseDAO.java | 71 +++ .../dal/mongodb/daointerface/GroupDAO.java | 27 ++ .../mongodb/daointerface/LogOperateDAO.java | 83 ++++ .../dal/mongodb/daointerface/TeamDAO.java | 28 ++ .../cloud/dal/mongodb/dataobject/AppDO.java | 47 ++ .../dal/mongodb/dataobject/AppMockCallDO.java | 69 +++ .../dataobject/AppMockCallReportDO.java | 80 ++++ .../cloud/dal/mongodb/dataobject/BaseDO.java | 116 +++++ .../cloud/dal/mongodb/dataobject/GroupDO.java | 34 ++ .../dal/mongodb/dataobject/LogOperateDO.java | 98 ++++ .../cloud/dal/mongodb/dataobject/TeamDO.java | 47 ++ .../dal/mongodb/mongo/AbstractBaseDAO.java | 40 ++ .../cloud/dal/mongodb/mongo/MongoAppDAO.java | 83 ++++ .../mongodb/mongo/MongoAppMockCallDAO.java | 79 +++ .../mongo/MongoAppMockCallReportDAO.java | 44 ++ .../dal/mongodb/mongo/MongoGroupDAO.java | 83 ++++ .../dal/mongodb/mongo/MongoLogOperateDAO.java | 61 +++ .../dal/mongodb/mongo/MongoPageHelper.java | 114 +++++ .../cloud/dal/mongodb/mongo/MongoTeamDAO.java | 87 ++++ .../amc/cloud/dal/mongodb/package-info.java | 5 + .../loopstack/amc/cloud/dal/package-info.java | 5 + .../amc/cloud/dal/utils/EnvUtils.java | 33 ++ .../amc/cloud/dal/utils/IDHolder.java | 40 ++ .../cloud/dal/utils/service/EnvService.java | 14 + .../dal/utils/service/IDGeneratorService.java | 15 + .../utils/service/impl/EnvServiceImpl.java | 30 ++ .../service/impl/IDGeneratorServiceImpl.java | 31 ++ facade/pom.xml | 18 + .../amc/cloud/MockCallCloudFacade.java | 41 ++ .../loopstack/amc/cloud/package-info.java | 5 + pom.xml | 451 +++++++++++++++++- 64 files changed, 3696 insertions(+), 39 deletions(-) delete mode 100644 README.en.md create mode 100644 application/pom.xml create mode 100644 application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java create mode 100644 application/src/main/resources/application.yml create mode 100644 application/src/main/resources/log4j2.xml create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java create mode 100644 biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java create mode 100644 biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java rename {trace => common}/pom.xml (93%) create mode 100644 common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java create mode 100644 common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java create mode 100644 common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java create mode 100644 common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java create mode 100644 common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java create mode 100644 common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java create mode 100644 dal/pom.xml create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java create mode 100644 dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java create mode 100644 facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java create mode 100644 facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java diff --git a/README.en.md b/README.en.md deleted file mode 100644 index e028c40..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# AMC-Cloud:自动化Mock组件服务项目 - -#### Description -AMC-Cloud(Automated Mock Component Cloud):自动化Mock组件服务项目,用来对外暴露接口提供服务。 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/application/pom.xml b/application/pom.xml new file mode 100644 index 0000000..8436294 --- /dev/null +++ b/application/pom.xml @@ -0,0 +1,37 @@ + + + + amc-cloud-parent + cn.icanci.loopstack.amc + 1.0-SNAPSHOT + + 4.0.0 + + cloud-application + + + 8 + 8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + cn.icanci.loopstack.amc + cloud-facade + ${parent.version} + + + \ No newline at end of file diff --git a/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java b/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java new file mode 100644 index 0000000..6d28469 --- /dev/null +++ b/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java @@ -0,0 +1,17 @@ +package cn.icanci.loopstack.amc.cloud.application; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:25 + */ +@ComponentScan(basePackages = { "cn.icanci.loopstack.amc.cloud", "cn.icanci.loopstack.amc.admin" }) +@SpringBootApplication +public class MockCloudApplication { + public static void main(String[] args) { + SpringApplication.run(MockCloudApplication.class, args); + } +} diff --git a/application/src/main/resources/application.yml b/application/src/main/resources/application.yml new file mode 100644 index 0000000..c26f38c --- /dev/null +++ b/application/src/main/resources/application.yml @@ -0,0 +1,28 @@ +server: + tomcat: + uri-encoding: UTF-8 + port: 9996 + servlet: + context-path: / + +logging: + config: classpath:log4j2.xml + +# 环境标识 +amc: + env: test + +# 接入方需要上报自己的信息给注册中心 +ddk: + env: test + load: true + client-port: 12000 + server-ips: 127.0.0.1 + server-port: 9998 + app-id: lsi.bs.java.amc + + +spring: + data: + mongodb: + uri: mongodb://127.0.0.1:27017/amc \ No newline at end of file diff --git a/application/src/main/resources/log4j2.xml b/application/src/main/resources/log4j2.xml new file mode 100644 index 0000000..6d98eec --- /dev/null +++ b/application/src/main/resources/log4j2.xml @@ -0,0 +1,63 @@ + + + + + ./logs + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c{1.}#%M(%L) %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/biz/pom.xml b/biz/pom.xml index 23ded5f..76d92c6 100644 --- a/biz/pom.xml +++ b/biz/pom.xml @@ -16,4 +16,37 @@ 8 + + + cn.icanci.loopstack.amc + cloud-dal + ${parent.version} + + + cn.icanci.loopstack.amc + cloud-trace + ${parent.version} + + + cn.icanci.loopstack.amc + cloud-common + ${parent.version} + + + cn.icanci.loopstack + lsi-script + + + cn.icanci.loopstack + lsi-event + + + org.aspectj + aspectjweaver + + + cn.icanci.loopstack.amc + amc-spi + + \ No newline at end of file diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java new file mode 100644 index 0000000..a398d17 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java @@ -0,0 +1,39 @@ +package cn.icanci.loopstack.amc.cloud.biz.aop; + +import cn.icanci.loopstack.amc.cloud.biz.event.call.MockCallEvent; +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; +import cn.icanci.loopstack.lsi.event.EventDispatcher; + +import javax.annotation.Resource; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +/** + * AOP拦截 + * + * @author icanci + * @since 1.0 Created in 2023/01/16 19:56 + */ +@Aspect +@Component +public class MockCallAop { + @Resource + private EventDispatcher eventDispatcher; + + @Pointcut("execution(public * cn.icanci.loopstack.amc.cloud.biz.service.impl.MockCallServiceImpl.mockCall(..))") + private void callAop() { + + } + + @Around("callAop()") + public Object doBefore(ProceedingJoinPoint pjp) throws Throwable { + Object[] args = pjp.getArgs(); + Object returnVal = pjp.proceed(); + eventDispatcher.fire(new MockCallEvent(String.valueOf(args[0]), String.valueOf(args[1]), (MockCallWrapper) returnVal), false); + return returnVal; + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java new file mode 100644 index 0000000..4360d6a --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java @@ -0,0 +1,24 @@ +package cn.icanci.loopstack.amc.cloud.biz.config; + +import cn.icanci.loopstack.lsi.event.DefaultEventDispatcher; +import cn.icanci.loopstack.lsi.event.EventDispatcher; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author icanci(1205068) + * @version Id: Config, v 0.1 2022/12/24 20:22 icanci Exp $ + */ +@Configuration +public class ConfigurationBeans { + /** + * 事件分发器 + * + * @return 返回事件分发器 + */ + @Bean(name = "eventDispatcher") + public EventDispatcher eventDispatcher() { + return new DefaultEventDispatcher(); + } +} \ No newline at end of file diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java new file mode 100644 index 0000000..0167d69 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java @@ -0,0 +1,44 @@ +package cn.icanci.loopstack.amc.cloud.biz.ddk; + +import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallRepository; +import cn.icanci.loopstack.ddk.common.anno.DdkAfterCall; +import cn.icanci.loopstack.ddk.common.anno.DdkBeforeCall; +import cn.icanci.loopstack.ddk.common.anno.DdkCall; +import cn.icanci.loopstack.ddk.common.anno.DdkResource; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:34 + */ +@Service +@DdkResource("#mock.cloud.notice") +public class DDKResource { + + private final Logger logger = LoggerFactory.getLogger(DDKResource.class); + + @Resource + private AmcMockCallRepository amcMockCallRepository; + + @DdkBeforeCall + private synchronized void ddkBeforeCall(String mockCallUuid) { + // No Op + } + + @DdkCall + private synchronized void ddkCall(String mockCallUuid) { + logger.info("[DDKResource][ddkCall] mockCallUuid:{}, now is Start", mockCallUuid); + amcMockCallRepository.refresh(mockCallUuid); + logger.info("[DDKResource][ddkCall] mockCallUuid:{}, now is End", mockCallUuid); + } + + @DdkAfterCall + private synchronized void ddkAfterCall(String mockCallUuid) { + // No Op + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java new file mode 100644 index 0000000..c32b1b1 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java @@ -0,0 +1,11 @@ +package cn.icanci.loopstack.amc.cloud.biz.event; + +import cn.icanci.loopstack.lsi.event.BaseEvent; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/07 22:26 + */ +public class AmcCloudEvent extends BaseEvent { + +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java new file mode 100644 index 0000000..92a10ce --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java @@ -0,0 +1,59 @@ +package cn.icanci.loopstack.amc.cloud.biz.event.call; + +import cn.icanci.loopstack.amc.cloud.biz.event.AmcCloudEvent; +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; + +import org.springframework.stereotype.Component; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 20:09 + */ +@Component +public class MockCallEvent extends AmcCloudEvent { + /** + * Mock 请求uuid + */ + private String mockCallUuid; + /** + * mock请求参数 + */ + private String mockCallRequest; + /** + * Mock请求Wrapper + */ + private MockCallWrapper wrapper; + + public MockCallEvent() { + } + + public MockCallEvent(String mockCallUuid, String mockCallRequest, MockCallWrapper wrapper) { + this.mockCallUuid = mockCallUuid; + this.mockCallRequest = mockCallRequest; + this.wrapper = wrapper; + } + + public String getMockCallRequest() { + return mockCallRequest; + } + + public void setMockCallRequest(String mockCallRequest) { + this.mockCallRequest = mockCallRequest; + } + + public String getMockCallUuid() { + return mockCallUuid; + } + + public void setMockCallUuid(String mockCallUuid) { + this.mockCallUuid = mockCallUuid; + } + + public MockCallWrapper getWrapper() { + return wrapper; + } + + public void setWrapper(MockCallWrapper wrapper) { + this.wrapper = wrapper; + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java new file mode 100644 index 0000000..4d7b8ab --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java @@ -0,0 +1,30 @@ +package cn.icanci.loopstack.amc.cloud.biz.event.call; + +import cn.icanci.loopstack.amc.cloud.biz.service.AppMockTestService; +import cn.icanci.loopstack.lsi.event.BaseEventListener; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 20:10 + */ +@Service +public class MockCallEventListener extends BaseEventListener { + + @Resource + private AppMockTestService appMockTestService; + + @Override + protected void event(MockCallEvent event) { + appMockTestService.log(event.getMockCallUuid(), event.getMockCallRequest(), event.getWrapper()); + } + + @Override + protected boolean isSupport(MockCallEvent event) { + // 确定标准 + return event.getWrapper() != null; + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java new file mode 100644 index 0000000..ac4a5d3 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java @@ -0,0 +1,27 @@ +package cn.icanci.loopstack.amc.cloud.biz.exception; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 20:33 + */ +public class MockCallScriptException extends RuntimeException { + public MockCallScriptException() { + super(); + } + + public MockCallScriptException(String message) { + super(message); + } + + public MockCallScriptException(String message, Throwable cause) { + super(message, cause); + } + + public MockCallScriptException(Throwable cause) { + super(cause); + } + + protected MockCallScriptException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java new file mode 100644 index 0000000..14474b7 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:33 + */ +package cn.icanci.loopstack.amc.cloud.biz; \ No newline at end of file diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java new file mode 100644 index 0000000..f823f77 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java @@ -0,0 +1,130 @@ +package cn.icanci.loopstack.amc.cloud.biz.repository; + +import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler; +import cn.icanci.loopstack.script.enums.ScriptTypeEnum; + +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; + +/** + * 脚本执行数据持有者 + * - 如果是mvel2.0脚本,则不会有handlerClass和instance + * - 如果是groovy脚本 + * - 如果不是 {cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler}的实现类,则不会有handlerClass和instance + * - 如果是 {cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler}的实现类,则有handlerClass和instance + * + * @author icanci + * @since 1.0 Created in 2023/01/16 15:44 + */ +public class AmcMockCallHolder { + /** + * mock uuid + */ + private String mockCallUuid; + /** + * mock uuid + */ + private String mockCallName; + /** + * 脚本类型 + */ + private ScriptTypeEnum scriptType; + /** + * 脚本内容 + */ + private String scriptContent; + /** + * 脚本执行引擎 + */ + private ScriptEngine scriptEngine; + /** + * 脚本执行引擎编译器,如果脚本执行引擎实现了Compilable + * 那么 scriptEngine 和 compilable 则是同一个对象 + */ + private Compilable compilable; + /** + * 通过 Compilable 编译 scriptContent 之后的实例对象 + */ + private CompiledScript compiledScript; + /** + * 处理器groovy脚本Invoke类型 + */ + private Class handlerClass; + /** + * handlerClass 实例化对象 + */ + private MockCallStandardHandler instance; + + public String getMockCallUuid() { + return mockCallUuid; + } + + public void setMockCallUuid(String mockCallUuid) { + this.mockCallUuid = mockCallUuid; + } + + public String getMockCallName() { + return mockCallName; + } + + public void setMockCallName(String mockCallName) { + this.mockCallName = mockCallName; + } + + public ScriptTypeEnum getScriptType() { + return scriptType; + } + + public void setScriptType(ScriptTypeEnum scriptType) { + this.scriptType = scriptType; + } + + public String getScriptContent() { + return scriptContent; + } + + public void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public ScriptEngine getScriptEngine() { + return scriptEngine; + } + + public void setScriptEngine(ScriptEngine scriptEngine) { + this.scriptEngine = scriptEngine; + } + + public Compilable getCompilable() { + return compilable; + } + + public void setCompilable(Compilable compilable) { + this.compilable = compilable; + } + + public CompiledScript getCompiledScript() { + return compiledScript; + } + + public void setCompiledScript(CompiledScript compiledScript) { + this.compiledScript = compiledScript; + } + + public Class getHandlerClass() { + return handlerClass; + } + + public void setHandlerClass(Class handlerClass) { + this.handlerClass = handlerClass; + } + + public MockCallStandardHandler getInstance() { + return instance; + } + + public void setInstance(MockCallStandardHandler instance) { + this.instance = instance; + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java new file mode 100644 index 0000000..3f1e5e0 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java @@ -0,0 +1,150 @@ +package cn.icanci.loopstack.amc.cloud.biz.repository; + +import cn.icanci.loopstack.amc.cloud.biz.exception.MockCallScriptException; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO; +import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler; +import cn.icanci.loopstack.script.LsiScriptEngineFactory; +import cn.icanci.loopstack.script.compile.GroovyClassLoaderHolder; +import cn.icanci.loopstack.script.enums.ScriptTypeEnum; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Resource; +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:36 + */ +@Service +public class AmcMockCallRepository { + + private final Logger logger = LoggerFactory.getLogger(AmcMockCallRepository.class); + /** + * 判断是否是第一次加载 变量标识 + */ + private static final AtomicBoolean ATOMIC_BOOLEAN_REFRESHED = new AtomicBoolean(false); + + /** + * 执行缓存 + * + * key: uuid + * value: 配置数据 + */ + private static final Map MOCK_CALL_HOLDER_MAP = new ConcurrentHashMap<>(); + + @Resource + private AppMockCallDAO appMockCallDAO; + + /** + * 刷新本地执行仓储 + * + * @param mockCallUuid mockCallUuid + */ + public void refresh(String mockCallUuid) { + // 1.判断是否是第一次加载 + if (!ATOMIC_BOOLEAN_REFRESHED.get()) { + // 1.1 如果是第一次加载,则加载所有的数据,然后再加载mockCallUuid + refreshAll(); + // 1.1.1 加载结束之后设置标识 + ATOMIC_BOOLEAN_REFRESHED.compareAndSet(false, true); + } + // 1.2 如果不是第一次加载,则加载mockCallUuid + refreshForUuid(mockCallUuid); + } + + /** + * 刷新缓存所有数据 + */ + private void refreshAll() { + List appMockCallList = appMockCallDAO.queryAll(); + if (CollectionUtils.isEmpty(appMockCallList)) { + logger.warn("[AmcMockCallRepository][refreshAll] appMockCallList is Empty!"); + return; + } + for (AppMockCallDO appMockCall : appMockCallList) { + if (appMockCall.getIsDelete() == 1) { + continue; + } + refresh(appMockCall); + } + } + + /** + * 刷新单独组件 + * + * @param appMockCall appMockCall + */ + private void refresh(AppMockCallDO appMockCall) { + try { + String appMockUuid = appMockCall.getUuid(); + ScriptTypeEnum scriptType = ScriptTypeEnum.valueOf(appMockCall.getScriptType()); + String script = appMockCall.getScript(); + + AmcMockCallHolder holder = new AmcMockCallHolder(); + holder.setMockCallUuid(appMockUuid); + holder.setMockCallName(appMockCall.getMockName()); + holder.setScriptType(scriptType); + holder.setScriptContent(script); + + ScriptEngine scriptEngine = LsiScriptEngineFactory.getScriptEngine(scriptType); + holder.setScriptEngine(scriptEngine); + if (scriptEngine instanceof Compilable) { + Compilable compilable = (Compilable) scriptEngine; + holder.setCompilable(compilable); + CompiledScript compile = compilable.compile(script); + holder.setCompiledScript(compile); + } + Class compileClass = GroovyClassLoaderHolder.compile(script); + Object instance = compileClass.newInstance(); + if (instance instanceof MockCallStandardHandler) { + holder.setHandlerClass((Class) compileClass); + // TODO 后置处理器 注入一些工具bean之类,此版本暂时没有 + holder.setInstance((MockCallStandardHandler) instance); + } + MOCK_CALL_HOLDER_MAP.put(appMockUuid, holder); + } catch (Exception ex) { + logger.error("[AmcMockCallRepository][refresh] Compile Script error:{}", ex.getLocalizedMessage()); + throw new MockCallScriptException(ex); + } + } + + /** + * 只刷新指定的uuid + * + * @param mockCallUuid mockCallUuid + */ + private void refreshForUuid(String mockCallUuid) { + AppMockCallDO appMockCall = appMockCallDAO.queryByUuid(mockCallUuid); + if (appMockCall == null) { + logger.warn("[AmcMockCallRepository][refreshForUuid] appMockCall is Null!"); + return; + } + if (appMockCall.getIsDelete() == 1) { + logger.warn("[AmcMockCallRepository][refreshForUuid] appMockCall is Offline!"); + return; + } + refresh(appMockCall); + } + + /** + * 获取仓储数据 + * + * @param mockCallUuid mockCallUuid + * @return 返回仓储数据 + */ + public AmcMockCallHolder getAmcMockCallHolder(String mockCallUuid) { + return MOCK_CALL_HOLDER_MAP.get(mockCallUuid); + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java new file mode 100644 index 0000000..a97234c --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java @@ -0,0 +1,21 @@ +package cn.icanci.loopstack.amc.cloud.biz.service; + +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; + +/** + * 记录执行日志 + * + * @author icanci + * @since 1.0 Created in 2023/01/17 22:50 + */ +public interface AppMockTestService { + + /** + * 记录操作轨迹日志 + * + * @param mockUuid mockUuid + * @param request 执行请求 + * @param wrapper Wrapper对象 + */ + void log(String mockUuid, String request, MockCallWrapper wrapper); +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java new file mode 100644 index 0000000..00f21e1 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java @@ -0,0 +1,18 @@ +package cn.icanci.loopstack.amc.cloud.biz.service; + +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:52 + */ +public interface MockCallService { + /** + * mockCall + * + * @param mockCallUuid mockCallUuid + * @param mockRequest mockRequest + * @return 执行结果包装器 + */ + MockCallWrapper mockCall(String mockCallUuid, String mockRequest); +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java new file mode 100644 index 0000000..9bfd846 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java @@ -0,0 +1,39 @@ +package cn.icanci.loopstack.amc.cloud.biz.service.impl; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.amc.cloud.biz.service.AppMockTestService; +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallReportDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 22:57 + */ +@Service +public class AppMockTestServiceImpl implements AppMockTestService { + private static final Logger logger = LoggerFactory.getLogger(AppMockTestServiceImpl.class); + + @Resource + private AppMockCallReportDAO appMockCallReportDAO; + + @Override + public void log(String mockUuid, String request, MockCallWrapper wrapper) { + logger.info("[AppMockTestService][log] mockUuid:{},request:{},wrapper:{}", mockUuid, request, JSONUtil.toJsonStr(wrapper)); + + AppMockCallReportDO report = new AppMockCallReportDO(); + report.setSuccess(wrapper.isSuccess()); + report.setMockName(wrapper.getMockName()); + report.setMockUuid(wrapper.getMockUuid()); + report.setMockRequest(wrapper.getMockRequest()); + report.setMockErrorMessage(wrapper.getMockErrorMessage()); + report.setMockResponse(JSONUtil.toJsonStr(wrapper.getMockResponse())); + appMockCallReportDAO.insert(report); + } +} diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java new file mode 100644 index 0000000..6fa14c0 --- /dev/null +++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java @@ -0,0 +1,65 @@ +package cn.icanci.loopstack.amc.cloud.biz.service.impl; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallHolder; +import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallRepository; +import cn.icanci.loopstack.amc.cloud.biz.service.MockCallService; +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; + +import javax.annotation.Resource; +import javax.script.SimpleBindings; + +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:53 + */ +@Service +public class MockCallServiceImpl implements MockCallService { + @Resource + private AmcMockCallRepository amcMockCallRepository; + + @Override + public MockCallWrapper mockCall(String mockCallUuid, String mockRequest) { + AmcMockCallHolder holder = amcMockCallRepository.getAmcMockCallHolder(mockCallUuid); + if (holder == null) { + return MockCallWrapper.fail(mockCallUuid, "Cannot found the Mock Config for:" + mockCallUuid); + } + + try { + SimpleBindings simpleBindings = JSONUtil.toBean(mockRequest, SimpleBindings.class); + + Object ret = null; + // 优先处理实例 + if (holder.getInstance() != null) { + ret = holder.getInstance().execute(mockRequest); + } else if (holder.getCompiledScript() != null) { + ret = holder.getCompiledScript().eval(simpleBindings); + } else { + ret = holder.getScriptEngine().eval(holder.getScriptContent(), simpleBindings); + } + return buildWrapper(ret, holder, mockRequest); + } catch (Exception e) { + return MockCallWrapper.fail(mockCallUuid, holder.getMockCallName(), mockRequest, "Invoke Script error:" + e.getLocalizedMessage()); + } + } + + /** + * 返回 Wrapper + * + * @param ret 脚本执行返回结果 + * @param holder mock配置持有者 + * @param mockRequest mock 请求 + * @return 返回Wrapper + */ + private MockCallWrapper buildWrapper(Object ret, AmcMockCallHolder holder, String mockRequest) { + MockCallWrapper wrapper = new MockCallWrapper(); + wrapper.setSuccess(true); + wrapper.setMockName(holder.getMockCallName()); + wrapper.setMockUuid(holder.getMockCallUuid()); + wrapper.setMockRequest(mockRequest); + wrapper.setMockResponse(ret); + return wrapper; + } +} diff --git a/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java b/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java new file mode 100644 index 0000000..8324cdc --- /dev/null +++ b/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java @@ -0,0 +1,184 @@ +package cn.icanci.loopstack.amc.cloud.biz.repository.test; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler; + +/** + * 测试TestHandler处理器 + * + * @author icanci + * @since 1.0 Created in 2023/01/17 18:48 + */ +public class TestHandler extends MockCallStandardHandler { + + @Override + public Object execute(Object request) throws Exception { + QuotaRequest bean = JSONUtil.toBean(String.valueOf(request), QuotaRequest.class); + Quota quota = new Quota(); + quota.setMethod(bean.getUuid()); + quota.setResourceType(bean.getUuid()); + quota.setSource(bean.getUuid()); + quota.setPrepayValidateCount(bean.getUuid()); + quota.setBookCount(bean.getUuid()); + quota.setConversionRate(System.currentTimeMillis()); + return quota; + } + + public static class QuotaRequest { + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + } + + public static class Quota { + String method = "ALL"; + String resourceType; + String source; + String prepayValidateCount; + String bookCount; + long conversionRate; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getPrepayValidateCount() { + return prepayValidateCount; + } + + public void setPrepayValidateCount(String prepayValidateCount) { + this.prepayValidateCount = prepayValidateCount; + } + + public String getBookCount() { + return bookCount; + } + + public void setBookCount(String bookCount) { + this.bookCount = bookCount; + } + + public long getConversionRate() { + return conversionRate; + } + + public void setConversionRate(long conversionRate) { + this.conversionRate = conversionRate; + } + } +} + +// Tips 脚本内容 +// import cn.hutool.json.JSONUtil; +// import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler; +// +// public class TestHandler extends MockCallStandardHandler { +//å +// @Override +// public Object execute(Object request) throws Exception { +// QuotaRequest bean = JSONUtil.toBean(String.valueOf(request), QuotaRequest.class); +// Quota quota = new Quota(); +// quota.setMethod(bean.getUuid()); +// quota.setResourceType(bean.getUuid()); +// quota.setSource(bean.getUuid()); +// quota.setPrepayValidateCount(bean.getUuid()); +// quota.setBookCount(bean.getUuid()); +// quota.setConversionRate(System.currentTimeMillis()); +// return quota; +// } +// +// public static class QuotaRequest { +// private String uuid; +// +// public String getUuid() { +// return uuid; +// } +// +// public void setUuid(String uuid) { +// this.uuid = uuid; +// } +// } +// +// public static class Quota { +// String method = "ALL"; +// String resourceType; +// String source; +// String prepayValidateCount; +// String bookCount; +// long conversionRate; +// +// public String getMethod() { +// return method; +// } +// +// public void setMethod(String method) { +// this.method = method; +// } +// +// public String getResourceType() { +// return resourceType; +// } +// +// public void setResourceType(String resourceType) { +// this.resourceType = resourceType; +// } +// +// public String getSource() { +// return source; +// } +// +// public void setSource(String source) { +// this.source = source; +// } +// +// public String getPrepayValidateCount() { +// return prepayValidateCount; +// } +// +// public void setPrepayValidateCount(String prepayValidateCount) { +// this.prepayValidateCount = prepayValidateCount; +// } +// +// public String getBookCount() { +// return bookCount; +// } +// +// public void setBookCount(String bookCount) { +// this.bookCount = bookCount; +// } +// +// public long getConversionRate() { +// return conversionRate; +// } +// +// public void setConversionRate(long conversionRate) { +// this.conversionRate = conversionRate; +// } +// } +//} \ No newline at end of file diff --git a/trace/pom.xml b/common/pom.xml similarity index 93% rename from trace/pom.xml rename to common/pom.xml index fdadfa0..bb25e22 100644 --- a/trace/pom.xml +++ b/common/pom.xml @@ -9,11 +9,10 @@ 4.0.0 - cloud-trace + cloud-common 8 8 - \ No newline at end of file diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java new file mode 100644 index 0000000..c8649c2 --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java @@ -0,0 +1,27 @@ +package cn.icanci.loopstack.amc.cloud.common.exception; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 11:16 + */ +public class UnSupportWrapperException extends RuntimeException { + public UnSupportWrapperException() { + super(); + } + + public UnSupportWrapperException(String message) { + super(message); + } + + public UnSupportWrapperException(String message, Throwable cause) { + super(message, cause); + } + + public UnSupportWrapperException(Throwable cause) { + super(cause); + } + + protected UnSupportWrapperException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java new file mode 100644 index 0000000..3e32474 --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java @@ -0,0 +1,118 @@ +package cn.icanci.loopstack.amc.cloud.common.model; + +import java.io.Serializable; + +/** + * MockFacade执行请求返回结果 + * + * @author icanci + * @since 1.0 Created in 2023/01/16 15:20 + */ +public class MockCallWrapper implements Serializable { + /** + * mock 过程是否成功 + */ + private boolean success; + /** + * mockName + */ + private String mockName; + /** + * mockUuid + */ + private String mockUuid; + /** + * mock执行的请求 + */ + private String mockRequest; + /** + * mock执行的异常信息 + */ + private String mockErrorMessage; + /** + * 真正mock返回的结果 + */ + private Object mockResponse; + + /** + * 失败 + * + * @param mockUuid mockUuid + * @param message message + * @return Wrapper + */ + public static MockCallWrapper fail(String mockUuid, String message) { + MockCallWrapper wrapper = new MockCallWrapper(); + wrapper.setSuccess(false); + wrapper.setMockUuid(mockUuid); + wrapper.setMockErrorMessage(message); + return wrapper; + } + + /** + * 失败 + * + * @param mockUuid mockUuid + * @param mockName mockName + * @param mockRequest mockRequest + * @param message message + * @return 返回结果 + */ + public static MockCallWrapper fail(String mockUuid, String mockName, String mockRequest, String message) { + MockCallWrapper wrapper = new MockCallWrapper(); + wrapper.setSuccess(false); + wrapper.setMockName(mockName); + wrapper.setMockUuid(mockUuid); + wrapper.setMockRequest(mockRequest); + wrapper.setMockErrorMessage(message); + return wrapper; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMockName() { + return mockName; + } + + public void setMockName(String mockName) { + this.mockName = mockName; + } + + public String getMockUuid() { + return mockUuid; + } + + public void setMockUuid(String mockUuid) { + this.mockUuid = mockUuid; + } + + public String getMockRequest() { + return mockRequest; + } + + public void setMockRequest(String mockRequest) { + this.mockRequest = mockRequest; + } + + public String getMockErrorMessage() { + return mockErrorMessage; + } + + public void setMockErrorMessage(String mockErrorMessage) { + this.mockErrorMessage = mockErrorMessage; + } + + public Object getMockResponse() { + return mockResponse; + } + + public void setMockResponse(Object mockResponse) { + this.mockResponse = mockResponse; + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java new file mode 100644 index 0000000..5844006 --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java @@ -0,0 +1,46 @@ +package cn.icanci.loopstack.amc.cloud.common.request; + +import java.io.Serializable; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 15:19 + */ +public class MockCallRequest implements Serializable { + /** + * Mock 的链路id + */ + private String traceId; + /** + * 需要执行的Mock + */ + private String mockCallUuid; + /** + * 需要处理的请求数据 + */ + private String mockRequest; + + public String getTraceId() { + return traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public String getMockCallUuid() { + return mockCallUuid; + } + + public void setMockCallUuid(String mockCallUuid) { + this.mockCallUuid = mockCallUuid; + } + + public String getMockRequest() { + return mockRequest; + } + + public void setMockRequest(String mockRequest) { + this.mockRequest = mockRequest; + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java new file mode 100644 index 0000000..40d9446 --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java @@ -0,0 +1,65 @@ +package cn.icanci.loopstack.amc.cloud.common.response; + +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; + +import java.io.Serializable; + +/** + * MockFacade执行请求返回结果 + * + * @author icanci + * @since 1.0 Created in 2023/01/16 15:20 + */ +public class MockCallResponse implements Serializable { + + /** + * 是否成功 + */ + private boolean success; + /** + * 请求调用错误信息 + */ + private String errorMessage; + /** + * Mock Wrapper + */ + private MockCallWrapper wrapper; + + public static MockCallResponse success(MockCallWrapper wrapper) { + MockCallResponse response = new MockCallResponse(); + response.setSuccess(true); + response.setWrapper(wrapper); + return response; + } + + public static MockCallResponse fail(String localizedMessage) { + MockCallResponse response = new MockCallResponse(); + response.setSuccess(true); + response.setErrorMessage(localizedMessage); + return response; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public MockCallWrapper getWrapper() { + return wrapper; + } + + public void setWrapper(MockCallWrapper wrapper) { + this.wrapper = wrapper; + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java new file mode 100644 index 0000000..01d62ea --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java @@ -0,0 +1,269 @@ +package cn.icanci.loopstack.amc.cloud.common.utils; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.amc.cloud.common.exception.UnSupportWrapperException; + +import java.math.BigDecimal; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 11:10 + */ +public class WrapperUtils { + private WrapperUtils() { + } + + /** + * 转换为bean + * + * @param wrapperResp wrapperResp + * @param clazz clazz + * @param T 类型 + * @return 返回指定对象数据 + */ + public static T toObjectBean(Object wrapperResp, Class clazz) { + try { + return JSONUtil.toBean(JSONUtil.toJsonStr(wrapperResp), clazz); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toBoolean + * + * @param wrapperResp wrapperResp + * @return toBoolean + */ + public static Boolean toBoolean(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + if (wrapperResp instanceof Boolean) { + return (Boolean) wrapperResp; + } + String resp = wrapperResp.toString(); + if (Boolean.TRUE.toString().equalsIgnoreCase(resp) || Boolean.FALSE.toString().equalsIgnoreCase(resp)) { + return Boolean.valueOf(resp); + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toBoolean"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toBooleanUnBox + * + * @param wrapperResp wrapperResp + * @return toBooleanUnBox + */ + public static boolean toBooleanUnBox(Object wrapperResp) { + try { + if (wrapperResp == null) { + throw new UnSupportWrapperException("UnSupport parse null toBooleanUnBox"); + } + if (wrapperResp instanceof Boolean) { + return (Boolean) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toBoolean"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toInteger + * + * @param wrapperResp wrapperResp + * @return toInteger + */ + public static Integer toInteger(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + if (wrapperResp instanceof Integer) { + return (Integer) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toInteger"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toIntegerUnBox + * + * @param wrapperResp wrapperResp + * @return toIntegerUnBox + */ + public static int toIntegerUnBox(Object wrapperResp) { + try { + if (wrapperResp == null) { + throw new UnSupportWrapperException("UnSupport parse null toIntegerUnBox"); + } + if (wrapperResp instanceof Integer) { + return (Integer) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toIntegerUnBox"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toLong + * + * @param wrapperResp wrapperResp + * @return toLong + */ + public static Long toLong(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + if (wrapperResp instanceof Long) { + return (Long) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toLong"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toLongUnBox + * + * @param wrapperResp wrapperResp + * @return toLongUnBox + */ + public static long toLongUnBox(Object wrapperResp) { + try { + if (wrapperResp == null) { + throw new UnSupportWrapperException("UnSupport parse null toLongUnBox"); + } + if (wrapperResp instanceof Long) { + return (Long) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toLongUnBox"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toDouble + * + * @param wrapperResp wrapperResp + * @return toDouble + */ + public static Double toDouble(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + if (wrapperResp instanceof Double) { + return (Double) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toDouble"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toDoubleUnBox + * + * @param wrapperResp wrapperResp + * @return toDoubleUnBox + */ + public static double toDoubleUnBox(Object wrapperResp) { + try { + if (wrapperResp == null) { + throw new UnSupportWrapperException("UnSupport parse null toDoubleUnBox"); + } + if (wrapperResp instanceof Double) { + return (Double) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toDoubleUnBox"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toFloat + * + * @param wrapperResp wrapperResp + * @return toFloat + */ + public static Float toFloat(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + if (wrapperResp instanceof Float) { + return (Float) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toFloat"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toFloatUnBox + * + * @param wrapperResp wrapperResp + * @return toFloatUnBox + */ + public static float toFloatUnBox(Object wrapperResp) { + try { + if (wrapperResp == null) { + throw new UnSupportWrapperException("UnSupport parse null toFloatUnBox"); + } + if (wrapperResp instanceof Float) { + return (Float) wrapperResp; + } + throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toFloatUnBox"); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toBigDecimal + * + * @param wrapperResp wrapperResp + * @return toBigDecimal + */ + public static BigDecimal toBigDecimal(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + return new BigDecimal(String.valueOf(wrapperResp)); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } + + /** + * toStringValue + * + * @param wrapperResp wrapperResp + * @return toStringValue + */ + public static String toStringValue(Object wrapperResp) { + try { + if (wrapperResp == null) { + return null; + } + return wrapperResp.toString(); + } catch (Exception ex) { + throw new UnSupportWrapperException(ex); + } + } +} diff --git a/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java b/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java new file mode 100644 index 0000000..ad81259 --- /dev/null +++ b/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java @@ -0,0 +1,18 @@ +package cn.icanci.loopstack.amc.cloud.common.utils.test; + +import cn.icanci.loopstack.amc.cloud.common.utils.WrapperUtils; + +import org.junit.Test; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 11:19 + */ +public class WrapperUtilsTest { + @Test + public void testBoolean() { + Boolean b = Boolean.TRUE; + Boolean aBoolean = WrapperUtils.toBoolean("FAlse"); + System.out.println(aBoolean); + } +} diff --git a/dal/pom.xml b/dal/pom.xml new file mode 100644 index 0000000..804caf0 --- /dev/null +++ b/dal/pom.xml @@ -0,0 +1,44 @@ + + + + amc-cloud-parent + cn.icanci.loopstack.amc + 1.0-SNAPSHOT + + 4.0.0 + + cloud-dal + + + 8 + 8 + + + + org.springframework + spring-context + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + com.google.guava + guava + + + cn.icanci.loopstack.amc + amc-common + + + \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java new file mode 100644 index 0000000..459f764 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java @@ -0,0 +1,27 @@ +package cn.icanci.loopstack.amc.cloud.dal.exception; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 23:37 + */ +public class NotSupportAccessException extends RuntimeException { + public NotSupportAccessException() { + super(); + } + + public NotSupportAccessException(String message) { + super(message); + } + + public NotSupportAccessException(String message, Throwable cause) { + super(message, cause); + } + + public NotSupportAccessException(Throwable cause) { + super(cause); + } + + protected NotSupportAccessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java new file mode 100644 index 0000000..29fe7e1 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java @@ -0,0 +1,28 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppDO; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:31 + */ +public interface AppDAO extends BaseDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-app"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = AppDO.class; + + AppDO queryByAppId(String appId); + + AppDO queryByAppName(String appName); + + interface AppColumn extends BaseColumn { + String appId = "appId"; + String appName = "appName"; + String teamUuid = "teamUuid"; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java new file mode 100644 index 0000000..817d93f --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java @@ -0,0 +1,30 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:23 + */ +public interface AppMockCallDAO extends BaseDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-app-mock-call"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = AppMockCallDO.class; + + AppMockCallDO queryByAppMockName(String mockName); + + AppMockCallDO queryByUuid(String uuid); + + interface AppMockCallColumn extends BaseColumn { + String mockName = "mockName"; + String appUuid = "appUuid"; + String scriptType = "scriptType"; + String script = "script"; + String method = "method"; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java new file mode 100644 index 0000000..0990873 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java @@ -0,0 +1,21 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 23:28 + */ +public interface AppMockCallReportDAO extends BaseDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-app-mock-call-report"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = AppMockCallReportDO.class; + + interface AppMockCallReportColumn extends BaseColumn { + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java new file mode 100644 index 0000000..ef030fa --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java @@ -0,0 +1,71 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.BaseDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 11:55 + */ +public interface BaseDAO { + + /** + * 插入文档一条记录 + * + * @param t t + */ + void insert(T t); + + /** + * 更新文档一条记录 + * + * @param t t + * @return 更新结果 + */ + void update(T t); + + /** + * 查询文档所有记录 + * + * @return 返回查询的结果 + */ + List queryAll(); + + /** + * 查询文档所有记录 + * + * @param t 请求参数 + * @param pageNum pageNum + * @param pageSize pageSize + * @return 返回查询的结果 + */ + PageList pageQuery(T t, int pageNum, int pageSize); + + /** + * 根据 _id 查询一条信息 + * + * @param _id _id + * @return 返回查询的结果 + */ + T queryOneById(String _id); + + /** 基本表 */ + interface BaseColumn { + /** 文档id */ + String _id = "_id"; + /** uuid */ + String uuid = "uuid"; + /** desc */ + String desc = "desc"; + /** createTime */ + String createTime = "createTime"; + /** updateTime */ + String updateTime = "updateTime"; + /** 状态 0:有效,1:无效 */ + String isDelete = "isDelete"; + /** 操作环境 */ + String env = "env"; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java new file mode 100644 index 0000000..acc025f --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java @@ -0,0 +1,27 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.GroupDO; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:31 + */ +public interface GroupDAO extends BaseDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-group"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = GroupDO.class; + + GroupDO queryByGroupId(String groupId); + + GroupDO queryByGroupName(String groupName); + + interface GroupColumn extends BaseColumn { + String groupId = "groupId"; + String groupName = "groupName"; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java new file mode 100644 index 0000000..4e310a3 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java @@ -0,0 +1,83 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.LogOperateDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/11 14:05 + */ +public interface LogOperateDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-log"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = LogOperateDO.class; + + /** + * 插入文档一条记录 + * + * @param t t + */ + void insert(LogOperateDO t); + + /** + * 更新文档一条记录 + * + * @param t t + * @return 更新结果 + */ + void update(LogOperateDO t); + + /** + * 查询文档所有记录 + * + * @return 返回查询的结果 + */ + List queryAll(); + + /** + * 查询文档所有记录 + * + * @param t 请求参数 + * @param pageNum pageNum + * @param pageSize pageSize + * @return 返回查询的结果 + */ + PageList pageQuery(LogOperateDO t, int pageNum, int pageSize); + + /** + * 根据 _id 查询一条信息 + * + * @param _id _id + * @return 返回查询的结果 + */ + LogOperateDO queryOneById(String _id); + + interface LogColumn { + String _id = "id"; + + /** 操作模块 */ + String module = "module"; + + /** 对象编号 */ + String targetId = "targetId"; + + /** 操作类型*/ + String operatorType = "operatorType"; + + /** 操作内容 */ + String content = "content"; + + /** 创建时间 */ + String createTime = "createTime"; + + /** 环境 */ + String env = "env"; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java new file mode 100644 index 0000000..f955e1f --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java @@ -0,0 +1,28 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.TeamDO; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:38 + */ +public interface TeamDAO extends BaseDAO { + /** + * 文档对应的名字 + */ + String COLLECTION_NAME = "amc-team"; + /** + * 文档对应的Class + */ + Class COLLECTION_CLASS = TeamDO.class; + + TeamDO queryByTeamId(String teamId); + + TeamDO queryByTeamName(String teamName); + + interface TeamColumn extends BaseColumn { + String teamId = "teamId"; + String teamName = "teamName"; + String groupUuid = "groupUuid"; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java new file mode 100644 index 0000000..6ee56f5 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java @@ -0,0 +1,47 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +/** +* @author icanci +* @since 1.0 Created in 2023/01/07 15:22 +*/ +public class AppDO extends BaseDO { + + /** + * 项目id,全局唯一 + */ + private String appId; + + /** + * 项目名字 + */ + private String appName; + + /** + * 项目组关联uuid + */ + private String teamUuid; + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppId() { + return this.appId; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getAppName() { + return this.appName; + } + + public void setTeamUuid(String teamUuid) { + this.teamUuid = teamUuid; + } + + public String getTeamUuid() { + return this.teamUuid; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java new file mode 100644 index 0000000..09a9d26 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java @@ -0,0 +1,69 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +/** +* @author icanci +* @since 1.0 Created in 2023/01/07 15:22 +*/ +public class AppMockCallDO extends BaseDO { + + /** + * mock 配置名称 + */ + private String mockName; + /** + * 脚本关联的uuid + */ + private String appUuid; + /** + * 脚本执行类型 + */ + private String scriptType; + /** + * 执行的脚本内容 + */ + private String script; + /** + * 脚本的请求方法 + */ + private String method; + + public String getMockName() { + return mockName; + } + + public void setMockName(String mockName) { + this.mockName = mockName; + } + + public String getAppUuid() { + return appUuid; + } + + public void setAppUuid(String appUuid) { + this.appUuid = appUuid; + } + + public String getScriptType() { + return scriptType; + } + + public void setScriptType(String scriptType) { + this.scriptType = scriptType; + } + + public String getScript() { + return script; + } + + public void setScript(String script) { + this.script = script; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java new file mode 100644 index 0000000..2efbcb2 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java @@ -0,0 +1,80 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 23:29 + */ +public class AppMockCallReportDO extends BaseDO { + /** + * mock 过程是否成功 + */ + private boolean success; + /** + * mockName + */ + private String mockName; + /** + * mockUuid + */ + private String mockUuid; + /** + * mock执行的请求 + */ + private String mockRequest; + /** + * mock执行的异常信息 + */ + private String mockErrorMessage; + /** + * 真正mock返回的结果 + */ + private String mockResponse; + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMockName() { + return mockName; + } + + public void setMockName(String mockName) { + this.mockName = mockName; + } + + public String getMockUuid() { + return mockUuid; + } + + public void setMockUuid(String mockUuid) { + this.mockUuid = mockUuid; + } + + public String getMockRequest() { + return mockRequest; + } + + public void setMockRequest(String mockRequest) { + this.mockRequest = mockRequest; + } + + public String getMockErrorMessage() { + return mockErrorMessage; + } + + public void setMockErrorMessage(String mockErrorMessage) { + this.mockErrorMessage = mockErrorMessage; + } + + public String getMockResponse() { + return mockResponse; + } + + public void setMockResponse(String mockResponse) { + this.mockResponse = mockResponse; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java new file mode 100644 index 0000000..96d1fa5 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java @@ -0,0 +1,116 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +import java.util.Date; +import java.util.StringJoiner; + +import org.springframework.data.annotation.Id; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 存储基本模型 + * + * @author icanci + * @since 1.0 Created in 2023/01/15 11:55 + */ +public class BaseDO { + /** + * 文档id + */ + @Id + private String id; + + /** + * 雪花算法随机UUID + */ + private String uuid; + + /** + * 功能描述 + */ + private String desc; + + /** + * 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + 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; + } + + @Override + public String toString() { + return new StringJoiner(",").add("id=" + id).add("uuid=" + uuid).add("desc=" + desc).add("createTime=" + createTime).add("updateTime=" + updateTime) + .add("isDelete=" + isDelete).add("env=" + env).toString(); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java new file mode 100644 index 0000000..53289ab --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java @@ -0,0 +1,34 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +/** +* @author icanci +* @since 1.0 Created in 2023/01/07 15:22 +*/ +public class GroupDO extends BaseDO { + + /** + * 事业群组id,唯一 + */ + private String groupId; + + /** + * 组名字 + */ + private String groupName; + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java new file mode 100644 index 0000000..a87c5e8 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java @@ -0,0 +1,98 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +import cn.icanci.loopstack.amc.common.enums.LogOperatorTypeEnum; + +import java.util.Date; + +import org.springframework.data.annotation.Id; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/11 13:39 + */ +public class LogOperateDO { + /** 编号 */ + @Id + private String id; + + /** 操作模块 */ + private String module; + + /** 对象编号 */ + private String targetId; + + /** + * 操作类型 + * + * @see LogOperatorTypeEnum#name() + */ + private String operatorType; + + /** 操作内容 */ + private String content; + + /** 创建时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 环境 */ + private String env; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getModule() { + return module; + } + + public void setModule(String module) { + this.module = module; + } + + public String getTargetId() { + return targetId; + } + + public void setTargetId(String targetId) { + this.targetId = targetId; + } + + public String getOperatorType() { + return operatorType; + } + + public void setOperatorType(String operatorType) { + this.operatorType = operatorType; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getEnv() { + return env; + } + + public void setEnv(String env) { + this.env = env; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java new file mode 100644 index 0000000..4f3b0bd --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java @@ -0,0 +1,47 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject; + +/** +* @author icanci +* @since 1.0 Created in 2023/01/07 15:22 +*/ +public class TeamDO extends BaseDO { + + /** + * 项目组id,唯一 + */ + private String teamId; + + /** + * 项目组名字 + */ + private String teamName; + + /** + * 事业群关联uuid + */ + private String groupUuid; + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getGroupUuid() { + return groupUuid; + } + + public void setGroupUuid(String groupUuid) { + this.groupUuid = groupUuid; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java new file mode 100644 index 0000000..6646855 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java @@ -0,0 +1,40 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.BaseDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.BaseDO; +import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils; +import cn.icanci.loopstack.amc.cloud.dal.utils.IDHolder; + +import java.util.Date; + +import org.springframework.beans.factory.InitializingBean; + +/** + * @author icanci + * @since 1.0 Created in 2022/10/24 22:47 + */ +public abstract class AbstractBaseDAO extends MongoPageHelper implements BaseDAO, InitializingBean { + + protected String DEFAULT_ENV; + + @Override + public void insert(T t) { + // 处理插入数据 + t.setId(null); + t.setIsDelete(0); + t.setCreateTime(new Date()); + t.setUpdateTime(new Date()); + t.setEnv(DEFAULT_ENV); + t.setUuid(IDHolder.generateNoBySnowFlakeDefaultPrefix()); + } + + @Override + public void update(T t) { + t.setUpdateTime(new Date()); + } + + @Override + public void afterPropertiesSet() throws Exception { + DEFAULT_ENV = EnvUtils.getEnv(); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java new file mode 100644 index 0000000..75d4e68 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java @@ -0,0 +1,83 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:24 + */ +@Service("appDAO") +public class MongoAppDAO extends AbstractBaseDAO implements AppDAO { + + @Override + public void insert(AppDO app) { + super.insert(app); + mongoTemplate.insert(app, COLLECTION_NAME); + } + + @Override + public void update(AppDO app) { + super.update(app); + mongoTemplate.save(app, COLLECTION_NAME); + } + + @Override + public List queryAll() { + Criteria criteria = Criteria.where(AppColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public PageList pageQuery(AppDO app, int pageNum, int pageSize) { + Criteria criteria = Criteria.where(AppColumn.env).is(DEFAULT_ENV); + + if (StringUtils.isNotBlank(app.getAppName())) { + // 不分区大小写查询,其中操作符"i":表示不分区大小写 + criteria.and(AppColumn.appName).regex("^.*" + app.getAppName() + ".*$", "i"); + } + + if (StringUtils.isNotBlank(app.getTeamUuid())) { + criteria.and(AppColumn.teamUuid).is(app.getTeamUuid()); + } + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, AppColumn.createTime)); + + return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); + } + + @Override + public AppDO queryOneById(String _id) { + Criteria criteria = Criteria.where(AppColumn._id).is(_id); + criteria.and(AppColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public AppDO queryByAppId(String appId) { + Criteria criteria = Criteria.where(AppColumn.appId).is(appId); + criteria.and(AppColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public AppDO queryByAppName(String appName) { + Criteria criteria = Criteria.where(AppColumn.appName).is(appName); + criteria.and(AppColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java new file mode 100644 index 0000000..c9063e7 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java @@ -0,0 +1,79 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:24 + */ +@Service("appMockCallDAO") +public class MongoAppMockCallDAO extends AbstractBaseDAO implements AppMockCallDAO { + + @Override + public void insert(AppMockCallDO appMockCallDO) { + super.insert(appMockCallDO); + mongoTemplate.insert(appMockCallDO, COLLECTION_NAME); + } + + @Override + public void update(AppMockCallDO appMockCallDO) { + super.update(appMockCallDO); + mongoTemplate.save(appMockCallDO, COLLECTION_NAME); + } + + @Override + public List queryAll() { + Criteria criteria = Criteria.where(AppMockCallColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public PageList pageQuery(AppMockCallDO appMockCallDO, int pageNum, int pageSize) { + Criteria criteria = Criteria.where(AppMockCallColumn.env).is(DEFAULT_ENV); + + if (StringUtils.isNotBlank(appMockCallDO.getMockName())) { + // 不分区大小写查询,其中操作符"i":表示不分区大小写 + criteria.and(AppMockCallColumn.mockName).regex("^.*" + appMockCallDO.getMockName() + ".*$", "i"); + } + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, AppMockCallColumn.createTime)); + + return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); + } + + @Override + public AppMockCallDO queryOneById(String _id) { + Criteria criteria = Criteria.where(AppMockCallColumn._id).is(_id); + criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public AppMockCallDO queryByAppMockName(String mockName) { + Criteria criteria = Criteria.where(AppMockCallColumn.mockName).is(mockName); + criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public AppMockCallDO queryByUuid(String uuid) { + Criteria criteria = Criteria.where(AppMockCallColumn.uuid).is(uuid); + criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java new file mode 100644 index 0000000..66d4f7e --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java @@ -0,0 +1,44 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.cloud.dal.exception.NotSupportAccessException; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallReportDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 23:35 + */ +@Service("appMockCallReportDAO") +public class MongoAppMockCallReportDAO extends AbstractBaseDAO implements AppMockCallReportDAO { + + @Override + public void insert(AppMockCallReportDO appMockCallReportDO) { + super.insert(appMockCallReportDO); + mongoTemplate.insert(appMockCallReportDO, COLLECTION_NAME); + } + + @Override + public void update(AppMockCallReportDO appMockCallReportDO) { + throw new NotSupportAccessException(); + } + + @Override + public List queryAll() { + throw new NotSupportAccessException(); + } + + @Override + public PageList pageQuery(AppMockCallReportDO appMockCallReportDO, int pageNum, int pageSize) { + throw new NotSupportAccessException(); + } + + @Override + public AppMockCallReportDO queryOneById(String _id) { + throw new NotSupportAccessException(); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java new file mode 100644 index 0000000..5255188 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java @@ -0,0 +1,83 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.GroupDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.GroupDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:24 + */ +@Service("groupDAO") +public class MongoGroupDAO extends AbstractBaseDAO implements GroupDAO { + + @Override + public void insert(GroupDO group) { + super.insert(group); + mongoTemplate.insert(group, COLLECTION_NAME); + } + + @Override + public void update(GroupDO group) { + super.update(group); + mongoTemplate.save(group, COLLECTION_NAME); + } + + @Override + public List queryAll() { + Criteria criteria = Criteria.where(GroupColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public PageList pageQuery(GroupDO group, int pageNum, int pageSize) { + Criteria criteria = Criteria.where(GroupColumn.env).is(DEFAULT_ENV); + + if (StringUtils.isNotBlank(group.getGroupName())) { + // 不分区大小写查询,其中操作符"i":表示不分区大小写 + criteria.and(GroupColumn.groupName).regex("^.*" + group.getGroupName() + ".*$", "i"); + } + + if (StringUtils.isNotBlank(group.getGroupId())) { + criteria.and(GroupColumn.groupId).is(group.getGroupId()); + } + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, GroupColumn.createTime)); + + return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); + } + + @Override + public GroupDO queryOneById(String _id) { + Criteria criteria = Criteria.where(GroupColumn._id).is(_id); + criteria.and(GroupColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public GroupDO queryByGroupId(String groupId) { + Criteria criteria = Criteria.where(GroupColumn.groupId).is(groupId); + criteria.and(GroupColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public GroupDO queryByGroupName(String groupName) { + Criteria criteria = Criteria.where(GroupColumn.groupName).is(groupName); + criteria.and(GroupColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java new file mode 100644 index 0000000..db01626 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java @@ -0,0 +1,61 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.LogOperateDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.LogOperateDO; +import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils; +import cn.icanci.loopstack.amc.common.model.PageList; + +import java.util.List; + +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/11 16:06 + */ +@Service("logOperateDAO") +public class MongoLogOperateDAO extends MongoPageHelper implements LogOperateDAO { + @Override + public void insert(LogOperateDO t) { + t.setId(null); + t.setEnv(EnvUtils.getEnv()); + mongoTemplate.insert(t, COLLECTION_NAME); + } + + @Override + public void update(LogOperateDO t) { + throw new RuntimeException("Not Support Update!"); + } + + @Override + public List queryAll() { + Criteria criteria = Criteria.where(LogColumn.env).is(EnvUtils.getEnv()); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + + } + + @Override + public PageList pageQuery(LogOperateDO t, int pageNum, int pageSize) { + Criteria criteria = Criteria.where(LogColumn.env).is(EnvUtils.getEnv()); + criteria.and(LogColumn.module).is(t.getModule()); + criteria.and(LogColumn.targetId).is(t.getTargetId()); + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, LogColumn.createTime)); + + return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); + + } + + @Override + public LogOperateDO queryOneById(String _id) { + Criteria criteria = Criteria.where(LogColumn._id).is(_id); + criteria.and(LogColumn.env).is(EnvUtils.getEnv()); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java new file mode 100644 index 0000000..5ad13c7 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java @@ -0,0 +1,114 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import cn.icanci.loopstack.amc.common.model.PageList; +import cn.icanci.loopstack.amc.common.model.Paginator; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.bson.types.ObjectId; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Order; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import com.google.common.collect.Lists; + +/** + * 分页插件 + * + * @author icanci(1205068) + * @version Id: MongoPageHelper, v 0.1 2022/10/24 16:44 icanci Exp $ + */ +public class MongoPageHelper { + @Resource + protected MongoTemplate mongoTemplate; + + public static final int FIRST_PAGE_NUM = 1; + + public static final String ID = "_id"; + + /** + * 分页查询,直接返回集合类型的结果. + * + * @param query 查询 + * @param entityClass class + * @param pageSize pageSize + * @param pageNum pageNum + * @param collectionName collectionName + * @param T + * @return PageResult + */ + public PageList pageQuery(Query query, Class entityClass, Integer pageSize, Integer pageNum, String collectionName) { + return pageQuery(query, entityClass, Function.identity(), pageSize, pageNum, null, collectionName); + } + + /** + * 分页查询,不考虑条件分页,直接使用skip-limit来分页. + * + * @param query 查询 + * @param entityClass class + * @param pageSize pageSize + * @param pageNum pageNum + * @param collectionName collectionName + * @param T + * @param R + * @param mapper mapper + * @return PageResult + */ + public PageList pageQuery(Query query, Class entityClass, Function mapper, Integer pageSize, Integer pageNum, String collectionName) { + return pageQuery(query, entityClass, mapper, pageSize, pageNum, null, collectionName); + } + + /** + * 分页查询. + * + * @param query Mongo Query对象,构造你自己的查询条件 + * @param entityClass Mongo collection定义的entity class,用来确定查询哪个集合 + * @param mapper 映射器,从db查出来的list的元素类型是entityClass, 如果你想要转换成另一个对象,比如去掉敏感字段等,可以使用mapper来决定如何转换 + * @param pageSize 分页的大小 + * @param pageNum 当前页 + * @param lastId 条件分页参数, 区别于skip-limit,采用find(_id>lastId).limit分页 + * @param collection定义的class类型 + * @param 最终返回时,展现给页面时的一条记录的类型 + * @return PageResult,一个封装page信息的对象 + */ + public PageList pageQuery(Query query, Class entityClass, Function mapper, Integer pageSize, Integer pageNum, String lastId, String collectionName) { + //分页逻辑 + long total = mongoTemplate.count(query, entityClass, collectionName); + + final int pages = (int) Math.ceil(total / (double) pageSize); + + if (pageNum <= 0 || pageNum > pages) { + pageNum = FIRST_PAGE_NUM; + } + + final Criteria criteria = new Criteria(); + + if (StringUtils.isNotBlank(lastId)) { + if (pageNum != FIRST_PAGE_NUM) { + criteria.and(ID).gt(new ObjectId(lastId)); + } + query.limit(pageSize); + } else { + int skip = pageSize * (pageNum - 1); + query.skip(skip).limit(pageSize); + } + + final List entityList = mongoTemplate.find(query.addCriteria(criteria).with(Sort.by(Lists.newArrayList(new Order(Sort.Direction.ASC, ID)))), entityClass, + collectionName); + + final PageList pageResult = new PageList<>(); + Paginator paginator = pageResult.getPaginator(); + paginator.setTotalCount((int) total); + paginator.setPageSize(pageSize); + paginator.setCurrentPage(pageNum); + pageResult.setData(entityList.stream().map(mapper).collect(Collectors.toList())); + return pageResult; + } +} \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java new file mode 100644 index 0000000..833f778 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java @@ -0,0 +1,87 @@ +package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.TeamDAO; +import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.TeamDO; +import cn.icanci.loopstack.amc.common.model.PageList; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 12:24 + */ +@Service("teamDAO") +public class MongoTeamDAO extends AbstractBaseDAO implements TeamDAO { + + @Override + public void insert(TeamDO team) { + super.insert(team); + mongoTemplate.insert(team, COLLECTION_NAME); + } + + @Override + public void update(TeamDO team) { + super.update(team); + mongoTemplate.save(team, COLLECTION_NAME); + } + + @Override + public List queryAll() { + Criteria criteria = Criteria.where(TeamColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public PageList pageQuery(TeamDO team, int pageNum, int pageSize) { + Criteria criteria = Criteria.where(TeamColumn.env).is(DEFAULT_ENV); + + if (StringUtils.isNotBlank(team.getTeamName())) { + // 不分区大小写查询,其中操作符"i":表示不分区大小写 + criteria.and(TeamColumn.teamName).regex("^.*" + team.getTeamName() + ".*$", "i"); + } + + if (StringUtils.isNotBlank(team.getTeamId())) { + criteria.and(TeamColumn.teamId).is(team.getTeamId()); + } + + if (StringUtils.isNotBlank(team.getGroupUuid())) { + criteria.and(TeamColumn.groupUuid).is(team.getGroupUuid()); + } + + Query query = new Query(criteria); + query.with(Sort.by(Sort.Direction.DESC, TeamColumn.createTime)); + + return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME); + } + + @Override + public TeamDO queryOneById(String _id) { + Criteria criteria = Criteria.where(TeamColumn._id).is(_id); + criteria.and(TeamColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public TeamDO queryByTeamId(String teamId) { + Criteria criteria = Criteria.where(TeamColumn.teamId).is(teamId); + criteria.and(TeamColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } + + @Override + public TeamDO queryByTeamName(String teamName) { + Criteria criteria = Criteria.where(TeamColumn.teamName).is(teamName); + criteria.and(TeamColumn.env).is(DEFAULT_ENV); + Query query = new Query(criteria); + return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java new file mode 100644 index 0000000..510f4a3 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 11:54 + */ +package cn.icanci.loopstack.amc.cloud.dal.mongodb; \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java new file mode 100644 index 0000000..48646bb --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2023/01/15 11:53 + */ +package cn.icanci.loopstack.amc.cloud.dal; \ No newline at end of file diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java new file mode 100644 index 0000000..0a6e10d --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java @@ -0,0 +1,33 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils; + +import org.apache.commons.lang3.StringUtils; + +import cn.icanci.loopstack.amc.cloud.dal.utils.service.EnvService; +import cn.icanci.loopstack.amc.cloud.dal.utils.service.impl.EnvServiceImpl; + +/** + * 环境标识 + * + * @author icanci + * @since 1.0 Created in 2022/11/12 08:26 + */ +public class EnvUtils { + + private static final String DEFAULT_ENV = "test"; + + private static EnvService envService; + + private static String currEnv; + + public static String getEnv() { + if (StringUtils.isBlank(currEnv)) { + String env = envService.getEnv(); + currEnv = StringUtils.isBlank(env) ? DEFAULT_ENV : env; + } + return currEnv; + } + + public static void setEnvService(EnvServiceImpl envService) { + EnvUtils.envService = envService; + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java new file mode 100644 index 0000000..4557f85 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java @@ -0,0 +1,40 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils; + +import cn.icanci.loopstack.amc.cloud.dal.utils.service.IDGeneratorService; + +/** + * Id 生成器 + * + * @author icanci + * @since 1.0 Created in 2022/11/11 14:18 + */ +public class IDHolder { + /** 分布式id服务 */ + private static IDGeneratorService idGeneratorService; + + private static final String DEFAULT_PREFIX = "AMC"; + + public static void setIdGeneratorService(IDGeneratorService idGeneratorService) { + IDHolder.idGeneratorService = idGeneratorService; + } + + /** + * 通过雪花算法生成唯一id + * + * @param prefix 前缀 + * @return id + */ + public static String generateNoBySnowFlake(String prefix) { + return idGeneratorService.generateBySnowFlake(prefix); + } + + /** + * 通过雪花算法生成唯一id,默认 REC + * + * @return id + */ + public static String generateNoBySnowFlakeDefaultPrefix() { + return idGeneratorService.generateBySnowFlake(DEFAULT_PREFIX); + } + +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java new file mode 100644 index 0000000..895d5c0 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java @@ -0,0 +1,14 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils.service; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/12 08:28 + */ +public interface EnvService { + /** + * 获取当前的环境信息 + * + * @return 返回当前的环境信息 + */ + String getEnv(); +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java new file mode 100644 index 0000000..6b78daf --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java @@ -0,0 +1,15 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils.service; + +/** + * @author icanci + * @since 1.0 Created in 2022/10/30 08:43 + */ +public interface IDGeneratorService { + /** + * 生成唯一id + * + * @param prefix 前缀 + * @return id + */ + String generateBySnowFlake(String prefix); +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java new file mode 100644 index 0000000..1f86d07 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java @@ -0,0 +1,30 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils.service.impl; + +import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils; +import cn.icanci.loopstack.amc.cloud.dal.utils.service.EnvService; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Service; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/12 08:29 + */ +@Service("envService") +public class EnvServiceImpl implements EnvService, BeanPostProcessor { + @Value("${amc.env}") + private String env; + + @Override + public String getEnv() { + return env; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + EnvUtils.setEnvService(this); + return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName); + } +} diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java new file mode 100644 index 0000000..e690770 --- /dev/null +++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java @@ -0,0 +1,31 @@ +package cn.icanci.loopstack.amc.cloud.dal.utils.service.impl; + +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.loopstack.amc.cloud.dal.utils.IDHolder; +import cn.icanci.loopstack.amc.cloud.dal.utils.service.IDGeneratorService; + +/** + * 分布式ID生成器 + * + * @author icanci + * @since 1.0 Created in 2022/10/30 08:43 + */ +@Service +public class IDGeneratorServiceImpl implements IDGeneratorService, InitializingBean { + /** 雪花序列号生成算法 */ + private static final Snowflake SNOW_FLAKE = new Snowflake(RandomUtils.nextInt(1, 9), RandomUtils.nextInt(1, 9)); + + @Override + public String generateBySnowFlake(String prefix) { + return prefix + SNOW_FLAKE.nextId(); + } + + @Override + public void afterPropertiesSet() throws Exception { + IDHolder.setIdGeneratorService(this); + } +} diff --git a/facade/pom.xml b/facade/pom.xml index 953ff5a..25e567f 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -16,4 +16,22 @@ 8 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + cn.icanci.loopstack.amc + cloud-biz + ${parent.version} + + \ No newline at end of file diff --git a/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java new file mode 100644 index 0000000..293418d --- /dev/null +++ b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java @@ -0,0 +1,41 @@ +package cn.icanci.loopstack.amc.cloud; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper; +import cn.icanci.loopstack.amc.cloud.biz.service.MockCallService; +import cn.icanci.loopstack.amc.cloud.common.request.MockCallRequest; +import cn.icanci.loopstack.amc.cloud.common.response.MockCallResponse; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 14:31 + */ +@RestController +@RequestMapping("mock/call") +public class MockCallCloudFacade { + private static final Logger logger = LoggerFactory.getLogger(MockCallCloudFacade.class); + @Resource + private MockCallService mockCallService; + + @PostMapping("invoke") + public MockCallResponse invoke(@RequestBody MockCallRequest request) { + logger.info("[MockCallCloudFacade][invoke] request:{}", JSONUtil.toJsonStr(request)); + try { + MockCallWrapper wrapper = mockCallService.mockCall(request.getMockCallUuid(), request.getMockRequest()); + logger.info("[MockCallCloudFacade][invoke] response:{}", JSONUtil.toJsonStr(wrapper)); + return MockCallResponse.success(wrapper); + } catch (Exception ex) { + logger.error("[MockCallCloudFacade][invoke] invoke error:{}", ex.getLocalizedMessage()); + return MockCallResponse.fail(ex.getLocalizedMessage()); + } + } +} diff --git a/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java new file mode 100644 index 0000000..a6ce0f7 --- /dev/null +++ b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2023/01/16 14:30 + */ +package cn.icanci.loopstack.amc.cloud; \ No newline at end of file diff --git a/pom.xml b/pom.xml index a75baad..e090945 100644 --- a/pom.xml +++ b/pom.xml @@ -11,12 +11,461 @@ biz facade - trace + dal + application + common + + UTF-8 + + 3.8.1 + 3.0.0-M1 + 3.2.1 + 3.2.0 + 1.6.8 + 1.6 + 3.0.0-M1 + + 1.8 + UTF-8 8 8 + + 4.13.2 + + 1.7.30 + 2.12.1 + 2.13.3 + 2.13.3 + 3.3.4 + + 2.2.2.RELEASE + + 3.4 + 2.4 + 4.3 + 19.0 + + + 2.4.7.Final + + 2.5.11 + + 2.11.2 + 1.2.70 + + 1.4.2.Final + 5.4.2 + + 4.1.63.Final + + 1.0-SNAPSHOT + + 0.0.0.1-SNAPSHOT + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-dependencies + + + org.springframework.boot + spring-boot-starter-logging + + + ${spring.boot.version} + import + pom + + + + org.apache.commons + commons-lang3 + ${commons.lang3.version} + + + commons-io + commons-io + ${commons.io.version} + + + org.apache.commons + commons-collections4 + ${commons.collections4.version} + + + com.google.guava + guava + ${guava.version} + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + junit + junit + ${junit.version} + test + + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j-slf4j-impl.version} + + + + org.apache.logging.log4j + log4j-api + ${log4j-api.version} + + + + org.apache.logging.log4j + log4j-core + ${log4j-core.version} + + + + com.lmax + disruptor + ${disruptor.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + org.mvel + mvel2 + ${mvel2.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + + + io.netty + netty-all + ${netty-all.version} + + + + cn.icanci.loopstack + lsi-event + ${lsi.version} + + + cn.icanci.loopstack.ddk + ddk-client + ${ddk.version} + + + cn.icanci.loopstack + lsi-api + ${lsi.version} + + + cn.icanci.loopstack + lsi-script + ${lsi.version} + + + cn.icanci.loopstack.amc + amc-common + ${amc.version} + + + cn.icanci.loopstack.amc + amc-spi + ${amc.version} + + + + + + + + org.slf4j + slf4j-api + + + + org.apache.logging.log4j + log4j-slf4j-impl + + + + org.apache.logging.log4j + log4j-api + + + + org.apache.logging.log4j + log4j-core + + + + com.lmax + disruptor + + + org.springframework.boot + spring-boot-starter-log4j2 + + + junit + junit + test + + + com.fasterxml.jackson.core + jackson-core + + + com.alibaba + fastjson + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + cn.hutool + hutool-all + + + cn.icanci.loopstack.ddk + ddk-client + ${ddk.version} + + + cn.icanci.loopstack + lsi-api + ${lsi.version} + + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + icanci + icanci@foxmail.com + https://gitee.com/icanci + +8 + + + + + ${project.artifactId}-${project.version} + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-deploy-plugin.version} + + ${javadoc.opts} + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.target} + ${maven.compiler.source} + ${project.build.sourceEncoding} + + + + + org.apache.maven.plugins + maven-source-plugin + + + package + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + package + + jar + + + + + + + + + + + disable-javadoc-doclint + + [1.8,) + + + -Xdoclint:none + + + + release + + + + + org.apache.maven.plugins + maven-source-plugin + + + package + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + package + + jar + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${nexus-staging-maven-plugin.version} + true + + oss-release + https://s01.oss.sonatype.org/ + true + + + + + + + sonatype-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots + + + sonatype-release + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + + sonatype-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots + + + sonatype-release + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + \ No newline at end of file -- Gitee