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