From 5a73ee56e43e97b140649e5657b643fec4a0b38c Mon Sep 17 00:00:00 2001 From: tjlygdx Date: Wed, 27 May 2026 14:47:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20fix:=E3=80=90=E7=B3=BB=E7=BB=9F=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E3=80=91=E6=9B=B4=E6=96=B0=E6=88=96=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=88=B7=E6=96=B0=E9=A1=B5=E9=9D=A2=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=BC=82=E5=B8=B8=EF=BC=8C=E5=A6=82=E6=9E=9C=E4=B8=8D?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E5=B9=B3=E5=8F=B0=E5=A4=84=E4=BA=8E=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=BD=BF=E7=94=A8=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/DatasourcePluginInfoLoader.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/plugin/DatasourcePluginInfoLoader.java diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/plugin/DatasourcePluginInfoLoader.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/plugin/DatasourcePluginInfoLoader.java new file mode 100644 index 0000000000..070df3a705 --- /dev/null +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/plugin/DatasourcePluginInfoLoader.java @@ -0,0 +1,89 @@ +package io.dataease.extensions.datasource.plugin; + +import io.dataease.exception.DEException; +import io.dataease.license.utils.JsonUtil; +import io.dataease.plugins.template.DataEasePlugin; +import io.dataease.plugins.vo.DataEasePluginVO; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.security.ProtectionDomain; +import java.nio.charset.StandardCharsets; +import java.util.Enumeration; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +final class DatasourcePluginInfoLoader { + + private static final String PLUGIN_INFO_PATTERN = "^plugin/extensions.*\\.json$"; + + private DatasourcePluginInfoLoader() { + } + + public static DataEasePluginVO load(DataEasePlugin plugin) { + ProtectionDomain protectionDomain = plugin.getClass().getProtectionDomain(); + try { + URI uri = protectionDomain.getCodeSource().getLocation().toURI(); + File file = new File(uri); + if (!file.isFile()) { + return plugin.getPluginInfo(); + } + try (JarFile jarFile = new JarFile(file)) { + JarEntry pluginInfoEntry = findPluginInfoEntry(jarFile); + Map pluginInfo = readPluginInfo(jarFile, pluginInfoEntry); + String moduleName = readModuleName(pluginInfo); + String icon = readIcon(jarFile, moduleName); + pluginInfo.put("icon", icon); + pluginInfo.put("config", JsonUtil.toJSONString(pluginInfo.get("config"))); + return JsonUtil.parseObject(JsonUtil.toJSONString(pluginInfo).toString(), DataEasePluginVO.class); + } + } catch (Exception e) { + DEException.throwException(e); + return null; + } + } + + private static JarEntry findPluginInfoEntry(JarFile jarFile) { + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + if (entry.getName().matches(PLUGIN_INFO_PATTERN)) { + return entry; + } + } + DEException.throwException("插件缺失描述文件[extensions-*.json]"); + return null; + } + + private static Map readPluginInfo(JarFile jarFile, JarEntry pluginInfoEntry) throws Exception { + try (InputStream inputStream = jarFile.getInputStream(pluginInfoEntry)) { + Map pluginInfo = JsonUtil.parseObject(new String(inputStream.readAllBytes(), StandardCharsets.UTF_8), Map.class); + if (pluginInfo == null || pluginInfo.isEmpty()) { + DEException.throwException("插件描述文件[extensions-*.json]内容为空"); + } + return pluginInfo; + } + } + + private static String readModuleName(Map pluginInfo) { + Object moduleName = pluginInfo.get("moduleName"); + if (moduleName == null || StringUtils.isBlank(moduleName.toString())) { + DEException.throwException("插件描述文件[extensions-*.json]中缺失moduleName描述"); + } + return moduleName.toString(); + } + + private static String readIcon(JarFile jarFile, String moduleName) throws Exception { + String iconPath = String.format("plugin/%s.svg", moduleName); + JarEntry iconEntry = jarFile.getJarEntry(iconPath); + if (iconEntry == null) { + DEException.throwException(String.format("插件缺失图标文件[%s]", iconPath)); + } + try (InputStream inputStream = jarFile.getInputStream(iconEntry)) { + return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + } + } +}