From 9ce8bd619f0b0276800e69cdfbe1e07604a22ac5 Mon Sep 17 00:00:00 2001 From: yunjy Date: Fri, 19 Aug 2022 14:17:06 +0900 Subject: [PATCH] =?UTF-8?q?In=20memory=20compiler=20=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EA=B8=B0=EB=8F=99=EC=8B=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8=20=EB=A1=9C=EB=94=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + .../httpmockserver/PostConstructBean.java | 28 +++++++++++ .../script/ScriptController.java | 4 +- .../script/ScriptInfoService.java | 2 + .../script/ScriptInfoServiceImpl.java | 5 ++ .../httpmockserver/script/ScriptLoader.java | 48 ++++++++----------- 6 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/eactive/httpmockserver/PostConstructBean.java diff --git a/build.gradle b/build.gradle index 2d1212d..c50e89b 100644 --- a/build.gradle +++ b/build.gradle @@ -22,11 +22,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect' // implementation 'com.github.darrachequesne:spring-data-jpa-datatables:5.1.0' + implementation 'org.apache.commons:commons-lang3:3.10' implementation 'commons-io:commons-io:2.6' implementation 'com.jayway.jsonpath:json-path:2.4.0' implementation 'io.netty:netty-all:4.1.60.Final' runtimeOnly 'com.h2database:h2' + implementation 'org.mdkt.compiler:InMemoryJavaCompiler:1.3.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/com/eactive/httpmockserver/PostConstructBean.java b/src/main/java/com/eactive/httpmockserver/PostConstructBean.java new file mode 100644 index 0000000..dfac53c --- /dev/null +++ b/src/main/java/com/eactive/httpmockserver/PostConstructBean.java @@ -0,0 +1,28 @@ +package com.eactive.httpmockserver; + +import com.eactive.httpmockserver.script.ScriptInfoService; +import com.eactive.httpmockserver.script.ScriptLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class PostConstructBean { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + public ScriptInfoService scriptInfoService; + + @PostConstruct + public void init() { + logger.info("init scripts"); + try { + ScriptLoader.getInstance().init(scriptInfoService); + } catch (Exception e) { + logger.error("init scripts failed", e); + } + } +} diff --git a/src/main/java/com/eactive/httpmockserver/script/ScriptController.java b/src/main/java/com/eactive/httpmockserver/script/ScriptController.java index 90aa60e..d26f06b 100644 --- a/src/main/java/com/eactive/httpmockserver/script/ScriptController.java +++ b/src/main/java/com/eactive/httpmockserver/script/ScriptController.java @@ -62,7 +62,7 @@ public class ScriptController { } @PostMapping("/manage/saveScriptInfo") - public String saveScriptInfo(@Valid ScriptInfo spec, BindingResult result, Model model) throws IOException, ClassNotFoundException { + public String saveScriptInfo(@Valid ScriptInfo spec, BindingResult result, Model model) throws Exception { if (result.hasErrors()) { return "page/add-edit-script-info"; } @@ -74,7 +74,7 @@ public class ScriptController { } if (BooleanUtils.toBoolean(spec.getUseYn())) { - // 기존설정 useYn=N으로 수정 + // useYn=N scriptInfoService.setUnuseOthers(spec.getId()); } diff --git a/src/main/java/com/eactive/httpmockserver/script/ScriptInfoService.java b/src/main/java/com/eactive/httpmockserver/script/ScriptInfoService.java index 575c9e8..389d741 100644 --- a/src/main/java/com/eactive/httpmockserver/script/ScriptInfoService.java +++ b/src/main/java/com/eactive/httpmockserver/script/ScriptInfoService.java @@ -9,6 +9,8 @@ import java.util.Optional; public interface ScriptInfoService { public ScriptInfo findActiveScriptInfo(); + public List findAllScriptInfos(); + public List findAllScriptInfos(Pageable pageable); public List findAllScriptInfos(Example example, Pageable pageable); diff --git a/src/main/java/com/eactive/httpmockserver/script/ScriptInfoServiceImpl.java b/src/main/java/com/eactive/httpmockserver/script/ScriptInfoServiceImpl.java index fbc9d62..d4ad2ba 100644 --- a/src/main/java/com/eactive/httpmockserver/script/ScriptInfoServiceImpl.java +++ b/src/main/java/com/eactive/httpmockserver/script/ScriptInfoServiceImpl.java @@ -23,6 +23,11 @@ public class ScriptInfoServiceImpl implements ScriptInfoService { return dao.findFirstByUseYn("Y"); } + @Override + public List findAllScriptInfos() { + return dao.findAll(); + } + @Override public List findAllScriptInfos(Pageable pageable) { Page pagedResult = dao.findAll(pageable); diff --git a/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java b/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java index 776ce81..ff05b54 100644 --- a/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java +++ b/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java @@ -1,6 +1,8 @@ package com.eactive.httpmockserver.script; import org.apache.commons.io.IOUtils; +import org.mdkt.compiler.InMemoryJavaCompiler; +import org.springframework.beans.factory.annotation.Autowired; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; @@ -12,6 +14,7 @@ import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; +import java.util.List; import java.util.Map; public class ScriptLoader{ @@ -36,42 +39,29 @@ public class ScriptLoader{ return newInstance; } - class DynamicLoader extends ClassLoader{ - public Class