From 30736532962d5acaf923c6635173147c62b1b59c Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 10:26:04 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=A7=A3=E6=9E=90=E5=8F=AA?= =?UTF-8?q?=E7=94=A8Groovy=E8=84=9A=E6=9C=AC=EF=BC=8C=E6=97=A0=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E7=9B=B4=E6=8E=A5=E6=8A=A5=E9=94=99=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E9=99=A4Java=E5=BC=95=E6=93=8E=E5=85=9C=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/api/controller/AdapterController.java | 72 +++++++------------ 1 file changed, 27 insertions(+), 45 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/AdapterController.java b/par-api/src/main/java/com/par/api/controller/AdapterController.java index da9d529..d8b7fb4 100644 --- a/par-api/src/main/java/com/par/api/controller/AdapterController.java +++ b/par-api/src/main/java/com/par/api/controller/AdapterController.java @@ -1,8 +1,6 @@ package com.par.api.controller; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.par.core.adapter.AdapterConfig; -import com.par.core.adapter.AdapterEngine; +import com.par.core.adapter.GroovyScriptEngine; import com.par.core.dto.ApiResponse; import com.par.core.entity.AccessResult; import com.par.core.entity.SiteConfig; @@ -24,12 +22,10 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class AdapterController { - private final AdapterEngine adapterEngine; private final GroovyScriptEngine groovyEngine; private final SiteConfigMapper siteConfigMapper; private final AccessResultMapper accessResultMapper; private final CachedStorageService storageService; - private static final ObjectMapper objectMapper = new ObjectMapper(); /** * 用指定适配配置解析指定访问结果 @@ -45,38 +41,26 @@ public class AdapterController { return ApiResponse.error(400, "configId and accessResultId are required"); } - // 加载适配配置 SiteConfig siteConfig = siteConfigMapper.selectById(configId); if (siteConfig == null) return ApiResponse.error(404, "配置不存在"); + if (siteConfig.getScriptStoragePath() == null || siteConfig.getScriptStoragePath().isBlank()) { + return ApiResponse.error(400, "该配置未绑定 Groovy 脚本"); + } - String configJson; - try { configJson = storageService.read(siteConfig.getStoragePath()); } - catch (Exception e) { return ApiResponse.error(500, "读取配置失败: " + e.getMessage()); } - if (configJson == null) return ApiResponse.error(404, "配置内容为空"); + String script; + try { script = storageService.read(siteConfig.getScriptStoragePath()); } + catch (Exception e) { return ApiResponse.error(500, "读取脚本失败: " + e.getMessage()); } + if (script == null || script.isBlank()) return ApiResponse.error(404, "Groovy 脚本为空"); - AdapterConfig adapterConfig; - try { adapterConfig = objectMapper.readValue(configJson, AdapterConfig.class); } - catch (Exception e) { return ApiResponse.error(400, "配置格式无效: " + e.getMessage()); } - - // 加载访问结果 HTML AccessResult accessResult = accessResultMapper.selectById(accessResultId); if (accessResult == null) return ApiResponse.error(404, "访问结果不存在"); - String html; - try { html = storageService.read(accessResult.getStoragePath()); } - catch (Exception e) { return ApiResponse.error(500, "读取访问结果失败: " + e.getMessage()); } - if (html == null) return ApiResponse.error(404, "访问结果内容为空"); + String content; + try { content = storageService.read(accessResult.getStoragePath()); } + catch (Exception e) { return ApiResponse.error(500, "读取内容失败: " + e.getMessage()); } + if (content == null) return ApiResponse.error(404, "内容为空"); - // 执行解析 - Map result; - try { - result = adapterEngine.extract(adapterConfig, html, accessResult.getUrl()); - } catch (Exception e) { - log.error("Adapter parse error", e); - return ApiResponse.error(500, "解析异常: " + e.getMessage()); - } - - return ApiResponse.success(result); + return ApiResponse.success(groovyEngine.execute(script, content, accessResult.getUrl())); } /** @@ -138,24 +122,22 @@ public class AdapterController { item.put("invalidCount", allResults.stream().filter(r -> url.equals(r.getUrl()) && Boolean.FALSE.equals(r.getIsValid())).count()); item.put("uncheckedCount", allResults.stream().filter(r -> url.equals(r.getUrl()) && r.getIsValid() == null).count()); - // 解析内容:优先 Groovy 脚本,否则用 Java 引擎 + // 解析内容:必须有 Groovy 脚本 try { - String content = storageService.read(ar.getStoragePath()); - if (content != null) { - Map parsed; - if (siteConfig.getScriptStoragePath() != null && !siteConfig.getScriptStoragePath().isBlank()) { - String script = storageService.read(siteConfig.getScriptStoragePath()); - if (script != null && !script.isBlank()) { - parsed = groovyEngine.execute(script, content, url); - } else { - parsed = adapterEngine.extract(adapterConfig, content, ar.getContentType(), url); - } - } else { - parsed = adapterEngine.extract(adapterConfig, content, ar.getContentType(), url); - } - item.put("parsed", parsed); + if (siteConfig.getScriptStoragePath() == null || siteConfig.getScriptStoragePath().isBlank()) { + item.put("parsed", Map.of("matched", false, "message", "该配置未绑定 Groovy 脚本")); } else { - item.put("parsed", Map.of("matched", false, "message", "内容为空")); + String script = storageService.read(siteConfig.getScriptStoragePath()); + if (script == null || script.isBlank()) { + item.put("parsed", Map.of("matched", false, "message", "Groovy 脚本为空")); + } else { + String content = storageService.read(ar.getStoragePath()); + if (content == null) { + item.put("parsed", Map.of("matched", false, "message", "内容为空")); + } else { + item.put("parsed", groovyEngine.execute(script, content, url)); + } + } } } catch (Exception e) { item.put("parsed", Map.of("matched", false, "message", "解析异常: " + e.getMessage()));