diff --git a/admin/admin-biz/pom.xml b/admin/admin-biz/pom.xml index cd917e2d0dd7825072cc86ac65a1d348bf0a86bf..b347226dc64913f33674a877dd507081af6c4529 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 18540a0e6a2807e82143e9d49d2e689e73975f7c..fd595240247403a39fc045b38a3d348de2244aab 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 4475cb04ebdf61bcfc537ba649359f1244f3ba63..28be2c26c080cbb1035e9afc3e3c73fc20f32754 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 454fcfd7bf5f0fc5a595fb78914d4c08742a1fb6..614d3752f08f32728bb7f92ff1a32fdeafe4e01a 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 0000000000000000000000000000000000000000..f259a410d388bf406af611184859558a21b16507 --- /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 0000000000000000000000000000000000000000..c26c7669a457a93d653a684bb93f43982e337f59 --- /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 0000000000000000000000000000000000000000..9ad391e7b627c0aa5a45d6b17df1c6147909d155 --- /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 0000000000000000000000000000000000000000..8e4b88d578dfa47f369b1cdd2e4375802e3d7c0c --- /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 { + +}