From c84190f6fb16dcc97dee68c635de34407df0b607 Mon Sep 17 00:00:00 2001
From: yuan <1363654894@qq.com>
Date: Sat, 31 Aug 2024 21:11:52 +0800
Subject: [PATCH] =?UTF-8?q?feat():=E4=B8=8B=E8=BD=BDOSS=20class=E7=BC=96?=
=?UTF-8?q?=E8=AF=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
cloud-rule-engine/pom.xml | 6 +
.../com/muyu/compile/MemoryClassLoader.java | 33 ++++
.../muyu/compile/MemoryJavaFileManager.java | 91 ++++++++++
.../java/com/muyu/compile/OSSFileCompile.java | 36 ++++
.../main/java/com/muyu/load/OSSFileLoad.java | 72 ++++++++
.../java/com/muyu/upload/ALiYunUpload.java | 2 +-
.../main/java/com/muyu/upload/OssUtil.java | 162 ------------------
.../controller/RuleVersionController.java | 1 +
.../servier/impl/RuleVersionServiceImpl.java | 2 +
9 files changed, 242 insertions(+), 163 deletions(-)
create mode 100644 cloud-rule-engine/src/main/java/com/muyu/compile/MemoryClassLoader.java
create mode 100644 cloud-rule-engine/src/main/java/com/muyu/compile/MemoryJavaFileManager.java
create mode 100644 cloud-rule-engine/src/main/java/com/muyu/compile/OSSFileCompile.java
create mode 100644 cloud-rule-engine/src/main/java/com/muyu/load/OSSFileLoad.java
delete mode 100644 cloud-rule-engine/src/main/java/com/muyu/upload/OssUtil.java
diff --git a/cloud-rule-engine/pom.xml b/cloud-rule-engine/pom.xml
index b899d8e..6f33720 100644
--- a/cloud-rule-engine/pom.xml
+++ b/cloud-rule-engine/pom.xml
@@ -107,6 +107,12 @@
2.3.3
+
+ com.itranswarp
+ compiler
+ 1.0
+
+
junit
junit
diff --git a/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryClassLoader.java b/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryClassLoader.java
new file mode 100644
index 0000000..ea3f855
--- /dev/null
+++ b/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryClassLoader.java
@@ -0,0 +1,33 @@
+package com.muyu.compile;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Load class from byte[] which is compiled in memory.
+ *
+ * @author michael
+ */
+class MemoryClassLoader extends URLClassLoader {
+
+ // class name to class bytes:
+ Map classBytes = new HashMap();
+
+ public MemoryClassLoader(Map classBytes) {
+ super(new URL[0], MemoryClassLoader.class.getClassLoader());
+ this.classBytes.putAll(classBytes);
+ }
+
+ @Override
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ byte[] buf = classBytes.get(name);
+ if (buf == null) {
+ return super.findClass(name);
+ }
+ classBytes.remove(name);
+ return defineClass(name, buf, 0, buf.length);
+ }
+
+}
diff --git a/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryJavaFileManager.java b/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryJavaFileManager.java
new file mode 100644
index 0000000..29b82bb
--- /dev/null
+++ b/cloud-rule-engine/src/main/java/com/muyu/compile/MemoryJavaFileManager.java
@@ -0,0 +1,91 @@
+package com.muyu.compile;
+
+import javax.tools.*;
+import javax.tools.JavaFileObject.Kind;
+import java.io.ByteArrayOutputStream;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.nio.CharBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * In-memory java file manager.
+ *
+ * @author michael
+ */
+class MemoryJavaFileManager extends ForwardingJavaFileManager {
+
+ // compiled classes in bytes:
+ final Map classBytes = new HashMap();
+
+ MemoryJavaFileManager(JavaFileManager fileManager) {
+ super(fileManager);
+ }
+
+ public Map getClassBytes() {
+ return new HashMap(this.classBytes);
+ }
+
+ @Override
+ public void flush() throws IOException {
+ }
+
+ @Override
+ public void close() throws IOException {
+ classBytes.clear();
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind,
+ FileObject sibling) throws IOException {
+ if (kind == Kind.CLASS) {
+ return new MemoryOutputJavaFileObject(className);
+ } else {
+ return super.getJavaFileForOutput(location, className, kind, sibling);
+ }
+ }
+
+ JavaFileObject makeStringSource(String name, String code) {
+ return new MemoryInputJavaFileObject(name, code);
+ }
+
+ static class MemoryInputJavaFileObject extends SimpleJavaFileObject {
+
+ final String code;
+
+ MemoryInputJavaFileObject(String name, String code) {
+ super(URI.create("string:///" + name), Kind.SOURCE);
+ this.code = code;
+ }
+
+ @Override
+ public CharBuffer getCharContent(boolean ignoreEncodingErrors) {
+ return CharBuffer.wrap(code);
+ }
+ }
+
+ class MemoryOutputJavaFileObject extends SimpleJavaFileObject {
+ final String name;
+
+ MemoryOutputJavaFileObject(String name) {
+ super(URI.create("string:///" + name), Kind.CLASS);
+ this.name = name;
+ }
+
+ @Override
+ public OutputStream openOutputStream() {
+ return new FilterOutputStream(new ByteArrayOutputStream()) {
+ @Override
+ public void close() throws IOException {
+ out.close();
+ ByteArrayOutputStream bos = (ByteArrayOutputStream) out;
+ classBytes.put(name, bos.toByteArray());
+ }
+ };
+ }
+
+ }
+}
diff --git a/cloud-rule-engine/src/main/java/com/muyu/compile/OSSFileCompile.java b/cloud-rule-engine/src/main/java/com/muyu/compile/OSSFileCompile.java
new file mode 100644
index 0000000..a484a98
--- /dev/null
+++ b/cloud-rule-engine/src/main/java/com/muyu/compile/OSSFileCompile.java
@@ -0,0 +1,36 @@
+package com.muyu.compile;
+
+
+import javax.tools.*;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author:蓬叁
+ * @Package:com.muyu.compile
+ * @Project:cloud-rule
+ * @name:OSSFileCompile
+ * @Date:2024/8/31 下午7:08
+ */
+public class OSSFileCompile{
+
+ public static Map compile(String fileName, String source,String extLib) throws IOException {
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ StandardJavaFileManager stdManager = compiler.getStandardFileManager(null, null, null);
+ try (MemoryJavaFileManager manager = new MemoryJavaFileManager(stdManager)) {
+ JavaFileObject javaFileObject = manager.makeStringSource(fileName, source);
+ // 传入诊断监听器 size和传入的javaObject相同
+ DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
+ List optionList = Arrays.asList("-extdirs",extLib);
+ JavaCompiler.CompilationTask task = compiler.getTask(null, manager,diagnosticCollector, optionList, null, Arrays.asList(javaFileObject));
+ Boolean result = task.call();
+ if (result == null || !result.booleanValue()) {
+ throw new RuntimeException("Compilation failed.");
+ }
+ return manager.getClassBytes();
+ }
+ }
+
+}
diff --git a/cloud-rule-engine/src/main/java/com/muyu/load/OSSFileLoad.java b/cloud-rule-engine/src/main/java/com/muyu/load/OSSFileLoad.java
new file mode 100644
index 0000000..1e699e6
--- /dev/null
+++ b/cloud-rule-engine/src/main/java/com/muyu/load/OSSFileLoad.java
@@ -0,0 +1,72 @@
+package com.muyu.load;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.OSSObject;
+import com.muyu.common.core.domain.Result;
+import com.muyu.compile.OSSFileCompile;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+/**
+ * @Author:蓬叁
+ * @Package:com.muyu.load
+ * @Project:cloud-rule
+ * @name:OSSFileLoad
+ * @Date:2024/8/31 下午6:38
+ */
+public class OSSFileLoad {
+
+ // 阿里云 endpoint
+ private static final String endpoint = "oss-cn-shanghai.aliyuncs.com";
+ // 阿里云 accessKeyId
+ private static final String accessKeyId = "LTAI5tHKdDATVKeBjFH8mb8D";
+ // 阿里云 accessKeySecret
+ private static final String accessKeySecret = "5ejb4qdgukfD1FdM181kdeAkSuURo7";
+ // bucket
+ private static final String bucketName = "java-web-generating-class";
+
+ public static Result