diff --git a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java index 5ea03a3..8b87440 100644 --- a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java +++ b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java @@ -24,8 +24,17 @@ public class GroovyScriptEngine { private static final ObjectMapper objectMapper = new ObjectMapper(); private static final GroovyClassLoader classLoader = new GroovyClassLoader( Thread.currentThread().getContextClassLoader()); - /** 类型 → 默认脚本 */ - private static final Map DEFAULT_SCRIPTS = new ConcurrentHashMap<>(); + /** 默认脚本存储路径前缀 */ + private static final String DEFAULT_SCRIPTS_PATH = "scripts/default/"; + /** 类型 → 默认脚本缓存 */ + private static final Map DEFAULT_SCRIPTS_CACHE = new ConcurrentHashMap<>(); + /** 存储服务(由 Spring 注入) */ + private static com.par.core.storage.CachedStorageService storageService; + + // Spring 注入 + public GroovyScriptEngine(com.par.core.storage.CachedStorageService storageService) { + GroovyScriptEngine.storageService = storageService; + } /** 脚本前缀:自动导入必要包 + PluginContext 桩 */ private static final String SCRIPT_PREFIX = "import groovy.json.*\n" + @@ -44,29 +53,42 @@ public class GroovyScriptEngine { } /** - * 保存站点类型默认脚本到 classpath + * 保存站点类型默认脚本到七牛云+本地缓存 */ public static void saveDefaultScript(String siteType, String script) { if (siteType == null || script == null) return; String key = siteType.toLowerCase(); - DEFAULT_SCRIPTS.put(key, script); - try { - var path = java.nio.file.Paths.get( - GroovyScriptEngine.class.getClassLoader().getResource("scripts/default-" + key + ".groovy").toURI()); - java.nio.file.Files.writeString(path, script, java.nio.charset.StandardCharsets.UTF_8); - log.info("Default script saved: default-{}.groovy", key); - } catch (Exception e) { - log.error("Failed to save default script: {}", key, e); + DEFAULT_SCRIPTS_CACHE.put(key, script); + if (storageService != null) { + storageService.store(DEFAULT_SCRIPTS_PATH + key + ".groovy", script); + } else { + // 回退到 classpath 写入(开发环境) + try { + var path = java.nio.file.Paths.get( + GroovyScriptEngine.class.getClassLoader().getResource("scripts/default-" + key + ".groovy").toURI()); + java.nio.file.Files.writeString(path, script, java.nio.charset.StandardCharsets.UTF_8); + } catch (Exception e) { + log.warn("Fallback save failed: {}", e.getMessage()); + } } + log.info("Default script saved: default-{}.groovy", key); } /** - * 从 classpath 加载默认脚本文件 + * 加载站点类型默认脚本(优先七牛云/本地缓存,回退到 classpath) */ public static String loadDefaultByType(String siteType) { if (siteType == null) return null; String key = siteType.toLowerCase(); - return DEFAULT_SCRIPTS.computeIfAbsent(key, k -> { + return DEFAULT_SCRIPTS_CACHE.computeIfAbsent(key, k -> { + // 先尝试从存储服务读取 + if (storageService != null) { + try { + String script = storageService.read(DEFAULT_SCRIPTS_PATH + k + ".groovy"); + if (script != null && !script.isBlank()) return script; + } catch (Exception ignored) {} + } + // 回退到 classpath String path = "scripts/default-" + k + ".groovy"; try (var in = GroovyScriptEngine.class.getClassLoader().getResourceAsStream(path)) { if (in == null) return null;