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

jianglongtao 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 f98288f41d3 Convert EncryptRuleConfiguration to DistSQL via SPI 
(#27255)
f98288f41d3 is described below

commit f98288f41d38046519aa5a180fc2221844206797
Author: yx9o <[email protected]>
AuthorDate: Tue Jul 18 10:09:53 2023 +0800

    Convert EncryptRuleConfiguration to DistSQL via SPI (#27255)
    
    * Convert EncryptRuleConfiguration to DistSQL via SPI
    
    * Update
---
 .../EncryptConvertRuleConfigurationProvider.java   | 146 +++++++++++++++++++++
 ...eSplittingConvertRuleConfigurationProvider.java |   2 +-
 .../ShardingConvertRuleConfigurationProvider.java  |   2 +-
 .../ConvertYamlConfigurationExecutor.java          |  74 +----------
 ...dler.ral.query.ConvertRuleConfigurationProvider |   1 +
 5 files changed, 153 insertions(+), 72 deletions(-)

diff --git 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptConvertRuleConfigurationProvider.java
 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptConvertRuleConfigurationProvider.java
new file mode 100644
index 00000000000..0c60d7397a8
--- /dev/null
+++ 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptConvertRuleConfigurationProvider.java
@@ -0,0 +1,146 @@
+/*
+ * 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.distsql.handler.provider;
+
+import com.google.common.base.Strings;
+import 
org.apache.shardingsphere.distsql.handler.ral.constant.DistSQLScriptConstants;
+import 
org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurationProvider;
+import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+
+/**
+ * Encrypt convert rule configuration provider.
+ */
+public final class EncryptConvertRuleConfigurationProvider implements 
ConvertRuleConfigurationProvider {
+    
+    @Override
+    public String convert(final RuleConfiguration ruleConfig) {
+        return getEncryptDistSQL((EncryptRuleConfiguration) ruleConfig);
+    }
+    
+    private String getEncryptDistSQL(final EncryptRuleConfiguration 
ruleConfig) {
+        if (ruleConfig.getTables().isEmpty()) {
+            return "";
+        }
+        StringBuilder result = new StringBuilder();
+        result.append(DistSQLScriptConstants.CREATE_ENCRYPT);
+        Iterator<EncryptTableRuleConfiguration> iterator = 
ruleConfig.getTables().iterator();
+        while (iterator.hasNext()) {
+            EncryptTableRuleConfiguration tableRuleConfig = iterator.next();
+            result.append(String.format(DistSQLScriptConstants.ENCRYPT, 
tableRuleConfig.getName(), getEncryptColumns(tableRuleConfig.getColumns(), 
ruleConfig.getEncryptors())));
+            if (iterator.hasNext()) {
+                
result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
+            }
+        }
+        
result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
+        return result.toString();
+    }
+    
+    private String getEncryptColumns(final 
Collection<EncryptColumnRuleConfiguration> ruleConfigs, final Map<String, 
AlgorithmConfiguration> encryptors) {
+        StringBuilder result = new StringBuilder();
+        Iterator<EncryptColumnRuleConfiguration> iterator = 
ruleConfigs.iterator();
+        while (iterator.hasNext()) {
+            EncryptColumnRuleConfiguration columnRuleConfig = iterator.next();
+            result.append(String.format(DistSQLScriptConstants.ENCRYPT_COLUMN, 
columnRuleConfig.getName(), getColumns(columnRuleConfig), 
getEncryptAlgorithms(columnRuleConfig, encryptors)));
+            if (iterator.hasNext()) {
+                
result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
+            }
+        }
+        return result.toString();
+    }
+    
+    private String getColumns(final EncryptColumnRuleConfiguration ruleConfig) 
{
+        StringBuilder result = new StringBuilder();
+        String cipherColumnName = ruleConfig.getCipher().getName();
+        if (!Strings.isNullOrEmpty(cipherColumnName)) {
+            result.append(String.format(DistSQLScriptConstants.CIPHER, 
cipherColumnName));
+        }
+        if (ruleConfig.getAssistedQuery().isPresent()) {
+            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.ASSISTED_QUERY_COLUMN, 
ruleConfig.getAssistedQuery().get().getName()));
+        }
+        if (ruleConfig.getLikeQuery().isPresent()) {
+            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.LIKE_QUERY_COLUMN, 
ruleConfig.getLikeQuery().get().getName()));
+        }
+        return result.toString();
+    }
+    
+    private String getEncryptAlgorithms(final EncryptColumnRuleConfiguration 
ruleConfig, final Map<String, AlgorithmConfiguration> encryptors) {
+        StringBuilder result = new StringBuilder();
+        String cipherEncryptorName = ruleConfig.getCipher().getEncryptorName();
+        String assistedQueryEncryptorName = 
ruleConfig.getAssistedQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse("");
+        String likeQueryEncryptorName = 
ruleConfig.getLikeQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse("");
+        if (!Strings.isNullOrEmpty(cipherEncryptorName)) {
+            
result.append(String.format(DistSQLScriptConstants.ENCRYPT_ALGORITHM, 
getAlgorithmType(encryptors.get(cipherEncryptorName))));
+        }
+        if (!Strings.isNullOrEmpty(assistedQueryEncryptorName)) {
+            result.append(DistSQLScriptConstants.COMMA).append(' ')
+                    
.append(String.format(DistSQLScriptConstants.ASSISTED_QUERY_ALGORITHM, 
getAlgorithmType(encryptors.get(assistedQueryEncryptorName))));
+        }
+        if (!Strings.isNullOrEmpty(likeQueryEncryptorName)) {
+            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.LIKE_QUERY_ALGORITHM, 
getAlgorithmType(encryptors.get(likeQueryEncryptorName))));
+        }
+        return result.toString();
+    }
+    
+    private String getAlgorithmType(final AlgorithmConfiguration 
algorithmConfig) {
+        StringBuilder result = new StringBuilder();
+        if (null == algorithmConfig) {
+            return result.toString();
+        }
+        String type = algorithmConfig.getType().toLowerCase();
+        if (algorithmConfig.getProps().isEmpty()) {
+            
result.append(String.format(DistSQLScriptConstants.ALGORITHM_TYPE_WITHOUT_PROPS,
 type));
+        } else {
+            result.append(String.format(DistSQLScriptConstants.ALGORITHM_TYPE, 
type, getAlgorithmProperties(algorithmConfig.getProps())));
+        }
+        return result.toString();
+    }
+    
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    private String getAlgorithmProperties(final Properties props) {
+        StringBuilder result = new StringBuilder();
+        Iterator<String> iterator = new TreeMap(props).keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            Object value = props.get(key);
+            if (null == value) {
+                continue;
+            }
+            result.append(String.format(DistSQLScriptConstants.PROPERTY, key, 
value));
+            if (iterator.hasNext()) {
+                result.append(DistSQLScriptConstants.COMMA).append(' ');
+            }
+        }
+        return result.toString();
+    }
+    
+    @Override
+    public String getType() {
+        return EncryptRuleConfiguration.class.getName();
+    }
+}
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingConvertRuleConfigurationProvider.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingConvertRuleConfigurationProvider.java
index 6ed238c0fed..806cdbe5a5f 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingConvertRuleConfigurationProvider.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingConvertRuleConfigurationProvider.java
@@ -34,7 +34,7 @@ import java.util.TreeMap;
 /**
  * Readwrite-splitting convert rule configuration provider.
  */
-public class ReadwriteSplittingConvertRuleConfigurationProvider implements 
ConvertRuleConfigurationProvider {
+public final class ReadwriteSplittingConvertRuleConfigurationProvider 
implements ConvertRuleConfigurationProvider {
     
     @Override
     public String convert(final RuleConfiguration ruleConfig) {
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingConvertRuleConfigurationProvider.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingConvertRuleConfigurationProvider.java
index 1127d76dbe1..44d30930242 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingConvertRuleConfigurationProvider.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingConvertRuleConfigurationProvider.java
@@ -42,7 +42,7 @@ import java.util.TreeMap;
 /**
  * Sharding convert rule configuration provider.
  */
-public class ShardingConvertRuleConfigurationProvider implements 
ConvertRuleConfigurationProvider {
+public final class ShardingConvertRuleConfigurationProvider implements 
ConvertRuleConfigurationProvider {
     
     @Override
     public String convert(final RuleConfiguration ruleConfig) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationExecutor.java
index df07c046b05..5d4ad39418b 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationExecutor.java
@@ -25,10 +25,6 @@ import 
org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurat
 import 
org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
 import 
org.apache.shardingsphere.encrypt.api.config.CompatibleEncryptRuleConfiguration;
-import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
-import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnItemRuleConfiguration;
-import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
-import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.yaml.config.YamlCompatibleEncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.yaml.config.YamlEncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.yaml.swapper.YamlCompatibleEncryptRuleConfigurationSwapper;
@@ -103,10 +99,10 @@ public final class ConvertYamlConfigurationExecutor 
implements QueryableRALExecu
         StringBuilder result = new StringBuilder();
         appendResourceDistSQL(yamlConfig, result);
         for (RuleConfiguration each : swapToRuleConfigs(yamlConfig).values()) {
-            if (each instanceof EncryptRuleConfiguration) {
-                appendEncryptDistSQL((EncryptRuleConfiguration) each, result);
-            } else if (each instanceof CompatibleEncryptRuleConfiguration) {
-                appendEncryptDistSQL(((CompatibleEncryptRuleConfiguration) 
each).convertToEncryptRuleConfiguration(), result);
+            if (each instanceof CompatibleEncryptRuleConfiguration) {
+                ConvertRuleConfigurationProvider convertRuleConfigProvider = 
TypedSPILoader.getService(ConvertRuleConfigurationProvider.class,
+                        ((CompatibleEncryptRuleConfiguration) 
each).convertToEncryptRuleConfiguration().getClass().getName());
+                result.append(convertRuleConfigProvider.convert(each));
             } else if (each instanceof ShadowRuleConfiguration) {
                 appendShadowDistSQL((ShadowRuleConfiguration) each, result);
             } else if (each instanceof MaskRuleConfiguration) {
@@ -209,68 +205,6 @@ public final class ConvertYamlConfigurationExecutor 
implements QueryableRALExecu
         }
     }
     
-    private void appendEncryptDistSQL(final EncryptRuleConfiguration 
ruleConfig, final StringBuilder stringBuilder) {
-        if (ruleConfig.getTables().isEmpty()) {
-            return;
-        }
-        stringBuilder.append(DistSQLScriptConstants.CREATE_ENCRYPT);
-        Iterator<EncryptTableRuleConfiguration> iterator = 
ruleConfig.getTables().iterator();
-        while (iterator.hasNext()) {
-            EncryptTableRuleConfiguration tableRuleConfig = iterator.next();
-            stringBuilder.append(String.format(DistSQLScriptConstants.ENCRYPT, 
tableRuleConfig.getName(), getEncryptColumns(tableRuleConfig.getColumns(), 
ruleConfig.getEncryptors())));
-            if (iterator.hasNext()) {
-                
stringBuilder.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
-            }
-        }
-        
stringBuilder.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator()).append(System.lineSeparator());
-    }
-    
-    private String getEncryptColumns(final 
Collection<EncryptColumnRuleConfiguration> ruleConfigs, final Map<String, 
AlgorithmConfiguration> encryptors) {
-        StringBuilder result = new StringBuilder();
-        Iterator<EncryptColumnRuleConfiguration> iterator = 
ruleConfigs.iterator();
-        while (iterator.hasNext()) {
-            EncryptColumnRuleConfiguration columnRuleConfig = iterator.next();
-            result.append(String.format(DistSQLScriptConstants.ENCRYPT_COLUMN, 
columnRuleConfig.getName(), getColumns(columnRuleConfig), 
getEncryptAlgorithms(columnRuleConfig, encryptors)));
-            if (iterator.hasNext()) {
-                
result.append(DistSQLScriptConstants.COMMA).append(System.lineSeparator());
-            }
-        }
-        return result.toString();
-    }
-    
-    private String getColumns(final EncryptColumnRuleConfiguration ruleConfig) 
{
-        StringBuilder result = new StringBuilder();
-        String cipherColumnName = ruleConfig.getCipher().getName();
-        if (!Strings.isNullOrEmpty(cipherColumnName)) {
-            result.append(String.format(DistSQLScriptConstants.CIPHER, 
cipherColumnName));
-        }
-        if (ruleConfig.getAssistedQuery().isPresent()) {
-            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.ASSISTED_QUERY_COLUMN, 
ruleConfig.getAssistedQuery().get().getName()));
-        }
-        if (ruleConfig.getLikeQuery().isPresent()) {
-            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.LIKE_QUERY_COLUMN, 
ruleConfig.getLikeQuery().get().getName()));
-        }
-        return result.toString();
-    }
-    
-    private String getEncryptAlgorithms(final EncryptColumnRuleConfiguration 
ruleConfig, final Map<String, AlgorithmConfiguration> encryptors) {
-        StringBuilder result = new StringBuilder();
-        String cipherEncryptorName = ruleConfig.getCipher().getEncryptorName();
-        String assistedQueryEncryptorName = 
ruleConfig.getAssistedQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse("");
-        String likeQueryEncryptorName = 
ruleConfig.getLikeQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse("");
-        if (!Strings.isNullOrEmpty(cipherEncryptorName)) {
-            
result.append(String.format(DistSQLScriptConstants.ENCRYPT_ALGORITHM, 
getAlgorithmType(encryptors.get(cipherEncryptorName))));
-        }
-        if (!Strings.isNullOrEmpty(assistedQueryEncryptorName)) {
-            result.append(DistSQLScriptConstants.COMMA).append(' ')
-                    
.append(String.format(DistSQLScriptConstants.ASSISTED_QUERY_ALGORITHM, 
getAlgorithmType(encryptors.get(assistedQueryEncryptorName))));
-        }
-        if (!Strings.isNullOrEmpty(likeQueryEncryptorName)) {
-            result.append(DistSQLScriptConstants.COMMA).append(' 
').append(String.format(DistSQLScriptConstants.LIKE_QUERY_ALGORITHM, 
getAlgorithmType(encryptors.get(likeQueryEncryptorName))));
-        }
-        return result.toString();
-    }
-    
     private void appendShadowDistSQL(final ShadowRuleConfiguration ruleConfig, 
final StringBuilder stringBuilder) {
         if (ruleConfig.getDataSources().isEmpty()) {
             return;
diff --git 
a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurationProvider
 
b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurationProvider
index 949701c872e..7df32713fd6 100644
--- 
a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurationProvider
+++ 
b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.ConvertRuleConfigurationProvider
@@ -17,3 +17,4 @@
 
 
org.apache.shardingsphere.sharding.distsql.handler.provider.ShardingConvertRuleConfigurationProvider
 
org.apache.shardingsphere.readwritesplitting.distsql.handler.provider.ReadwriteSplittingConvertRuleConfigurationProvider
+org.apache.shardingsphere.encrypt.distsql.handler.provider.EncryptConvertRuleConfigurationProvider

Reply via email to