diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-common/src/main/java/com/etl/data/rule/domain/EngineRule.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-common/src/main/java/com/etl/data/rule/domain/EngineRule.java index c7be075..26eea62 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-common/src/main/java/com/etl/data/rule/domain/EngineRule.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-common/src/main/java/com/etl/data/rule/domain/EngineRule.java @@ -73,4 +73,10 @@ public class EngineRule extends BaseEntity { */ @Excel(name = "描述") private String description; + + /** + * 编辑代码文本 + */ + @Excel(name = "编辑代码文本") + private String codeText; } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/classLoading/CustomClassLoader.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/classLoading/CustomClassLoader.java new file mode 100644 index 0000000..e33cdd9 --- /dev/null +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/classLoading/CustomClassLoader.java @@ -0,0 +1,14 @@ +package com.etl.data.rule.classLoading; + +/** + * 类加载器 + * + * @author Chao + * @ClassName: CustomClassLoader 类加载器 + * @CreateTime: 2024/5/4 下午2:10 + */ +public class CustomClassLoader extends ClassLoader { + public Class defineClassFromBytes(String name, byte[] data) { + return defineClass(name, data, 0, data.length); + } +} diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/controller/EngineRuleController.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/controller/EngineRuleController.java index a07d4c5..c45369c 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/controller/EngineRuleController.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/controller/EngineRuleController.java @@ -24,6 +24,7 @@ import java.util.List; @RestController @RequestMapping("/engine") public class EngineRuleController extends BaseController { + @Autowired private IEngineRuleService engineRuleService; @@ -88,4 +89,24 @@ public class EngineRuleController extends BaseController { public Result remove(@PathVariable Long[] ids) { return toAjax(engineRuleService.deleteEngineRuleByIds(ids)); } + + /** + * 初始化规则引擎类 + * @param engineRule + * @return + */ + @PostMapping("initializeRuleEngine") + public Result initializeRuleEngine(@RequestBody EngineRule engineRule) { + return engineRuleService.initializeRuleMaintenance(engineRule); + } + + /** + * 测试方法 + * @param encoding + * @return + */ + @GetMapping(value = "/testMethod/{encoding}") + public Result testMethod(@PathVariable("encoding") String encoding) { + return engineRuleService.testMethod(encoding); + } } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/IEngineRuleService.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/IEngineRuleService.java index 1eb28a7..cd51891 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/IEngineRuleService.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/IEngineRuleService.java @@ -1,6 +1,7 @@ package com.etl.data.rule.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.etl.common.core.domain.Result; import com.etl.data.rule.domain.EngineRule; import java.util.List; @@ -59,4 +60,8 @@ public interface IEngineRuleService extends IService { * @return 结果 */ public int deleteEngineRuleById(Long id); + + Result initializeRuleMaintenance(EngineRule engineRule); + + Result testMethod(String code); } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/impl/EngineRuleServiceImpl.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/impl/EngineRuleServiceImpl.java index 750766e..4cba9c0 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/impl/EngineRuleServiceImpl.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/java/com/etl/data/rule/service/impl/EngineRuleServiceImpl.java @@ -1,6 +1,7 @@ package com.etl.data.rule.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.etl.common.core.domain.Result; import com.etl.common.core.utils.DateUtils; import com.etl.data.rule.domain.EngineRule; import com.etl.data.rule.mapper.EngineRuleMapper; @@ -8,6 +9,17 @@ import com.etl.data.rule.service.IEngineRuleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.tools.JavaCompiler; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Paths; +import java.util.Arrays; import java.util.List; /** @@ -52,6 +64,10 @@ public class EngineRuleServiceImpl extends ServiceImpl options = Arrays.asList("-d", classPath); + JavaCompiler.CompilationTask cTask = javaCompiler.getTask(null, fileManager, null, options, null, fileObjects); + Boolean call = cTask.call(); + fileManager.close(); + if (call) { + return Result.success(null, "初始化成功"); + } + } catch (IOException e) { + log.error(e.getMessage()); + Result.error("初始化失败"); + } + return Result.error(null, "初始化失败"); + } + + @Override + public Result testMethod(String encoding) { + + + String className = "Rule" + Character.toUpperCase(encoding.charAt(0)) + encoding.substring(1) + "Class"; + String classPath = "etl-modules/etl-modules-data-source/etl-modules-data-source-common/target/classes/com/etl/data/rule/domain"; +// String classPath = "D:\\Java\\etl\\dataProcess\\ETL-Cloud\\etl-modules\\etl-modules-data-source\\etl-modules-data-source-common\\target\\classes\\" + className.replace(".", "\\") + ".class"; + try { + + +// 将路径转换为URL + URL classUrl = Paths.get(classPath).toUri().toURL(); + +// 创建一个只包含我们自定义路径的URLClassLoader + URLClassLoader classLoader = new URLClassLoader(new URL[]{classUrl}); +// 使用自定义的ClassLoader加载类 + Class clazz = Class.forName("com.etl.data.rule.domain." + className, true, classLoader); // 替换YourClassName为你的类名 + + Object testInstance = clazz.newInstance(); // 或者使用getDeclaredConstructor().newInstance(); + +// byte[] classData = Files.readAllBytes(Paths.get(classPath)); +// CustomClassLoader customClassLoader = new CustomClassLoader(); +// Class aClass = customClassLoader.defineClassFromBytes(className, classData); +// Object o = aClass.newInstance(); +// Method[] methods = clazz.getMethods(); + Method method = clazz.getMethod("main", String[].class); + method.invoke(null, new Object[]{null}); +// 遍历所有方法,寻找第一个无参方法并执行 +// for (Method method : methods) { +// if (method.getParameterTypes().length == 0) { // 检查方法是否有参数 +// System.out.println("调用无参方法: " + method.getName()); +// method.invoke(testInstance); // 调用找到的无参方法 +// break; // 如果只需要调用第一个无参方法,则可以跳出循环 +// } +// } +// customClassLoader = null; + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("测试失败"); + } + return Result.success(null, "测试成功"); + } + + public String getTypeCodeText(EngineRule engineRule) { + String className = Character.toUpperCase(engineRule.getEncoding().charAt(0)) + engineRule.getEncoding().substring(1); + switch (engineRule.getType()) { + case "data-set": + className = className + "DataSetContext"; + return "package com.etl.data.rule.domain;\n" + + "\n" + + "public class " + className + " {\n" + + "\n" + + " private final RecordContext recordContext;\n" + + "\n" + + " public DataSetContext (RecordContext recordContext) {\n" + + " this.recordContext = recordContext;\n" + + " }\n" + + "}\n"; + case "data-record": + return "记录"; + default: + return "数据字段"; + } + } } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/resources/mapper/data/EngineRuleMapper.xml b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/resources/mapper/data/EngineRuleMapper.xml index c8bf279..29d7ee9 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/resources/mapper/data/EngineRuleMapper.xml +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-system/src/main/resources/mapper/data/EngineRuleMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -21,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, name, type, scope, encoding, activated_or_not, status, description, remark, create_by, create_time, update_by, update_time from engine_rule + select id, name, type, scope, encoding, activated_or_not, status, description, remark, code_text, create_by, create_time, update_by, update_time from engine_rule