You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/06/24 15:13:16 UTC

[shardingsphere] branch master updated: Add EncryptItemNodeConverter to abstract EncryptNodeConverter (#26522)

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

zhaojinchao 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 b74ad281d12 Add EncryptItemNodeConverter to abstract EncryptNodeConverter (#26522)
b74ad281d12 is described below

commit b74ad281d1230e0986cff4195ed95f7dbab6ff51
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sat Jun 24 23:13:10 2023 +0800

    Add EncryptItemNodeConverter to abstract EncryptNodeConverter (#26522)
---
 .../EncryptRuleConfigurationEventBuilder.java      |   4 +-
 .../converter/EncryptItemNodeConverter.java        |  85 ++++++++++++++++
 .../metadata/converter/EncryptNodeConverter.java   | 108 +++------------------
 .../NewYamlEncryptRuleConfigurationSwapper.java    |  13 +--
 .../converter/EncryptItemNodeConverterTest.java    |  55 +++++++++++
 .../converter/EncryptNodeConverterTest.java        |  48 +--------
 6 files changed, 165 insertions(+), 148 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleConfigurationEventBuilder.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleConfigurationEventBuilder.java
index 79d5ef50d1b..132d2e57f64 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleConfigurationEventBuilder.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/event/EncryptRuleConfigurationEventBuilder.java
@@ -41,11 +41,11 @@ public final class EncryptRuleConfigurationEventBuilder implements RuleConfigura
         if (!EncryptNodeConverter.isEncryptPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        Optional<String> tableName = EncryptNodeConverter.getTableNameByActiveVersionPath(event.getKey());
+        Optional<String> tableName = EncryptNodeConverter.getTableNodeConvertor().getItemNameByActiveVersionPath(event.getKey());
         if (tableName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createEncryptConfigEvent(databaseName, tableName.get(), event);
         }
-        Optional<String> encryptorName = EncryptNodeConverter.getEncryptorNameByActiveVersionPath(event.getKey());
+        Optional<String> encryptorName = EncryptNodeConverter.getEncryptorNodeConvertor().getItemNameByActiveVersionPath(event.getKey());
         if (encryptorName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
             return createEncryptorEvent(databaseName, encryptorName.get(), event);
         }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverter.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverter.java
new file mode 100644
index 00000000000..aff434571d5
--- /dev/null
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverter.java
@@ -0,0 +1,85 @@
+/*
+ * 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.encrypt.metadata.converter;
+
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Encrypt item node converter.
+ */
+public final class EncryptItemNodeConverter {
+    
+    private final String itemsNode;
+    
+    private final Pattern itemsPathPattern;
+    
+    private final Pattern itemNamePathPattern;
+    
+    private final Pattern itemVersionPathPattern;
+    
+    public EncryptItemNodeConverter(final String itemsNode) {
+        this.itemsNode = itemsNode;
+        itemsPathPattern = Pattern.compile(EncryptNodeConverter.ROOT_NODE_PREFIX + "/" + itemsNode + "\\.*", Pattern.CASE_INSENSITIVE);
+        itemNamePathPattern = Pattern.compile(EncryptNodeConverter.ROOT_NODE_PREFIX + "/" + itemsNode + EncryptNodeConverter.RULE_NAME, Pattern.CASE_INSENSITIVE);
+        itemVersionPathPattern = Pattern.compile(EncryptNodeConverter.ROOT_NODE_PREFIX + "/" + itemsNode + EncryptNodeConverter.RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
+    }
+    
+    /**
+     * Get item name path.
+     *
+     * @param itemName item name
+     * @return item name path
+     */
+    public String getItemNamePath(final String itemName) {
+        return String.join("/", itemsNode, itemName);
+    }
+    
+    /**
+     * Is item path.
+     *
+     * @param rulePath rule path
+     * @return true or false
+     */
+    public boolean isItemPath(final String rulePath) {
+        return itemsPathPattern.matcher(rulePath).find();
+    }
+    
+    /**
+     * Get item name.
+     *
+     * @param rulePath rule path
+     * @return item name
+     */
+    public Optional<String> getItemName(final String rulePath) {
+        Matcher matcher = itemNamePathPattern.matcher(rulePath);
+        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    }
+    
+    /**
+     * Get item name by active version path.
+     *
+     * @param rulePath rule path
+     * @return encrypt item version
+     */
+    public Optional<String> getItemNameByActiveVersionPath(final String rulePath) {
+        Matcher matcher = itemVersionPathPattern.matcher(rulePath);
+        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    }
+}
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 b4304b76c57..eaf5245fe5a 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
@@ -20,8 +20,6 @@ package org.apache.shardingsphere.encrypt.metadata.converter;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
-import java.util.Optional;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
@@ -30,37 +28,17 @@ import java.util.regex.Pattern;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class EncryptNodeConverter {
     
-    private static final String ROOT_NODE = "encrypt";
+    public static final String ROOT_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/encrypt";
     
-    private static final String TABLES_NODE = "tables";
+    public static final String RULE_NAME = "/([\\w\\-]+)?";
     
-    private static final String ENCRYPTORS_NODE = "encryptors";
+    public static final String RULE_ACTIVE_VERSION = "/([\\w\\-]+)/active_version$";
     
-    private static final String RULES_NODE_PREFIX = "/([\\w\\-]+)/([\\w\\-]+)/rules/";
+    private static final Pattern ROOT_PATH_PATTERN = Pattern.compile(ROOT_NODE_PREFIX + "\\.*", Pattern.CASE_INSENSITIVE);
     
-    private static final String RULE_NAME_PATTERN = "/([\\w\\-]+)?";
+    private static final EncryptItemNodeConverter TABLE_NODE_CONVERTER = new EncryptItemNodeConverter("tables");
     
-    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 encryptor path.
-     *
-     * @param encryptorName encryptor name
-     * @return encryptor path
-     */
-    public static String getEncryptorPath(final String encryptorName) {
-        return String.join("/", ENCRYPTORS_NODE, encryptorName);
-    }
+    private static final EncryptItemNodeConverter ENCRYPTOR_NODE_CONVERTER = new EncryptItemNodeConverter("encryptors");
     
     /**
      * Is encrypt path.
@@ -69,80 +47,24 @@ public final class EncryptNodeConverter {
      * @return true or false
      */
     public static boolean isEncryptPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "\\.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
+        return ROOT_PATH_PATTERN.matcher(rulePath).find();
     }
     
     /**
-     * Is encrypt table path.
+     * Get table node convertor.
      *
-     * @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 encryptor path.
-     *
-     * @param rulePath rule path
-     * @return true or false
-     */
-    public static boolean isEncryptorPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ENCRYPTORS_NODE + "\\.*", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find();
-    }
-    
-    /**
-     * 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 encryptor name.
-     *
-     * @param rulePath rule path
-     * @return encryptor name
-     */
-    public static Optional<String> getEncryptorName(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ENCRYPTORS_NODE + RULE_NAME_PATTERN, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(rulePath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
-    }
-    
-    /**
-     * Get encrypt table name by active version path.
-     * 
-     * @param activeVersionPath active version path
-     * @return table name
+     * @return table node convertor
      */
-    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 EncryptItemNodeConverter getTableNodeConvertor() {
+        return TABLE_NODE_CONVERTER;
     }
     
     /**
-     * Get encryptor name by active version path.
+     * Get encryptor node convertor.
      *
-     * @param activeVersionPath active version path
-     * @return encryptor name
+     * @return encryptor node convertor
      */
-    public static Optional<String> getEncryptorNameByActiveVersionPath(final String activeVersionPath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + ENCRYPTORS_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(activeVersionPath);
-        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    public static EncryptItemNodeConverter getEncryptorNodeConvertor() {
+        return ENCRYPTOR_NODE_CONVERTER;
     }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/yaml/swapper/NewYamlEncryptRuleConfigurationSwapper.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/yaml/swapper/NewYamlEncryptRuleConfigurationSwapper.java
index eb2e2ecccee..709bb79c4dd 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/yaml/swapper/NewYamlEncryptRuleConfigurationSwapper.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/yaml/swapper/NewYamlEncryptRuleConfigurationSwapper.java
@@ -51,10 +51,11 @@ public final class NewYamlEncryptRuleConfigurationSwapper implements NewYamlRule
     public Collection<YamlDataNode> swapToDataNodes(final EncryptRuleConfiguration data) {
         Collection<YamlDataNode> result = new LinkedHashSet<>();
         for (EncryptTableRuleConfiguration each : data.getTables()) {
-            result.add(new YamlDataNode(EncryptNodeConverter.getTableNamePath(each.getName()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
+            result.add(new YamlDataNode(EncryptNodeConverter.getTableNodeConvertor().getItemNamePath(each.getName()), YamlEngine.marshal(tableSwapper.swapToYamlConfiguration(each))));
         }
         for (Entry<String, AlgorithmConfiguration> entry : data.getEncryptors().entrySet()) {
-            result.add(new YamlDataNode(EncryptNodeConverter.getEncryptorPath(entry.getKey()), YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
+            result.add(new YamlDataNode(EncryptNodeConverter.getEncryptorNodeConvertor().getItemNamePath(entry.getKey()),
+                    YamlEngine.marshal(algorithmSwapper.swapToYamlConfiguration(entry.getValue()))));
         }
         return result;
     }
@@ -64,11 +65,11 @@ public final class NewYamlEncryptRuleConfigurationSwapper implements NewYamlRule
         Collection<EncryptTableRuleConfiguration> tables = new LinkedList<>();
         Map<String, AlgorithmConfiguration> encryptors = new HashMap<>();
         for (YamlDataNode each : dataNodes) {
-            if (EncryptNodeConverter.isTablePath(each.getKey())) {
-                EncryptNodeConverter.getTableName(each.getKey())
+            if (EncryptNodeConverter.getTableNodeConvertor().isItemPath(each.getKey())) {
+                EncryptNodeConverter.getTableNodeConvertor().getItemName(each.getKey())
                         .ifPresent(tableName -> tables.add(tableSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlEncryptTableRuleConfiguration.class))));
-            } else if (EncryptNodeConverter.isEncryptorPath(each.getKey())) {
-                EncryptNodeConverter.getEncryptorName(each.getKey())
+            } else if (EncryptNodeConverter.getEncryptorNodeConvertor().isItemPath(each.getKey())) {
+                EncryptNodeConverter.getEncryptorNodeConvertor().getItemName(each.getKey())
                         .ifPresent(encryptorName -> encryptors.put(encryptorName, algorithmSwapper.swapToObject(YamlEngine.unmarshal(each.getValue(), YamlAlgorithmConfiguration.class))));
             }
         }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverterTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverterTest.java
new file mode 100644
index 00000000000..e99f12cb73f
--- /dev/null
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptItemNodeConverterTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.encrypt.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.assertTrue;
+
+class EncryptItemNodeConverterTest {
+    
+    private final EncryptItemNodeConverter itemNodeConverter = new EncryptItemNodeConverter("tables");
+    
+    @Test
+    void assertGetItemNamePath() {
+        assertThat(itemNodeConverter.getItemNamePath("foo_table"), is("tables/foo_table"));
+    }
+    
+    @Test
+    void assertIsItemPath() {
+        assertTrue(itemNodeConverter.isItemPath("/metadata/foo_db/rules/encrypt/tables/foo_table"));
+    }
+    
+    @Test
+    void assertGetItemName() {
+        Optional<String> actual = itemNodeConverter.getItemName("/metadata/foo_db/rules/encrypt/tables/foo_table");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), is("foo_table"));
+    }
+    
+    @Test
+    void assertGetItemNameByActiveVersionPath() {
+        Optional<String> actual = itemNodeConverter.getItemNameByActiveVersionPath("/metadata/foo_db/rules/encrypt/tables/foo_table/active_version");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), is("foo_table"));
+    }
+}
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverterTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverterTest.java
index bc896fee888..a1d7c765fd0 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverterTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/converter/EncryptNodeConverterTest.java
@@ -19,60 +19,14 @@ package org.apache.shardingsphere.encrypt.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 EncryptNodeConverterTest {
     
     @Test
-    void assertGetTableNamePath() {
-        assertThat(EncryptNodeConverter.getTableNamePath("foo_table"), is("tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmPath() {
-        assertThat(EncryptNodeConverter.getEncryptorPath("AES"), is("encryptors/AES"));
-    }
-    
-    @Test
-    void assertCheckIsTargetRuleByRulePath() {
+    void assertIsEncryptPath() {
         assertTrue(EncryptNodeConverter.isEncryptPath("/metadata/foo_db/rules/encrypt/tables/foo_table"));
         assertFalse(EncryptNodeConverter.isEncryptPath("/metadata/foo_db/rules/foo/tables/foo_table"));
-        assertTrue(EncryptNodeConverter.isTablePath("/metadata/foo_db/rules/encrypt/tables/foo_table"));
-        assertFalse(EncryptNodeConverter.isTablePath("/metadata/foo_db/rules/encrypt/encryptors/AES"));
-        assertTrue(EncryptNodeConverter.isEncryptorPath("/metadata/foo_db/rules/encrypt/encryptors/AES"));
-        assertFalse(EncryptNodeConverter.isEncryptorPath("/metadata/foo_db/rules/encrypt/tables/foo_table"));
-    }
-    
-    @Test
-    void assertGetTableNameByRulePath() {
-        Optional<String> actual = EncryptNodeConverter.getTableName("/metadata/foo_db/rules/encrypt/tables/foo_table");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetAlgorithmNameByRulePath() {
-        Optional<String> actual = EncryptNodeConverter.getEncryptorName("/metadata/foo_db/rules/encrypt/encryptors/AES");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("AES"));
-    }
-    
-    @Test
-    void assertGetEncryptTableVersion() {
-        Optional<String> actual = EncryptNodeConverter.getTableNameByActiveVersionPath("/metadata/foo_db/rules/encrypt/tables/foo_table/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("foo_table"));
-    }
-    
-    @Test
-    void assertGetEncryptAlgorithmVersion() {
-        Optional<String> actual = EncryptNodeConverter.getEncryptorNameByActiveVersionPath("/metadata/foo_db/rules/encrypt/encryptors/aes_algorithm/active_version");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("aes_algorithm"));
     }
 }