You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2023/06/25 20:03:10 UTC

[shardingsphere] branch master updated: Refactor rule node converters (#26560)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new f822fd6b031 Refactor rule node converters (#26560)
f822fd6b031 is described below

commit f822fd6b0310d2bfe25ac744dcaebb313820de3c
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Mon Jun 26 04:03:02 2023 +0800

    Refactor rule node converters (#26560)
    
    * Refactor BroadcastNodeConverter
    
    * Refactor ReadwriteSplittingNodeConverter
    
    * Refactor MaskNodeConverter
    
    * Refactor ShadowNodeConverter
    
    * Refactor ShardingNodeConverter
    
    * Fix test cases
---
 .../BroadcastRuleConfigurationEventBuilder.java    |   4 +-
 .../metadata/converter/BroadcastNodeConverter.java |  41 +--
 .../NewYamlBroadcastRuleConfigurationSwapper.java  |   2 +-
 .../coverter/BroadcastNodeConverterTest.java       |  31 --
 .../converter/CompatibleEncryptNodeConverter.java  |   8 +-
 .../metadata/converter/EncryptNodeConverter.java   |   8 +-
 .../event/MaskRuleConfigurationEventBuilder.java   |   6 +-
 .../mask/metadata/converter/MaskNodeConverter.java | 119 +------
 .../NewYamlMaskRuleConfigurationSwapper.java       |  12 +-
 .../metadata/converter/MaskNodeConverterTest.java  |  78 -----
 ...riteSplittingRuleConfigurationEventBuilder.java |   6 +-
 .../converter/ReadwriteSplittingNodeConverter.java | 119 +------
 ...ReadwriteSplittingRuleConfigurationSwapper.java |  16 +-
 .../ReadwriteSplittingNodeConverterTest.java       |  78 -----
 .../event/ShadowRuleConfigurationEventBuilder.java |   8 +-
 .../metadata/converter/ShadowNodeConverter.java    | 173 ++--------
 .../NewYamlShadowRuleConfigurationSwapper.java     |  18 +-
 .../converter/ShadowNodeConverterTest.java         | 106 ------
 .../ShardingRuleConfigurationEventBuilder.java     |  14 +-
 .../metadata/converter/ShardingNodeConverter.java  | 380 +++++----------------
 .../NewYamlShardingRuleConfigurationSwapper.java   |  38 ++-
 .../converter/ShardingNodeConverterTest.java       | 234 -------------
 22 files changed, 229 insertions(+), 1270 deletions(-)

diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
index eff7d33d6ee..77cf6d9ac8b 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
@@ -36,10 +36,10 @@ public final class BroadcastRuleConfigurationEventBuilder implements RuleConfigu
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!BroadcastNodeConverter.isBroadcastPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!BroadcastNodeConverter.getRuleRootNodeConverter().isRulePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        if (BroadcastNodeConverter.isTablesActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (BroadcastNodeConverter.getTableNodeConvertor().getNameByActiveVersionPath(event.getKey()).isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createBroadcastConfigEvent(databaseName, event);
         }
         return Optional.empty();
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
index cdd1d9aedfc..a2cd4607934 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
@@ -19,9 +19,8 @@ package org.apache.shardingsphere.broadcast.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
 /**
  * Broadcast node converter.
@@ -29,44 +28,36 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class BroadcastNodeConverter {
     
-    private static final String ROOT_NODE = "broadcast";
-    
     private static final String TABLES_NODE = "tables";
     
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("broadcast");
     
-    private static final String RULE_ACTIVE_VERSION = "/active_version$";
+    private static final RuleItemNodeConverter TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, TABLES_NODE);
     
     /**
-     * Get tables path.
+     * Get rule root node converter.
      *
-     * @return tables path
+     * @return rule root node converter
      */
-    public static String getTablesPath() {
-        return TABLES_NODE;
+    public static RuleRootNodeConverter getRuleRootNodeConverter() {
+        return ROOT_NODE_CONVERTER;
     }
     
     /**
-     * Is broadcast path.
+     * Get table node converter.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return table node converter
      */
-    public static boolean isBroadcastPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static RuleItemNodeConverter getTableNodeConvertor() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Is broadcast tables active version path.
+     * Get tables path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return tables path
      */
-    public static boolean isTablesActiveVersionPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getTablesPath() {
+        return TABLES_NODE;
     }
 }
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/NewYamlBroadcastRuleConfigurationSwapper.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/NewYamlBroadcastRuleConfigurationSwapper.java
index cc03cee1900..2a0f0dda48c 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/NewYamlBroadcastRuleConfigurationSwapper.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/yaml/swapper/NewYamlBroadcastRuleConfigurationSwapper.java
@@ -47,7 +47,7 @@ public final class NewYamlBroadcastRuleConfigurationSwapper implements NewYamlRu
     @Override
     public BroadcastRuleConfiguration swapToObject(final Collection<YamlDataNode> dataNodes) {
         for (YamlDataNode each : dataNodes) {
-            if (BroadcastNodeConverter.isBroadcastPath(each.getKey())) {
+            if (BroadcastNodeConverter.getRuleRootNodeConverter().isRulePath(each.getKey())) {
                 YamlBroadcastRuleConfiguration yamlBroadcastRuleConfiguration = YamlEngine.unmarshal(each.getValue(), YamlBroadcastRuleConfiguration.class);
                 return new BroadcastRuleConfiguration(yamlBroadcastRuleConfiguration.getTables());
             }
diff --git a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java
deleted file mode 100644
index 4bc7b8fd766..00000000000
--- a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.broadcast.metadata.coverter;
-
-import org.apache.shardingsphere.broadcast.metadata.converter.BroadcastNodeConverter;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class BroadcastNodeConverterTest {
-    
-    @Test
-    void assertIsTablesActiveVersionPath() {
-        assertTrue(BroadcastNodeConverter.isTablesActiveVersionPath("/metadata/foo_db/rules/broadcast/tables/active_version"));
-    }
-}
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/CompatibleEncryptNodeConverter.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/CompatibleEncryptNodeConverter.java
index c26591d6c97..479fc5b26cf 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/CompatibleEncryptNodeConverter.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/CompatibleEncryptNodeConverter.java
@@ -46,18 +46,18 @@ public final class CompatibleEncryptNodeConverter {
     }
     
     /**
-     * Get table node convertor.
+     * Get table node converter.
      *
-     * @return table node convertor
+     * @return table node converter
      */
     public static RuleItemNodeConverter getTableNodeConvertor() {
         return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get encryptor node convertor.
+     * Get encryptor node converter.
      *
-     * @return encryptor node convertor
+     * @return encryptor node converter
      */
     public static RuleItemNodeConverter getEncryptorNodeConvertor() {
         return ENCRYPTOR_NODE_CONVERTER;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverter.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverter.java
index fe0b0fa044c..0adcd9039de 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverter.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverter.java
@@ -44,18 +44,18 @@ public final class EncryptNodeConverter {
     }
     
     /**
-     * Get table node convertor.
+     * Get table node converter.
      *
-     * @return table node convertor
+     * @return table node converter
      */
     public static RuleItemNodeConverter getTableNodeConvertor() {
         return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get encryptor node convertor.
+     * Get encryptor node converter.
      *
-     * @return encryptor node convertor
+     * @return encryptor node converter
      */
     public static RuleItemNodeConverter getEncryptorNodeConvertor() {
         return ENCRYPTOR_NODE_CONVERTER;
diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleConfigurationEventBuilder.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleConfigurationEventBuilder.java
index 36526253f7d..e7c5e730c45 100644
--- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleConfigurationEventBuilder.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/event/MaskRuleConfigurationEventBuilder.java
@@ -38,14 +38,14 @@ public final class MaskRuleConfigurationEventBuilder implements RuleConfiguratio
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!MaskNodeConverter.isMaskPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!MaskNodeConverter.getRuleRootNodeConverter().isRulePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        Optional<String> tableName = MaskNodeConverter.getTableNameByActiveVersionPath(event.getKey());
+        Optional<String> tableName = MaskNodeConverter.getTableNodeConvertor().getNameByActiveVersionPath(event.getKey());
         if (tableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createMaskConfigEvent(databaseName, tableName.get(), event);
         }
-        Optional<String> algorithmName = MaskNodeConverter.getAlgorithmNameByActiveVersionPath(event.getKey());
+        Optional<String> algorithmName = MaskNodeConverter.getAlgorithmNodeConvertor().getNameByActiveVersionPath(event.getKey());
         if (algorithmName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createMaskAlgorithmEvent(databaseName, algorithmName.get(), event);
         }
diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverter.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverter.java
index 343bf83da51..9686ac8caf9 100644
--- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverter.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverter.java
@@ -19,10 +19,8 @@ package org.apache.shardingsphere.mask.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
 /**
  * Mask node converter.
@@ -30,119 +28,36 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class MaskNodeConverter {
     
-    private static final String ROOT_NODE = "mask";
-    
-    private static final String TABLES_NODE = "tables";
-    
-    private static final String ALGORITHMS_NODE = "algorithms";
-    
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
-    
-    private static final String RULE_NAME_PATTERN = "/([\\w\\-]+)?";
-    
-    private static final String RULE_ACTIVE_VERSION = "/([\\w\\-]+)/active_version$";
-    
-    /**
-     * Get table name path.
-     * 
-     * @param tableName table name
-     * @return table name path
-     */
-    public static String getTableNamePath(final String tableName) {
-        return String.join("/", TABLES_NODE, tableName);
-    }
-    
-    /**
-     * Get mask algorithm path.
-     * 
-     * @param maskAlgorithmName mask algorithm name
-     * @return mask algorithm path
-     */
-    public static String getMaskAlgorithmPath(final String maskAlgorithmName) {
-        return String.join("/", ALGORITHMS_NODE, maskAlgorithmName);
-    }
-    
-    /**
-     * Is mask path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isMaskPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is mask table path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isTablePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("mask");
     
-    /**
-     * Is mask algorithm path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isAlgorithmPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
+    private static final RuleItemNodeConverter TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "tables");
     
-    /**
-     * Get table name.
-     *
-     * @param rulePath rule path
-     * @return table name
-     */
-    public static Optional<String> getTableName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
+    private static final RuleItemNodeConverter ALGORITHM_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "algorithms");
     
     /**
-     *  Get algorithm name.
+     * Get rule root node converter.
      *
-     * @param rulePath rule path
-     * @return algorithm name
+     * @return rule root node converter
      */
-    public static Optional<String> getAlgorithmName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleRootNodeConverter getRuleRootNodeConverter() {
+        return ROOT_NODE_CONVERTER;
     }
     
     /**
-     * Get table name by active version.
+     * Get table node converter.
      *
-     * @param activeVersionPath active version path
-     * @return table name
+     * @return table node converter
      */
-    public static Optional<String> getTableNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleItemNodeConverter getTableNodeConvertor() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get algorithm name by active version.
+     * Get algorithm node converter.
      *
-     * @param activeVersionPath active version path
-     * @return algorithm name
+     * @return algorithm node converter
      */
-    public static Optional<String> getAlgorithmNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleItemNodeConverter getAlgorithmNodeConvertor() {
+        return ALGORITHM_NODE_CONVERTER;
     }
 }
diff --git a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/yaml/swapper/NewYamlMaskRuleConfigurationSwapper.java b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/yaml/swapper/NewYamlMaskRuleConfigurationSwapper.java
index 351d394f40b..b9d09d17d24 100644
--- a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/yaml/swapper/NewYamlMaskRuleConfigurationSwapper.java
+++ b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/yaml/swapper/NewYamlMaskRuleConfigurationSwapper.java
@@ -50,10 +50,10 @@ public final class NewYamlMaskRuleConfigurationSwapper implements NewYamlRuleCon
     public Collection<YamlDataNode> swapToDataNodes(final MaskRuleConfiguration data) {
         Collection<YamlDataNode> result = new LinkedHashSet<>();
         for (Map.Entry<String, AlgorithmConfiguration> entry : data.getMaskAlgorithms().entrySet()) {
-            result.add(new YamlDataNode(MaskNodeConverter.getMaskAlgorithmPath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
+            result.add(new YamlDataNode(MaskNodeConverter.getAlgorithmNodeConvertor().getNamePath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         for (MaskTableRuleConfiguration each : data.getTables()) {
-            result.add(new YamlDataNode(MaskNodeConverter.getTableNamePath(each.getName()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
+            result.add(new YamlDataNode(MaskNodeConverter.getTableNodeConvertor().getNamePath(each.getName()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
         }
         return result;
     }
@@ -63,11 +63,11 @@ public final class NewYamlMaskRuleConfigurationSwapper implements NewYamlRuleCon
         Collection<MaskTableRuleConfiguration> tables = new LinkedList<>();
         Map<String, AlgorithmConfiguration> algorithms = new LinkedHashMap<>();
         for (YamlDataNode each : dataNodes) {
-            if (MaskNodeConverter.isTablePath(each.getKey())) {
-                MaskNodeConverter.getTableName(each.getKey())
+            if (MaskNodeConverter.getTableNodeConvertor().isPath(each.getKey())) {
+                MaskNodeConverter.getTableNodeConvertor().getName(each.getKey())
                         .ifPresent(tableName -> tables.add(tableSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlMaskTableRuleConfiguration.class))));
-            } else if (MaskNodeConverter.isAlgorithmPath(each.getKey())) {
-                MaskNodeConverter.getAlgorithmName(each.getKey())
+            } else if (MaskNodeConverter.getAlgorithmNodeConvertor().isPath(each.getKey())) {
+                MaskNodeConverter.getAlgorithmNodeConvertor().getName(each.getKey())
                         .ifPresent(loadBalancerName -> algorithms.put(loadBalancerName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
             }
         }
diff --git a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverterTest.java b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverterTest.java
deleted file mode 100644
index 3ecaa742599..00000000000
--- a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/metadata/converter/MaskNodeConverterTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mask.metadata.converter;
-
-import org.junit.jupiter.api.Test;
-
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class MaskNodeConverterTest {
-    
-    @Test
-    void assertGetTableNamePath() {
-        assertThat(MaskNodeConverter.getTableNamePath("foo_table"), is("tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmPath() {
-        assertThat(MaskNodeConverter.getMaskAlgorithmPath("MD5"), is("algorithms/MD5"));
-    }
-    
-    @Test
-    void assertCheckIsTargetRuleByRulePath() {
-        assertTrue(MaskNodeConverter.isMaskPath("/metadata/foo_db/rules/mask/tables/foo_table"));
-        assertFalse(MaskNodeConverter.isMaskPath("/metadata/foo_db/rules/foo/tables/foo_table"));
-        assertTrue(MaskNodeConverter.isTablePath("/metadata/foo_db/rules/mask/tables/foo_table"));
-        assertFalse(MaskNodeConverter.isTablePath("/metadata/foo_db/rules/mask/algorithms/MD5"));
-        assertTrue(MaskNodeConverter.isAlgorithmPath("/metadata/foo_db/rules/mask/algorithms/MD5"));
-        assertFalse(MaskNodeConverter.isAlgorithmPath("/metadata/foo_db/rules/mask/tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetTableNameByRulePath() {
-        Optional<String> actual = MaskNodeConverter.getTableName("/metadata/foo_db/rules/mask/tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmNameByRulePath() {
-        Optional<String> actual = MaskNodeConverter.getAlgorithmName("/metadata/foo_db/rules/mask/algorithms/MD5");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("MD5"));
-    }
-    
-    @Test
-    void assertGetMaskTableVersion() {
-        Optional<String> actual = MaskNodeConverter.getTableNameByActiveVersionPath("/metadata/foo_db/rules/mask/tables/foo_table/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetMaskAlgorithmVersion() {
-        Optional<String> actual = MaskNodeConverter.getAlgorithmNameByActiveVersionPath("/metadata/foo_db/rules/mask/algorithms/md5_mask/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("md5_mask"));
-    }
-}
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
index 14b270f1277..5307d265fa9 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
@@ -38,14 +38,14 @@ public final class ReadwriteSplittingRuleConfigurationEventBuilder implements Ru
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!ReadwriteSplittingNodeConverter.isReadwriteSplittingPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!ReadwriteSplittingNodeConverter.getRuleRootNodeConverter().isRulePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        Optional<String> groupName = ReadwriteSplittingNodeConverter.getGroupNameByActiveVersionPath(event.getKey());
+        Optional<String> groupName = ReadwriteSplittingNodeConverter.getDataSourceNodeConvertor().getNameByActiveVersionPath(event.getKey());
         if (groupName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createReadwriteSplittingConfigEvent(databaseName, groupName.get(), event);
         }
-        Optional<String> loadBalancerName = ReadwriteSplittingNodeConverter.getLoadBalancerNameByActiveVersionPath(event.getKey());
+        Optional<String> loadBalancerName = ReadwriteSplittingNodeConverter.getLoadBalancerNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (loadBalancerName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createLoadBalanceEvent(databaseName, loadBalancerName.get(), event);
         }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverter.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverter.java
index b73a620a6e0..7c800d4d585 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverter.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverter.java
@@ -19,10 +19,8 @@ package org.apache.shardingsphere.readwritesplitting.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
 /**
  * Readwrite-splitting node converter.
@@ -30,119 +28,36 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ReadwriteSplittingNodeConverter {
     
-    private static final String ROOT_NODE = "readwrite_splitting";
-    
-    private static final String DATA_SOURCES_NODE = "data_sources";
-    
-    private static final String LOAD_BALANCER_NODE = "load_balancers";
-    
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
-    
-    private static final String RULE_NAME_PATTERN = "/([\\w\\-]+)?";
-    
-    private static final String RULE_ACTIVE_VERSION = "/([\\w\\-]+)/active_version$";
-    
-    /**
-     * Get group name path.
-     *
-     * @param groupName group name
-     * @return group name path
-     */
-    public static String getGroupNamePath(final String groupName) {
-        return String.join("/", DATA_SOURCES_NODE, groupName);
-    }
-    
-    /**
-     * Get load balancer name.
-     *
-     * @param loadBalancerName load balancer name
-     * @return load balancer path
-     */
-    public static String getLoadBalancerPath(final String loadBalancerName) {
-        return String.join("/", LOAD_BALANCER_NODE, loadBalancerName);
-    }
-    
-    /**
-     * Is readwrite-splitting path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isReadwriteSplittingPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("readwrite_splitting");
     
-    /**
-     * Is readwrite-splitting data sources path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDataSourcePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
+    private static final RuleItemNodeConverter DATA_SOURCE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "data_sources");
     
-    /**
-     * Is readwrite-splitting load balancer path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isLoadBalancerPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + LOAD_BALANCER_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Get group name.
-     *
-     * @param rulePath rule path
-     * @return group name
-     */
-    public static Optional<String> getGroupName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
+    private static final RuleItemNodeConverter LOAD_BALANCER_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "load_balancers");
     
     /**
-     * Get load balancer name.
+     * Get rule root node converter.
      *
-     * @param rulePath rule path
-     * @return load balancer name
+     * @return rule root node converter
      */
-    public static Optional<String> getLoadBalancerName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + LOAD_BALANCER_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleRootNodeConverter getRuleRootNodeConverter() {
+        return ROOT_NODE_CONVERTER;
     }
     
     /**
-     * Get group name by active version path.
+     * Get data source node converter.
      *
-     * @param activeVersionPath active version path
-     * @return group name
+     * @return data source node converter
      */
-    public static Optional<String> getGroupNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleItemNodeConverter getDataSourceNodeConvertor() {
+        return DATA_SOURCE_NODE_CONVERTER;
     }
     
     /**
-     * Get load balancer name by active version path.
+     * Get load balancer node converter.
      *
-     * @param activeVersionPath active version path
-     * @return load balancer name
+     * @return load balancer node converter
      */
-    public static Optional<String> getLoadBalancerNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + LOAD_BALANCER_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static RuleItemNodeConverter getLoadBalancerNodeConverter() {
+        return LOAD_BALANCER_NODE_CONVERTER;
     }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
index 063d6d4f4b3..f9fcb1d3bdd 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
@@ -49,10 +49,11 @@ public final class NewYamlReadwriteSplittingRuleConfigurationSwapper implements
     public Collection<YamlDataNode> swapToDataNodes(final ReadwriteSplittingRuleConfiguration data) {
         Collection<YamlDataNode> result = new LinkedHashSet<>();
         for (Map.Entry<String, AlgorithmConfiguration> entry : data.getLoadBalancers().entrySet()) {
-            result.add(new YamlDataNode(ReadwriteSplittingNodeConverter.getLoadBalancerPath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
+            result.add(new YamlDataNode(
+                    ReadwriteSplittingNodeConverter.getLoadBalancerNodeConverter().getNamePath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         for (ReadwriteSplittingDataSourceRuleConfiguration each : data.getDataSources()) {
-            result.add(new YamlDataNode(ReadwriteSplittingNodeConverter.getGroupNamePath(each.getName()), YamlEngine.marshal(swapToYamlConfiguration(each))));
+            result.add(new YamlDataNode(ReadwriteSplittingNodeConverter.getDataSourceNodeConvertor().getNamePath(each.getName()), YamlEngine.marshal(swapToYamlConfiguration(each))));
         }
         return result;
     }
@@ -71,13 +72,12 @@ public final class NewYamlReadwriteSplittingRuleConfigurationSwapper implements
         Collection<ReadwriteSplittingDataSourceRuleConfiguration> dataSources = new LinkedList<>();
         Map<String, AlgorithmConfiguration> loadBalancerMap = new LinkedHashMap<>();
         for (YamlDataNode each : dataNodes) {
-            if (ReadwriteSplittingNodeConverter.isDataSourcePath(each.getKey())) {
-                ReadwriteSplittingNodeConverter.getGroupName(each.getKey())
+            if (ReadwriteSplittingNodeConverter.getDataSourceNodeConvertor().isPath(each.getKey())) {
+                ReadwriteSplittingNodeConverter.getDataSourceNodeConvertor().getName(each.getKey())
                         .ifPresent(groupName -> dataSources.add(swapDataSource(groupName, YamlEngine.unmarshal(each.getValue(), YamlReadwriteSplittingDataSourceRuleConfiguration.class))));
-            } else if (ReadwriteSplittingNodeConverter.isLoadBalancerPath(each.getKey())) {
-                ReadwriteSplittingNodeConverter.getLoadBalancerName(each.getKey())
-                        .ifPresent(
-                                loadBalancerName -> loadBalancerMap.put(loadBalancerName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
+            } else if (ReadwriteSplittingNodeConverter.getLoadBalancerNodeConverter().isPath(each.getKey())) {
+                ReadwriteSplittingNodeConverter.getLoadBalancerNodeConverter().getName(each.getKey())
+                        .ifPresent(loadBalancerName -> loadBalancerMap.put(loadBalancerName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
             }
         }
         return new ReadwriteSplittingRuleConfiguration(dataSources, loadBalancerMap);
diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverterTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverterTest.java
deleted file mode 100644
index 053921ab964..00000000000
--- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/metadata/converter/ReadwriteSplittingNodeConverterTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.readwritesplitting.metadata.converter;
-
-import org.junit.jupiter.api.Test;
-
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class ReadwriteSplittingNodeConverterTest {
-    
-    @Test
-    void assertGetGroupNamePath() {
-        assertThat(ReadwriteSplittingNodeConverter.getGroupNamePath("group_0"), is("data_sources/group_0"));
-    }
-    
-    @Test
-    void assertGetLoadBalancerPath() {
-        assertThat(ReadwriteSplittingNodeConverter.getLoadBalancerPath("random"), is("load_balancers/random"));
-    }
-    
-    @Test
-    void assertCheckIsTargetRuleByRulePath() {
-        assertTrue(ReadwriteSplittingNodeConverter.isReadwriteSplittingPath("/metadata/foo_db/rules/readwrite_splitting/data_sources/group_0"));
-        assertFalse(ReadwriteSplittingNodeConverter.isReadwriteSplittingPath("/metadata/foo_db/rules/foo/data_sources/group_0"));
-        assertTrue(ReadwriteSplittingNodeConverter.isDataSourcePath("/metadata/foo_db/rules/readwrite_splitting/data_sources/group_0"));
-        assertFalse(ReadwriteSplittingNodeConverter.isDataSourcePath("/metadata/foo_db/rules/readwrite_splitting/load_balancers/random"));
-        assertTrue(ReadwriteSplittingNodeConverter.isLoadBalancerPath("/metadata/foo_db/rules/readwrite_splitting/load_balancers/random"));
-        assertFalse(ReadwriteSplittingNodeConverter.isLoadBalancerPath("/metadata/foo_db/rules/readwrite_splitting/data_sources/group_0"));
-    }
-    
-    @Test
-    void assertGetGroupNameByActiveVersionPath() {
-        Optional<String> actual = ReadwriteSplittingNodeConverter.getGroupNameByActiveVersionPath("/metadata/foo_db/rules/readwrite_splitting/data_sources/group_0/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("group_0"));
-    }
-    
-    @Test
-    void assertGetGroupName() {
-        Optional<String> actual = ReadwriteSplittingNodeConverter.getGroupName("/metadata/foo_db/rules/readwrite_splitting/data_sources/group_0/versions/0");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("group_0"));
-    }
-    
-    @Test
-    void assertGetLoadBalancerNameByActiveVersionPath() {
-        Optional<String> actual = ReadwriteSplittingNodeConverter.getLoadBalancerNameByActiveVersionPath("/metadata/foo_db/rules/readwrite_splitting/load_balancers/random/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("random"));
-    }
-    
-    @Test
-    void assertGetLoadBalancerName() {
-        Optional<String> actual = ReadwriteSplittingNodeConverter.getLoadBalancerName("/metadata/foo_db/rules/readwrite_splitting/load_balancers/random/versions/1");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("random"));
-    }
-}
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
index c243be18c75..a8b20cfe88d 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/event/ShadowRuleConfigurationEventBuilder.java
@@ -41,18 +41,18 @@ public final class ShadowRuleConfigurationEventBuilder implements RuleConfigurat
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!ShadowNodeConverter.isShadowPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!ShadowNodeConverter.getRuleRootNodeConverter().isRulePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        Optional<String> dataSourceName = ShadowNodeConverter.getDataSourceNameByActiveVersionPath(event.getKey());
+        Optional<String> dataSourceName = ShadowNodeConverter.getDataSourceNodeConvertor().getNameByActiveVersionPath(event.getKey());
         if (dataSourceName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShadowConfigEvent(databaseName, dataSourceName.get(), event);
         }
-        Optional<String> tableName = ShadowNodeConverter.getTableNameByActiveVersionPath(event.getKey());
+        Optional<String> tableName = ShadowNodeConverter.getTableNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (tableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShadowTableConfigEvent(databaseName, tableName.get(), event);
         }
-        Optional<String> algorithmName = ShadowNodeConverter.getAlgorithmNameByActiveVersionPath(event.getKey());
+        Optional<String> algorithmName = ShadowNodeConverter.getAlgorithmNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (algorithmName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShadowAlgorithmEvent(databaseName, algorithmName.get(), event);
         }
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
index 7391e65160d..b62d7b20f7d 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverter.java
@@ -19,8 +19,9 @@ package org.apache.shardingsphere.shadow.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
-import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -30,107 +31,59 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ShadowNodeConverter {
     
-    private static final String ROOT_NODE = "shadow";
-    
-    private static final String DATA_SOURCES_NODE = "data_sources";
-    
-    private static final String TABLES_NODE = "tables";
-    
-    private static final String ALGORITHMS_NODE = "algorithms";
-    
     private static final String DEFAULT_ALGORITHM_NAME = "default_algorithm_name";
     
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("shadow");
     
-    private static final String RULE_NAME_PATTERN = "/([\\w\\-]+)?";
+    private static final RuleItemNodeConverter DATA_SOURCE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "data_sources");
     
-    private static final String RULE_ACTIVE_VERSION = "/([\\w\\-]+)/active_version$";
+    private static final RuleItemNodeConverter TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "tables");
     
-    /**
-     * Get data source path.
-     *
-     * @param dataSourceName data source name
-     * @return data source path
-     */
-    public static String getDataSourcePath(final String dataSourceName) {
-        return String.join("/", DATA_SOURCES_NODE, dataSourceName);
-    }
+    private static final RuleItemNodeConverter ALGORITHM_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "algorithms");
     
     /**
-     * Get table name path.
+     * Get rule root node converter.
      *
-     * @param tableName table name
-     * @return table name path
+     * @return rule root node converter
      */
-    public static String getTableNamePath(final String tableName) {
-        return String.join("/", TABLES_NODE, tableName);
+    public static RuleRootNodeConverter getRuleRootNodeConverter() {
+        return ROOT_NODE_CONVERTER;
     }
     
     /**
-     * Get shadow algorithm path.
+     * Get data source node converter.
      *
-     * @param shadowAlgorithmName shadow algorithm name
-     * @return shadow algorithm path
+     * @return data source node converter
      */
-    public static String getShadowAlgorithmPath(final String shadowAlgorithmName) {
-        return String.join("/", ALGORITHMS_NODE, shadowAlgorithmName);
+    public static RuleItemNodeConverter getDataSourceNodeConvertor() {
+        return DATA_SOURCE_NODE_CONVERTER;
     }
     
     /**
-     * Get default shadow algorithm path.
+     * Get table node converter.
      *
-     * @return default shadow algorithm path
+     * @return table node converter
      */
-    public static String getDefaultShadowAlgorithmPath() {
-        return String.join("/", DEFAULT_ALGORITHM_NAME);
+    public static RuleItemNodeConverter getTableNodeConverter() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Is shadow path.
+     * Get algorithm node converter.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return algorithm node converter
      */
-    public static boolean isShadowPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static RuleItemNodeConverter getAlgorithmNodeConverter() {
+        return ALGORITHM_NODE_CONVERTER;
     }
     
     /**
-     * Is shadow data sources path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isDataSourcePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is shadow table path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isTablePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is shadow algorithm path.
+     * Get default shadow algorithm path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return default shadow algorithm path
      */
-    public static boolean isAlgorithmPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getDefaultShadowAlgorithmPath() {
+        return String.join("/", DEFAULT_ALGORITHM_NAME);
     }
     
     /**
@@ -140,80 +93,8 @@ public final class ShadowNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultAlgorithmNamePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_ALGORITHM_NAME + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_ALGORITHM_NAME + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
-    
-    /**
-     * Get data source name.
-     *
-     * @param rulePath rule path
-     * @return data source name
-     */
-    public static Optional<String> getDataSourceName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get table name.
-     *
-     * @param rulePath rule path
-     * @return table name
-     */
-    public static Optional<String> getTableName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get algorithm name.
-     *
-     * @param rulePath rule path
-     * @return algorithm name
-     */
-    public static Optional<String> getAlgorithmName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get data source name by active version path.
-     *
-     * @param activeVersionPath rule path
-     * @return data source name
-     */
-    public static Optional<String> getDataSourceNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DATA_SOURCES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get table name by active version path.
-     *
-     * @param activeVersionPath rule path
-     * @return table name
-     */
-    public static Optional<String> getTableNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get algorithm name by active version path.
-     *
-     * @param activeVersionPath rule path
-     * @return algorithm name
-     */
-    public static Optional<String> getAlgorithmNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ALGORITHMS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
 }
diff --git a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
index 1bfff333c66..d9a37509ee2 100644
--- a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
+++ b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/NewYamlShadowRuleConfigurationSwapper.java
@@ -51,16 +51,16 @@ public final class NewYamlShadowRuleConfigurationSwapper implements NewYamlRuleC
     public Collection<YamlDataNode> swapToDataNodes(final ShadowRuleConfiguration data) {
         Collection<YamlDataNode> result = new LinkedHashSet<>();
         for (Entry<String, AlgorithmConfiguration> entry : data.getShadowAlgorithms().entrySet()) {
-            result.add(new YamlDataNode(ShadowNodeConverter.getShadowAlgorithmPath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
+            result.add(new YamlDataNode(ShadowNodeConverter.getAlgorithmNodeConverter().getNamePath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         if (!Strings.isNullOrEmpty(data.getDefaultShadowAlgorithmName())) {
             result.add(new YamlDataNode(ShadowNodeConverter.getDefaultShadowAlgorithmPath(), data.getDefaultShadowAlgorithmName()));
         }
         for (ShadowDataSourceConfiguration each : data.getDataSources()) {
-            result.add(new YamlDataNode(ShadowNodeConverter.getDataSourcePath(each.getName()), YamlEngine.marshal(swapToDataSourceYamlConfiguration(each))));
+            result.add(new YamlDataNode(ShadowNodeConverter.getDataSourceNodeConvertor().getNamePath(each.getName()), YamlEngine.marshal(swapToDataSourceYamlConfiguration(each))));
         }
         for (Entry<String, ShadowTableConfiguration> entry : data.getTables().entrySet()) {
-            result.add(new YamlDataNode(ShadowNodeConverter.getTableNamePath(entry.getKey()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(entry.getValue()))));
+            result.add(new YamlDataNode(ShadowNodeConverter.getTableNodeConverter().getNamePath(entry.getKey()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         return result;
     }
@@ -76,14 +76,14 @@ public final class NewYamlShadowRuleConfigurationSwapper implements NewYamlRuleC
     public ShadowRuleConfiguration swapToObject(final Collection<YamlDataNode> dataNodes) {
         ShadowRuleConfiguration result = new ShadowRuleConfiguration();
         for (YamlDataNode each : dataNodes) {
-            if (ShadowNodeConverter.isDataSourcePath(each.getKey())) {
-                ShadowNodeConverter.getDataSourceName(each.getKey())
+            if (ShadowNodeConverter.getDataSourceNodeConvertor().isPath(each.getKey())) {
+                ShadowNodeConverter.getDataSourceNodeConvertor().getName(each.getKey())
                         .ifPresent(dataSourceName -> result.getDataSources().add(swapDataSource(dataSourceName, YamlEngine.unmarshal(each.getValue(), YamlShadowDataSourceConfiguration.class))));
-            } else if (ShadowNodeConverter.isTablePath(each.getKey())) {
-                ShadowNodeConverter.getTableName(each.getKey())
+            } else if (ShadowNodeConverter.getTableNodeConverter().isPath(each.getKey())) {
+                ShadowNodeConverter.getTableNodeConverter().getName(each.getKey())
                         .ifPresent(tableName -> result.getTables().put(tableName, tableSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShadowTableConfiguration.class))));
-            } else if (ShadowNodeConverter.isAlgorithmPath(each.getKey())) {
-                ShadowNodeConverter.getAlgorithmName(each.getKey())
+            } else if (ShadowNodeConverter.getAlgorithmNodeConverter().isPath(each.getKey())) {
+                ShadowNodeConverter.getAlgorithmNodeConverter().getName(each.getKey())
                         .ifPresent(algorithmName -> result.getShadowAlgorithms().put(algorithmName,
                                 algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
             } else if (ShadowNodeConverter.isDefaultAlgorithmNamePath(each.getKey())) {
diff --git a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverterTest.java b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverterTest.java
deleted file mode 100644
index db02a031518..00000000000
--- a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/metadata/converter/ShadowNodeConverterTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.shadow.metadata.converter;
-
-import org.junit.jupiter.api.Test;
-
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class ShadowNodeConverterTest {
-    
-    @Test
-    void assertGetDataSourcePath() {
-        assertThat(ShadowNodeConverter.getDataSourcePath("foo_db"), is("data_sources/foo_db"));
-    }
-    
-    @Test
-    void assertGetTableNamePath() {
-        assertThat(ShadowNodeConverter.getTableNamePath("foo_table"), is("tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmPath() {
-        assertThat(ShadowNodeConverter.getShadowAlgorithmPath("SQL_HINT"), is("algorithms/SQL_HINT"));
-    }
-    
-    @Test
-    void assertGetDefaultShadowAlgorithmPath() {
-        assertThat(ShadowNodeConverter.getDefaultShadowAlgorithmPath(), is("default_algorithm_name"));
-    }
-    
-    @Test
-    void assertCheckIsTargetRuleByRulePath() {
-        assertTrue(ShadowNodeConverter.isShadowPath("/metadata/foo_db/rules/shadow/tables/foo_table"));
-        assertFalse(ShadowNodeConverter.isShadowPath("/metadata/foo_db/rules/foo/tables/foo_table"));
-        assertTrue(ShadowNodeConverter.isDataSourcePath("/metadata/foo_db/rules/shadow/data_sources/ds_shadow"));
-        assertFalse(ShadowNodeConverter.isDataSourcePath("/metadata/foo_db/rules/shadow/tables/foo_table"));
-        assertTrue(ShadowNodeConverter.isTablePath("/metadata/foo_db/rules/shadow/tables/foo_table"));
-        assertFalse(ShadowNodeConverter.isTablePath("/metadata/foo_db/rules/shadow/algorithms/MD5"));
-        assertTrue(ShadowNodeConverter.isAlgorithmPath("/metadata/foo_db/rules/shadow/algorithms/MD5"));
-        assertFalse(ShadowNodeConverter.isAlgorithmPath("/metadata/foo_db/rules/shadow/tables/foo_table"));
-        assertTrue(ShadowNodeConverter.isDefaultAlgorithmNamePath("/metadata/foo_db/rules/shadow/default_algorithm_name"));
-        assertFalse(ShadowNodeConverter.isDefaultAlgorithmNamePath("/metadata/foo_db/rules/shadow/default_algorithm_name/s"));
-    }
-    
-    @Test
-    void assertGetDataSourceNameByRulePath() {
-        Optional<String> actual = ShadowNodeConverter.getDataSourceName("/metadata/foo_db/rules/shadow/data_sources/foo_db");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_db"));
-    }
-    
-    @Test
-    void assertGetTableNameByRulePath() {
-        Optional<String> actual = ShadowNodeConverter.getTableName("/metadata/foo_db/rules/shadow/tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmNameByRulePath() {
-        Optional<String> actual = ShadowNodeConverter.getAlgorithmName("/metadata/foo_db/rules/shadow/algorithms/SQL_HINT");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("SQL_HINT"));
-    }
-    
-    @Test
-    void assertGetDataSourceVersion() {
-        Optional<String> actual = ShadowNodeConverter.getDataSourceNameByActiveVersionPath("/metadata/foo_db/rules/shadow/data_sources/shadow_database/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("shadow_database"));
-    }
-    
-    @Test
-    void assertGetTableVersion() {
-        Optional<String> actual = ShadowNodeConverter.getTableNameByActiveVersionPath("/metadata/foo_db/rules/shadow/tables/shadow_table/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("shadow_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmVersion() {
-        Optional<String> actual = ShadowNodeConverter.getAlgorithmNameByActiveVersionPath("/metadata/foo_db/rules/shadow/algorithms/user_id_insert_match_algorithm/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("user_id_insert_match_algorithm"));
-    }
-}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
index a9c7444bf35..9a66aa4d8aa 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/event/ShardingRuleConfigurationEventBuilder.java
@@ -63,18 +63,18 @@ public final class ShardingRuleConfigurationEventBuilder implements RuleConfigur
     
     @Override
     public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
-        if (!ShardingNodeConverter.isShardingPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
+        if (!ShardingNodeConverter.getRuleRootNodeConverter().isRulePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        Optional<String> tableName = ShardingNodeConverter.getTableNameByActiveVersionPath(event.getKey());
+        Optional<String> tableName = ShardingNodeConverter.getTableNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (tableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingTableConfigEvent(databaseName, tableName.get(), event);
         }
-        Optional<String> autoTableName = ShardingNodeConverter.getAutoTableNameByActiveVersionPath(event.getKey());
+        Optional<String> autoTableName = ShardingNodeConverter.getAutoTableNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (autoTableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingAutoTableConfigEvent(databaseName, autoTableName.get(), event);
         }
-        Optional<String> bindingTableName = ShardingNodeConverter.getBindingTableNameByActiveVersionPath(event.getKey());
+        Optional<String> bindingTableName = ShardingNodeConverter.getBindingTableNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (bindingTableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingTableReferenceConfigEvent(databaseName, bindingTableName.get(), event);
         }
@@ -93,15 +93,15 @@ public final class ShardingRuleConfigurationEventBuilder implements RuleConfigur
         if (ShardingNodeConverter.isDefaultShardingColumnWithActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createDefaultShardingColumnEvent(databaseName, event);
         }
-        Optional<String> algorithmName = ShardingNodeConverter.getShardingAlgorithmNameByActiveVersionPath(event.getKey());
+        Optional<String> algorithmName = ShardingNodeConverter.getShardingCacheNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (algorithmName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createShardingAlgorithmEvent(databaseName, algorithmName.get(), event);
         }
-        Optional<String> keyGeneratorName = ShardingNodeConverter.getKeyGeneratorNameByActiveVersionPath(event.getKey());
+        Optional<String> keyGeneratorName = ShardingNodeConverter.getKeyGeneratorNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (keyGeneratorName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createKeyGeneratorEvent(databaseName, keyGeneratorName.get(), event);
         }
-        Optional<String> auditorName = ShardingNodeConverter.getAuditorNameByActiveVersionPath(event.getKey());
+        Optional<String> auditorName = ShardingNodeConverter.getAuditorNodeConverter().getNameByActiveVersionPath(event.getKey());
         if (auditorName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createAuditorEvent(databaseName, auditorName.get(), event);
         }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
index afa704f1ebe..54230e2ec0a 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverter.java
@@ -19,8 +19,9 @@ package org.apache.shardingsphere.sharding.metadata.converter;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.converter.RuleItemNodeConverter;
+import org.apache.shardingsphere.infra.metadata.converter.RuleRootNodeConverter;
 
-import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -30,14 +31,6 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ShardingNodeConverter {
     
-    private static final String ROOT_NODE = "sharding";
-    
-    private static final String TABLES_NODE = "tables";
-    
-    private static final String AUTO_TABLES_NODE = "auto_tables";
-    
-    private static final String BINDING_TABLES_NODE = "binding_tables";
-    
     private static final String DEFAULT_STRATEGIES_NODE = "default_strategies";
     
     private static final String DEFAULT_DATABASE_STRATEGY_NODE = "default_database_strategy";
@@ -50,182 +43,150 @@ public final class ShardingNodeConverter {
     
     private static final String DEFAULT_SHARDING_COLUMN_NODE = "default_sharding_column";
     
-    private static final String SHARDING_ALGORITHMS_NODE = "algorithms";
+    private static final String SHARDING_CACHE_NODE = "sharding_cache";
     
-    private static final String KEY_GENERATORS_NODE = "key_generators";
+    private static final String ACTIVE_VERSION = "/active_version$";
     
-    private static final String AUDITORS_NODE = "auditors";
+    private static final RuleRootNodeConverter ROOT_NODE_CONVERTER = new RuleRootNodeConverter("sharding");
     
-    private static final String SHARDING_CACHE_NODE = "sharding_cache";
+    private static final RuleItemNodeConverter TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "tables");
     
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
+    private static final RuleItemNodeConverter AUTO_TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "auto_tables");
     
-    private static final String RULE_NAME_PATTERN = "/([\\w\\-]+)?";
+    private static final RuleItemNodeConverter BINDING_TABLE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "binding_tables");
     
-    private static final String RULE_ACTIVE_VERSION = "/([\\w\\-]+)?/active_version$";
+    private static final RuleItemNodeConverter ALGORITHM_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "algorithms");
     
-    private static final String ACTIVE_VERSION = "/active_version$";
+    private static final RuleItemNodeConverter KEY_GENERATOR_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "key_generators");
     
-    /**
-     * Get table name path.
-     *
-     * @param tableName table name
-     * @return table name path
-     */
-    public static String getTableNamePath(final String tableName) {
-        return String.join("/", TABLES_NODE, tableName);
-    }
+    private static final RuleItemNodeConverter AUDITOR_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "auditors");
     
-    /**
-     * Get auto table name path.
-     *
-     * @param tableName table name
-     * @return auto table name path
-     */
-    public static String getAutoTableNamePath(final String tableName) {
-        return String.join("/", AUTO_TABLES_NODE, tableName);
-    }
+    private static final RuleItemNodeConverter SHARDING_CACHE_NODE_CONVERTER = new RuleItemNodeConverter(ROOT_NODE_CONVERTER, "sharding_cache");
     
     /**
-     * Get binding table name path.
+     * Get rule root node converter.
      *
-     * @param tableName table name
-     * @return binding table name path
+     * @return rule root node converter
      */
-    public static String getBindingTableNamePath(final String tableName) {
-        return String.join("/", BINDING_TABLES_NODE, tableName);
+    public static RuleRootNodeConverter getRuleRootNodeConverter() {
+        return ROOT_NODE_CONVERTER;
     }
     
     /**
-     * Get default database strategy path.
+     * Get table node converter.
      *
-     * @return default database strategy path
+     * @return table node converter
      */
-    public static String getDefaultDatabaseStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_DATABASE_STRATEGY_NODE);
+    public static RuleItemNodeConverter getTableNodeConverter() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get default table strategy path.
+     * Get auto table node converter.
      *
-     * @return default table strategy path
+     * @return auto table node converter
      */
-    public static String getDefaultTableStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_TABLE_STRATEGY_NODE);
+    public static RuleItemNodeConverter getAutoTableNodeConverter() {
+        return AUTO_TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get default key generate strategy path.
+     * Get binding table node converter.
      *
-     * @return default key generate path
+     * @return binding table node converter
      */
-    public static String getDefaultKeyGenerateStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_KEY_GENERATE_STRATEGY_NODE);
+    public static RuleItemNodeConverter getBindingTableNodeConverter() {
+        return BINDING_TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get default audit strategy path.
+     * Get algorithm node converter.
      *
-     * @return default audit strategy path
+     * @return algorithm node converter
      */
-    public static String getDefaultAuditStrategyPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_AUDIT_STRATEGY_NODE);
+    public static RuleItemNodeConverter getAlgorithmNodeConverter() {
+        return ALGORITHM_NODE_CONVERTER;
     }
     
     /**
-     * Get default sharding column path.
+     * Get key generator node converter.
      *
-     * @return default sharding column path
+     * @return key generator node converter
      */
-    public static String getDefaultShardingColumnPath() {
-        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_SHARDING_COLUMN_NODE);
+    public static RuleItemNodeConverter getKeyGeneratorNodeConverter() {
+        return KEY_GENERATOR_NODE_CONVERTER;
     }
     
     /**
-     * Get sharding algorithm path.
+     * Get auditor node converter.
      *
-     * @param shardingAlgorithmName sharding algorithm name
-     * @return sharding algorithm path
+     * @return auditor node converter
      */
-    public static String getShardingAlgorithmPath(final String shardingAlgorithmName) {
-        return String.join("/", SHARDING_ALGORITHMS_NODE, shardingAlgorithmName);
+    public static RuleItemNodeConverter getAuditorNodeConverter() {
+        return AUDITOR_NODE_CONVERTER;
     }
     
     /**
-     * Get key generator path.
+     * Get sharding cache node converter.
      *
-     * @param keyGeneratorName key generator name
-     * @return key generator path
+     * @return sharding cache node converter
      */
-    public static String getKeyGeneratorPath(final String keyGeneratorName) {
-        return String.join("/", KEY_GENERATORS_NODE, keyGeneratorName);
+    public static RuleItemNodeConverter getShardingCacheNodeConverter() {
+        return SHARDING_CACHE_NODE_CONVERTER;
     }
     
     /**
-     * Get auditor path.
+     * Get default database strategy path.
      *
-     * @param auditorName auditor name
-     * @return auditor path
+     * @return default database strategy path
      */
-    public static String getAuditorPath(final String auditorName) {
-        return String.join("/", AUDITORS_NODE, auditorName);
+    public static String getDefaultDatabaseStrategyPath() {
+        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_DATABASE_STRATEGY_NODE);
     }
     
     /**
-     * Get sharding cache path.
+     * Get default table strategy path.
      *
-     * @return sharding cache path
+     * @return default table strategy path
      */
-    public static String getShardingCachePath() {
-        return String.join("/", SHARDING_CACHE_NODE);
+    public static String getDefaultTableStrategyPath() {
+        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_TABLE_STRATEGY_NODE);
     }
     
     /**
-     * Is sharding path.
+     * Get default key generate strategy path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return default key generate path
      */
-    public static boolean isShardingPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getDefaultKeyGenerateStrategyPath() {
+        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_KEY_GENERATE_STRATEGY_NODE);
     }
     
     /**
-     * Is sharding table path.
+     * Get default audit strategy path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return default audit strategy path
      */
-    public static boolean isTablePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getDefaultAuditStrategyPath() {
+        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_AUDIT_STRATEGY_NODE);
     }
     
     /**
-     * Is sharding auto table path.
+     * Get default sharding column path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return default sharding column path
      */
-    public static boolean isAutoTablePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUTO_TABLES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getDefaultShardingColumnPath() {
+        return String.join("/", DEFAULT_STRATEGIES_NODE, DEFAULT_SHARDING_COLUMN_NODE);
     }
     
     /**
-     * Is binding table path.
+     * Get sharding cache path.
      *
-     * @param rulePath rule path
-     * @return true or false
+     * @return sharding cache path
      */
-    public static boolean isBindingTablePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + BINDING_TABLES_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+    public static String getShardingCachePath() {
+        return String.join("/", SHARDING_CACHE_NODE);
     }
     
     /**
@@ -235,7 +196,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultDatabaseStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
@@ -247,7 +208,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultTableStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
@@ -259,7 +220,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultKeyGenerateStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
@@ -271,7 +232,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultAuditStrategyPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
@@ -283,43 +244,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultShardingColumnPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + "$", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is sharding algorithm path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isShardingAlgorithmPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + SHARDING_ALGORITHMS_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is key generator path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isKeyGeneratorPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + KEY_GENERATORS_NODE + "/.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * Is sharding auditor path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isAuditorPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUDITORS_NODE + "/.*", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
@@ -331,119 +256,11 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isShardingCachePath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + SHARDING_CACHE_NODE + "$", Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + SHARDING_CACHE_NODE + "$", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
     
-    /**
-     * Get sharding table name.
-     *
-     * @param rulePath rule path
-     * @return sharding table name
-     */
-    public static Optional<String> getTableName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get auto table name.
-     *
-     * @param rulePath rule path
-     * @return auto table name
-     */
-    public static Optional<String> getAutoTableName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUTO_TABLES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get binding table name.
-     *
-     * @param rulePath rule path
-     * @return binding table name
-     */
-    public static Optional<String> getBindingTableName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + BINDING_TABLES_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get sharding algorithm name.
-     *
-     * @param rulePath rule path
-     * @return sharding algorithm name
-     */
-    public static Optional<String> getShardingAlgorithmName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + SHARDING_ALGORITHMS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get key generator name.
-     *
-     * @param rulePath rule path
-     * @return key generator name
-     */
-    public static Optional<String> getKeyGeneratorName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + KEY_GENERATORS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get auditor name.
-     *
-     * @param rulePath rule path
-     * @return auditor name
-     */
-    public static Optional<String> getAuditorName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUDITORS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get table name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return table name
-     */
-    public static Optional<String> getTableNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get auto table name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return auto table name
-     */
-    public static Optional<String> getAutoTableNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUTO_TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get binding table name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return binding table name
-     */
-    public static Optional<String> getBindingTableNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + BINDING_TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
     /**
      * Is sharding algorithm with active version path.
      *
@@ -451,7 +268,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultDatabaseStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_DATABASE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
@@ -463,7 +280,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultTableStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_TABLE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
@@ -475,7 +292,8 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultKeyGenerateStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(
+                ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_KEY_GENERATE_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
@@ -487,7 +305,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultAuditStrategyWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_AUDIT_STRATEGY_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
@@ -499,47 +317,11 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isDefaultShardingColumnWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + DEFAULT_STRATEGIES_NODE + "/" + DEFAULT_SHARDING_COLUMN_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
     
-    /**
-     * Get sharding algorithm name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return sharding algorithm name
-     */
-    public static Optional<String> getShardingAlgorithmNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + SHARDING_ALGORITHMS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get key generator name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return key generator name
-     */
-    public static Optional<String> getKeyGeneratorNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + KEY_GENERATORS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get auditor name by active version path.
-     *
-     * @param activeVersionPath active version path
-     * @return auditor name
-     */
-    public static Optional<String> getAuditorNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + AUDITORS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
     /**
      * Is sharding cache with active version path.
      *
@@ -547,7 +329,7 @@ public final class ShardingNodeConverter {
      * @return true or false
      */
     public static boolean isShardingCacheWithActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + SHARDING_CACHE_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+        Pattern pattern = Pattern.compile(ROOT_NODE_CONVERTER.getRuleNodePrefix() + "/" + SHARDING_CACHE_NODE + ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(activeVersionPath);
         return matcher.find();
     }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
index 25bb36672c5..96158416a5c 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/NewYamlShardingRuleConfigurationSwapper.java
@@ -84,13 +84,14 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
     
     private void swapAlgorithms(final ShardingRuleConfiguration data, final Collection<YamlDataNode> result) {
         for (Entry<String, AlgorithmConfiguration> each : data.getShardingAlgorithms().entrySet()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getShardingAlgorithmPath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
+            result.add(new YamlDataNode(ShardingNodeConverter.getAlgorithmNodeConverter().getNamePath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
         }
         for (Entry<String, AlgorithmConfiguration> each : data.getKeyGenerators().entrySet()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getKeyGeneratorPath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
+            result.add(new YamlDataNode(
+                    ShardingNodeConverter.getKeyGeneratorNodeConverter().getNamePath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
         }
         for (Entry<String, AlgorithmConfiguration> each : data.getAuditors().entrySet()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getAuditorPath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
+            result.add(new YamlDataNode(ShardingNodeConverter.getAuditorNodeConverter().getNamePath(each.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(each.getValue()))));
         }
     }
     
@@ -115,13 +116,14 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
     
     private void swapTableRules(final ShardingRuleConfiguration data, final Collection<YamlDataNode> result) {
         for (ShardingTableRuleConfiguration each : data.getTables()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getTableNamePath(each.getLogicTable()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
+            result.add(new YamlDataNode(ShardingNodeConverter.getTableNodeConverter().getNamePath(each.getLogicTable()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
         }
         for (ShardingAutoTableRuleConfiguration each : data.getAutoTables()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getAutoTableNamePath(each.getLogicTable()), YamlEngine.marshal(autoTableYamlSwapper.swapToYamlConfiguration(each))));
+            result.add(new YamlDataNode(ShardingNodeConverter.getAutoTableNodeConverter().getNamePath(each.getLogicTable()), YamlEngine.marshal(autoTableYamlSwapper.swapToYamlConfiguration(each))));
         }
         for (ShardingTableReferenceRuleConfiguration each : data.getBindingTableGroups()) {
-            result.add(new YamlDataNode(ShardingNodeConverter.getBindingTableNamePath(each.getName()), YamlShardingTableReferenceRuleConfigurationConverter.convertToYamlString(each)));
+            result.add(new YamlDataNode(
+                    ShardingNodeConverter.getBindingTableNodeConverter().getNamePath(each.getName()), YamlShardingTableReferenceRuleConfigurationConverter.convertToYamlString(each)));
         }
     }
     
@@ -129,14 +131,14 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
     public ShardingRuleConfiguration swapToObject(final Collection<YamlDataNode> dataNodes) {
         ShardingRuleConfiguration result = new ShardingRuleConfiguration();
         for (YamlDataNode each : dataNodes) {
-            if (ShardingNodeConverter.isTablePath(each.getKey())) {
-                ShardingNodeConverter.getTableName(each.getKey())
+            if (ShardingNodeConverter.getTableNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getTableNodeConverter().getName(each.getKey())
                         .ifPresent(tableName -> result.getTables().add(tableSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlTableRuleConfiguration.class))));
-            } else if (ShardingNodeConverter.isAutoTablePath(each.getKey())) {
-                ShardingNodeConverter.getAutoTableName(each.getKey())
+            } else if (ShardingNodeConverter.getAutoTableNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getAutoTableNodeConverter().getName(each.getKey())
                         .ifPresent(autoTableName -> result.getAutoTables().add(autoTableYamlSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingAutoTableRuleConfiguration.class))));
-            } else if (ShardingNodeConverter.isBindingTablePath(each.getKey())) {
-                ShardingNodeConverter.getBindingTableName(each.getKey())
+            } else if (ShardingNodeConverter.getBindingTableNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getBindingTableNodeConverter().getName(each.getKey())
                         .ifPresent(bindingTableName -> result.getBindingTableGroups().add(YamlShardingTableReferenceRuleConfigurationConverter.convertToObject(each.getValue())));
             } else if (ShardingNodeConverter.isDefaultDatabaseStrategyPath(each.getKey())) {
                 result.setDefaultDatabaseShardingStrategy(shardingStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingStrategyConfiguration.class)));
@@ -148,16 +150,16 @@ public final class NewYamlShardingRuleConfigurationSwapper implements NewYamlRul
                 result.setDefaultAuditStrategy(auditStrategySwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingAuditStrategyConfiguration.class)));
             } else if (ShardingNodeConverter.isDefaultShardingColumnPath(each.getKey())) {
                 result.setDefaultShardingColumn(each.getValue());
-            } else if (ShardingNodeConverter.isShardingAlgorithmPath(each.getKey())) {
-                ShardingNodeConverter.getShardingAlgorithmName(each.getKey())
+            } else if (ShardingNodeConverter.getAlgorithmNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getAlgorithmNodeConverter().getName(each.getKey())
                         .ifPresent(algorithmName -> result.getShardingAlgorithms().put(algorithmName,
                                 algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
-            } else if (ShardingNodeConverter.isKeyGeneratorPath(each.getKey())) {
-                ShardingNodeConverter.getKeyGeneratorName(each.getKey())
+            } else if (ShardingNodeConverter.getKeyGeneratorNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getKeyGeneratorNodeConverter().getName(each.getKey())
                         .ifPresent(keyGeneratorName -> result.getKeyGenerators().put(keyGeneratorName,
                                 algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
-            } else if (ShardingNodeConverter.isAuditorPath(each.getKey())) {
-                ShardingNodeConverter.getAuditorName(each.getKey())
+            } else if (ShardingNodeConverter.getAuditorNodeConverter().isPath(each.getKey())) {
+                ShardingNodeConverter.getAuditorNodeConverter().getName(each.getKey())
                         .ifPresent(auditorName -> result.getAuditors().put(auditorName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
             } else if (ShardingNodeConverter.isShardingCachePath(each.getKey())) {
                 result.setShardingCache(shardingCacheYamlSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlShardingCacheConfiguration.class)));
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverterTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverterTest.java
deleted file mode 100644
index b51a32e650e..00000000000
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/metadata/converter/ShardingNodeConverterTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sharding.metadata.converter;
-
-import org.junit.jupiter.api.Test;
-
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class ShardingNodeConverterTest {
-    
-    @Test
-    void assertGetTableNamePath() {
-        assertThat(ShardingNodeConverter.getTableNamePath("foo_table"), is("tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetAutoTableNamePath() {
-        assertThat(ShardingNodeConverter.getAutoTableNamePath("foo_auto_table"), is("auto_tables/foo_auto_table"));
-    }
-    
-    @Test
-    void assertGetBindingTableNamePath() {
-        assertThat(ShardingNodeConverter.getBindingTableNamePath("foo_binding_table"), is("binding_tables/foo_binding_table"));
-    }
-    
-    @Test
-    void assertGetDefaultDatabaseStrategyPath() {
-        assertThat(ShardingNodeConverter.getDefaultDatabaseStrategyPath(), is("default_strategies/default_database_strategy"));
-    }
-    
-    @Test
-    void assertGetDefaultTableStrategyPath() {
-        assertThat(ShardingNodeConverter.getDefaultTableStrategyPath(), is("default_strategies/default_table_strategy"));
-    }
-    
-    @Test
-    void assertGetDefaultKeyGenerateStrategyPath() {
-        assertThat(ShardingNodeConverter.getDefaultKeyGenerateStrategyPath(), is("default_strategies/default_key_generate_strategy"));
-    }
-    
-    @Test
-    void assertGetDefaultAuditStrategyPath() {
-        assertThat(ShardingNodeConverter.getDefaultAuditStrategyPath(), is("default_strategies/default_audit_strategy"));
-    }
-    
-    @Test
-    void assertGetDefaultShardingColumnPath() {
-        assertThat(ShardingNodeConverter.getDefaultShardingColumnPath(), is("default_strategies/default_sharding_column"));
-    }
-    
-    @Test
-    void assertGetShardingAlgorithmPath() {
-        assertThat(ShardingNodeConverter.getShardingAlgorithmPath("MOD"), is("algorithms/MOD"));
-    }
-    
-    @Test
-    void assertGetKeyGeneratorPath() {
-        assertThat(ShardingNodeConverter.getKeyGeneratorPath("DEFAULT"), is("key_generators/DEFAULT"));
-    }
-    
-    @Test
-    void assertGetAuditorPath() {
-        assertThat(ShardingNodeConverter.getAuditorPath("DML_SHARDING_CONDITIONS"), is("auditors/DML_SHARDING_CONDITIONS"));
-    }
-    
-    @Test
-    void assertGetShardingCachePath() {
-        assertThat(ShardingNodeConverter.getShardingCachePath(), is("sharding_cache"));
-    }
-    
-    @Test
-    void assertCheckIsTargetRuleByRulePath() {
-        assertTrue(ShardingNodeConverter.isShardingPath("/metadata/foo_db/rules/sharding/tables/foo_table"));
-        assertFalse(ShardingNodeConverter.isShardingPath("/metadata/foo_db/rules/foo/tables/foo_table"));
-        assertTrue(ShardingNodeConverter.isTablePath("/metadata/foo_db/rules/sharding/tables/foo_table"));
-        assertFalse(ShardingNodeConverter.isTablePath("/metadata/foo_db/rules/sharding/algorithms/MD5"));
-        assertTrue(ShardingNodeConverter.isAutoTablePath("/metadata/foo_db/rules/sharding/auto_tables/foo_table"));
-        assertFalse(ShardingNodeConverter.isAutoTablePath("/metadata/foo_db/rules/sharding/algorithms/MD5"));
-        assertTrue(ShardingNodeConverter.isBindingTablePath("/metadata/foo_db/rules/sharding/binding_tables/foo_table"));
-        assertFalse(ShardingNodeConverter.isBindingTablePath("/metadata/foo_db/rules/sharding/algorithms/MD5"));
-        assertTrue(ShardingNodeConverter.isDefaultDatabaseStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_database_strategy"));
-        assertFalse(ShardingNodeConverter.isDefaultDatabaseStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_database_strategy/foo"));
-        assertTrue(ShardingNodeConverter.isDefaultTableStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_table_strategy"));
-        assertFalse(ShardingNodeConverter.isDefaultTableStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_table_strategy/foo"));
-        assertTrue(ShardingNodeConverter.isDefaultKeyGenerateStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_key_generate_strategy"));
-        assertFalse(ShardingNodeConverter.isDefaultKeyGenerateStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_key_generate_strategy/foo"));
-        assertTrue(ShardingNodeConverter.isDefaultAuditStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_audit_strategy"));
-        assertFalse(ShardingNodeConverter.isDefaultAuditStrategyPath("/metadata/foo_db/rules/sharding/default_strategies/default_audit_strategy/foo"));
-        assertTrue(ShardingNodeConverter.isDefaultShardingColumnPath("/metadata/foo_db/rules/sharding/default_strategies/default_sharding_column"));
-        assertFalse(ShardingNodeConverter.isDefaultShardingColumnPath("/metadata/foo_db/rules/sharding/default_strategies/default_sharding_column/foo"));
-        assertTrue(ShardingNodeConverter.isShardingAlgorithmPath("/metadata/foo_db/rules/sharding/algorithms/foo_table"));
-        assertFalse(ShardingNodeConverter.isShardingAlgorithmPath("/metadata/foo_db/rules/sharding/key_generators/foo"));
-        assertTrue(ShardingNodeConverter.isKeyGeneratorPath("/metadata/foo_db/rules/sharding/key_generators/foo"));
-        assertFalse(ShardingNodeConverter.isKeyGeneratorPath("/metadata/foo_db/rules/sharding/algorithms/MD5"));
-        assertTrue(ShardingNodeConverter.isAuditorPath("/metadata/foo_db/rules/sharding/auditors/foo"));
-        assertFalse(ShardingNodeConverter.isAuditorPath("/metadata/foo_db/rules/sharding/algorithms/MD5"));
-        assertTrue(ShardingNodeConverter.isShardingCachePath("/metadata/foo_db/rules/sharding/sharding_cache"));
-        assertFalse(ShardingNodeConverter.isShardingCachePath("/metadata/foo_db/rules/sharding/sharding_cache/foo"));
-    }
-    
-    @Test
-    void assertGetTableNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getTableName("/metadata/foo_db/rules/sharding/tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAutoTableNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getAutoTableName("/metadata/foo_db/rules/sharding/auto_tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetBindingTableNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getBindingTableName("/metadata/foo_db/rules/sharding/binding_tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getShardingAlgorithmName("/metadata/foo_db/rules/sharding/algorithms/foo");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo"));
-    }
-    
-    @Test
-    void assertGetKeyGeneratorNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getKeyGeneratorName("/metadata/foo_db/rules/sharding/key_generators/foo");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo"));
-    }
-    
-    @Test
-    void assertGetAuditorNameByRulePath() {
-        Optional<String> actual = ShardingNodeConverter.getAuditorName("/metadata/foo_db/rules/sharding/auditors/foo");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo"));
-    }
-    
-    @Test
-    void assertGetTableNameByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getTableNameByActiveVersionPath("/metadata/foo_db/rules/sharding/tables/foo_table/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAutoTableNameByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getAutoTableNameByActiveVersionPath("/metadata/foo_db/rules/sharding/auto_tables/foo_table/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetBindingTableNameByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getBindingTableNameByActiveVersionPath("/metadata/foo_db/rules/sharding/binding_tables/c018fb3cd8e530dd/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("c018fb3cd8e530dd"));
-    }
-    
-    @Test
-    void assertIsDefaultDatabaseStrategyByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isDefaultDatabaseStrategyWithActiveVersionPath("/metadata/foo_db/rules/sharding/default_strategies/default_database_strategy/active_version"));
-    }
-    
-    @Test
-    void assertIsDefaultTableStrategyByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isDefaultTableStrategyWithActiveVersionPath("/metadata/foo_db/rules/sharding/default_strategies/default_table_strategy/active_version"));
-    }
-    
-    @Test
-    void assertIsDefaultKeyGenerateStrategyByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isDefaultKeyGenerateStrategyWithActiveVersionPath("/metadata/foo_db/rules/sharding/default_strategies/default_key_generate_strategy/active_version"));
-    }
-    
-    @Test
-    void assertIsDefaultAuditStrategyByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isDefaultAuditStrategyWithActiveVersionPath("/metadata/foo_db/rules/sharding/default_strategies/default_audit_strategy/active_version"));
-    }
-    
-    @Test
-    void assertIsDefaultShardingColumnByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isDefaultShardingColumnWithActiveVersionPath("/metadata/foo_db/rules/sharding/default_strategies/default_sharding_column/active_version"));
-    }
-    
-    @Test
-    void assertGetShardingAlgorithmByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getShardingAlgorithmNameByActiveVersionPath("/metadata/foo_db/rules/sharding/algorithms/foo_table_algorithm/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table_algorithm"));
-    }
-    
-    @Test
-    void assertGetKeyGeneratorByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getKeyGeneratorNameByActiveVersionPath("/metadata/foo_db/rules/sharding/key_generators/foo_table_key_generator/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table_key_generator"));
-    }
-    
-    @Test
-    void assertGetAuditorByActiveVersionPath() {
-        Optional<String> actual = ShardingNodeConverter.getAuditorNameByActiveVersionPath("/metadata/foo_db/rules/sharding/auditors/foo_table_auditor/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table_auditor"));
-    }
-    
-    @Test
-    void assertGetShardingCacheByActiveVersionPath() {
-        assertTrue(ShardingNodeConverter.isShardingCacheWithActiveVersionPath("/metadata/foo_db/rules/sharding/sharding_cache/active_version"));
-    }
-}