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

sunnianjun 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 1b4a52a7796 Add 
ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
1b4a52a7796 is described below

commit 1b4a52a7796a1fd4f3fac9c4ef2b9705d4366e59
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Mar 24 13:45:46 2024 +0800

    Add ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
    
    * Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
    
    * Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
---
 ...teSplittingImportRuleConfigurationProvider.java | 31 ++++-------
 ...littingImportRuleConfigurationProviderTest.java |  3 +-
 .../ShadowImportRuleConfigurationProvider.java     | 40 ++++----------
 .../ShardingImportRuleConfigurationProvider.java   | 39 ++++---------
 ...hardingImportRuleConfigurationProviderTest.java |  3 +-
 .../database/ImportRuleConfigurationChecker.java   | 64 ++++++++++++++++++++++
 .../database/ImportRuleConfigurationProvider.java  | 13 +++++
 .../YamlDatabaseConfigurationImportExecutor.java   |  6 +-
 8 files changed, 114 insertions(+), 85 deletions(-)

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
index 9be7a390639..aeeac9b6298 100644
--- 
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
@@ -18,18 +18,14 @@
 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.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 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.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 
 import java.util.Collection;
 import java.util.LinkedHashSet;
-import java.util.stream.Collectors;
 
 /**
  * Readwrite-splitting import rule configuration provider.
@@ -38,32 +34,25 @@ public final class 
ReadwriteSplittingImportRuleConfigurationProvider implements
     
     @Override
     public void check(final ShardingSphereDatabase database, final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
-        checkDataSources(database, ruleConfig);
         checkLoadBalancers(ruleConfig);
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
-        Collection<String> requiredDataSources = new LinkedHashSet<>();
+    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()) {
-                requiredDataSources.add(each.getWriteDataSourceName());
+                result.add(each.getWriteDataSourceName());
             }
             if (!each.getReadDataSourceNames().isEmpty()) {
-                requiredDataSources.addAll(each.getReadDataSourceNames());
+                result.addAll(each.getReadDataSourceNames());
             }
         }
-        Collection<String> notExistedDataSources = 
database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
-        Collection<String> logicalDataSources = getLogicDataSources(database);
-        notExistedDataSources.removeIf(logicalDataSources::contains);
-        
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> 
new MissingRequiredStorageUnitsException(database.getName(), 
notExistedDataSources));
-    }
-    
-    private Collection<String> getLogicDataSources(final 
ShardingSphereDatabase database) {
-        return 
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream().flatMap(each
 -> each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
-    }
-    
-    private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration 
ruleConfig) {
-        ruleConfig.getLoadBalancers().values().forEach(each -> 
TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(), 
each.getProps()));
+        return result;
     }
     
     @Override
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
index 13275211ec5..f9d20a89a22 100644
--- 
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
@@ -17,6 +17,7 @@
 
 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.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -46,7 +47,7 @@ class ReadwriteSplittingImportRuleConfigurationProviderTest {
     void assertCheckDataSources() {
         ShardingSphereDatabase database = mockDatabaseWithDataSource();
         ReadwriteSplittingRuleConfiguration currentRuleConfig = 
getRuleConfigWithNotExistedDataSources();
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
importRuleConfigProvider.check(database, currentRuleConfig));
+        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
ImportRuleConfigurationChecker.checkRule(currentRuleConfig, database));
     }
     
     @Test
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
index da3bab54f63..b9ebb241217 100644
--- 
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
@@ -19,10 +19,8 @@ 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.distsql.handler.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 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.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
@@ -39,20 +37,23 @@ public final class ShadowImportRuleConfigurationProvider 
implements ImportRuleCo
     
     @Override
     public void check(final ShardingSphereDatabase database, final 
ShadowRuleConfiguration ruleConfig) {
-        checkDataSources(database, ruleConfig);
         checkTables(database.getName(), ruleConfig);
         checkShadowAlgorithms(ruleConfig);
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final 
ShadowRuleConfiguration ruleConfig) {
-        Collection<String> requiredResource = getRequiredResources(ruleConfig);
-        Collection<String> notExistedResources = 
database.getResourceMetaData().getNotExistedDataSources(requiredResource);
-        Collection<String> logicResources = getLogicDataSources(database);
-        notExistedResources.removeIf(logicResources::contains);
-        ShardingSpherePreconditions.checkState(notExistedResources.isEmpty(), 
() -> new MissingRequiredStorageUnitsException(database.getName(), 
notExistedResources));
+    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 Collection<String> getRequiredResources(final 
ShadowRuleConfiguration ruleConfig) {
+    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()) {
@@ -65,25 +66,6 @@ public final class ShadowImportRuleConfigurationProvider 
implements ImportRuleCo
         return result;
     }
     
-    private Collection<String> getLogicDataSources(final 
ShardingSphereDatabase database) {
-        Collection<String> result = new LinkedHashSet<>();
-        for (DataSourceMapperRuleAttribute each : 
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
-            result.addAll(each.getDataSourceMapper().keySet());
-        }
-        return result;
-    }
-    
-    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 Class<ShadowRuleConfiguration> getType() {
         return ShadowRuleConfiguration.class;
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
index 83e6a199f74..2099e919c68 100644
--- 
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
@@ -19,14 +19,12 @@ 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.distsql.handler.exception.rule.DuplicateRuleException;
-import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 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.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.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -49,7 +47,6 @@ public final class ShardingImportRuleConfigurationProvider 
implements ImportRule
     @Override
     public void check(final ShardingSphereDatabase database, final 
ShardingRuleConfiguration ruleConfig) {
         checkLogicTables(database.getName(), ruleConfig);
-        checkDataSources(database, ruleConfig);
         checkShardingAlgorithms(ruleConfig.getShardingAlgorithms().values());
         checkKeyGeneratorAlgorithms(ruleConfig.getKeyGenerators().values());
     }
@@ -62,45 +59,29 @@ public final class ShardingImportRuleConfigurationProvider 
implements ImportRule
         
ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () -> 
new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
     }
     
-    private void checkDataSources(final ShardingSphereDatabase database, final 
ShardingRuleConfiguration ruleConfig) {
-        Collection<String> requiredDataSources = 
getRequiredDataSources(ruleConfig);
-        Collection<String> notExistedDataSources = 
database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
-        Collection<String> logicDataSources = getLogicDataSources(database);
-        notExistedDataSources.removeIf(logicDataSources::contains);
-        
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> 
new MissingRequiredStorageUnitsException(database.getName(), 
notExistedDataSources));
+    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 Collection<String> getRequiredDataSources(final 
ShardingRuleConfiguration ruleConfig) {
+    @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 
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
-        Collection<String> actualDataSources = 
InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate();
-        return new HashSet<>(actualDataSources);
-    }
-    
     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> getLogicDataSources(final 
ShardingSphereDatabase database) {
-        Collection<String> result = new LinkedHashSet<>();
-        for (DataSourceMapperRuleAttribute each : 
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
-            result.addAll(each.getDataSourceMapper().keySet());
-        }
-        return result;
-    }
-    
-    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 Collection<String> getDataSourceNames(final 
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
+        return new 
HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
     }
     
     @Override
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
index 2a7daf22128..fe3da7f9a1e 100644
--- 
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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sharding.distsql.provider;
 
+import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
 import 
org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
@@ -49,7 +50,7 @@ class ShardingImportRuleConfigurationProviderTest {
     void assertCheckDataSources() {
         ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
         currentRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order", "ds_${0..2}.t_order_${0..2}"));
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> new 
ShardingImportRuleConfigurationProvider().check(mockDatabaseWithDataSource(), 
currentRuleConfig));
+        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
ImportRuleConfigurationChecker.checkRule(currentRuleConfig, 
mockDatabaseWithDataSource()));
     }
     
     @Test
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
new file mode 100644
index 00000000000..d24d9db9fa3
--- /dev/null
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
@@ -0,0 +1,64 @@
+/*
+ * 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 lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+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 java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Import rule configuration checker.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ImportRuleConfigurationChecker {
+    
+    /**
+     * Check rule.
+     * 
+     * @param ruleConfig rule configuration
+     * @param database database
+     */
+    @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, ruleConfig);
+        }
+    }
+    
+    private static void checkDataSourcesExisted(final ShardingSphereDatabase 
database, final Collection<String> requiredDataSourceNames) {
+        Collection<String> notExistedDataSources = 
database.getResourceMetaData().getNotExistedDataSources(requiredDataSourceNames);
+        Collection<String> logicDataSources = 
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream()
+                .flatMap(each -> 
each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
+        notExistedDataSources.removeIf(logicDataSources::contains);
+        
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () -> 
new MissingRequiredStorageUnitsException(database.getName(), 
notExistedDataSources));
+    }
+}
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
index 61195f43e5c..f428b6cfc92 100644
--- 
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
@@ -22,6 +22,9 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 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.
  * 
@@ -38,6 +41,16 @@ public interface ImportRuleConfigurationProvider<T extends 
RuleConfiguration> ex
      */
     void check(ShardingSphereDatabase database, 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/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 622af678883..cc232ad03bd 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.ImportRuleConfigurationProvider;
+import 
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
 import 
org.apache.shardingsphere.distsql.handler.exception.datasource.MissingRequiredDataSourcesException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
 import 
org.apache.shardingsphere.distsql.handler.validate.DataSourcePoolPropertiesValidator;
@@ -39,7 +39,6 @@ import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -140,9 +139,8 @@ public final class YamlDatabaseConfigurationImportExecutor {
         
metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 ruleConfigs);
     }
     
-    @SuppressWarnings("unchecked")
     private void addRule(final Collection<RuleConfiguration> ruleConfigs, 
final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
-        TypedSPILoader.findService(ImportRuleConfigurationProvider.class, 
ruleConfig.getClass()).ifPresent(optional -> optional.check(database, 
ruleConfig));
+        ImportRuleConfigurationChecker.checkRule(ruleConfig, database);
         ruleConfigs.add(ruleConfig);
         database.getRuleMetaData().getRules().add(buildRule(ruleConfig, 
database));
     }

Reply via email to