This is an automated email from the ASF dual-hosted git repository.

zhaoqingran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/master by this push:
     new 4a691777a [improve] improve plugin params (#2655)
4a691777a is described below

commit 4a691777aafc7ef6107417266cd60b471961784b
Author: liutianyou <[email protected]>
AuthorDate: Mon Sep 2 23:31:13 2024 +0800

    [improve] improve plugin params (#2655)
    
    Co-authored-by: shown <[email protected]>
    Co-authored-by: Calvin <[email protected]>
---
 .../common/entity/manager/PluginMetadata.java      |  4 ++
 .../common/entity/plugin/PluginConfig.java         |  5 +++
 .../manager/service/impl/PluginServiceImpl.java    | 43 +++++++++++++++-------
 .../manager/service/PluginServiceTest.java         |  5 ++-
 web-app/src/app/pojo/Plugin.ts                     |  1 +
 .../routes/setting/plugins/plugin.component.html   | 13 +++++--
 web-app/src/assets/i18n/en-US.json                 |  1 +
 web-app/src/assets/i18n/zh-CN.json                 |  1 +
 web-app/src/assets/i18n/zh-TW.json                 |  1 +
 9 files changed, 56 insertions(+), 18 deletions(-)

diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/PluginMetadata.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/PluginMetadata.java
index f88b98a67..55b12b30f 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/entity/manager/PluginMetadata.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/manager/PluginMetadata.java
@@ -100,4 +100,8 @@ public class PluginMetadata {
     @JoinColumn(name = "metadata_id", referencedColumnName = "id")
     private List<PluginItem> items;
 
+    @Schema(title = "Param count", example = "1", accessMode = READ_WRITE)
+    private Integer paramCount;
+
+
 }
diff --git 
a/common/src/main/java/org/apache/hertzbeat/common/entity/plugin/PluginConfig.java
 
b/common/src/main/java/org/apache/hertzbeat/common/entity/plugin/PluginConfig.java
index f0377f50d..3b71ed637 100644
--- 
a/common/src/main/java/org/apache/hertzbeat/common/entity/plugin/PluginConfig.java
+++ 
b/common/src/main/java/org/apache/hertzbeat/common/entity/plugin/PluginConfig.java
@@ -22,6 +22,7 @@
 
 package org.apache.hertzbeat.common.entity.plugin;
 
+import java.util.ArrayList;
 import java.util.List;
 import lombok.Data;
 import org.apache.hertzbeat.common.entity.manager.ParamDefine;
@@ -33,4 +34,8 @@ import org.apache.hertzbeat.common.entity.manager.ParamDefine;
 public class PluginConfig {
 
     private List<ParamDefine> params;
+
+    public PluginConfig() {
+        this.params = new ArrayList<>();
+    }
 }
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
index 0b789452f..0399eaed5 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java
@@ -48,6 +48,7 @@ import javax.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.hertzbeat.common.constants.PluginType;
 import org.apache.hertzbeat.common.entity.dto.PluginUpload;
@@ -71,7 +72,6 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.error.YAMLException;
 
@@ -216,16 +216,16 @@ public class PluginServiceImpl implements PluginService {
      * verify the type of the jar package
      *
      * @param jarFile jar file
-     * @return return the full path of the Plugin interface implementation 
class
+     * @return return the result of jar package parsed
      */
-    public List<PluginItem> validateJarFile(File jarFile) {
+    public PluginMetadata validateJarFile(File jarFile) {
+        PluginMetadata metadata = new PluginMetadata();
         List<PluginItem> pluginItems = new ArrayList<>();
         try {
             URL jarUrl = new URL("file:" + jarFile.getAbsolutePath());
             try (URLClassLoader classLoader = new URLClassLoader(new 
URL[]{jarUrl}, this.getClass().getClassLoader());
                 JarFile jar = new JarFile(jarFile)) {
                 Enumeration<JarEntry> entries = jar.entries();
-                Yaml yaml = new Yaml();
                 while (entries.hasMoreElements()) {
                     JarEntry entry = entries.nextElement();
                     if (entry.getName().endsWith(".class")) {
@@ -244,9 +244,8 @@ public class PluginServiceImpl implements PluginService {
                         }
                     }
                     if ((entry.getName().contains("define")) && 
(entry.getName().endsWith(".yml") || entry.getName().endsWith(".yaml"))) {
-                        try (InputStream ymlInputStream = 
jar.getInputStream(entry)) {
-                            yaml.loadAs(ymlInputStream, List.class);
-                        }
+                        PluginConfig config = readPluginConfig(jar, entry);
+                        
metadata.setParamCount(CollectionUtils.size(config.getParams()));
                     }
                 }
                 if (pluginItems.isEmpty()) {
@@ -262,7 +261,8 @@ public class PluginServiceImpl implements PluginService {
         } catch (YAMLException e) {
             throw new CommonException("YAML the file format is incorrect");
         }
-        return pluginItems;
+        metadata.setItems(pluginItems);
+        return metadata;
     }
 
     private void validateMetadata(PluginMetadata metadata) {
@@ -290,10 +290,12 @@ public class PluginServiceImpl implements PluginService {
         List<PluginItem> pluginItems;
         PluginMetadata pluginMetadata;
         try {
-            pluginItems = validateJarFile(destFile);
+            PluginMetadata parsed = validateJarFile(destFile);
+            pluginItems = parsed.getItems();
             pluginMetadata = PluginMetadata.builder()
                 .name(pluginUpload.getName())
                 .enableStatus(true)
+                .paramCount(parsed.getParamCount())
                 .items(pluginItems).jarFilePath(destFile.getAbsolutePath())
                 .gmtCreate(LocalDateTime.now())
                 .build();
@@ -424,7 +426,6 @@ public class PluginServiceImpl implements PluginService {
         List<URL> libUrls = new ArrayList<>();
         try (JarFile jarFile = new JarFile(pluginJarPath)) {
             Enumeration<JarEntry> entries = jarFile.entries();
-            Yaml yaml = new Yaml();
             while (entries.hasMoreElements()) {
                 JarEntry entry = entries.nextElement();
                 File file = new File(libDir, entry.getName());
@@ -447,16 +448,30 @@ public class PluginServiceImpl implements PluginService {
                     }
                 }
                 if ((entry.getName().contains("define")) && 
(entry.getName().endsWith(".yml") || entry.getName().endsWith(".yaml"))) {
-                    try (InputStream ymlInputStream = 
jarFile.getInputStream(entry)) {
-                        PluginConfig config = yaml.loadAs(ymlInputStream, 
PluginConfig.class);
-                        PARAMS_CONFIG_MAP.put(pluginMetadataId, config);
-                    }
+                    PluginConfig config = readPluginConfig(jarFile, entry);
+                    PARAMS_CONFIG_MAP.put(pluginMetadataId, config);
                 }
             }
         }
         return libUrls;
     }
 
+    /**
+     * Read the plugin configuration file from the jar package
+     *
+     * @return plugin config
+     */
+    private PluginConfig readPluginConfig(JarFile jarFile, JarEntry entry) 
throws IOException {
+        Yaml yaml = new Yaml();
+        try (InputStream ymlInputStream = jarFile.getInputStream(entry)) {
+            PluginConfig config = yaml.loadAs(ymlInputStream, 
PluginConfig.class);
+            if (config == null) {
+                return new PluginConfig();
+            }
+            return config;
+        }
+    }
+
     @Override
     public <T> void pluginExecute(Class<T> clazz, Consumer<T> execute) {
         for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
diff --git 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
index a2ccc15e7..3576ea483 100644
--- 
a/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
+++ 
b/manager/src/test/java/org/apache/hertzbeat/manager/service/PluginServiceTest.java
@@ -81,8 +81,11 @@ class PluginServiceTest {
     void testSavePlugin() {
 
         List<PluginItem> pluginItems = Collections.singletonList(new 
PluginItem("org.apache.hertzbeat.PluginTest", PluginType.POST_ALERT));
+        PluginMetadata metadata = new PluginMetadata();
+        metadata.setItems(pluginItems);
+        metadata.setParamCount(0);
         PluginServiceImpl service = spy(pluginService);
-        doReturn(pluginItems).when(service).validateJarFile(any());
+        doReturn(metadata).when(service).validateJarFile(any());
 
         MockMultipartFile mockFile = new MockMultipartFile("file", 
"test-plugin.jar", "application/java-archive", "plugin-content".getBytes());
         PluginUpload pluginUpload = new PluginUpload(mockFile, "Test Plugin", 
true);
diff --git a/web-app/src/app/pojo/Plugin.ts b/web-app/src/app/pojo/Plugin.ts
index 99b68fa36..db22985b1 100644
--- a/web-app/src/app/pojo/Plugin.ts
+++ b/web-app/src/app/pojo/Plugin.ts
@@ -24,4 +24,5 @@ export class Plugin {
   name!: string;
   enableStatus!: boolean;
   items!: PluginItem[];
+  paramCount!: number;
 }
diff --git a/web-app/src/app/routes/setting/plugins/plugin.component.html 
b/web-app/src/app/routes/setting/plugins/plugin.component.html
index 4bf3bffd2..9508f35e1 100644
--- a/web-app/src/app/routes/setting/plugins/plugin.component.html
+++ b/web-app/src/app/routes/setting/plugins/plugin.component.html
@@ -92,7 +92,14 @@
       <!--      <td nzAlign="center">{{ data.enableStatus }}</td>-->
       <td nzAlign="center">
         <div class="actions">
-          <button nz-button nzType="primary" 
(click)="onEditPluginParamDefine(data.id)" nz-tooltip 
[nzTooltipTitle]="'plugin.edit' | i18n">
+          <button
+            *ngIf="data.paramCount !== 0"
+            nz-button
+            nzType="primary"
+            (click)="onEditPluginParamDefine(data.id)"
+            nz-tooltip
+            [nzTooltipTitle]="'plugin.param.edit' | i18n"
+          >
             <i nz-icon nzType="edit" nzTheme="outline"></i>
           </button>
           <button
@@ -111,7 +118,7 @@
   </tbody>
 </nz-table>
 
-<ng-template #rangeTemplate> {{ 'common.total' | i18n }} {{ total }} 
</ng-template>
+<ng-template #rangeTemplate> {{ 'common.total' | i18n }} {{ total 
}}</ng-template>
 
 <!-- upload plugin pop-up window -->
 <nz-modal
@@ -174,7 +181,7 @@
     <form nz-form #form="ngForm">
       <ng-container *ngFor="let paramDefine of paramDefines; let i = index">
         <nz-form-item>
-          <nz-form-label nzSpan="7" [nzRequired]="paramDefine.required" 
[nzFor]="paramDefine.field">{{ paramDefine.name }} </nz-form-label>
+          <nz-form-label nzSpan="7" [nzRequired]="paramDefine.required" 
[nzFor]="paramDefine.field">{{ paramDefine.name }}</nz-form-label>
           <nz-form-control nzSpan="8" [nzErrorTip]="'validation.required' | 
i18n">
             <app-form-field [item]="paramDefine" [name]="paramDefine.field" 
[(ngModel)]="params[paramDefine.field].paramValue" />
           </nz-form-control>
diff --git a/web-app/src/assets/i18n/en-US.json 
b/web-app/src/assets/i18n/en-US.json
index 48d9529cd..f7fc8ae19 100644
--- a/web-app/src/assets/i18n/en-US.json
+++ b/web-app/src/assets/i18n/en-US.json
@@ -583,6 +583,7 @@
   "plugin.type.POST_COLLECT": "POST COLLECT",
   "plugin.search": "Search plugins",
   "plugin.edit": "Edit plugin",
+  "plugin.param.edit": "Edit Params",
   "define.help": "The monitor templates define each monitoring type, parameter 
variable, metrics info, collection protocol, etc. You can select an existing 
monitoring template from the drop-down menu then make modifications according 
to your own needs. The bottom-left area is the compare area and the 
bottom-right area is the editing place. <br> You can also click \"New Monitor 
Type\" to custom define an new type. Currently supported protocols include<a 
href='https://hertzbeat.apache.org/ [...]
   "define.help.link": 
"https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/";,
   "define.save-apply": "Save And Apply",
diff --git a/web-app/src/assets/i18n/zh-CN.json 
b/web-app/src/assets/i18n/zh-CN.json
index 303fab11b..45e7174ab 100644
--- a/web-app/src/assets/i18n/zh-CN.json
+++ b/web-app/src/assets/i18n/zh-CN.json
@@ -566,6 +566,7 @@
   "plugin.type.POST_COLLECT": "采集后",
   "plugin.search": "搜索插件",
   "plugin.edit": "编辑插件",
+  "plugin.param.edit": "编辑参数",
   "define.help": 
"监控模版定义每一个监控类型,类型的参数变量,指标信息,采集协议等。您可根据需求在下拉菜单中选择已有监控模板修改。左下区域为对照区,右下区域为编辑区。<br>您也可以点击“<i>新增监控类型</i>”来自定义新的的监控类型,目前支持
 <a href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-http'> HTTP 
协议</a>,<a 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-jdbc'>JDBC协议</a>,<a
 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-ssh'>SSH协议</a>,<a 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-jmx'> JMX 
协议</a>,<a href='https://hertzbeat.apa [...]
   "define.help.link": 
"https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/";,
   "define.save-apply": "保存并应用",
diff --git a/web-app/src/assets/i18n/zh-TW.json 
b/web-app/src/assets/i18n/zh-TW.json
index 9783be18a..f52a0a9d3 100644
--- a/web-app/src/assets/i18n/zh-TW.json
+++ b/web-app/src/assets/i18n/zh-TW.json
@@ -579,6 +579,7 @@
   "plugin.type.POST_COLLECT": "採集後",
   "plugin.search": "搜尋插件",
   "plugin.edit": "編輯插件",
+  "plugin.param.edit": "編輯參數",
   "define.help": 
"監控模版定義每一個監控類型,類型的參數變量,指標信息,採集協議等。您可根據需求在下拉功能表中選擇已有監控模版進行修改。右下區域為編輯區,左下區域為對照區。<br>您也可以點擊“<i>新增監控類型</i>”來自定義新的的監控類型,現支持<a
 href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-http'> 
HTTP協議</a>,<a 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-jdbc'>JDBC協定</a>,<a
 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-ssh'>SSH協定</a>,<a 
href='https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-jmx'> 
JMX協定</a>,<a href='https://hertzbeat.apac [...]
   "define.help.link": 
"https://hertzbeat.apache.org/zh-cn/docs/advanced/extend-point/";,
   "define.save-apply": "保存並應用",


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to