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

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


The following commit(s) were added to refs/heads/master by this push:
     new e37cedbc6a2 Remove ImportRuleConfigurationProvider (#30629)
e37cedbc6a2 is described below

commit e37cedbc6a2c2e0f1032872b8757f62a369ff7a8
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Mar 25 10:04:05 2024 +0800

    Remove ImportRuleConfigurationProvider (#30629)
    
    * Refactor AlterEncryptRuleExecutorTest
    
    * Move ImportRuleConfigurationChecker
    
    * Move ImportRuleConfigurationChecker
    
    * Move ImportRuleConfigurationChecker
    
    * Merge EncryptRuleConfigurationChecker and 
EncryptImportRuleConfigurationProvider
    
    * Merge MaskRuleConfigurationChecker and MaskImportRuleConfigurationProvider
    
    * Merge ReadwriteSplittingRuleConfigurationChecker and 
ReadwriteSplittingImportRuleConfigurationProvider
    
    * Merge ShadowRuleConfigurationChecker and 
ShadowImportRuleConfigurationProvider
    
    * Merge ShardingRuleConfigurationChecker and 
ShardingImportRuleConfigurationProvider
    
    * Merge ShardingRuleConfigurationChecker and 
ShardingImportRuleConfigurationProvider
---
 .../checker/EncryptRuleConfigurationChecker.java   | 47 +++++++----
 .../EncryptRuleConfigurationCheckerTest.java       |  9 ++-
 .../EncryptImportRuleConfigurationProvider.java    | 77 ------------------
 .../handler/update/CreateEncryptRuleExecutor.java  |  2 +-
 ...le.spi.database.ImportRuleConfigurationProvider | 18 -----
 .../update/AlterEncryptRuleExecutorTest.java       |  3 +-
 .../mask/checker/MaskRuleConfigurationChecker.java | 21 ++++-
 .../MaskImportRuleConfigurationProvider.java       | 68 ----------------
 ...le.spi.database.ImportRuleConfigurationProvider | 18 -----
 ...ReadwriteSplittingRuleConfigurationChecker.java | 48 ++++++-----
 ...teSplittingImportRuleConfigurationProvider.java | 61 --------------
 ...le.spi.database.ImportRuleConfigurationProvider | 18 -----
 ...littingImportRuleConfigurationProviderTest.java | 81 -------------------
 .../checker/ShadowRuleConfigurationChecker.java    | 34 +++++++-
 .../ShadowRuleConfigurationCheckerTest.java        |  2 +-
 .../ShadowImportRuleConfigurationProvider.java     | 72 -----------------
 .../AlterDefaultShadowAlgorithmExecutor.java       |  4 +-
 .../handler/update/AlterShadowRuleExecutor.java    |  2 +-
 .../CreateDefaultShadowAlgorithmExecutor.java      |  4 +-
 .../update/DropDefaultShadowAlgorithmExecutor.java |  2 +-
 .../update/DropShadowAlgorithmExecutor.java        |  4 +-
 ...le.spi.database.ImportRuleConfigurationProvider | 18 -----
 .../AlterDefaultShadowAlgorithmExecutorTest.java   |  4 +-
 .../update/AlterShadowRuleExecutorTest.java        |  2 +-
 .../DropDefaultShadowAlgorithmExecutorTest.java    |  2 +-
 .../checker/ShardingRuleConfigurationChecker.java  | 49 ++++++++++++
 .../ShardingRuleConfigurationCheckerTest.java      | 11 ++-
 .../checker/ShardingTableRuleStatementChecker.java |  2 +-
 .../ShardingImportRuleConfigurationProvider.java   | 90 ---------------------
 .../AlterDefaultShardingStrategyExecutor.java      |  4 +-
 .../CreateDefaultShardingStrategyExecutor.java     |  4 +-
 .../update/DropShardingAlgorithmExecutor.java      |  4 +-
 .../update/DropShardingAuditorExecutor.java        |  4 +-
 .../update/DropShardingKeyGeneratorExecutor.java   |  4 +-
 ...le.spi.database.ImportRuleConfigurationProvider | 18 -----
 .../checker/ShardingRuleStatementCheckerTest.java  |  2 +-
 ...hardingImportRuleConfigurationProviderTest.java | 93 ----------------------
 .../AlterDefaultShardingStrategyExecutorTest.java  |  4 +-
 .../CreateDefaultShardingStrategyExecutorTest.java |  4 +-
 .../CreateShardingTableRuleExecutorTest.java       |  4 +-
 .../update/DropShardingAlgorithmExecutorTest.java  |  4 +-
 .../update/DropShardingAuditorExecutorTest.java    |  4 +-
 .../DropShardingKeyGeneratorExecutorTest.java      |  4 +-
 .../checker/RuleConfigurationCheckEngine.java}     | 28 ++++---
 .../rule/checker/RuleConfigurationChecker.java     | 11 +++
 .../algorithm/AlgorithmInUsedException.java        |  5 +-
 .../algorithm/DuplicateAlgorithmException.java     |  5 +-
 .../InvalidAlgorithmConfigurationException.java    |  5 +-
 .../MissingRequiredAlgorithmException.java         |  5 +-
 .../database/ImportRuleConfigurationProvider.java  | 55 -------------
 .../category/AlgorithmDefinitionException.java}    | 16 ++--
 .../distsql/ral/updatable/LockClusterExecutor.java |  2 +-
 .../YamlDatabaseConfigurationImportExecutor.java   |  4 +-
 53 files changed, 259 insertions(+), 807 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
index c66135ebe91..4ea6481d65c 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
@@ -28,14 +28,19 @@ import 
org.apache.shardingsphere.encrypt.exception.metadata.EncryptCipherColumnN
 import 
org.apache.shardingsphere.encrypt.exception.metadata.EncryptLikeQueryColumnNotFoundException;
 import 
org.apache.shardingsphere.encrypt.exception.metadata.MissingEncryptorException;
 import 
org.apache.shardingsphere.encrypt.exception.metadata.UnregisteredEncryptorException;
+import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 
 import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 /**
  * Encrypt rule configuration checker.
@@ -44,41 +49,51 @@ public final class EncryptRuleConfigurationChecker 
implements RuleConfigurationC
     
     @Override
     public void check(final String databaseName, final 
EncryptRuleConfiguration ruleConfig, final Map<String, DataSource> 
dataSourceMap, final Collection<ShardingSphereRule> builtRules) {
-        checkTableConfiguration(databaseName, ruleConfig.getTables(), 
ruleConfig.getEncryptors());
+        checkEncryptors(ruleConfig.getEncryptors());
+        checkTables(databaseName, ruleConfig.getTables(), 
ruleConfig.getEncryptors());
     }
     
-    private void checkTableConfiguration(final String databaseName, final 
Collection<EncryptTableRuleConfiguration> tableRuleConfigs, final Map<String, 
AlgorithmConfiguration> encryptors) {
-        for (EncryptTableRuleConfiguration each : tableRuleConfigs) {
-            checkColumnConfiguration(databaseName, each, encryptors);
-        }
+    private void checkEncryptors(final Map<String, AlgorithmConfiguration> 
encryptors) {
+        encryptors.values().forEach(each -> 
TypedSPILoader.checkService(EncryptAlgorithm.class, each.getType(), 
each.getProps()));
+    }
+    
+    private void checkTables(final String databaseName, final 
Collection<EncryptTableRuleConfiguration> tableRuleConfigs, final Map<String, 
AlgorithmConfiguration> encryptors) {
+        checkTablesNotDuplicated(databaseName, tableRuleConfigs);
+        tableRuleConfigs.forEach(each -> checkColumns(databaseName, each, 
encryptors));
+    }
+    
+    private void checkTablesNotDuplicated(final String databaseName, final 
Collection<EncryptTableRuleConfiguration> tableRuleConfigs) {
+        Collection<String> duplicatedTables = 
tableRuleConfigs.stream().map(EncryptTableRuleConfiguration::getName)
+                .collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream().filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("ENCRYPT", databaseName, duplicatedTables));
     }
     
-    private void checkColumnConfiguration(final String databaseName, final 
EncryptTableRuleConfiguration tableRuleConfig, final Map<String, 
AlgorithmConfiguration> encryptors) {
+    private void checkColumns(final String databaseName, final 
EncryptTableRuleConfiguration tableRuleConfig, final Map<String, 
AlgorithmConfiguration> encryptors) {
         for (EncryptColumnRuleConfiguration each : 
tableRuleConfig.getColumns()) {
-            checkCipherColumnConfiguration(databaseName, 
tableRuleConfig.getName(), each.getName(), each.getCipher(), encryptors);
-            each.getAssistedQuery().ifPresent(optional -> 
checkAssistColumnConfiguration(databaseName, tableRuleConfig.getName(), 
each.getName(), optional, encryptors));
-            each.getLikeQuery().ifPresent(optional -> 
checkLikeColumnConfiguration(databaseName, tableRuleConfig.getName(), 
each.getName(), optional, encryptors));
+            checkCipherColumn(databaseName, tableRuleConfig.getName(), 
each.getName(), each.getCipher(), encryptors);
+            each.getAssistedQuery().ifPresent(optional -> 
checkAssistColumn(databaseName, tableRuleConfig.getName(), each.getName(), 
optional, encryptors));
+            each.getLikeQuery().ifPresent(optional -> 
checkLikeColumn(databaseName, tableRuleConfig.getName(), each.getName(), 
optional, encryptors));
         }
     }
     
-    private void checkCipherColumnConfiguration(final String databaseName, 
final String tableName, final String logicColumnName,
-                                                final 
EncryptColumnItemRuleConfiguration cipherColumnConfig, final Map<String, 
AlgorithmConfiguration> encryptors) {
+    private void checkCipherColumn(final String databaseName, final String 
tableName, final String logicColumnName,
+                                   final EncryptColumnItemRuleConfiguration 
cipherColumnConfig, final Map<String, AlgorithmConfiguration> encryptors) {
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(cipherColumnConfig.getName()),
 () -> new EncryptCipherColumnNotFoundException(logicColumnName, databaseName));
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(cipherColumnConfig.getEncryptorName()),
 () -> new MissingEncryptorException(tableName, logicColumnName, "STANDARD"));
         
ShardingSpherePreconditions.checkState(encryptors.containsKey(cipherColumnConfig.getEncryptorName()),
                 () -> new UnregisteredEncryptorException(databaseName, 
cipherColumnConfig.getEncryptorName()));
     }
     
-    private void checkAssistColumnConfiguration(final String databaseName, 
final String tableName, final String logicColumnName,
-                                                final 
EncryptColumnItemRuleConfiguration assistedQueryColumnConfig, final Map<String, 
AlgorithmConfiguration> encryptors) {
+    private void checkAssistColumn(final String databaseName, final String 
tableName, final String logicColumnName,
+                                   final EncryptColumnItemRuleConfiguration 
assistedQueryColumnConfig, final Map<String, AlgorithmConfiguration> 
encryptors) {
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(assistedQueryColumnConfig.getName()),
 () -> new EncryptAssistedQueryColumnNotFoundException(logicColumnName, 
databaseName));
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(assistedQueryColumnConfig.getEncryptorName()),
 () -> new MissingEncryptorException(tableName, logicColumnName, 
"ASSIST_QUERY"));
         ShardingSpherePreconditions.checkState(
                 
encryptors.containsKey(assistedQueryColumnConfig.getEncryptorName()), () -> new 
UnregisteredEncryptorException(databaseName, 
assistedQueryColumnConfig.getEncryptorName()));
     }
     
-    private void checkLikeColumnConfiguration(final String databaseName, final 
String tableName, final String logicColumnName,
-                                              final 
EncryptColumnItemRuleConfiguration likeQueryColumnConfig, final Map<String, 
AlgorithmConfiguration> encryptors) {
+    private void checkLikeColumn(final String databaseName, final String 
tableName, final String logicColumnName,
+                                 final EncryptColumnItemRuleConfiguration 
likeQueryColumnConfig, final Map<String, AlgorithmConfiguration> encryptors) {
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(likeQueryColumnConfig.getName()),
 () -> new EncryptLikeQueryColumnNotFoundException(logicColumnName, 
databaseName));
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(likeQueryColumnConfig.getEncryptorName()),
 () -> new MissingEncryptorException(tableName, logicColumnName, "LIKE_QUERY"));
         
ShardingSpherePreconditions.checkState(encryptors.containsKey(likeQueryColumnConfig.getEncryptorName()),
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
index e6814d40c8f..0075f3ae01c 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
@@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Properties;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -39,14 +40,14 @@ class EncryptRuleConfigurationCheckerTest {
     @SuppressWarnings({"rawtypes", "unchecked"})
     @Test
     void assertCheckWhenConfigValidConfiguration() {
-        EncryptRuleConfiguration config = createValidConfiguration();
-        RuleConfigurationChecker checker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(config.getClass())).get(config.getClass());
-        checker.check("test", config, Collections.emptyMap(), 
Collections.emptyList());
+        EncryptRuleConfiguration ruleConfig = createValidConfiguration();
+        RuleConfigurationChecker checker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
+        checker.check("test", ruleConfig, Collections.emptyMap(), 
Collections.emptyList());
     }
     
     private EncryptRuleConfiguration createValidConfiguration() {
         EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
-        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 mock(AlgorithmConfiguration.class)));
+        
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 new AlgorithmConfiguration("MD5", new Properties())));
         EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", new 
EncryptColumnItemRuleConfiguration("user_cipher", "aes_encryptor"));
         Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singleton(columnRuleConfig);
         when(result.getTables()).thenReturn(Collections.singleton(new 
EncryptTableRuleConfiguration("t_encrypt", columns)));
diff --git 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptImportRuleConfigurationProvider.java
 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptImportRuleConfigurationProvider.java
deleted file mode 100644
index eca437af360..00000000000
--- 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/provider/EncryptImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.encrypt.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
-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.spi.EncryptAlgorithm;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * Encrypt import rule configuration provider.
- */
-public final class EncryptImportRuleConfigurationProvider implements 
ImportRuleConfigurationProvider<EncryptRuleConfiguration> {
-    
-    @Override
-    public void check(final String databaseName, final 
EncryptRuleConfiguration ruleConfig) {
-        checkTables(databaseName, ruleConfig);
-        checkEncryptors(ruleConfig);
-        checkTableEncryptorsExisted(databaseName, ruleConfig);
-    }
-    
-    private void checkTables(final String databaseName, final 
EncryptRuleConfiguration ruleConfig) {
-        Collection<String> tableNames = 
ruleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
-        Collection<String> duplicatedTables = 
tableNames.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
-                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
-        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("ENCRYPT", databaseName, duplicatedTables));
-    }
-    
-    private void checkEncryptors(final EncryptRuleConfiguration ruleConfig) {
-        ruleConfig.getEncryptors().values().forEach(each -> 
TypedSPILoader.checkService(EncryptAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    private void checkTableEncryptorsExisted(final String databaseName, final 
EncryptRuleConfiguration ruleConfig) {
-        Collection<EncryptColumnRuleConfiguration> columns = new 
LinkedList<>();
-        ruleConfig.getTables().forEach(each -> 
columns.addAll(each.getColumns()));
-        Collection<String> notExistedEncryptors = 
columns.stream().map(optional -> 
optional.getCipher().getEncryptorName()).collect(Collectors.toList());
-        notExistedEncryptors.addAll(
-                columns.stream().map(optional -> 
optional.getLikeQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList()));
-        notExistedEncryptors.addAll(columns.stream().map(optional -> 
optional.getAssistedQuery().map(EncryptColumnItemRuleConfiguration::getEncryptorName).orElse(null)).filter(Objects::nonNull)
-                .collect(Collectors.toList()));
-        Collection<String> encryptors = ruleConfig.getEncryptors().keySet();
-        notExistedEncryptors.removeIf(encryptors::contains);
-        ShardingSpherePreconditions.checkState(notExistedEncryptors.isEmpty(), 
() -> new MissingRequiredAlgorithmException(databaseName, 
notExistedEncryptors));
-    }
-    
-    @Override
-    public Class<EncryptRuleConfiguration> getType() {
-        return EncryptRuleConfiguration.class;
-    }
-}
diff --git 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutor.java
 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutor.java
index c100b997b55..caed06aaa23 100644
--- 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutor.java
+++ 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleExecutor.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.encrypt.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.exception.rule.InvalidRuleConfigurationException;
 import 
org.apache.shardingsphere.infra.exception.storageunit.EmptyStorageUnitException;
diff --git 
a/features/encrypt/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
 
b/features/encrypt/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
deleted file mode 100644
index 544470758ce..00000000000
--- 
a/features/encrypt/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.encrypt.distsql.handler.provider.EncryptImportRuleConfigurationProvider
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java
index fa1553ae422..fe77f4a7cf8 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleExecutorTest.java
@@ -62,8 +62,7 @@ class AlterEncryptRuleExecutorTest {
         EncryptRule rule = mock(EncryptRule.class);
         when(rule.getConfiguration()).thenReturn(new 
EncryptRuleConfiguration(Collections.emptyList(), Collections.emptyMap()));
         executor.setRule(rule);
-        assertThrows(MissingRequiredRuleException.class,
-                () -> executor.checkBeforeUpdate(createSQLStatement("MD5")));
+        assertThrows(MissingRequiredRuleException.class, () -> 
executor.checkBeforeUpdate(createSQLStatement("MD5")));
     }
     
     @Test
diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
index 39ac6e928de..74add9d483e 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
@@ -21,15 +21,20 @@ import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfigurat
 import 
org.apache.shardingsphere.infra.algorithm.core.exception.AlgorithmNotFoundOnColumnException;
 import 
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
 import 
org.apache.shardingsphere.mask.api.config.rule.MaskColumnRuleConfiguration;
 import 
org.apache.shardingsphere.mask.api.config.rule.MaskTableRuleConfiguration;
 import org.apache.shardingsphere.mask.constant.MaskOrder;
+import org.apache.shardingsphere.mask.spi.MaskAlgorithm;
 
 import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 /**
  * Mask rule configuration checker.
@@ -38,13 +43,23 @@ public final class MaskRuleConfigurationChecker implements 
RuleConfigurationChec
     
     @Override
     public void check(final String databaseName, final MaskRuleConfiguration 
ruleConfig, final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> builtRules) {
+        checkMaskAlgorithms(ruleConfig.getMaskAlgorithms());
         checkTables(databaseName, ruleConfig.getTables(), 
ruleConfig.getMaskAlgorithms());
     }
     
+    private void checkMaskAlgorithms(final Map<String, AlgorithmConfiguration> 
maskAlgorithms) {
+        maskAlgorithms.values().forEach(each -> 
TypedSPILoader.checkService(MaskAlgorithm.class, each.getType(), 
each.getProps()));
+    }
+    
     private void checkTables(final String databaseName, final 
Collection<MaskTableRuleConfiguration> tables, final Map<String, 
AlgorithmConfiguration> maskAlgorithms) {
-        for (MaskTableRuleConfiguration each : tables) {
-            checkColumns(databaseName, each.getName(), each.getColumns(), 
maskAlgorithms);
-        }
+        checkTablesNotDuplicated(databaseName, tables);
+        tables.forEach(each -> checkColumns(databaseName, each.getName(), 
each.getColumns(), maskAlgorithms));
+    }
+    
+    private void checkTablesNotDuplicated(final String databaseName, final 
Collection<MaskTableRuleConfiguration> tables) {
+        Collection<String> duplicatedTables = 
tables.stream().map(MaskTableRuleConfiguration::getName)
+                .collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream().filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("MASK", databaseName, duplicatedTables));
     }
     
     private void checkColumns(final String databaseName, final String 
tableName, final Collection<MaskColumnRuleConfiguration> columns, final 
Map<String, AlgorithmConfiguration> maskAlgorithms) {
diff --git 
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/provider/MaskImportRuleConfigurationProvider.java
 
b/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/provider/MaskImportRuleConfigurationProvider.java
deleted file mode 100644
index 2255d033a64..00000000000
--- 
a/features/mask/distsql/handler/src/main/java/org/apache/shardingsphere/mask/distsql/handler/provider/MaskImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mask.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
-import 
org.apache.shardingsphere.mask.api.config.rule.MaskColumnRuleConfiguration;
-import 
org.apache.shardingsphere.mask.api.config.rule.MaskTableRuleConfiguration;
-import org.apache.shardingsphere.mask.spi.MaskAlgorithm;
-
-import java.util.Collection;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
-/**
- * Mask import rule configuration provider.
- */
-public final class MaskImportRuleConfigurationProvider implements 
ImportRuleConfigurationProvider<MaskRuleConfiguration> {
-    
-    @Override
-    public void check(final String databaseName, final MaskRuleConfiguration 
ruleConfig) {
-        checkTables(databaseName, ruleConfig);
-        checkMaskAlgorithms(ruleConfig);
-        checkMaskAlgorithmsExisted(databaseName, ruleConfig);
-    }
-    
-    private void checkTables(final String databaseName, final 
MaskRuleConfiguration ruleConfig) {
-        Collection<String> tableNames = 
ruleConfig.getTables().stream().map(MaskTableRuleConfiguration::getName).collect(Collectors.toList());
-        Collection<String> duplicatedTables = 
tableNames.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
-                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
-        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("MASK", databaseName, duplicatedTables));
-    }
-    
-    private void checkMaskAlgorithms(final MaskRuleConfiguration ruleConfig) {
-        ruleConfig.getMaskAlgorithms().values().forEach(each -> 
TypedSPILoader.checkService(MaskAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    private void checkMaskAlgorithmsExisted(final String databaseName, final 
MaskRuleConfiguration ruleConfig) {
-        Collection<String> notExistedAlgorithms = 
ruleConfig.getTables().stream()
-                .flatMap(each -> 
each.getColumns().stream()).map(MaskColumnRuleConfiguration::getMaskAlgorithm).collect(Collectors.toList());
-        
notExistedAlgorithms.removeIf(ruleConfig.getMaskAlgorithms().keySet()::contains);
-        ShardingSpherePreconditions.checkState(notExistedAlgorithms.isEmpty(), 
() -> new MissingRequiredAlgorithmException(databaseName, 
notExistedAlgorithms));
-    }
-    
-    @Override
-    public Class<MaskRuleConfiguration> getType() {
-        return MaskRuleConfiguration.class;
-    }
-}
diff --git 
a/features/mask/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
 
b/features/mask/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
deleted file mode 100644
index 04b5da428c0..00000000000
--- 
a/features/mask/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.mask.distsql.handler.provider.MaskImportRuleConfigurationProvider
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
index f6bc2cb4f94..8bb5bd43f9e 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
@@ -38,9 +38,10 @@ import 
org.apache.shardingsphere.readwritesplitting.exception.checker.MissingReq
 import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Optional;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 /**
  * Readwrite-splitting rule configuration checker.
@@ -51,7 +52,7 @@ public final class ReadwriteSplittingRuleConfigurationChecker 
implements RuleCon
     public void check(final String databaseName, final 
ReadwriteSplittingRuleConfiguration ruleConfig, final Map<String, DataSource> 
dataSourceMap, final Collection<ShardingSphereRule> builtRules) {
         Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs = 
ruleConfig.getDataSources();
         checkDataSources(databaseName, configs, dataSourceMap, builtRules);
-        checkLoadBalancer(databaseName, configs, getLoadBalancer(ruleConfig));
+        checkLoadBalancer(databaseName, ruleConfig);
     }
     
     private void checkDataSources(final String databaseName, final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs,
@@ -66,33 +67,28 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
     
     private void checkDataSources(final String databaseName, final Map<String, 
DataSource> dataSourceMap,
                                   final 
ReadwriteSplittingDataSourceRuleConfiguration config, final Collection<String> 
addedWriteDataSourceNames,
-                                  final Collection<String> 
readDataSourceNames, final Collection<ShardingSphereRule> rules) {
+                                  final Collection<String> 
readDataSourceNames, final Collection<ShardingSphereRule> builtRules) {
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(config.getWriteDataSourceName()),
 () -> new MissingRequiredWriteDataSourceNameException(databaseName));
         
ShardingSpherePreconditions.checkState(!config.getReadDataSourceNames().isEmpty(),
 () -> new MissingRequiredReadDataSourceNamesException(databaseName));
-        checkWriteDataSourceNames(databaseName, dataSourceMap, 
addedWriteDataSourceNames, config, rules);
+        checkWriteDataSourceNames(databaseName, dataSourceMap, 
addedWriteDataSourceNames, config, builtRules);
         for (String each : config.getReadDataSourceNames()) {
-            checkReadeDataSourceNames(databaseName, dataSourceMap, 
readDataSourceNames, each, rules);
+            checkReadeDataSourceNames(databaseName, dataSourceMap, 
readDataSourceNames, each, builtRules);
         }
     }
     
     private void checkWriteDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
addedWriteDataSourceNames,
-                                           final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
Collection<ShardingSphereRule> rules) {
+                                           final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
Collection<ShardingSphereRule> builtRules) {
         for (String each : 
InlineExpressionParserFactory.newInstance(config.getWriteDataSourceName()).splitAndEvaluate())
 {
-            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, rules),
+            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, builtRules),
                     () -> new 
DataSourceNameNotExistedException(String.format("Write data source name `%s` 
not in database `%s`.", each, databaseName)));
             
ShardingSpherePreconditions.checkState(addedWriteDataSourceNames.add(each),
                     () -> new DuplicateDataSourceException(String.format("Can 
not config duplicate write data source `%s` in database `%s`.", each, 
databaseName)));
         }
     }
     
-    private boolean containsInOtherRules(final String datasourceName, final 
Collection<ShardingSphereRule> rules) {
-        for (ShardingSphereRule each : rules) {
-            Optional<DataSourceMapperRuleAttribute> ruleAttribute = 
each.getAttributes().findAttribute(DataSourceMapperRuleAttribute.class);
-            if (ruleAttribute.isPresent() && 
ruleAttribute.get().getDataSourceMapper().containsKey(datasourceName)) {
-                return true;
-            }
-        }
-        return false;
+    private boolean containsInOtherRules(final String datasourceName, final 
Collection<ShardingSphereRule> builtRules) {
+        return builtRules.stream().map(each -> 
each.getAttributes().findAttribute(DataSourceMapperRuleAttribute.class))
+                .anyMatch(ruleAttribute -> ruleAttribute.isPresent() && 
ruleAttribute.get().getDataSourceMapper().containsKey(datasourceName));
     }
     
     private void checkReadeDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap,
@@ -105,8 +101,10 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
         }
     }
     
-    private void checkLoadBalancer(final String databaseName, final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs, final 
Map<String, LoadBalanceAlgorithm> loadBalancers) {
-        for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
+    private void checkLoadBalancer(final String databaseName, final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
+        Map<String, LoadBalanceAlgorithm> loadBalancers = 
ruleConfig.getLoadBalancers().entrySet().stream()
+                .collect(Collectors.toMap(Entry::getKey, entry -> 
TypedSPILoader.getService(LoadBalanceAlgorithm.class, 
entry.getValue().getType(), entry.getValue().getProps())));
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
             if (Strings.isNullOrEmpty(each.getLoadBalancerName())) {
                 continue;
             }
@@ -116,9 +114,17 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
         }
     }
     
-    private Map<String, LoadBalanceAlgorithm> getLoadBalancer(final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
-        Map<String, LoadBalanceAlgorithm> result = new 
LinkedHashMap<>(ruleConfig.getLoadBalancers().size(), 1F);
-        ruleConfig.getLoadBalancers().forEach((key, value) -> result.put(key, 
TypedSPILoader.getService(LoadBalanceAlgorithm.class, value.getType(), 
value.getProps())));
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
+        Collection<String> result = new LinkedHashSet<>();
+        for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
+            if (null != each.getWriteDataSourceName()) {
+                result.add(each.getWriteDataSourceName());
+            }
+            if (!each.getReadDataSourceNames().isEmpty()) {
+                result.addAll(each.getReadDataSourceNames());
+            }
+        }
         return result;
     }
     
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
deleted file mode 100644
index 5784003282c..00000000000
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import 
org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-
-import java.util.Collection;
-import java.util.LinkedHashSet;
-
-/**
- * Readwrite-splitting import rule configuration provider.
- */
-public final class ReadwriteSplittingImportRuleConfigurationProvider 
implements ImportRuleConfigurationProvider<ReadwriteSplittingRuleConfiguration> 
{
-    
-    @Override
-    public void check(final String databaseName, final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
-        checkLoadBalancers(ruleConfig);
-    }
-    
-    private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration 
ruleConfig) {
-        ruleConfig.getLoadBalancers().values().forEach(each -> 
TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    @Override
-    public Collection<String> getRequiredDataSourceNames(final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
-        Collection<String> result = new LinkedHashSet<>();
-        for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            if (null != each.getWriteDataSourceName()) {
-                result.add(each.getWriteDataSourceName());
-            }
-            if (!each.getReadDataSourceNames().isEmpty()) {
-                result.addAll(each.getReadDataSourceNames());
-            }
-        }
-        return result;
-    }
-    
-    @Override
-    public Class<ReadwriteSplittingRuleConfiguration> getType() {
-        return ReadwriteSplittingRuleConfiguration.class;
-    }
-}
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
 
b/features/readwrite-splitting/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
deleted file mode 100644
index 0ada7c83e45..00000000000
--- 
a/features/readwrite-splitting/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.readwritesplitting.distsql.handler.provider.ReadwriteSplittingImportRuleConfigurationProvider
diff --git 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
deleted file mode 100644
index 3ce43375f1d..00000000000
--- 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
-import 
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
-import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
-import 
org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException;
-import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class ReadwriteSplittingImportRuleConfigurationProviderTest {
-    
-    private final ReadwriteSplittingImportRuleConfigurationProvider 
importRuleConfigProvider = new 
ReadwriteSplittingImportRuleConfigurationProvider();
-    
-    @Test
-    void assertCheckDataSources() {
-        ShardingSphereDatabase database = mockDatabaseWithDataSource();
-        ReadwriteSplittingRuleConfiguration currentRuleConfig = 
getRuleConfigWithNotExistedDataSources();
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
ImportRuleConfigurationChecker.checkRule(currentRuleConfig, database));
-    }
-    
-    @Test
-    void assertCheckLoadBalancers() {
-        ReadwriteSplittingRuleConfiguration currentRuleConfig = 
createInvalidLoadBalancerRuleConfig();
-        assertThrows(ServiceProviderNotFoundException.class, () -> 
importRuleConfigProvider.check("foo_db", currentRuleConfig));
-    }
-    
-    private ShardingSphereDatabase mockDatabaseWithDataSource() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        Collection<String> dataSources = new LinkedList<>();
-        dataSources.add("su_1");
-        
when(result.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
-        
when(result.getResourceMetaData().getNotExistedDataSources(any())).thenReturn(dataSources);
-        return result;
-    }
-    
-    private ReadwriteSplittingRuleConfiguration 
getRuleConfigWithNotExistedDataSources() {
-        ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig =
-                new 
ReadwriteSplittingDataSourceRuleConfiguration("data_source", "write_ds", 
Collections.emptyList(), "load_balancer");
-        Collection<ReadwriteSplittingDataSourceRuleConfiguration> dataSources 
= new LinkedList<>();
-        dataSources.add(dataSourceRuleConfig);
-        return new ReadwriteSplittingRuleConfiguration(dataSources, 
Collections.emptyMap());
-    }
-    
-    private ReadwriteSplittingRuleConfiguration 
createInvalidLoadBalancerRuleConfig() {
-        Map<String, AlgorithmConfiguration> loadBalancer = new HashMap<>();
-        loadBalancer.put("invalid_load_balancer", 
mock(AlgorithmConfiguration.class));
-        return new 
ReadwriteSplittingRuleConfiguration(Collections.emptyList(), loadBalancer);
-    }
-}
diff --git 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
index 86bb0103fa6..ae58d08e91f 100644
--- 
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
+++ 
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
@@ -19,8 +19,10 @@ package org.apache.shardingsphere.shadow.checker;
 
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
@@ -29,13 +31,16 @@ import 
org.apache.shardingsphere.shadow.exception.algorithm.NotImplementHintShad
 import 
org.apache.shardingsphere.shadow.exception.metadata.MissingRequiredShadowAlgorithmException;
 import 
org.apache.shardingsphere.shadow.exception.metadata.MissingRequiredShadowConfigurationException;
 import 
org.apache.shardingsphere.shadow.exception.metadata.ShadowDataSourceMappingNotFoundException;
+import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
 
 import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Shadow rule configuration checker.
@@ -44,6 +49,8 @@ public final class ShadowRuleConfigurationChecker implements 
RuleConfigurationCh
     
     @Override
     public void check(final String databaseName, final ShadowRuleConfiguration 
ruleConfig, final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> builtRules) {
+        checkShadowAlgorithms(ruleConfig);
+        checkTablesNotDuplicated(databaseName, ruleConfig);
         Map<String, ShadowDataSourceConfiguration> dataSources = 
initShadowDataSources(ruleConfig.getDataSources());
         checkDataSources(dataSources, dataSourceMap, databaseName);
         Map<String, ShadowTableConfiguration> shadowTables = 
ruleConfig.getTables();
@@ -56,6 +63,17 @@ public final class ShadowRuleConfigurationChecker implements 
RuleConfigurationCh
         checkShadowTableAlgorithmsReferences(shadowTables, databaseName);
     }
     
+    private void checkShadowAlgorithms(final ShadowRuleConfiguration 
ruleConfig) {
+        ruleConfig.getShadowAlgorithms().values().forEach(each -> 
TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(), 
each.getProps()));
+    }
+    
+    private void checkTablesNotDuplicated(final String databaseName, final 
ShadowRuleConfiguration ruleConfig) {
+        Collection<String> tableNames = ruleConfig.getTables().keySet();
+        Collection<String> duplicatedTables = 
tableNames.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
+                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
+    }
+    
     private void checkDataSources(final Map<String, 
ShadowDataSourceConfiguration> shadowDataSources, final Map<String, DataSource> 
dataSourceMap, final String databaseName) {
         Set<String> dataSourceName = dataSourceMap.keySet();
         for (Entry<String, ShadowDataSourceConfiguration> entry : 
shadowDataSources.entrySet()) {
@@ -113,6 +131,20 @@ public final class ShadowRuleConfigurationChecker 
implements RuleConfigurationCh
         return result;
     }
     
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final 
ShadowRuleConfiguration ruleConfig) {
+        Collection<String> result = new LinkedHashSet<>();
+        ruleConfig.getDataSources().forEach(each -> {
+            if (null != each.getShadowDataSourceName()) {
+                result.add(each.getShadowDataSourceName());
+            }
+            if (null != each.getProductionDataSourceName()) {
+                result.add(each.getProductionDataSourceName());
+            }
+        });
+        return result;
+    }
+    
     @Override
     public int getOrder() {
         return ShadowOrder.ORDER;
diff --git 
a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
 
b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
index 0da4b74b984..2a0cc53bf2f 100644
--- 
a/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
+++ 
b/features/shadow/core/src/test/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationCheckerTest.java
@@ -55,7 +55,7 @@ class ShadowRuleConfigurationCheckerTest {
     }
     
     private AlgorithmConfiguration createAlgorithmConfiguration() {
-        return new AlgorithmConfiguration("user-id-insert-match-algorithm",
+        return new AlgorithmConfiguration("REGEX_MATCH",
                 PropertiesBuilder.build(new Property("column", "shadow"), new 
Property("operation", "insert"), new Property("regex", "[1]")));
     }
 }
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
deleted file mode 100644
index 08813c47f87..00000000000
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.shadow.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
-import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
-
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
-/**
- * Shadow import rule configuration provider.
- */
-public final class ShadowImportRuleConfigurationProvider implements 
ImportRuleConfigurationProvider<ShadowRuleConfiguration> {
-    
-    @Override
-    public void check(final String databaseName, final ShadowRuleConfiguration 
ruleConfig) {
-        checkTables(databaseName, ruleConfig);
-        checkShadowAlgorithms(ruleConfig);
-    }
-    
-    private void checkTables(final String databaseName, final 
ShadowRuleConfiguration ruleConfig) {
-        Collection<String> tableNames = ruleConfig.getTables().keySet();
-        Collection<String> duplicatedTables = 
tableNames.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
-                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
-        ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), () 
-> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
-    }
-    
-    private void checkShadowAlgorithms(final ShadowRuleConfiguration 
ruleConfig) {
-        ruleConfig.getShadowAlgorithms().values().forEach(each -> 
TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    @Override
-    public Collection<String> getRequiredDataSourceNames(final 
ShadowRuleConfiguration ruleConfig) {
-        Collection<String> result = new LinkedHashSet<>();
-        ruleConfig.getDataSources().forEach(each -> {
-            if (null != each.getShadowDataSourceName()) {
-                result.add(each.getShadowDataSourceName());
-            }
-            if (null != each.getProductionDataSourceName()) {
-                result.add(each.getProductionDataSourceName());
-            }
-        });
-        return result;
-    }
-    
-    @Override
-    public Class<ShadowRuleConfiguration> getType() {
-        return ShadowRuleConfiguration.class;
-    }
-}
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterDefaultShadowAlgorithmExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterDefaultShadowAlgorithmExecutor.java
index 4d830025ed5..294aaf605d3 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterDefaultShadowAlgorithmExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterDefaultShadowAlgorithmExecutor.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import com.google.common.base.Strings;
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleAlterExecutor;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterShadowRuleExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterShadowRuleExecutor.java
index f61104a247b..c2a0be24dc1 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterShadowRuleExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/AlterShadowRuleExecutor.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleAlterExecutor;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.exception.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/CreateDefaultShadowAlgorithmExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/CreateDefaultShadowAlgorithmExecutor.java
index f9df45b8b7b..4258c36a392 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/CreateDefaultShadowAlgorithmExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/CreateDefaultShadowAlgorithmExecutor.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleCreateExecutor;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.DuplicateAlgorithmException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.DuplicateAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmExecutor.java
index 94618c8581e..6e7134be480 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmExecutor.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDropExecutor;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmExecutor.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmExecutor.java
index b556047d1ca..37abdf7885c 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmExecutor.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmExecutor.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import lombok.Setter;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDropExecutor;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.KernelSQLException;
diff --git 
a/features/shadow/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
 
b/features/shadow/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
deleted file mode 100644
index 0347c538e71..00000000000
--- 
a/features/shadow/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.shadow.distsql.handler.provider.ShadowImportRuleConfigurationProvider
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterDefaultShadowAlgorithmExecutorTest.java
 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterDefaultShadowAlgorithmExecutorTest.java
index 54fc6ce7373..a3539ba4e79 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterDefaultShadowAlgorithmExecutorTest.java
+++ 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterDefaultShadowAlgorithmExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.shadow.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterShadowRuleExecutorTest.java
 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterShadowRuleExecutorTest.java
index 51e7d50b9c8..1da05656697 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterShadowRuleExecutorTest.java
+++ 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/AlterShadowRuleExecutorTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.shadow.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.exception.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/DropDefaultShadowAlgorithmExecutorTest.java
 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/DropDefaultShadowAlgorithmExecutorTest.java
index d6fc548fcd4..8b2921aaa17 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/DropDefaultShadowAlgorithmExecutorTest.java
+++ 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/update/DropDefaultShadowAlgorithmExecutorTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.shadow.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
index 638872cfe4e..85033fb5b36 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
@@ -19,9 +19,15 @@ package org.apache.shardingsphere.sharding.checker;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
+import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
+import 
org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm;
 import 
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
+import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
+import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
@@ -33,10 +39,17 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingS
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
 import 
org.apache.shardingsphere.sharding.exception.metadata.MissingRequiredShardingAlgorithmException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.MissingRequiredShardingConfigurationException;
+import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
 
 import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Sharding rule configuration checker.
@@ -45,6 +58,8 @@ public final class ShardingRuleConfigurationChecker 
implements RuleConfiguration
     
     @Override
     public void check(final String databaseName, final 
ShardingRuleConfiguration ruleConfig, final Map<String, DataSource> 
dataSourceMap, final Collection<ShardingSphereRule> builtRules) {
+        checkShardingAlgorithms(ruleConfig.getShardingAlgorithms().values());
+        checkKeyGeneratorAlgorithms(ruleConfig.getKeyGenerators().values());
         Collection<String> keyGenerators = 
ruleConfig.getKeyGenerators().keySet();
         Collection<String> auditors = ruleConfig.getAuditors().keySet();
         Collection<String> shardingAlgorithms = 
ruleConfig.getShardingAlgorithms().keySet();
@@ -55,8 +70,17 @@ public final class ShardingRuleConfigurationChecker 
implements RuleConfiguration
         checkShardingStrategy(databaseName, 
ruleConfig.getDefaultTableShardingStrategy(), shardingAlgorithms);
     }
     
+    private void checkShardingAlgorithms(final 
Collection<AlgorithmConfiguration> algorithmConfigs) {
+        algorithmConfigs.forEach(each -> 
TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(), 
each.getProps()));
+    }
+    
+    private void checkKeyGeneratorAlgorithms(final 
Collection<AlgorithmConfiguration> algorithmConfigs) {
+        algorithmConfigs.stream().filter(Objects::nonNull).forEach(each -> 
TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(), 
each.getProps()));
+    }
+    
     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) {
+        checkTablesNotDuplicated(databaseName, tables, autoTables);
         for (ShardingTableRuleConfiguration each : tables) {
             checkLogicTable(databaseName, each.getLogicTable());
             checkKeyGenerateStrategy(databaseName, 
each.getKeyGenerateStrategy(), keyGenerators);
@@ -72,6 +96,14 @@ public final class ShardingRuleConfigurationChecker 
implements RuleConfiguration
         }
     }
     
+    private void checkTablesNotDuplicated(final String databaseName, final 
Collection<ShardingTableRuleConfiguration> tables, final 
Collection<ShardingAutoTableRuleConfiguration> autoTables) {
+        Collection<String> logicTables = 
tables.stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList());
+        
logicTables.addAll(autoTables.stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+        Set<String> duplicatedLogicTables = 
logicTables.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
+                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
+        
ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () -> 
new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
+    }
+    
     private void checkLogicTable(final String databaseName, final String 
logicTable) {
         
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(logicTable), () 
-> new MissingRequiredShardingConfigurationException("Sharding logic table", 
databaseName));
     }
@@ -106,6 +138,23 @@ public final class ShardingRuleConfigurationChecker 
implements RuleConfiguration
                 () -> new 
MissingRequiredShardingAlgorithmException(shardingStrategy.getShardingAlgorithmName(),
 databaseName));
     }
     
+    @Override
+    public Collection<String> getRequiredDataSourceNames(final 
ShardingRuleConfiguration ruleConfig) {
+        Collection<String> result = new LinkedHashSet<>();
+        ruleConfig.getTables().forEach(each -> 
result.addAll(getDataSourceNames(each)));
+        ruleConfig.getAutoTables().forEach(each -> 
result.addAll(getDataSourceNames(each)));
+        return result;
+    }
+    
+    private Collection<String> getDataSourceNames(final 
ShardingTableRuleConfiguration shardingTableRuleConfig) {
+        Collection<String> actualDataNodes = 
InlineExpressionParserFactory.newInstance(shardingTableRuleConfig.getActualDataNodes()).splitAndEvaluate();
+        return actualDataNodes.stream().map(each -> new 
DataNode(each).getDataSourceName()).collect(Collectors.toList());
+    }
+    
+    private Collection<String> getDataSourceNames(final 
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
+        return new 
HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
+    }
+    
     @Override
     public int getOrder() {
         return ShardingOrder.ORDER;
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
index 5a87b334a12..00aaf75fca9 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationCheckerTest.java
@@ -27,9 +27,12 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAudi
 import 
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.exception.metadata.MissingRequiredShardingConfigurationException;
+import org.apache.shardingsphere.test.util.PropertiesBuilder;
+import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
+import java.util.Properties;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.mock;
@@ -63,9 +66,9 @@ class ShardingRuleConfigurationCheckerTest {
     
     private ShardingRuleConfiguration createRuleConfiguration() {
         ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getShardingAlgorithms().put("foo_algorithm", 
mock(AlgorithmConfiguration.class));
-        result.getAuditors().put("foo_audit", 
mock(AlgorithmConfiguration.class));
-        result.getKeyGenerators().put("foo_keygen", 
mock(AlgorithmConfiguration.class));
+        result.getShardingAlgorithms().put("foo_algorithm", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "1"))));
+        result.getAuditors().put("foo_audit", new 
AlgorithmConfiguration("foo", new Properties()));
+        result.getKeyGenerators().put("foo_keygen", new 
AlgorithmConfiguration("UUID", new Properties()));
         result.setDefaultKeyGenerateStrategy(new 
KeyGenerateStrategyConfiguration("foo_col", "foo_keygen"));
         return result;
     }
@@ -91,7 +94,7 @@ class ShardingRuleConfigurationCheckerTest {
                                                                                
         final ShardingAuditStrategyConfiguration shardingAuditStrategyConfig,
                                                                                
         final KeyGenerateStrategyConfiguration keyGenerateStrategyConfig) {
         ShardingAutoTableRuleConfiguration result = 
mock(ShardingAutoTableRuleConfiguration.class);
-        when(result.getLogicTable()).thenReturn("foo_tbl");
+        when(result.getLogicTable()).thenReturn("bar_tbl");
         when(result.getShardingStrategy()).thenReturn(null == 
shardingStrategyConfig ? mock(ShardingStrategyConfiguration.class) : 
shardingStrategyConfig);
         when(result.getAuditStrategy()).thenReturn(null == 
shardingAuditStrategyConfig ? mock(ShardingAuditStrategyConfiguration.class) : 
shardingAuditStrategyConfig);
         when(result.getKeyGenerateStrategy()).thenReturn(null == 
keyGenerateStrategyConfig ? mock(KeyGenerateStrategyConfiguration.class) : 
keyGenerateStrategyConfig);
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
index 41bef1f82ce..f6622464c60 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
@@ -21,7 +21,7 @@ import com.cedarsoftware.util.CaseInsensitiveSet;
 import com.google.common.base.Splitter;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.exception.rule.InvalidRuleConfigurationException;
 import 
org.apache.shardingsphere.infra.exception.rule.MissingRequiredRuleException;
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
deleted file mode 100644
index 3734b54b810..00000000000
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sharding.distsql.handler.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
-import 
org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm;
-import org.apache.shardingsphere.infra.datanode.DataNode;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Sharding import rule configuration provider.
- */
-public final class ShardingImportRuleConfigurationProvider implements 
ImportRuleConfigurationProvider<ShardingRuleConfiguration> {
-    
-    @Override
-    public void check(final String databaseName, final 
ShardingRuleConfiguration ruleConfig) {
-        checkLogicTables(databaseName, ruleConfig);
-        checkShardingAlgorithms(ruleConfig.getShardingAlgorithms().values());
-        checkKeyGeneratorAlgorithms(ruleConfig.getKeyGenerators().values());
-    }
-    
-    private void checkLogicTables(final String databaseName, final 
ShardingRuleConfiguration ruleConfig) {
-        Collection<String> logicTables = 
ruleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList());
-        
logicTables.addAll(ruleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
-        Set<String> duplicatedLogicTables = 
logicTables.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
-                .filter(each -> each.getValue() > 
1).map(Entry::getKey).collect(Collectors.toSet());
-        
ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () -> 
new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
-    }
-    
-    private void checkShardingAlgorithms(final 
Collection<AlgorithmConfiguration> algorithmConfigs) {
-        algorithmConfigs.forEach(each -> 
TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    private void checkKeyGeneratorAlgorithms(final 
Collection<AlgorithmConfiguration> algorithmConfigs) {
-        algorithmConfigs.stream().filter(Objects::nonNull).forEach(each -> 
TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(), 
each.getProps()));
-    }
-    
-    @Override
-    public Collection<String> getRequiredDataSourceNames(final 
ShardingRuleConfiguration ruleConfig) {
-        Collection<String> result = new LinkedHashSet<>();
-        ruleConfig.getTables().forEach(each -> 
result.addAll(getDataSourceNames(each)));
-        ruleConfig.getAutoTables().forEach(each -> 
result.addAll(getDataSourceNames(each)));
-        return result;
-    }
-    
-    private Collection<String> getDataSourceNames(final 
ShardingTableRuleConfiguration shardingTableRuleConfig) {
-        Collection<String> actualDataNodes = 
InlineExpressionParserFactory.newInstance(shardingTableRuleConfig.getActualDataNodes()).splitAndEvaluate();
-        return actualDataNodes.stream().map(each -> new 
DataNode(each).getDataSourceName()).collect(Collectors.toList());
-    }
-    
-    private Collection<String> getDataSourceNames(final 
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
-        return new 
HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
-    }
-    
-    @Override
-    public Class<ShardingRuleConfiguration> getType() {
-        return ShardingRuleConfiguration.class;
-    }
-}
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyExecutor.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyExecutor.java
index 1bcc8c7ae65..a49d3a2438b 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyExecutor.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterDefaultShardingStrategyExecutor.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.sharding.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.infra.exception.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleAlterExecutor;
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyExecutor.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyExecutor.java
index 1203ab80f4d..0ef6d8042b8 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyExecutor.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyExecutor.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.sharding.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleCreateExecutor;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAlgorithmExecutor.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAlgorithmExecutor.java
index d61cb16aeb2..dd008dd94f9 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAlgorithmExecutor.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAlgorithmExecutor.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.sharding.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDropExecutor;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAuditorExecutor.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAuditorExecutor.java
index 724ae459162..70357d24610 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAuditorExecutor.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingAuditorExecutor.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.sharding.distsql.handler.update;
 
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDropExecutor;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingKeyGeneratorExecutor.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingKeyGeneratorExecutor.java
index 8e19b581dc0..1dd8a93da58 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingKeyGeneratorExecutor.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingKeyGeneratorExecutor.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.sharding.distsql.handler.update;
 
 import com.google.common.base.Strings;
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorCurrentRuleRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDropExecutor;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
diff --git 
a/features/sharding/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
 
b/features/sharding/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
deleted file mode 100644
index 896e8984273..00000000000
--- 
a/features/sharding/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.sharding.distsql.handler.provider.ShardingImportRuleConfigurationProvider
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
index 9b8381d6f1c..3e9aa131f70 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.sharding.distsql.checker;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
 import 
org.apache.shardingsphere.sharding.exception.strategy.InvalidShardingStrategyConfigurationException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.exception.rule.MissingRequiredRuleException;
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
deleted file mode 100644
index 5eb7653c748..00000000000
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sharding.distsql.provider;
-
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
-import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import 
org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.distsql.handler.provider.ShardingImportRuleConfigurationProvider;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class ShardingImportRuleConfigurationProviderTest {
-    
-    @Test
-    void assertCheckLogicTables() {
-        assertThrows(DuplicateRuleException.class, () -> new 
ShardingImportRuleConfigurationProvider().check("foo_db", 
createDuplicatedTablesRuleConfiguration()));
-    }
-    
-    @Test
-    void assertCheckDataSources() {
-        ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
-        currentRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order", "ds_${0..2}.t_order_${0..2}"));
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
ImportRuleConfigurationChecker.checkRule(currentRuleConfig, 
mockDatabaseWithDataSource()));
-    }
-    
-    @Test
-    void assertCheckKeyGenerators() {
-        assertThrows(ServiceProviderNotFoundException.class, () -> new 
ShardingImportRuleConfigurationProvider().check("foo_db", 
createInvalidKeyGeneratorRuleConfiguration()));
-    }
-    
-    @Test
-    void assertCheckShardingAlgorithms() {
-        assertThrows(ServiceProviderNotFoundException.class, () -> new 
ShardingImportRuleConfigurationProvider().check("foo_db", 
createInvalidShardingAlgorithmRuleConfiguration()));
-    }
-    
-    private ShardingRuleConfiguration 
createDuplicatedTablesRuleConfiguration() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getTables().add(new ShardingTableRuleConfiguration("t_order", 
null));
-        result.getTables().add(new ShardingTableRuleConfiguration("t_order", 
null));
-        return result;
-    }
-    
-    private ShardingSphereDatabase mockDatabaseWithDataSource() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        Collection<String> dataSources = new LinkedList<>();
-        dataSources.add("su_1");
-        
when(result.getResourceMetaData().getNotExistedDataSources(any())).thenReturn(dataSources);
-        when(result.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.emptyList()));
-        return result;
-    }
-    
-    private ShardingRuleConfiguration 
createInvalidKeyGeneratorRuleConfiguration() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getKeyGenerators().put("Invalid_key_generator", 
mock(AlgorithmConfiguration.class));
-        return result;
-    }
-    
-    private ShardingRuleConfiguration 
createInvalidShardingAlgorithmRuleConfiguration() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getShardingAlgorithms().put("Invalid_algorithm", 
mock(AlgorithmConfiguration.class));
-        return result;
-    }
-}
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyExecutorTest.java
index 09991cd9ebc..12557ce15ed 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterDefaultShardingStrategyExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyExecutorTest.java
index 75380b4d152..a0e66207b4e 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.InvalidAlgorithmConfigurationException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleExecutorTest.java
index 5d0d41f9c4c..85c89e35657 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleExecutorTest.java
@@ -21,7 +21,7 @@ import lombok.SneakyThrows;
 import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
 import org.apache.shardingsphere.distsql.statement.DistSQLStatement;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.DistSQLException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.InvalidAlgorithmConfigurationException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -138,7 +138,7 @@ class CreateShardingTableRuleExecutorTest {
                 + 
"TYPE(NAME='inline',PROPERTIES('algorithm-expression'='t_order_item_${order_id 
% 4}')),"
                 + 
"KEY_GENERATE_STRATEGY(COLUMN=order_id,TYPE(NAME='snowflake')))";
         CreateShardingTableRuleStatement distSQLStatement = 
(CreateShardingTableRuleStatement) getDistSQLStatement(sql);
-        assertThrows(DistSQLException.class, () -> 
executor.checkBeforeUpdate(distSQLStatement));
+        assertThrows(InvalidAlgorithmConfigurationException.class, () -> 
executor.checkBeforeUpdate(distSQLStatement));
     }
     
     @Test
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAlgorithmExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAlgorithmExecutorTest.java
index da84381abbe..84e88ef6338 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAlgorithmExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAlgorithmExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.RuleDefinitionException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAuditorExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAuditorExecutorTest.java
index 787f47b25dd..3923ac49207 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAuditorExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingAuditorExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingKeyGeneratorExecutorTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingKeyGeneratorExecutorTest.java
index 6451e8f4388..d7b571be1a3 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingKeyGeneratorExecutorTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingKeyGeneratorExecutorTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.AlgorithmInUsedException;
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.AlgorithmInUsedException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
similarity index 70%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
index 5578532f400..1a7b8660c6a 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
@@ -15,26 +15,29 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database;
+package org.apache.shardingsphere.infra.config.rule.checker;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 
+import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Optional;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 /**
- * Import rule configuration checker.
+ * Rule configuration check engine.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ImportRuleConfigurationChecker {
+public final class RuleConfigurationCheckEngine {
     
     /**
      * Check rule.
@@ -44,14 +47,13 @@ public final class ImportRuleConfigurationChecker {
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
     public static void checkRule(final RuleConfiguration ruleConfig, final 
ShardingSphereDatabase database) {
-        Optional<ImportRuleConfigurationProvider> importProvider = 
TypedSPILoader.findService(ImportRuleConfigurationProvider.class, 
ruleConfig.getClass());
-        if (importProvider.isPresent()) {
-            Collection<String> requiredDataSourceNames = 
importProvider.get().getRequiredDataSourceNames(ruleConfig);
-            if (!requiredDataSourceNames.isEmpty()) {
-                checkDataSourcesExisted(database, requiredDataSourceNames);
-            }
-            importProvider.get().check(database.getName(), ruleConfig);
+        RuleConfigurationChecker configChecker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
+        Collection<String> requiredDataSourceNames = 
configChecker.getRequiredDataSourceNames(ruleConfig);
+        if (!requiredDataSourceNames.isEmpty()) {
+            checkDataSourcesExisted(database, requiredDataSourceNames);
         }
+        Map<String, DataSource> dataSources = 
database.getResourceMetaData().getStorageUnits().entrySet().stream().collect(Collectors.toMap(Entry::getKey,
 entry -> entry.getValue().getDataSource()));
+        configChecker.check(database.getName(), ruleConfig, dataSources, 
database.getRuleMetaData().getRules());
     }
     
     private static void checkDataSourcesExisted(final ShardingSphereDatabase 
database, final Collection<String> requiredDataSourceNames) {
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
index 96898b169b2..ebd03cd97b9 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPI;
 
 import javax.sql.DataSource;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
 /**
@@ -43,4 +44,14 @@ public interface RuleConfigurationChecker<T extends 
RuleConfiguration> extends O
      * @param builtRules built rules
      */
     void check(String databaseName, T ruleConfig, Map<String, DataSource> 
dataSourceMap, Collection<ShardingSphereRule> builtRules);
+    
+    /**
+     * Get required data source names.
+     *
+     * @param ruleConfig rule configuration
+     * @return required data source names
+     */
+    default Collection<String> getRequiredDataSourceNames(T ruleConfig) {
+        return Collections.emptyList();
+    }
 }
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmInUsedException.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/AlgorithmInUsedException.java
similarity index 87%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmInUsedException.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/AlgorithmInUsedException.java
index 17e76411f4d..284237b080a 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmInUsedException.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/AlgorithmInUsedException.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.handler.exception.algorithm;
+package org.apache.shardingsphere.infra.exception.algorithm;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.AlgorithmDefinitionException;
 
 import java.util.Collection;
 
 /**
  * Algorithm in used exception.
  */
-public final class AlgorithmInUsedException extends 
AlgorithmDefinitionViolationException {
+public final class AlgorithmInUsedException extends 
AlgorithmDefinitionException {
     
     private static final long serialVersionUID = -8735125626190637177L;
     
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/DuplicateAlgorithmException.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/DuplicateAlgorithmException.java
similarity index 87%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/DuplicateAlgorithmException.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/DuplicateAlgorithmException.java
index 9e2644a42f0..2e3b85e7f5e 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/DuplicateAlgorithmException.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/DuplicateAlgorithmException.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.handler.exception.algorithm;
+package org.apache.shardingsphere.infra.exception.algorithm;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.AlgorithmDefinitionException;
 
 import java.util.Collection;
 
 /**
  * Duplicate algorithm exception.
  */
-public final class DuplicateAlgorithmException extends 
AlgorithmDefinitionViolationException {
+public final class DuplicateAlgorithmException extends 
AlgorithmDefinitionException {
     
     private static final long serialVersionUID = 3503761639898230997L;
     
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/InvalidAlgorithmConfigurationException.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/InvalidAlgorithmConfigurationException.java
similarity index 90%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/InvalidAlgorithmConfigurationException.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/InvalidAlgorithmConfigurationException.java
index 29ac56f6334..871c2745091 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/InvalidAlgorithmConfigurationException.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/InvalidAlgorithmConfigurationException.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.handler.exception.algorithm;
+package org.apache.shardingsphere.infra.exception.algorithm;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.AlgorithmDefinitionException;
 
 import java.util.Collection;
 
 /**
  * Invalid algorithm configuration exception.
  */
-public final class InvalidAlgorithmConfigurationException extends 
AlgorithmDefinitionViolationException {
+public final class InvalidAlgorithmConfigurationException extends 
AlgorithmDefinitionException {
     
     private static final long serialVersionUID = 1352014079406440573L;
     
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/MissingRequiredAlgorithmException.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/MissingRequiredAlgorithmException.java
similarity index 90%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/MissingRequiredAlgorithmException.java
rename to 
infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/MissingRequiredAlgorithmException.java
index ea2b20ca1ae..bec1eb2effe 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/MissingRequiredAlgorithmException.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/exception/algorithm/MissingRequiredAlgorithmException.java
@@ -15,16 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.handler.exception.algorithm;
+package org.apache.shardingsphere.infra.exception.algorithm;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.AlgorithmDefinitionException;
 
 import java.util.Collection;
 
 /**
  * Missing required algorithm exception.
  */
-public final class MissingRequiredAlgorithmException extends 
AlgorithmDefinitionViolationException {
+public final class MissingRequiredAlgorithmException extends 
AlgorithmDefinitionException {
     
     private static final long serialVersionUID = 4591071898233749618L;
     
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
deleted file mode 100644
index 91d964bc918..00000000000
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database;
-
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Import rule configuration provider.
- * 
- * @param <T> type of rule configuration
- */
-@SingletonSPI
-public interface ImportRuleConfigurationProvider<T extends RuleConfiguration> 
extends TypedSPI {
-    
-    /**
-     * Check rule configuration.
-     *
-     * @param databaseName database name
-     * @param ruleConfig rule configuration
-     */
-    void check(String databaseName, T ruleConfig);
-    
-    /**
-     * Get required data source names.
-     *
-     * @param ruleConfig rule configuration
-     * @return required data source names
-     */
-    default Collection<String> getRequiredDataSourceNames(T ruleConfig) {
-        return Collections.emptyList();
-    }
-    
-    @Override
-    Class<T> getType();
-}
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmDefinitionViolationException.java
 
b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/AlgorithmDefinitionException.java
similarity index 63%
rename from 
infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmDefinitionViolationException.java
rename to 
infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/AlgorithmDefinitionException.java
index 0d85728da4e..6ca961f3c8c 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/exception/algorithm/AlgorithmDefinitionViolationException.java
+++ 
b/infra/exception/core/src/main/java/org/apache/shardingsphere/infra/exception/core/external/sql/type/kernel/category/AlgorithmDefinitionException.java
@@ -15,19 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.handler.exception.algorithm;
+package 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category;
 
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.DistSQLException;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.SQLState;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.KernelSQLException;
 
 /**
- * Algorithm definition violation exception.
+ * Algorithm definition exception.
  */
-public abstract class AlgorithmDefinitionViolationException extends 
DistSQLException {
+public abstract class AlgorithmDefinitionException extends KernelSQLException {
     
-    private static final long serialVersionUID = -727466071244178933L;
+    private static final long serialVersionUID = -8947223495845000542L;
     
-    protected AlgorithmDefinitionViolationException(final SQLState sqlState, 
final int errorCode, final String reason, final Object... messageArgs) {
-        super(sqlState, errorCode, reason, messageArgs);
+    private static final int KERNEL_CODE = 9;
+    
+    protected AlgorithmDefinitionException(final SQLState sqlState, final int 
errorCode, final String reason, final Object... messageArgs) {
+        super(sqlState, KERNEL_CODE, errorCode, reason, messageArgs);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java
index d371180e689..c1ef1eab15a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LockClusterExecutor.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
 
-import 
org.apache.shardingsphere.distsql.handler.exception.algorithm.MissingRequiredAlgorithmException;
+import 
org.apache.shardingsphere.infra.exception.algorithm.MissingRequiredAlgorithmException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
 import 
org.apache.shardingsphere.distsql.statement.ral.updatable.LockClusterStatement;
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index c682f4ac29e..f21f94119d6 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.util;
 
-import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
+import 
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationCheckEngine;
 import 
org.apache.shardingsphere.distsql.handler.exception.datasource.MissingRequiredDataSourcesException;
 import 
org.apache.shardingsphere.infra.exception.storageunit.InvalidStorageUnitsException;
 import 
org.apache.shardingsphere.distsql.handler.validate.DataSourcePoolPropertiesValidator;
@@ -140,7 +140,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
     }
     
     private void addRule(final Collection<RuleConfiguration> ruleConfigs, 
final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
-        ImportRuleConfigurationChecker.checkRule(ruleConfig, database);
+        RuleConfigurationCheckEngine.checkRule(ruleConfig, database);
         ruleConfigs.add(ruleConfig);
         database.getRuleMetaData().getRules().add(buildRule(ruleConfig, 
database));
     }

Reply via email to