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 41bc836852f Move EncryptRuleConfiguration check logic from EncryptRule 
to EncryptRuleConfigurationChecker (#19476)
41bc836852f is described below

commit 41bc836852f6cbc7641773290878c4f4d9c508d6
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat Jul 23 07:19:26 2022 +0800

    Move EncryptRuleConfiguration check logic from EncryptRule to 
EncryptRuleConfigurationChecker (#19476)
    
    * Move EncryptRuleConfiguration check logic from EncryptRule to 
EncryptRuleConfigurationChecker
    
    * fix unit test
---
 .../AbstractEncryptRuleConfigurationChecker.java   | 41 +++++++++++++-
 ...thmProvidedEncryptRuleConfigurationChecker.java | 12 +++-
 .../checker/EncryptRuleConfigurationChecker.java   | 12 +++-
 .../shardingsphere/encrypt/rule/EncryptRule.java   | 64 ----------------------
 ...rovidedEncryptRuleConfigurationCheckerTest.java | 38 +++++++++++--
 .../EncryptRuleConfigurationCheckerTest.java       | 36 ++++++++++--
 .../encrypt/rule/EncryptRuleTest.java              | 18 ------
 ...ReadwriteSplittingRuleConfigurationChecker.java |  9 +--
 .../AbstractShardingRuleConfigurationChecker.java  | 34 ++++++------
 9 files changed, 144 insertions(+), 120 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
index 0241dc95542..076914023f3 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AbstractEncryptRuleConfigurationChecker.java
@@ -18,9 +18,14 @@
 package org.apache.shardingsphere.encrypt.checker;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 
+import java.util.Collection;
+
 /**
  * Abstract encrypt rule configuration checker.
  * 
@@ -30,8 +35,40 @@ public abstract class 
AbstractEncryptRuleConfigurationChecker<T extends RuleConf
     
     @Override
     public final void check(final String databaseName, final T config) {
-        Preconditions.checkState(!isEmptyEncryptors(config), "No available 
encrypt rule configuration in database `%s`.", databaseName);
+        checkTableConfiguration(databaseName, getTables(config), 
getEncryptors(config));
+    }
+    
+    private void checkTableConfiguration(final String databaseName, final 
Collection<EncryptTableRuleConfiguration> tables, final Collection<String> 
encryptors) {
+        for (EncryptTableRuleConfiguration each : tables) {
+            for (EncryptColumnRuleConfiguration column : each.getColumns()) {
+                checkCipherColumnConfiguration(databaseName, encryptors, 
column);
+                checkAssistColumnConfiguration(databaseName, encryptors, 
column);
+            }
+        }
+    }
+    
+    private void checkCipherColumnConfiguration(final String databaseName, 
final Collection<String> encryptors, final EncryptColumnRuleConfiguration 
column) {
+        
Preconditions.checkState(!Strings.isNullOrEmpty(column.getCipherColumn()),
+                "Cipher column of `%s` can not be null in database `%s`.", 
column.getLogicColumn(), databaseName);
+        
Preconditions.checkState(!Strings.isNullOrEmpty(column.getEncryptorName()),
+                "Encryptor name of `%s` can not be null in database `%s`.", 
column.getLogicColumn(), databaseName);
+        
Preconditions.checkState(encryptors.contains(column.getEncryptorName()),
+                "Can not find encryptor `%s` in database `%s`.", 
column.getEncryptorName(), databaseName);
+    }
+    
+    private void checkAssistColumnConfiguration(final String databaseName, 
final Collection<String> encryptors, final EncryptColumnRuleConfiguration 
column) {
+        if (Strings.isNullOrEmpty(column.getAssistedQueryColumn()) && 
Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName())) {
+            return;
+        }
+        
Preconditions.checkState(!Strings.isNullOrEmpty(column.getAssistedQueryColumn()),
+                "Assisted query column of `%s` can not be null in database 
`%s`.", column.getLogicColumn(), databaseName);
+        
Preconditions.checkState(!Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName()),
+                "Assisted query encryptor name of `%s` can not be null in 
database `%s`.", column.getLogicColumn(), databaseName);
+        
Preconditions.checkState(encryptors.contains(column.getAssistedQueryEncryptorName()),
+                "Can not find assisted query encryptor `%s` in database 
`%s`.", column.getEncryptorName(), databaseName);
     }
     
-    protected abstract boolean isEmptyEncryptors(T config);
+    protected abstract Collection<String> getEncryptors(T config);
+    
+    protected abstract Collection<EncryptTableRuleConfiguration> getTables(T 
config);
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationChecker.java
index c4f38e8438d..bffb8c22861 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationChecker.java
@@ -18,16 +18,24 @@
 package org.apache.shardingsphere.encrypt.checker;
 
 import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.constant.EncryptOrder;
 
+import java.util.Collection;
+
 /**
  * Algorithm provided encrypt rule configuration checker.
  */
 public final class AlgorithmProvidedEncryptRuleConfigurationChecker extends 
AbstractEncryptRuleConfigurationChecker<AlgorithmProvidedEncryptRuleConfiguration>
 {
     
     @Override
-    protected boolean isEmptyEncryptors(final 
AlgorithmProvidedEncryptRuleConfiguration config) {
-        return config.getEncryptors().isEmpty();
+    protected Collection<String> getEncryptors(final 
AlgorithmProvidedEncryptRuleConfiguration config) {
+        return config.getEncryptors().keySet();
+    }
+    
+    @Override
+    protected Collection<EncryptTableRuleConfiguration> getTables(final 
AlgorithmProvidedEncryptRuleConfiguration config) {
+        return config.getTables();
     }
     
     @Override
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
index 8e0a0ca108a..c95c263855e 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
@@ -18,16 +18,24 @@
 package org.apache.shardingsphere.encrypt.checker;
 
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.constant.EncryptOrder;
 
+import java.util.Collection;
+
 /**
  * Encrypt rule configuration checker.
  */
 public final class EncryptRuleConfigurationChecker extends 
AbstractEncryptRuleConfigurationChecker<EncryptRuleConfiguration> {
     
     @Override
-    protected boolean isEmptyEncryptors(final EncryptRuleConfiguration config) 
{
-        return config.getEncryptors().isEmpty();
+    protected Collection<String> getEncryptors(final EncryptRuleConfiguration 
config) {
+        return config.getEncryptors().keySet();
+    }
+    
+    @Override
+    protected Collection<EncryptTableRuleConfiguration> getTables(final 
EncryptRuleConfiguration config) {
+        return config.getTables();
     }
     
     @Override
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
index 5ba03d72e8b..aff04eea771 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptRule.java
@@ -18,12 +18,9 @@
 package org.apache.shardingsphere.encrypt.rule;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import lombok.Getter;
 import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
-import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
-import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
 import org.apache.shardingsphere.encrypt.factory.EncryptAlgorithmFactory;
 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
@@ -60,7 +57,6 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
     
     public EncryptRule(final EncryptRuleConfiguration ruleConfig) {
         configuration = ruleConfig;
-        Preconditions.checkArgument(isValidRuleConfiguration(ruleConfig), 
"Invalid encrypt column configurations in EncryptTableRuleConfigurations.");
         ruleConfig.getEncryptors().forEach((key, value) -> encryptors.put(key, 
EncryptAlgorithmFactory.newInstance(value)));
         ruleConfig.getTables().forEach(each -> 
tables.put(each.getName().toLowerCase(), new EncryptTable(each)));
         queryWithCipherColumn = ruleConfig.isQueryWithCipherColumn();
@@ -68,71 +64,11 @@ public final class EncryptRule implements DatabaseRule, 
TableContainedRule {
     
     public EncryptRule(final AlgorithmProvidedEncryptRuleConfiguration 
ruleConfig) {
         configuration = ruleConfig;
-        
Preconditions.checkArgument(isValidRuleConfigurationWithAlgorithmProvided(ruleConfig),
 "Invalid encrypt column configurations in EncryptTableRuleConfigurations.");
         encryptors.putAll(ruleConfig.getEncryptors());
         ruleConfig.getTables().forEach(each -> 
tables.put(each.getName().toLowerCase(), new EncryptTable(each)));
         queryWithCipherColumn = ruleConfig.isQueryWithCipherColumn();
     }
     
-    private boolean isValidRuleConfiguration(final EncryptRuleConfiguration 
config) {
-        return (config.getTables().isEmpty() && 
config.getEncryptors().isEmpty()) || isValidTableConfiguration(config);
-    }
-    
-    private boolean isValidTableConfiguration(final EncryptRuleConfiguration 
config) {
-        for (EncryptTableRuleConfiguration table : config.getTables()) {
-            for (EncryptColumnRuleConfiguration column : table.getColumns()) {
-                if (!isValidCipherColumnConfiguration(config, column) || 
!isValidAssistColumnConfiguration(config, column)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-    
-    private boolean isValidCipherColumnConfiguration(final 
EncryptRuleConfiguration encryptRuleConfig, final 
EncryptColumnRuleConfiguration column) {
-        return !Strings.isNullOrEmpty(column.getCipherColumn()) && 
!Strings.isNullOrEmpty(column.getEncryptorName()) && 
containsEncryptors(encryptRuleConfig, column.getEncryptorName());
-    }
-    
-    private boolean isValidAssistColumnConfiguration(final 
EncryptRuleConfiguration encryptRuleConfig, final 
EncryptColumnRuleConfiguration column) {
-        if (Strings.isNullOrEmpty(column.getAssistedQueryColumn()) && 
Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName())) {
-            return true;
-        }
-        return !Strings.isNullOrEmpty(column.getAssistedQueryColumn()) && 
!Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName())
-                && containsEncryptors(encryptRuleConfig, 
column.getAssistedQueryEncryptorName());
-    }
-    
-    private boolean containsEncryptors(final EncryptRuleConfiguration 
encryptRuleConfig, final String encryptorName) {
-        return 
encryptRuleConfig.getEncryptors().keySet().stream().anyMatch(each -> 
each.equals(encryptorName));
-    }
-    
-    private boolean isValidRuleConfigurationWithAlgorithmProvided(final 
AlgorithmProvidedEncryptRuleConfiguration config) {
-        return (config.getTables().isEmpty() && 
config.getEncryptors().isEmpty()) || 
isValidTableConfigurationWithAlgorithmProvided(config);
-    }
-    
-    private boolean isValidTableConfigurationWithAlgorithmProvided(final 
AlgorithmProvidedEncryptRuleConfiguration config) {
-        for (EncryptTableRuleConfiguration table : config.getTables()) {
-            for (EncryptColumnRuleConfiguration column : table.getColumns()) {
-                if 
(!isValidCipherColumnConfigurationWithAlgorithmProvided(config, column) || 
!isValidAssistColumnConfigurationWithAlgorithmProvided(config, column)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-    
-    private boolean 
isValidCipherColumnConfigurationWithAlgorithmProvided(final 
AlgorithmProvidedEncryptRuleConfiguration encryptRuleConfig, final 
EncryptColumnRuleConfiguration column) {
-        return !Strings.isNullOrEmpty(column.getCipherColumn()) && 
!Strings.isNullOrEmpty(column.getEncryptorName())
-                && 
encryptRuleConfig.getEncryptors().containsKey(column.getEncryptorName());
-    }
-    
-    private boolean 
isValidAssistColumnConfigurationWithAlgorithmProvided(final 
AlgorithmProvidedEncryptRuleConfiguration encryptRuleConfig, final 
EncryptColumnRuleConfiguration column) {
-        if (Strings.isNullOrEmpty(column.getAssistedQueryColumn()) && 
Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName())) {
-            return true;
-        }
-        return !Strings.isNullOrEmpty(column.getAssistedQueryColumn()) && 
!Strings.isNullOrEmpty(column.getAssistedQueryEncryptorName())
-                && 
encryptRuleConfig.getEncryptors().containsKey(column.getAssistedQueryEncryptorName());
-    }
-    
     /**
      * Find encrypt table.
      * 
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
index 8ec69cf26f7..3440d21c59e 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
@@ -18,11 +18,14 @@
 package org.apache.shardingsphere.encrypt.checker;
 
 import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
 import org.junit.Test;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -36,7 +39,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
     
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Test
-    public void assertValidCheck() {
+    public void assertCheckWhenConfigValidConfiguration() {
         AlgorithmProvidedEncryptRuleConfiguration config = 
createValidConfiguration();
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
@@ -44,26 +47,49 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
         checker.get().check("test", config);
     }
     
+    @SuppressWarnings("unchecked")
     private AlgorithmProvidedEncryptRuleConfiguration 
createValidConfiguration() {
         AlgorithmProvidedEncryptRuleConfiguration result = 
mock(AlgorithmProvidedEncryptRuleConfiguration.class);
-        EncryptAlgorithm<?, ?> encryptAlgorithm = mock(EncryptAlgorithm.class);
-        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("type1", 
encryptAlgorithm));
+        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 mock(EncryptAlgorithm.class)));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Test(expected = IllegalStateException.class)
-    public void assertInvalidCheck() {
-        AlgorithmProvidedEncryptRuleConfiguration config = 
createInvalidConfiguration();
+    public void assertCheckWhenConfigInvalidCipherColumn() {
+        AlgorithmProvidedEncryptRuleConfiguration config = 
createInvalidCipherColumnConfig();
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(AlgorithmProvidedEncryptRuleConfigurationChecker.class));
         checker.get().check("test", config);
     }
     
-    private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidConfiguration() {
+    private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidCipherColumnConfig() {
         AlgorithmProvidedEncryptRuleConfiguration result = 
mock(AlgorithmProvidedEncryptRuleConfiguration.class);
         when(result.getEncryptors()).thenReturn(Collections.emptyMap());
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
+        return result;
+    }
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    @Test(expected = IllegalStateException.class)
+    public void assertCheckWhenConfigInvalidAssistColumn() {
+        AlgorithmProvidedEncryptRuleConfiguration config = 
createInvalidAssistColumnConfig();
+        Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
+        assertTrue(checker.isPresent());
+        assertThat(checker.get(), 
instanceOf(AlgorithmProvidedEncryptRuleConfigurationChecker.class));
+        checker.get().check("test", config);
+    }
+    
+    private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidAssistColumnConfig() {
+        AlgorithmProvidedEncryptRuleConfiguration result = 
mock(AlgorithmProvidedEncryptRuleConfiguration.class);
+        when(result.getEncryptors()).thenReturn(Collections.emptyMap());
+        Collection<EncryptColumnRuleConfiguration> columns =
+                Collections.singletonList(new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "user_assisted", 
"user_plain", "aes_encryptor", "aes_assisted_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
index 30fb1f66ce3..306b652542d 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
@@ -18,11 +18,14 @@
 package org.apache.shardingsphere.encrypt.checker;
 
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
+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.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.infra.config.checker.RuleConfigurationCheckerFactory;
 import org.junit.Test;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
 
@@ -36,7 +39,7 @@ public final class EncryptRuleConfigurationCheckerTest {
     
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Test
-    public void assertValidCheck() {
+    public void assertCheckWhenConfigValidConfiguration() {
         EncryptRuleConfiguration config = createValidConfiguration();
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
@@ -46,23 +49,46 @@ public final class EncryptRuleConfigurationCheckerTest {
     
     private EncryptRuleConfiguration createValidConfiguration() {
         EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
-        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("type1", 
mock(ShardingSphereAlgorithmConfiguration.class)));
+        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 mock(ShardingSphereAlgorithmConfiguration.class)));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Test(expected = IllegalStateException.class)
-    public void assertInvalidCheck() {
-        EncryptRuleConfiguration config = createInvalidConfiguration();
+    public void assertCheckWhenConfigInvalidCipherColumn() {
+        EncryptRuleConfiguration config = createInvalidCipherColumnConfig();
         Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
         assertTrue(checker.isPresent());
         assertThat(checker.get(), 
instanceOf(EncryptRuleConfigurationChecker.class));
         checker.get().check("test", config);
     }
     
-    private EncryptRuleConfiguration createInvalidConfiguration() {
+    private EncryptRuleConfiguration createInvalidCipherColumnConfig() {
         EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
         when(result.getEncryptors()).thenReturn(Collections.emptyMap());
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
+        return result;
+    }
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    @Test(expected = IllegalStateException.class)
+    public void assertCheckWhenConfigInvalidAssistColumn() {
+        EncryptRuleConfiguration config = createInvalidAssistColumnConfig();
+        Optional<RuleConfigurationChecker> checker = 
RuleConfigurationCheckerFactory.findInstance(config);
+        assertTrue(checker.isPresent());
+        assertThat(checker.get(), 
instanceOf(EncryptRuleConfigurationChecker.class));
+        checker.get().check("test", config);
+    }
+    
+    private EncryptRuleConfiguration createInvalidAssistColumnConfig() {
+        EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
+        when(result.getEncryptors()).thenReturn(Collections.emptyMap());
+        Collection<EncryptColumnRuleConfiguration> columns =
+                Collections.singletonList(new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "user_assisted", 
"user_plain", "aes_encryptor", "aes_assisted_encryptor", false));
+        when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index 25408e351ee..89143e6a4c0 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -58,24 +58,6 @@ public final class EncryptRuleTest {
         assertTrue(actual.findEncryptTable("t_encrypt").isPresent());
     }
     
-    @Test(expected = IllegalArgumentException.class)
-    public void assertNewInstanceWithInvalidConfiguration() {
-        ShardingSphereAlgorithmConfiguration encryptAlgorithmConfig = new 
ShardingSphereAlgorithmConfiguration("CORE.FIXTURE", new Properties());
-        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", null);
-        EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), null);
-        EncryptRuleConfiguration ruleConfig = new 
EncryptRuleConfiguration(Collections.singleton(tableConfig), 
Collections.singletonMap("invalid_encryptor", encryptAlgorithmConfig));
-        new EncryptRule(ruleConfig);
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void 
assertNewInstanceWithInvalidAlgorithmProvidedEncryptRuleConfiguration() {
-        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", null);
-        EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), null);
-        AlgorithmProvidedEncryptRuleConfiguration ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(
-                Collections.singleton(tableConfig), 
Collections.singletonMap("invalid_encryptor", new 
CoreEncryptAlgorithmFixture()), true);
-        new EncryptRule(ruleConfig);
-    }
-    
     @Test
     public void assertFindEncryptTable() {
         assertTrue(new 
EncryptRule(createEncryptRuleConfiguration()).findEncryptTable("t_encrypt").isPresent());
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
index 9d12d5546e9..32a77180269 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
@@ -45,15 +45,16 @@ public abstract class 
AbstractReadwriteSplittingRuleConfigurationChecker<T exten
         for (ReadwriteSplittingDataSourceRuleConfiguration each : dataSources) 
{
             Preconditions.checkState(null != each.getStaticStrategy() || null 
!= each.getDynamicStrategy(),
                     "No available readwrite-splitting rule configuration in 
database `%s`.", databaseName);
-            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(writeDataSourceNames, readDataSourceNames, optional));
+            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(databaseName, writeDataSourceNames, readDataSourceNames, 
optional));
         }
     }
     
-    private void checkStaticStrategy(final Collection<String> 
writeDataSourceNames, final Collection<String> readDataSourceNames, final 
StaticReadwriteSplittingStrategyConfiguration strategyConfig) {
+    private void checkStaticStrategy(final String databaseName, final 
Collection<String> writeDataSourceNames,
+                                     final Collection<String> 
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration 
strategyConfig) {
         
Preconditions.checkState(writeDataSourceNames.add(strategyConfig.getWriteDataSourceName()),
-                "Can not config duplicate write dataSource `%s` in multi 
readwrite-splitting rule configurations.", 
strategyConfig.getWriteDataSourceName());
+                "Can not config duplicate write dataSource `%s` in database 
`%s`.", strategyConfig.getWriteDataSourceName(), databaseName);
         
Preconditions.checkState(readDataSourceNames.addAll(strategyConfig.getReadDataSourceNames()),
-                "Can not config duplicate read dataSources `%s` in multi 
readwrite-splitting rule configurations.", 
strategyConfig.getReadDataSourceNames());
+                "Can not config duplicate read dataSources `%s` in database 
`%s`.", strategyConfig.getReadDataSourceNames(), databaseName);
     }
     
     protected abstract 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> getDataSources(T 
config);
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
index 88d978f53d7..a1fb1d7c7ce 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/checker/AbstractShardingRuleConfigurationChecker.java
@@ -41,31 +41,31 @@ public abstract class 
AbstractShardingRuleConfigurationChecker<T extends RuleCon
         Collection<String> keyGenerators = getKeyGenerators(config);
         Collection<String> auditors = getAuditors(config);
         Collection<String> shardingAlgorithms = getShardingAlgorithms(config);
-        checkTableConfiguration(getTables(config), getAutoTables(config), 
keyGenerators, auditors, shardingAlgorithms, databaseName);
-        checkKeyGenerateStrategy(getDefaultKeyGenerateStrategy(config), 
keyGenerators, databaseName);
-        checkAuditStrategy(getDefaultAuditStrategy(config), auditors, 
databaseName);
-        checkShardingStrategy(getDefaultDatabaseShardingStrategy(config), 
shardingAlgorithms, databaseName);
-        checkShardingStrategy(getDefaultTableShardingStrategy(config), 
shardingAlgorithms, databaseName);
+        checkTableConfiguration(databaseName, getTables(config), 
getAutoTables(config), keyGenerators, auditors, shardingAlgorithms);
+        checkKeyGenerateStrategy(databaseName, 
getDefaultKeyGenerateStrategy(config), keyGenerators);
+        checkAuditStrategy(databaseName, getDefaultAuditStrategy(config), 
auditors);
+        checkShardingStrategy(databaseName, 
getDefaultDatabaseShardingStrategy(config), shardingAlgorithms);
+        checkShardingStrategy(databaseName, 
getDefaultTableShardingStrategy(config), shardingAlgorithms);
     }
     
-    private void checkTableConfiguration(final 
Collection<ShardingTableRuleConfiguration> tables, final 
Collection<ShardingAutoTableRuleConfiguration> autoTables,
-                                         final Collection<String> 
keyGenerators, final Collection<String> auditors, final Collection<String> 
shardingAlgorithms, final String databaseName) {
+    private void checkTableConfiguration(final String databaseName, final 
Collection<ShardingTableRuleConfiguration> tables, final 
Collection<ShardingAutoTableRuleConfiguration> autoTables,
+                                         final Collection<String> 
keyGenerators, final Collection<String> auditors, final Collection<String> 
shardingAlgorithms) {
         Preconditions.checkState(!tables.isEmpty() || !autoTables.isEmpty(),
                 "No available sharding table or autoTable configurations in 
database `%s`.", databaseName);
         for (ShardingTableRuleConfiguration each : tables) {
-            checkKeyGenerateStrategy(each.getKeyGenerateStrategy(), 
keyGenerators, databaseName);
-            checkAuditStrategy(each.getAuditStrategy(), auditors, 
databaseName);
-            checkShardingStrategy(each.getDatabaseShardingStrategy(), 
shardingAlgorithms, databaseName);
-            checkShardingStrategy(each.getTableShardingStrategy(), 
shardingAlgorithms, databaseName);
+            checkKeyGenerateStrategy(databaseName, 
each.getKeyGenerateStrategy(), keyGenerators);
+            checkAuditStrategy(databaseName, each.getAuditStrategy(), 
auditors);
+            checkShardingStrategy(databaseName, 
each.getDatabaseShardingStrategy(), shardingAlgorithms);
+            checkShardingStrategy(databaseName, 
each.getTableShardingStrategy(), shardingAlgorithms);
         }
         for (ShardingAutoTableRuleConfiguration each : autoTables) {
-            checkKeyGenerateStrategy(each.getKeyGenerateStrategy(), 
keyGenerators, databaseName);
-            checkAuditStrategy(each.getAuditStrategy(), auditors, 
databaseName);
-            checkShardingStrategy(each.getShardingStrategy(), 
shardingAlgorithms, databaseName);
+            checkKeyGenerateStrategy(databaseName, 
each.getKeyGenerateStrategy(), keyGenerators);
+            checkAuditStrategy(databaseName, each.getAuditStrategy(), 
auditors);
+            checkShardingStrategy(databaseName, each.getShardingStrategy(), 
shardingAlgorithms);
         }
     }
     
-    private void checkKeyGenerateStrategy(final 
KeyGenerateStrategyConfiguration keyGenerateStrategy, final Collection<String> 
keyGenerators, final String databaseName) {
+    private void checkKeyGenerateStrategy(final String databaseName, final 
KeyGenerateStrategyConfiguration keyGenerateStrategy, final Collection<String> 
keyGenerators) {
         if (null == keyGenerateStrategy) {
             return;
         }
@@ -73,7 +73,7 @@ public abstract class 
AbstractShardingRuleConfigurationChecker<T extends RuleCon
                 "Can not find keyGenerator `%s` in database `%s`.", 
keyGenerateStrategy.getKeyGeneratorName(), databaseName);
     }
     
-    private void checkAuditStrategy(final ShardingAuditStrategyConfiguration 
auditStrategy, final Collection<String> auditors, final String databaseName) {
+    private void checkAuditStrategy(final String databaseName, final 
ShardingAuditStrategyConfiguration auditStrategy, final Collection<String> 
auditors) {
         if (null == auditStrategy) {
             return;
         }
@@ -81,7 +81,7 @@ public abstract class 
AbstractShardingRuleConfigurationChecker<T extends RuleCon
                 "Can not find all auditors `%s` in database `%s`.", 
auditStrategy.getAuditorNames(), databaseName);
     }
     
-    private void checkShardingStrategy(final ShardingStrategyConfiguration 
shardingStrategy, final Collection<String> shardingAlgorithms, final String 
databaseName) {
+    private void checkShardingStrategy(final String databaseName, final 
ShardingStrategyConfiguration shardingStrategy, final Collection<String> 
shardingAlgorithms) {
         if (null == shardingStrategy || shardingStrategy instanceof 
NoneShardingStrategyConfiguration) {
             return;
         }

Reply via email to