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

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


The following commit(s) were added to refs/heads/master by this push:
     new f3743ee  Introduce booster-ui and implement v9 template management 
protocol (#8637)
f3743ee is described below

commit f3743ee017cca7d165a25c0319ffe870ea9d1791
Author: Kai <[email protected]>
AuthorDate: Wed Mar 9 08:15:55 2022 +0800

    Introduce booster-ui and implement v9 template management protocol (#8637)
---
 .gitmodules                                        |  6 +--
 CHANGES.md                                         |  2 +
 apm-webapp/pom.xml                                 |  2 +-
 .../core/management/ui/template/UITemplate.java    | 28 +++++-------
 .../ui/template/UITemplateInitializer.java         | 43 +-----------------
 .../ui/template/UITemplateManagementService.java   | 16 ++++---
 .../server/core/query/input/DashboardSetting.java  | 11 ++---
 .../NewDashboardSetting.java}                      | 25 +++++-----
 .../core/query/type/DashboardConfiguration.java    | 10 +---
 .../core/query/type/TemplateChangeStatus.java      |  1 +
 .../management/UITemplateManagementDAO.java        |  4 +-
 .../ui/template/UITemplateInitializerTest.java     | 28 +-----------
 .../management/ui/template/UITemplateTest.java     | 12 +----
 .../resolver/UIConfigurationManagement.java        | 27 +++++++----
 .../src/main/resources/query-protocol              |  2 +-
 .../query/UITemplateManagementEsDAO.java           | 41 +++++++++++++----
 .../query/UITemplateManagementDAOImpl.java         | 53 ++++++++++++++++++----
 .../management/IoTDBUITemplateManagementDAO.java   | 38 +++++++++++++---
 .../jdbc/h2/dao/H2UITemplateManagementDAO.java     | 42 +++++++++++++----
 skywalking-ui                                      |  2 +-
 20 files changed, 213 insertions(+), 180 deletions(-)

diff --git a/.gitmodules b/.gitmodules
index f78cd69..8011ff2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,9 +4,9 @@
 [submodule 
"oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol"]
        path = 
oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
        url = https://github.com/apache/skywalking-query-protocol.git
-[submodule "skywalking-ui"]
-       path = skywalking-ui
-       url = https://github.com/apache/skywalking-rocketbot-ui.git
 [submodule "test/e2e-v2/java-test-service/e2e-protocol/src/main/proto"]
        path = test/e2e-v2/java-test-service/e2e-protocol/src/main/proto
        url = https://github.com/apache/skywalking-data-collect-protocol.git
+[submodule "skywalking-ui"]
+       path = skywalking-ui
+       url = https://github.com/apache/skywalking-booster-ui.git
diff --git a/CHANGES.md b/CHANGES.md
index dc49f34..802a140 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -85,12 +85,14 @@ Release Notes.
 * Support large service/instance/networkAddressAlias list query by using 
ElasticSearch scrolling API, add `metadataQueryBatchSize` to configure 
scrolling page size.
 * Change default value of `metadataQueryMaxSize` from `5000` to `10000`
 * Replace deprecated Armeria API `BasicToken.of` with `AuthToken.ofBasic`.
+* Implement v9 UI template management protocol.
 
 #### UI
 
 * Remove unused jars (log4j-api.jar) in classpath.
 * Bump up netty version to fix CVE.
 * Add Database Connection pool metric.
+* Introduce skywalking-booster-ui, remove skywalking-rocketbot-ui.
 
 #### Documentation
 
diff --git a/apm-webapp/pom.xml b/apm-webapp/pom.xml
index 2e5d797..91e43c3 100644
--- a/apm-webapp/pom.xml
+++ b/apm-webapp/pom.xml
@@ -147,7 +147,7 @@
                 <version>${frontend-maven-plugin.version}</version>
                 <configuration>
                     <workingDirectory>${ui.path}</workingDirectory>
-                    <nodeVersion>v8.17.0</nodeVersion>
+                    <nodeVersion>v14.19.0</nodeVersion>
                 </configuration>
                 <executions>
                     <execution>
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplate.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplate.java
index f4544fd..cc96e43 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplate.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplate.java
@@ -37,43 +37,38 @@ import static 
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.UI
 @ScopeDeclaration(id = UI_TEMPLATE, name = "UITemplate")
 @Stream(name = UITemplate.INDEX_NAME, scopeId = UI_TEMPLATE, builder = 
UITemplate.Builder.class, processor = ManagementStreamProcessor.class)
 @EqualsAndHashCode(of = {
-        "name"
+        "templateId"
 }, callSuper = false)
 public class UITemplate extends ManagementData {
     public static final String INDEX_NAME = "ui_template";
-    public static final String NAME = "name";
-    public static final String TYPE = "type";
+    public static final String TEMPLATE_ID = "template_id";
     public static final String CONFIGURATION = "configuration";
-    public static final String ACTIVATED = "activated";
+    public static final String UPDATE_TIME = "update_time";
     public static final String DISABLED = "disabled";
 
-    @Column(columnName = NAME)
-    private String name;
-    @Column(columnName = TYPE, storageOnly = true)
-    private String type;
+    @Column(columnName = TEMPLATE_ID)
+    private String templateId;
     /**
      * Configuration in JSON format.
      */
     @Column(columnName = CONFIGURATION, storageOnly = true, length = 1_000_000)
     private String configuration;
-    @Column(columnName = ACTIVATED, storageOnly = true)
-    private int activated;
+    @Column(columnName = UPDATE_TIME)
+    private long updateTime;
     @Column(columnName = DISABLED)
     private int disabled;
 
     @Override
     public String id() {
-        return name;
+        return templateId;
     }
 
     public static class Builder implements StorageHashMapBuilder<UITemplate> {
         @Override
         public UITemplate storage2Entity(final Map<String, Object> dbMap) {
             UITemplate uiTemplate = new UITemplate();
-            uiTemplate.setName((String) dbMap.get(NAME));
-            uiTemplate.setType((String) dbMap.get(TYPE));
+            uiTemplate.setTemplateId((String) dbMap.get(TEMPLATE_ID));
             uiTemplate.setConfiguration((String) dbMap.get(CONFIGURATION));
-            uiTemplate.setActivated(((Number) 
dbMap.get(ACTIVATED)).intValue());
             uiTemplate.setDisabled(((Number) dbMap.get(DISABLED)).intValue());
             return uiTemplate;
         }
@@ -81,10 +76,9 @@ public class UITemplate extends ManagementData {
         @Override
         public Map<String, Object> entity2Storage(final UITemplate 
storageData) {
             final HashMap<String, Object> map = new HashMap<>();
-            map.put(NAME, storageData.getName());
-            map.put(TYPE, storageData.getType());
+            map.put(TEMPLATE_ID, storageData.getTemplateId());
             map.put(CONFIGURATION, storageData.getConfiguration());
-            map.put(ACTIVATED, storageData.getActivated());
+            map.put(UPDATE_TIME, storageData.getUpdateTime());
             map.put(DISABLED, storageData.getDisabled());
             return map;
         }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java
index 93a5b42..d1bdb87 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java
@@ -23,11 +23,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.skywalking.oap.server.library.util.StringUtil;
-import org.apache.skywalking.oap.server.core.query.enumeration.TemplateType;
-import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 import org.yaml.snakeyaml.Yaml;
 
 /**
@@ -53,44 +49,7 @@ public class UITemplateInitializer {
 
     public List<UITemplate> read() {
         List<UITemplate> uiTemplates = new ArrayList<>();
-        if (Objects.nonNull(yamlData)) {
-            List templates = (List) yamlData.get("templates");
-            if (templates != null) {
-                templates.forEach(templateObj -> {
-                    final Map template = (Map) templateObj;
-                    UITemplate newTemplate = new UITemplate();
-                    final String name = (String) template.get("name");
-                    if (StringUtil.isEmpty(name)) {
-                        throw new IllegalArgumentException("template name 
shouldn't be null");
-                    }
-                    newTemplate.setName(name);
-                    final String type = (String) template.getOrDefault("type", 
TemplateType.DASHBOARD.name());
-                    TemplateType.forName(type); // for checking.
-                    newTemplate.setType(type);
-                    final String configuration = (String) 
template.get("configuration");
-                    if (StringUtil.isEmpty(configuration)) {
-                        throw new IllegalArgumentException("template 
configuration shouldn't be null");
-                    }
-                    newTemplate.setConfiguration(configuration);
-                    newTemplate.setActivated(
-                        BooleanUtils.booleanToValue(
-                            // The template should be activated in default, it 
is just an option.
-                            (Boolean) template.getOrDefault("activated", false)
-                        )
-                    );
-                    newTemplate.setDisabled(
-                        BooleanUtils.booleanToValue(
-                            // The template should be available in default.
-                            (Boolean) template.getOrDefault("disabled", false)
-                        )
-                    );
-                    if (uiTemplates.contains(newTemplate)) {
-                        throw new IllegalArgumentException("Template " + 
newTemplate.getName() + " name conflicts");
-                    }
-                    uiTemplates.add(newTemplate);
-                });
-            }
-        }
+        //Todo: implement later when new template file ready
         return uiTemplates;
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateManagementService.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateManagementService.java
index 27d6d47..c64374f 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateManagementService.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateManagementService.java
@@ -19,8 +19,6 @@
 package org.apache.skywalking.oap.server.core.management.ui.template;
 
 import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.query.input.DashboardSetting;
@@ -45,11 +43,17 @@ public class UITemplateManagementService implements Service 
{
         return uiTemplateManagementDAO;
     }
 
+    public DashboardConfiguration getTemplate(String id) throws IOException {
+        DashboardConfiguration configuration = 
getUITemplateManagementDAO().getTemplate(id);
+        if (configuration.isDisabled()) {
+            return null;
+        }
+        return configuration;
+    }
+
     public List<DashboardConfiguration> getAllTemplates(Boolean 
includingDisabled) throws IOException {
         final List<DashboardConfiguration> allTemplates =
             getUITemplateManagementDAO().getAllTemplates(includingDisabled);
-        // Make sure the template in A-Za-z
-        Collections.sort(allTemplates, 
Comparator.comparing(DashboardConfiguration::getName));
         return allTemplates;
     }
 
@@ -61,7 +65,7 @@ public class UITemplateManagementService implements Service {
         return getUITemplateManagementDAO().changeTemplate(setting);
     }
 
-    public TemplateChangeStatus disableTemplate(String name) throws 
IOException {
-        return getUITemplateManagementDAO().disableTemplate(name);
+    public TemplateChangeStatus disableTemplate(String id) throws IOException {
+        return getUITemplateManagementDAO().disableTemplate(id);
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/DashboardSetting.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/DashboardSetting.java
index f9464d8..354e239 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/DashboardSetting.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/DashboardSetting.java
@@ -21,23 +21,20 @@ package org.apache.skywalking.oap.server.core.query.input;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
-import org.apache.skywalking.oap.server.core.query.enumeration.TemplateType;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 
 @Setter
 @Getter
 public class DashboardSetting {
-    private String name;
-    private TemplateType type;
+    private String id;
     private String configuration;
-    private boolean active;
+    private long updateTime;
 
     public UITemplate toEntity() {
         UITemplate uiTemplate = new UITemplate();
-        uiTemplate.setName(this.getName());
+        uiTemplate.setTemplateId(this.id);
         uiTemplate.setConfiguration(this.getConfiguration());
-        uiTemplate.setType(this.getType().name());
-        uiTemplate.setActivated(BooleanUtils.booleanToValue(this.isActive()));
+        uiTemplate.setUpdateTime(this.updateTime);
         uiTemplate.setDisabled(BooleanUtils.FALSE);
         return uiTemplate;
     }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/enumeration/TemplateType.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/NewDashboardSetting.java
similarity index 64%
rename from 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/enumeration/TemplateType.java
rename to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/NewDashboardSetting.java
index cbc06bb..d628465 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/enumeration/TemplateType.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/NewDashboardSetting.java
@@ -16,19 +16,20 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.query.enumeration;
+package org.apache.skywalking.oap.server.core.query.input;
 
-public enum TemplateType {
-    DASHBOARD,
-    TOPOLOGY_SERVICE,
-    TOPOLOGY_INSTANCE,
-    TOPOLOGY_ENDPOINT,
-    TOPOLOGY_SERVICE_RELATION,
-    TOPOLOGY_SERVICE_INSTANCE_RELATION,
-    TOPOLOGY_ENDPOINT_RELATION,
-    ;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
 
-    public static TemplateType forName(String name) {
-        return Enum.valueOf(TemplateType.class, name.toUpperCase());
+@Setter
+@Getter
+public class NewDashboardSetting {
+    private String configuration;
+
+    public UITemplate toEntity() {
+        UITemplate uiTemplate = new UITemplate();
+        uiTemplate.setConfiguration(this.getConfiguration());
+        return uiTemplate;
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/DashboardConfiguration.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/DashboardConfiguration.java
index e4e2788..1e1c69b 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/DashboardConfiguration.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/DashboardConfiguration.java
@@ -21,28 +21,22 @@ package org.apache.skywalking.oap.server.core.query.type;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
-import org.apache.skywalking.oap.server.core.query.enumeration.TemplateType;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 
 @Setter
 @Getter
 public class DashboardConfiguration {
-    private String name;
-    private TemplateType type;
+    private String id;
     /**
      * Configuration in JSON format.
      */
     private String configuration;
-    private boolean activated;
     private boolean disabled;
 
     public DashboardConfiguration fromEntity(UITemplate templateEntity) {
-        this.setName(templateEntity.getName());
-        this.setType(TemplateType.forName(templateEntity.getType()));
+        this.setId(templateEntity.getTemplateId());
         this.setConfiguration(templateEntity.getConfiguration());
-        
this.setActivated(BooleanUtils.valueToBoolean(templateEntity.getActivated()));
         
this.setDisabled(BooleanUtils.valueToBoolean(templateEntity.getDisabled()));
-
         return this;
     }
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/TemplateChangeStatus.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/TemplateChangeStatus.java
index 8282672..00cbfce 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/TemplateChangeStatus.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/TemplateChangeStatus.java
@@ -26,6 +26,7 @@ import lombok.Setter;
 @Getter
 @Builder
 public class TemplateChangeStatus {
+    private String id;
     private boolean status;
     private String message;
 }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/management/UITemplateManagementDAO.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/management/UITemplateManagementDAO.java
index aee1bbb..4208af4 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/management/UITemplateManagementDAO.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/management/UITemplateManagementDAO.java
@@ -29,11 +29,13 @@ import org.apache.skywalking.oap.server.core.storage.DAO;
  * UI Template management, including CRUD.
  */
 public interface UITemplateManagementDAO extends DAO {
+    DashboardConfiguration getTemplate(String id) throws IOException;
+
     List<DashboardConfiguration> getAllTemplates(Boolean includingDisabled) 
throws IOException;
 
     TemplateChangeStatus addTemplate(DashboardSetting setting) throws 
IOException;
 
     TemplateChangeStatus changeTemplate(DashboardSetting setting) throws 
IOException;
 
-    TemplateChangeStatus disableTemplate(String name) throws IOException;
+    TemplateChangeStatus disableTemplate(String id) throws IOException;
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializerTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializerTest.java
index 82e9d3a..4e6d4a6 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializerTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializerTest.java
@@ -18,38 +18,12 @@
 
 package org.apache.skywalking.oap.server.core.management.ui.template;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.skywalking.oap.server.library.util.BooleanUtils;
-import org.apache.skywalking.oap.server.library.util.ResourceUtils;
-import org.junit.Assert;
 import org.junit.Test;
 
 public class UITemplateInitializerTest {
     @Test
     public void testReadFile() throws FileNotFoundException {
-        final File[] templateFiles = 
ResourceUtils.getPathFiles("test-ui-templates");
-        final List<UITemplate> uiTemplates = new ArrayList<>();
-        for (final File templateFile : templateFiles) {
-            UITemplateInitializer initializer = new UITemplateInitializer(
-                new FileInputStream(templateFile));
-            uiTemplates.addAll(initializer.read());
-        }
-
-        Assert.assertEquals(2, uiTemplates.size());
-        UITemplate uiTemplate = uiTemplates.get(0);
-        Assert.assertEquals("APM (Agent based)", uiTemplate.getName());
-        Assert.assertTrue(uiTemplate.getConfiguration().length() > 0);
-        Assert.assertEquals(BooleanUtils.TRUE, uiTemplate.getActivated());
-        Assert.assertEquals(BooleanUtils.FALSE, uiTemplate.getDisabled());
-
-        uiTemplate = uiTemplates.get(1);
-        Assert.assertEquals("APM (Service Mesh)", uiTemplate.getName());
-        Assert.assertTrue(uiTemplate.getConfiguration().length() > 0);
-        Assert.assertEquals(BooleanUtils.FALSE, uiTemplate.getActivated());
-        Assert.assertEquals(BooleanUtils.TRUE, uiTemplate.getDisabled());
+        //Todo: implement later when new template file ready
     }
 }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateTest.java
index 5510b4d..fc1ef80 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateTest.java
@@ -18,8 +18,6 @@
 
 package org.apache.skywalking.oap.server.core.management.ui.template;
 
-import org.apache.skywalking.oap.server.core.query.enumeration.TemplateType;
-import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -27,11 +25,8 @@ public class UITemplateTest {
     @Test
     public void testSerialization() {
         UITemplate uiTemplate = new UITemplate();
-        uiTemplate.setName("name");
+        uiTemplate.setTemplateId("id");
         uiTemplate.setConfiguration("configuration");
-        uiTemplate.setType(TemplateType.DASHBOARD.name());
-        uiTemplate.setActivated(BooleanUtils.TRUE);
-        uiTemplate.setDisabled(BooleanUtils.FALSE);
 
         final UITemplate.Builder builder = new UITemplate.Builder();
         final UITemplate uiTemplate2 = 
builder.storage2Entity(builder.entity2Storage(uiTemplate));
@@ -39,10 +34,7 @@ public class UITemplateTest {
         Assert.assertEquals(uiTemplate, uiTemplate2);
 
         uiTemplate2.setConfiguration("configuration2");
-        uiTemplate.setType(TemplateType.TOPOLOGY_ENDPOINT.name());
-        uiTemplate.setActivated(BooleanUtils.FALSE);
-        uiTemplate.setDisabled(BooleanUtils.TRUE);
-        // Equals method is only for `name` field.
+        // Equals method is only for `templateId` field.
         Assert.assertEquals(uiTemplate, uiTemplate2);
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/UIConfigurationManagement.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/UIConfigurationManagement.java
index 00f0eee..cf68f65 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/UIConfigurationManagement.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/UIConfigurationManagement.java
@@ -22,10 +22,12 @@ import graphql.kickstart.tools.GraphQLMutationResolver;
 import graphql.kickstart.tools.GraphQLQueryResolver;
 import java.io.IOException;
 import java.util.List;
+import java.util.UUID;
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import 
org.apache.skywalking.oap.server.core.management.ui.template.UITemplateManagementService;
 import org.apache.skywalking.oap.server.core.query.input.DashboardSetting;
+import org.apache.skywalking.oap.server.core.query.input.NewDashboardSetting;
 import org.apache.skywalking.oap.server.core.query.type.DashboardConfiguration;
 import org.apache.skywalking.oap.server.core.query.type.TemplateChangeStatus;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -50,22 +52,29 @@ public class UIConfigurationManagement implements 
GraphQLQueryResolver, GraphQLM
         return uiTemplateManagementService;
     }
 
-    public List<DashboardConfiguration> getAllTemplates(Boolean 
includingDisabled) throws IOException {
-        if (includingDisabled == null) {
-            includingDisabled = false;
-        }
-        return 
getUITemplateManagementService().getAllTemplates(includingDisabled);
+    public DashboardConfiguration getTemplate(String id) throws IOException {
+        return getUITemplateManagementService().getTemplate(id);
+    }
+
+    public List<DashboardConfiguration> getAllTemplates() throws IOException {
+        return getUITemplateManagementService().getAllTemplates(false);
     }
 
-    public TemplateChangeStatus addTemplate(DashboardSetting setting) throws 
IOException {
-        return getUITemplateManagementService().addTemplate(setting);
+    public TemplateChangeStatus addTemplate(NewDashboardSetting setting) 
throws IOException {
+        DashboardSetting dashboardSetting = new DashboardSetting();
+        //Backend generate the Id for new template
+        dashboardSetting.setId(UUID.randomUUID().toString());
+        dashboardSetting.setUpdateTime(System.currentTimeMillis());
+        dashboardSetting.setConfiguration(setting.getConfiguration());
+        return getUITemplateManagementService().addTemplate(dashboardSetting);
     }
 
     public TemplateChangeStatus changeTemplate(DashboardSetting setting) 
throws IOException {
+        setting.setUpdateTime(System.currentTimeMillis());
         return getUITemplateManagementService().changeTemplate(setting);
     }
 
-    public TemplateChangeStatus disableTemplate(String name) throws 
IOException {
-        return getUITemplateManagementService().disableTemplate(name);
+    public TemplateChangeStatus disableTemplate(String id) throws IOException {
+        return getUITemplateManagementService().disableTemplate(id);
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
index d6e2947..74f9bc7 160000
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
@@ -1 +1 @@
-Subproject commit d6e294735ab43b2fa9e70b11c91d85268591dec0
+Subproject commit 74f9bc7ee6af33fc341331cf381c98847dcccfff
diff --git 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/UITemplateManagementEsDAO.java
 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/UITemplateManagementEsDAO.java
index ac48a26..5f1e906 100644
--- 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/UITemplateManagementEsDAO.java
+++ 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/UITemplateManagementEsDAO.java
@@ -37,6 +37,7 @@ import 
org.apache.skywalking.oap.server.core.query.type.TemplateChangeStatus;
 import 
org.apache.skywalking.oap.server.core.storage.management.UITemplateManagementDAO;
 import 
org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
 import 
org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO;
 import 
org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.IndexController;
 
@@ -47,6 +48,26 @@ public class UITemplateManagementEsDAO extends EsDAO 
implements UITemplateManage
     }
 
     @Override
+    public DashboardConfiguration getTemplate(final String id) {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+        final String index =
+            
IndexController.LogicIndicesRegister.getPhysicalTableName(UITemplate.INDEX_NAME);
+        final SearchBuilder search =
+            Search.builder().query(Query.ids(id))
+                  .size(1);
+        final SearchResponse response = getClient().search(index, 
search.build());
+
+        if (response.getHits().getHits().size() > 0) {
+            UITemplate.Builder builder = new UITemplate.Builder();
+            SearchHit data = response.getHits().getHits().get(0);
+            return new 
DashboardConfiguration().fromEntity(builder.storage2Entity(data.getSource()));
+        }
+        return null;
+    }
+
+    @Override
     public List<DashboardConfiguration> getAllTemplates(final Boolean 
includingDisabled) {
         final BoolQueryBuilder boolQuery = Query.bool();
         if (!includingDisabled) {
@@ -84,16 +105,16 @@ public class UITemplateManagementEsDAO extends EsDAO 
implements UITemplateManage
 
             final boolean exist = getClient().existDoc(UITemplate.INDEX_NAME, 
uiTemplate.id());
             if (exist) {
-                return 
TemplateChangeStatus.builder().status(false).message("Template exists")
+                return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Template
 exists")
                                            .build();
             }
 
             final Map<String, Object> xContentBuilder = 
builder.entity2Storage(uiTemplate);
             getClient().forceInsert(UITemplate.INDEX_NAME, uiTemplate.id(), 
xContentBuilder);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(uiTemplate.getTemplateId()).build();
         } catch (Exception e) {
             log.error(e.getMessage(), e);
-            return TemplateChangeStatus.builder().status(false).message("Can't 
add a new template")
+            return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't 
add a new template")
                                        .build();
         }
     }
@@ -106,23 +127,23 @@ public class UITemplateManagementEsDAO extends EsDAO 
implements UITemplateManage
 
             final boolean exist = getClient().existDoc(UITemplate.INDEX_NAME, 
uiTemplate.id());
             if (!exist) {
-                return TemplateChangeStatus.builder().status(false)
+                return 
TemplateChangeStatus.builder().status(false).id(setting.getId())
                                            .message("Can't find the 
template").build();
             }
 
             final Map<String, Object> xContentBuilder = 
builder.entity2Storage(uiTemplate);
             getClient().forceUpdate(UITemplate.INDEX_NAME, uiTemplate.id(), 
xContentBuilder);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
         } catch (Exception e) {
             log.error(e.getMessage(), e);
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template")
+            return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't 
find the template")
                                        .build();
         }
     }
 
     @Override
-    public TemplateChangeStatus disableTemplate(final String name) {
-        final Optional<Document> response = 
getClient().get(UITemplate.INDEX_NAME, name);
+    public TemplateChangeStatus disableTemplate(final String id) {
+        final Optional<Document> response = 
getClient().get(UITemplate.INDEX_NAME, id);
         if (response.isPresent()) {
             final UITemplate.Builder builder = new UITemplate.Builder();
             final UITemplate uiTemplate = 
builder.storage2Entity(response.get().getSource());
@@ -130,9 +151,9 @@ public class UITemplateManagementEsDAO extends EsDAO 
implements UITemplateManage
 
             final Map<String, Object> xContentBuilder = 
builder.entity2Storage(uiTemplate);
             getClient().forceUpdate(UITemplate.INDEX_NAME, uiTemplate.id(), 
xContentBuilder);
-            return TemplateChangeStatus.builder().status(true).build();
+            return TemplateChangeStatus.builder().status(true).id(id).build();
         } else {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template")
+            return 
TemplateChangeStatus.builder().status(false).id(id).message("Can't find the 
template")
                                        .build();
         }
     }
diff --git 
a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/UITemplateManagementDAOImpl.java
 
b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/UITemplateManagementDAOImpl.java
index c23f07f..7528fa0 100644
--- 
a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/UITemplateManagementDAOImpl.java
+++ 
b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/UITemplateManagementDAOImpl.java
@@ -33,6 +33,7 @@ import 
org.apache.skywalking.oap.server.core.query.type.DashboardConfiguration;
 import org.apache.skywalking.oap.server.core.query.type.TemplateChangeStatus;
 import 
org.apache.skywalking.oap.server.core.storage.management.UITemplateManagementDAO;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.storage.plugin.influxdb.InfluxClient;
 import 
org.apache.skywalking.oap.server.storage.plugin.influxdb.InfluxConstants;
 import org.influxdb.dto.Point;
@@ -49,12 +50,44 @@ public class UITemplateManagementDAOImpl implements 
UITemplateManagementDAO {
     private final InfluxClient client;
 
     @Override
-    public List<DashboardConfiguration> getAllTemplates(final Boolean 
includingDisabled) throws IOException {
+    public DashboardConfiguration getTemplate(final String id) throws 
IOException {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+
+        final SelectQueryImpl query = select().all()
+                                              .from(client.getDatabase(), 
UITemplate.INDEX_NAME)
+                                              
.where(eq(InfluxConstants.TagName.ID_COLUMN, id))
+                                              .limit(1);
+
+        final QueryResult.Series series = client.queryForSingleSeries(query);
+        if (log.isDebugEnabled()) {
+            log.debug("SQL: {} result: {}", query.getCommand(), series);
+        }
+        final UITemplate.Builder builder = new UITemplate.Builder();
+
+        if (Objects.nonNull(series)) {
+            List<String> columnNames = series.getColumns();
+            List<Object> columnValues = series.getValues().get(0);
+
+            Map<String, Object> data = Maps.newHashMap();
+            for (int i = 1; i < columnNames.size(); i++) {
+                data.put(columnNames.get(i), columnValues.get(i));
+            }
+            UITemplate uiTemplate = builder.storage2Entity(data);
+            return new DashboardConfiguration().fromEntity(uiTemplate);
+
+        }
+        return null;
+    }
+
+    @Override
+    public List<DashboardConfiguration> getAllTemplates(Boolean 
includingDisabled) throws IOException {
         final WhereQueryImpl<SelectQueryImpl> where = select().raw("*::field")
                                                               
.from(client.getDatabase(), UITemplate.INDEX_NAME)
                                                               .where();
         if (!includingDisabled) {
-            where.and(eq(UITemplate.DISABLED, BooleanUtils.FALSE));
+            where.and(eq(UITemplate.DISABLED, 
BooleanUtils.booleanToValue(includingDisabled)));
         }
         final QueryResult.Series series = client.queryForSingleSeries(where);
         final List<DashboardConfiguration> configs = new ArrayList<>();
@@ -88,7 +121,7 @@ public class UITemplateManagementDAOImpl implements 
UITemplateManagementDAO {
                                  .time(1L, TimeUnit.NANOSECONDS)
                                  .build();
         client.write(point);
-        return TemplateChangeStatus.builder().status(true).build();
+        return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
     }
 
     @Override
@@ -108,28 +141,28 @@ public class UITemplateManagementDAOImpl implements 
UITemplateManagementDAO {
                                      .time(1L, TimeUnit.NANOSECONDS)
                                      .build();
             client.write(point);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
         } else {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't 
find the template").build();
         }
     }
 
     @Override
-    public TemplateChangeStatus disableTemplate(final String name) throws 
IOException {
+    public TemplateChangeStatus disableTemplate(final String id) throws 
IOException {
         WhereQueryImpl<SelectQueryImpl> query = select().all()
                                                         
.from(client.getDatabase(), UITemplate.INDEX_NAME)
-                                                        
.where(eq(InfluxConstants.TagName.ID_COLUMN, name));
+                                                        
.where(eq(InfluxConstants.TagName.ID_COLUMN, id));
         QueryResult.Series series = client.queryForSingleSeries(query);
         if (Objects.nonNull(series)) {
             final Point point = Point.measurement(UITemplate.INDEX_NAME)
-                                     .tag(InfluxConstants.TagName.ID_COLUMN, 
name)
+                                     .tag(InfluxConstants.TagName.ID_COLUMN, 
id)
                                      .addField(UITemplate.DISABLED, 
BooleanUtils.TRUE)
                                      .time(1L, TimeUnit.NANOSECONDS)
                                      .build();
             client.write(point);
-            return TemplateChangeStatus.builder().status(true).build();
+            return TemplateChangeStatus.builder().status(true).id(id).build();
         } else {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(id).message("Can't find the 
template").build();
         }
     }
 }
diff --git 
a/oap-server/server-storage-plugin/storage-iotdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/iotdb/management/IoTDBUITemplateManagementDAO.java
 
b/oap-server/server-storage-plugin/storage-iotdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/iotdb/management/IoTDBUITemplateManagementDAO.java
index 0bf9c20..12c3f0b 100644
--- 
a/oap-server/server-storage-plugin/storage-iotdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/iotdb/management/IoTDBUITemplateManagementDAO.java
+++ 
b/oap-server/server-storage-plugin/storage-iotdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/iotdb/management/IoTDBUITemplateManagementDAO.java
@@ -20,7 +20,9 @@ package 
org.apache.skywalking.oap.server.storage.plugin.iotdb.management;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
@@ -31,7 +33,9 @@ import 
org.apache.skywalking.oap.server.core.storage.StorageData;
 import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder;
 import 
org.apache.skywalking.oap.server.core.storage.management.UITemplateManagementDAO;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.storage.plugin.iotdb.IoTDBClient;
+import org.apache.skywalking.oap.server.storage.plugin.iotdb.IoTDBIndexes;
 import 
org.apache.skywalking.oap.server.storage.plugin.iotdb.base.IoTDBInsertRequest;
 
 @Slf4j
@@ -42,6 +46,26 @@ public class IoTDBUITemplateManagementDAO implements 
UITemplateManagementDAO {
     private static final long UI_TEMPLATE_TIMESTAMP = 1L;
 
     @Override
+    public DashboardConfiguration getTemplate(final String id) throws 
IOException {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+        StringBuilder query = new StringBuilder();
+        query.append("select * from ");
+        query = client.addModelPath(query, UITemplate.INDEX_NAME);
+        Map<String, String> indexAndValueMap = new HashMap<>();
+        indexAndValueMap.put(IoTDBIndexes.ID_IDX, id);
+        query = client.addQueryIndexValue(UITemplate.INDEX_NAME, query, 
indexAndValueMap);
+        query.append(" limit 1").append(IoTDBClient.ALIGN_BY_DEVICE);
+
+        List<? super StorageData> storageDataList = 
client.filterQuery(UITemplate.INDEX_NAME, query.toString(), storageBuilder);
+        if (storageDataList.size() > 0) {
+            return new DashboardConfiguration().fromEntity((UITemplate) 
storageDataList.get(0));
+        }
+        return null;
+    }
+
+    @Override
     public List<DashboardConfiguration> getAllTemplates(Boolean 
includingDisabled) throws IOException {
         StringBuilder query = new StringBuilder();
         query.append("select * from ");
@@ -67,7 +91,7 @@ public class IoTDBUITemplateManagementDAO implements 
UITemplateManagementDAO {
         IoTDBInsertRequest request = new 
IoTDBInsertRequest(UITemplate.INDEX_NAME, UI_TEMPLATE_TIMESTAMP,
                 uiTemplate, storageBuilder);
         client.write(request);
-        return TemplateChangeStatus.builder().status(true).build();
+        return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
     }
 
     @Override
@@ -81,33 +105,33 @@ public class IoTDBUITemplateManagementDAO implements 
UITemplateManagementDAO {
                 .append(IoTDBClient.ALIGN_BY_DEVICE);
         List<? super StorageData> queryResult = 
client.filterQuery(UITemplate.INDEX_NAME, query.toString(), storageBuilder);
         if (queryResult.size() == 0) {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't 
find the template").build();
         } else {
             IoTDBInsertRequest request = new 
IoTDBInsertRequest(UITemplate.INDEX_NAME, UI_TEMPLATE_TIMESTAMP,
                     uiTemplate, storageBuilder);
             client.write(request);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
         }
     }
 
     @Override
-    public TemplateChangeStatus disableTemplate(String name) throws 
IOException {
+    public TemplateChangeStatus disableTemplate(String id) throws IOException {
         StringBuilder query = new StringBuilder();
         query.append("select * from ");
         query = client.addModelPath(query, UITemplate.INDEX_NAME);
-        query.append(IoTDBClient.DOT).append(client.indexValue2LayerName(name))
+        query.append(IoTDBClient.DOT).append(client.indexValue2LayerName(id))
                 .append(IoTDBClient.ALIGN_BY_DEVICE);
 
         List<? super StorageData> queryResult = 
client.filterQuery(UITemplate.INDEX_NAME, query.toString(), storageBuilder);
         if (queryResult.size() == 0) {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(id).message("Can't find the 
template").build();
         } else {
             final UITemplate uiTemplate = (UITemplate) queryResult.get(0);
             uiTemplate.setDisabled(BooleanUtils.TRUE);
             IoTDBInsertRequest request = new 
IoTDBInsertRequest(UITemplate.INDEX_NAME, UI_TEMPLATE_TIMESTAMP,
                     uiTemplate, storageBuilder);
             client.write(request);
-            return TemplateChangeStatus.builder().status(true).build();
+            return TemplateChangeStatus.builder().status(true).id(id).build();
         }
     }
 }
diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2UITemplateManagementDAO.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2UITemplateManagementDAO.java
index 8802b28..7f1c227 100644
--- 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2UITemplateManagementDAO.java
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2UITemplateManagementDAO.java
@@ -34,6 +34,7 @@ import 
org.apache.skywalking.oap.server.core.storage.management.UITemplateManage
 import 
org.apache.skywalking.oap.server.library.client.jdbc.JDBCClientException;
 import 
org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.SQLExecutor;
 
 @Slf4j
@@ -42,7 +43,32 @@ public class H2UITemplateManagementDAO extends H2SQLExecutor 
implements UITempla
     private final JDBCHikariCPClient h2Client;
 
     @Override
-    public List<DashboardConfiguration> getAllTemplates(final Boolean 
includingDisabled) throws IOException {
+    public DashboardConfiguration getTemplate(final String id) throws 
IOException {
+        if (StringUtil.isEmpty(id)) {
+            return null;
+        }
+        final StringBuilder sql = new StringBuilder();
+        final ArrayList<Object> condition = new ArrayList<>(1);
+        sql.append("select * from ").append(UITemplate.INDEX_NAME).append(" 
where id=? LIMIT 1 ");
+        condition.add(id);
+
+        try (Connection connection = h2Client.getConnection()) {
+            try (ResultSet rs = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) 
{
+                final UITemplate.Builder builder = new UITemplate.Builder();
+                UITemplate uiTemplate = (UITemplate) toStorageData(rs, 
UITemplate.INDEX_NAME, builder);
+                if (uiTemplate != null) {
+                    return new DashboardConfiguration().fromEntity(uiTemplate);
+                }
+            }
+        } catch (SQLException | JDBCClientException e) {
+            throw new IOException(e);
+        }
+        return null;
+    }
+
+    @Override
+    public List<DashboardConfiguration> getAllTemplates(Boolean 
includingDisabled) throws IOException {
         final StringBuilder sql = new StringBuilder();
         final ArrayList<Object> condition = new ArrayList<>(1);
         sql.append("select * from ").append(UITemplate.INDEX_NAME).append(" 
where 1=1 ");
@@ -75,10 +101,10 @@ public class H2UITemplateManagementDAO extends 
H2SQLExecutor implements UITempla
         final SQLExecutor insertExecutor = 
getInsertExecutor(UITemplate.INDEX_NAME, uiTemplate, new UITemplate.Builder());
         try (Connection connection = h2Client.getConnection()) {
             insertExecutor.invoke(connection);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(setting.getId()).build();
         } catch (SQLException | JDBCClientException e) {
             log.error(e.getMessage(), e);
-            return TemplateChangeStatus.builder().status(false).message("Can't 
add a new template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't 
add a new template").build();
         }
     }
 
@@ -89,10 +115,10 @@ public class H2UITemplateManagementDAO extends 
H2SQLExecutor implements UITempla
     }
 
     @Override
-    public TemplateChangeStatus disableTemplate(final String name) throws 
IOException {
-        final UITemplate uiTemplate = (UITemplate) getByID(h2Client, 
UITemplate.INDEX_NAME, name, new UITemplate.Builder());
+    public TemplateChangeStatus disableTemplate(final String id) throws 
IOException {
+        final UITemplate uiTemplate = (UITemplate) getByID(h2Client, 
UITemplate.INDEX_NAME, id, new UITemplate.Builder());
         if (uiTemplate == null) {
-            return TemplateChangeStatus.builder().status(false).message("Can't 
find the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(id).message("Can't find the 
template").build();
         }
         uiTemplate.setDisabled(BooleanUtils.TRUE);
         return executeUpdate(uiTemplate);
@@ -102,10 +128,10 @@ public class H2UITemplateManagementDAO extends 
H2SQLExecutor implements UITempla
         final SQLExecutor updateExecutor = 
getUpdateExecutor(UITemplate.INDEX_NAME, uiTemplate, new UITemplate.Builder());
         try (Connection connection = h2Client.getConnection()) {
             updateExecutor.invoke(connection);
-            return TemplateChangeStatus.builder().status(true).build();
+            return 
TemplateChangeStatus.builder().status(true).id(uiTemplate.getTemplateId()).build();
         } catch (SQLException | JDBCClientException e) {
             log.error(e.getMessage(), e);
-            return TemplateChangeStatus.builder().status(false).message("Can't 
add/update the template").build();
+            return 
TemplateChangeStatus.builder().status(false).id(uiTemplate.getTemplateId()).message("Can't
 add/update the template").build();
         }
     }
 }
diff --git a/skywalking-ui b/skywalking-ui
index 0e2541e..8ad1c91 160000
--- a/skywalking-ui
+++ b/skywalking-ui
@@ -1 +1 @@
-Subproject commit 0e2541e3f1c0c5bacd7da4d13a32bd2b99402b8f
+Subproject commit 8ad1c91082b5c58a7be39cd78ecef783e60d50c2

Reply via email to