From 7a37de381330850e10a869a801d69fcf590ab351 Mon Sep 17 00:00:00 2001 From: icanci Date: Tue, 17 Jan 2023 19:14:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/admin-biz/pom.xml | 5 +++ .../amc/biz/model/AppMockDebugResult.java | 26 ++++++++++++ .../service/impl/AppMockCallServiceImpl.java | 41 ++++++++++++++++++- pom.xml | 1 + spi/pom.xml | 19 +++++++++ .../amc/spi/mock/MockCallStandardHandler.java | 22 ++++++++++ .../loopstack/amc/spi/package-info.java | 5 +++ .../loopstack/amc/spi/service/LogService.java | 11 +++++ 8 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 spi/pom.xml create mode 100644 spi/src/main/java/cn/icanci/loopstack/amc/spi/mock/MockCallStandardHandler.java create mode 100644 spi/src/main/java/cn/icanci/loopstack/amc/spi/package-info.java create mode 100644 spi/src/main/java/cn/icanci/loopstack/amc/spi/service/LogService.java diff --git a/admin/admin-biz/pom.xml b/admin/admin-biz/pom.xml index cd917e2..b347226 100644 --- a/admin/admin-biz/pom.xml +++ b/admin/admin-biz/pom.xml @@ -40,6 +40,11 @@ org.mapstruct mapstruct + + cn.icanci.loopstack.amc + amc-spi + ${parent.version} + diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/model/AppMockDebugResult.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/model/AppMockDebugResult.java index 18540a0..fd59524 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/model/AppMockDebugResult.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/model/AppMockDebugResult.java @@ -25,6 +25,32 @@ public class AppMockDebugResult implements Serializable { */ private String exceptionMessage; + public AppMockDebugResult() { + } + + public AppMockDebugResult(boolean success, String scriptType, Object realResult, String exceptionMessage) { + this.success = success; + this.scriptType = scriptType; + this.realResult = realResult; + this.exceptionMessage = exceptionMessage; + } + + public static AppMockDebugResult fail(String scriptType, String localizedMessage) { + AppMockDebugResult result = new AppMockDebugResult(); + result.setSuccess(false); + result.setScriptType(scriptType); + result.setExceptionMessage(localizedMessage); + return result; + } + + public static AppMockDebugResult success(String scriptType, Object realResult) { + AppMockDebugResult result = new AppMockDebugResult(); + result.setSuccess(true); + result.setScriptType(scriptType); + result.setRealResult(realResult); + return result; + } + public boolean isSuccess() { return success; } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/service/impl/AppMockCallServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/service/impl/AppMockCallServiceImpl.java index 4475cb0..28be2c2 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/service/impl/AppMockCallServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/amc/biz/service/impl/AppMockCallServiceImpl.java @@ -16,8 +16,10 @@ import cn.icanci.loopstack.amc.common.model.PageList; import cn.icanci.loopstack.amc.common.model.TextValue; import cn.icanci.loopstack.amc.common.model.config.AppMockCallVO; import cn.icanci.loopstack.amc.common.result.R; +import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler; import cn.icanci.loopstack.api.client.Client; import cn.icanci.loopstack.script.LsiScriptEngine; +import cn.icanci.loopstack.script.compile.GroovyClassLoaderHolder; import cn.icanci.loopstack.script.context.LsiScriptEngineContext; import cn.icanci.loopstack.script.enums.ScriptTypeEnum; @@ -103,8 +105,45 @@ public class AppMockCallServiceImpl extends BaseService implement @Override public AppMockDebugResult debug(AppMockCallVO appMock, String scriptContentTest) { ScriptTypeEnum scriptType = appMock.getScriptType(); + String script = appMock.getScript(); + // mvel2.0 脚本 + if (scriptType == ScriptTypeEnum.MVEL2) { + return noneHandlerMockDebugResult(scriptContentTest, scriptType, script); + } + + // groovy脚本 + if (scriptType == ScriptTypeEnum.GROOVY) { + try { + Class compile = GroovyClassLoaderHolder.compile(script); + Object instance = compile.newInstance(); + if (instance instanceof MockCallStandardHandler) { + MockCallStandardHandler handler = (MockCallStandardHandler) instance; + // 全限定类名重复的处理。此处无需处理, + // 经过 GroovyClassLoaderHolder.compile 的class对象是不重复的,即使代码是完全一样的 + Object execute = handler.execute(scriptContentTest); + return AppMockDebugResult.success(scriptType.getDesc(), execute); + } + } catch (Exception e) { + logger.info("[AppMockCallService][debug] error msg:{}", e.getLocalizedMessage()); + return AppMockDebugResult.fail(scriptType.getDesc(), e.getLocalizedMessage()); + } + return noneHandlerMockDebugResult(scriptContentTest, scriptType, script); + } + + throw new IllegalArgumentException("Not Support ScriptType: " + scriptType); + } + + /** + * 非标准化处理器执行流程 + * + * @param scriptContentTest scriptContentTest + * @param scriptType scriptType + * @param script script + * @return script + */ + private AppMockDebugResult noneHandlerMockDebugResult(String scriptContentTest, ScriptTypeEnum scriptType, String script) { Bindings bindings = JSONUtil.toBean(scriptContentTest, SimpleBindings.class); - LsiScriptEngineContext context = lsiScriptEngine.eval(scriptType, bindings, appMock.getScript()); + LsiScriptEngineContext context = lsiScriptEngine.eval(scriptType, bindings, script); AppMockDebugResult result = new AppMockDebugResult(); result.setSuccess(context.isSuccess()); diff --git a/pom.xml b/pom.xml index 454fcfd..614d375 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ admin common + spi AMC diff --git a/spi/pom.xml b/spi/pom.xml new file mode 100644 index 0000000..f259a41 --- /dev/null +++ b/spi/pom.xml @@ -0,0 +1,19 @@ + + + + amc-parent + cn.icanci.loopstack.amc + 1.0-SNAPSHOT + + 4.0.0 + + amc-spi + + + 8 + 8 + + + \ No newline at end of file diff --git a/spi/src/main/java/cn/icanci/loopstack/amc/spi/mock/MockCallStandardHandler.java b/spi/src/main/java/cn/icanci/loopstack/amc/spi/mock/MockCallStandardHandler.java new file mode 100644 index 0000000..c26c766 --- /dev/null +++ b/spi/src/main/java/cn/icanci/loopstack/amc/spi/mock/MockCallStandardHandler.java @@ -0,0 +1,22 @@ +package cn.icanci.loopstack.amc.spi.mock; + +/** + * Mock Call 标准接口 + * + * @author icanci + * @since 1.0 Created in 2023/01/17 13:45 + */ +public abstract class MockCallStandardHandler { + // TODO 暂时用不到 + // @Resource + // protected LogService logService; + + /** + * 执行处理器 + * + * @param request 请求(JSON格式的请求数据) + * @return Object 执行返回值 + * @throws Exception Exception + */ + public abstract Object execute(Object request) throws Exception; +} diff --git a/spi/src/main/java/cn/icanci/loopstack/amc/spi/package-info.java b/spi/src/main/java/cn/icanci/loopstack/amc/spi/package-info.java new file mode 100644 index 0000000..9ad391e --- /dev/null +++ b/spi/src/main/java/cn/icanci/loopstack/amc/spi/package-info.java @@ -0,0 +1,5 @@ +/** + * @author icanci + * @since 1.0 Created in 2023/01/17 13:46 + */ +package cn.icanci.loopstack.amc.spi; \ No newline at end of file diff --git a/spi/src/main/java/cn/icanci/loopstack/amc/spi/service/LogService.java b/spi/src/main/java/cn/icanci/loopstack/amc/spi/service/LogService.java new file mode 100644 index 0000000..8e4b88d --- /dev/null +++ b/spi/src/main/java/cn/icanci/loopstack/amc/spi/service/LogService.java @@ -0,0 +1,11 @@ +package cn.icanci.loopstack.amc.spi.service; + +/** + * 日志记录 + * + * @author icanci + * @since 1.0 Created in 2023/01/17 13:47 + */ +public interface LogService { + +} -- Gitee