diff --git a/build.gradle b/build.gradle index c50e89b..16c8971 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ 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 'com.google.jimfs:jimfs:1.2' implementation 'org.apache.commons:commons-lang3:3.10' implementation 'commons-io:commons-io:2.6' diff --git a/src/main/java/com/eactive/httpmockserver/PostConstructBean.java b/src/main/java/com/eactive/httpmockserver/PostConstructBean.java index dfac53c..6d1c525 100644 --- a/src/main/java/com/eactive/httpmockserver/PostConstructBean.java +++ b/src/main/java/com/eactive/httpmockserver/PostConstructBean.java @@ -2,12 +2,16 @@ package com.eactive.httpmockserver; import com.eactive.httpmockserver.script.ScriptInfoService; import com.eactive.httpmockserver.script.ScriptLoader; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Paths; @Component public class PostConstructBean { @@ -17,7 +21,7 @@ public class PostConstructBean { public ScriptInfoService scriptInfoService; @PostConstruct - public void init() { + public void init() throws URISyntaxException { logger.info("init scripts"); try { ScriptLoader.getInstance().init(scriptInfoService); diff --git a/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java b/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java index ff05b54..a23ecde 100644 --- a/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java +++ b/src/main/java/com/eactive/httpmockserver/script/ScriptLoader.java @@ -1,21 +1,21 @@ package com.eactive.httpmockserver.script; -import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.mdkt.compiler.CompilationException; +import org.mdkt.compiler.CompiledCode; +import org.mdkt.compiler.DynamicClassLoader; import org.mdkt.compiler.InMemoryJavaCompiler; -import org.springframework.beans.factory.annotation.Autowired; -import javax.tools.JavaCompiler; -import javax.tools.ToolProvider; +import javax.tools.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; -import java.net.URLClassLoader; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class ScriptLoader{ String path = ScriptLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath(); @@ -24,9 +24,63 @@ public class ScriptLoader{ private static final ScriptLoader instance = new ScriptLoader(); private Map> loadedClass; + private String classPath = null; + /** + * BOOT JAR Class BOOT-INF  Ͻ ȵǴ + * ӽ÷ /tmp Ͽ ش θ ϰ Ͽ ޸ ɰų jar ִ ãƺ + * Groovy ũƮ 浵 + */ private ScriptLoader(){ this.loadedClass = new HashMap<>(); + URL url = getClass().getProtectionDomain().getCodeSource().getLocation(); + try { + String uri = url.toURI().toString(); + System.out.println(uri); + if(StringUtils.contains(uri, "jar:file:" )) { + String jarPath = StringUtils.substringBetween(uri, "jar:file:/", ".jar!") + ".jar"; + System.out.println("jarPath => " + jarPath); + + if(StringUtils.contains(uri, "BOOT-INF" )) { + String memoryWorkingPath = "/tmp/httpmockworking"; + File workingDir = new File(memoryWorkingPath); + workingDir.mkdirs(); + + java.util.jar.JarFile jar = new java.util.jar.JarFile(jarPath); + java.util.Enumeration enumEntries = jar.entries(); + while (enumEntries.hasMoreElements()) { + java.util.jar.JarEntry file = (java.util.jar.JarEntry) enumEntries.nextElement(); + java.io.File f = new java.io.File(memoryWorkingPath + "/" + file.getName()); + if (file.isDirectory()) { // if its a directory, create it + f.mkdirs(); + continue; + } + java.io.InputStream is = jar.getInputStream(file); // get the input stream + BufferedInputStream bis = new BufferedInputStream(is); + + java.io.FileOutputStream fos = new java.io.FileOutputStream(f); + BufferedOutputStream bos = new BufferedOutputStream(fos); + + int numBytes; + byte[] buffer = new byte[1024]; + while ((numBytes = bis.read(buffer))!= -1) + { + bos.write(buffer, 0, numBytes); + } + bis.close(); + bos.close(); + } + jar.close(); + classPath = memoryWorkingPath+"/BOOT-INF/classes;"+memoryWorkingPath+"/BOOT-INF/lib/*;"; + }else { + classPath = jarPath; + } + } + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } } public static ScriptLoader getInstance(){ @@ -39,12 +93,18 @@ public class ScriptLoader{ return newInstance; } -// class DynamicLoader extends ClassLoader{ -// public Class