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

zhangliang 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 a7873a0f5b8 Spilt RegisterCenterMetaDataContextsFactory and 
LocalConfigurationMetaDataContextsFactory (#34399)
a7873a0f5b8 is described below

commit a7873a0f5b88b3b5a4329e56cdbe248f5cc1c6e3
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jan 19 17:40:17 2025 +0800

    Spilt RegisterCenterMetaDataContextsFactory and 
LocalConfigurationMetaDataContextsFactory (#34399)
    
    * Refactor MetaDataContextsFactory
    
    * Refactor MetaDataContextsFactory
    
    * Spilt RegisterCenterMetaDataContextsFactory and 
LocalConfigurationMetaDataContextsFactory
---
 .../mode/metadata/MetaDataContextManager.java      |   1 +
 .../{ => factory}/MetaDataContextsFactory.java     | 101 ++-----------------
 .../LocalConfigurationMetaDataContextsFactory.java | 107 ++++++++++++++++++++
 .../RegisterCenterMetaDataContextsFactory.java     | 110 +++++++++++++++++++++
 .../manager/DatabaseRuleConfigurationManager.java  |   2 +-
 .../mode/metadata/manager/StorageUnitManager.java  |   2 +-
 .../{ => factory}/MetaDataContextsFactoryTest.java |   3 +-
 .../cluster/ClusterContextManagerBuilder.java      |   2 +-
 .../ClusterMetaDataManagerPersistService.java      |   2 +-
 .../StandaloneContextManagerBuilder.java           |   2 +-
 .../StandaloneMetaDataManagerPersistService.java   |   2 +-
 11 files changed, 233 insertions(+), 101 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
index 119d40b1098..911d72cad79 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
 import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import 
org.apache.shardingsphere.mode.metadata.manager.DatabaseRuleConfigurationManager;
 import 
org.apache.shardingsphere.mode.metadata.manager.GlobalConfigurationManager;
 import org.apache.shardingsphere.mode.metadata.manager.ResourceSwitchManager;
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
similarity index 61%
rename from 
mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
rename to 
mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
index 681608c445f..9ada96c58eb 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
@@ -15,36 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.mode.metadata;
+package org.apache.shardingsphere.mode.metadata.factory;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
-import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceGeneratedDatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
-import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
-import 
org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereDatabaseData;
-import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaData;
-import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
 import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import 
org.apache.shardingsphere.mode.metadata.factory.type.LocalConfigurationMetaDataContextsFactory;
+import 
org.apache.shardingsphere.mode.metadata.factory.type.RegisterCenterMetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 
@@ -74,95 +67,15 @@ public final class MetaDataContextsFactory {
      * @throws SQLException SQL exception
      */
     public MetaDataContexts create(final ContextManagerBuilderParameter param) 
throws SQLException {
-        return containsRegisteredDatabases() ? createFromRegisterCenter(param) 
: createFromLocalConfiguration(param);
+        return containsRegisteredDatabases()
+                ? new RegisterCenterMetaDataContextsFactory(persistService, 
instanceContext).create(param)
+                : new 
LocalConfigurationMetaDataContextsFactory(persistService, 
instanceContext).create(param);
     }
     
     private boolean containsRegisteredDatabases() {
         return 
!persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames().isEmpty();
     }
     
-    private MetaDataContexts createFromRegisterCenter(final 
ContextManagerBuilderParameter param) {
-        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = 
createEffectiveDatabaseConfigurations(getDatabaseNames(param.getDatabaseConfigs()),
 param.getDatabaseConfigs());
-        Collection<RuleConfiguration> globalRuleConfigs = 
persistService.getGlobalRuleService().load();
-        // TODO load global data sources from persist service
-        Map<String, DataSource> globalDataSources = 
param.getGlobalDataSources();
-        ConfigurationProperties props = new 
ConfigurationProperties(persistService.getPropsService().load());
-        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(
-                effectiveDatabaseConfigs, 
loadSchemas(effectiveDatabaseConfigs.keySet()), props, instanceContext);
-        return createMetaDataContexts(globalRuleConfigs, globalDataSources, 
databases, props);
-    }
-    
-    private MetaDataContexts createFromLocalConfiguration(final 
ContextManagerBuilderParameter param) throws SQLException {
-        ConfigurationProperties props = new 
ConfigurationProperties(param.getProps());
-        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(param.getDatabaseConfigs(), props, 
instanceContext);
-        MetaDataContexts result = 
createMetaDataContexts(param.getGlobalRuleConfigs(), 
param.getGlobalDataSources(), databases, props);
-        persistDatabaseConfigurations(result, param);
-        persistMetaData(result);
-        return result;
-    }
-    
-    private MetaDataContexts createMetaDataContexts(final 
Collection<RuleConfiguration> globalRuleConfigs, final Map<String, DataSource> 
globalDataSources,
-                                                    final 
Collection<ShardingSphereDatabase> databases, final ConfigurationProperties 
props) {
-        Collection<ShardingSphereRule> globalRules = 
GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props);
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, new ResourceMetaData(globalDataSources), new 
RuleMetaData(globalRules), props);
-        ShardingSphereStatistics statistics = 
ShardingSphereStatisticsFactory.create(metaData, 
persistService.getShardingSphereDataPersistService().load(metaData));
-        return new MetaDataContexts(metaData, statistics);
-    }
-    
-    private void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param) {
-        Collection<RuleConfiguration> globalRuleConfigs = 
metadataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations();
-        persistService.persistGlobalRuleConfiguration(globalRuleConfigs, 
param.getProps());
-        for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
-            String databaseName = entry.getKey();
-            persistService.persistConfigurations(entry.getKey(), 
entry.getValue(),
-                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits().entrySet().stream()
-                            .collect(Collectors.toMap(Entry::getKey, each -> 
each.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
-                    
metadataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
-        }
-    }
-    
-    private void persistMetaData(final MetaDataContexts metaDataContexts) {
-        metaDataContexts.getMetaData().getAllDatabases().forEach(each -> 
each.getAllSchemas().forEach(schema -> {
-            if (schema.isEmpty()) {
-                
persistService.getDatabaseMetaDataFacade().getSchema().add(each.getName(), 
schema.getName());
-            }
-            
persistService.getDatabaseMetaDataFacade().getTable().persist(each.getName(), 
schema.getName(), schema.getAllTables());
-        }));
-        for (Entry<String, ShardingSphereDatabaseData> databaseDataEntry : 
metaDataContexts.getStatistics().getDatabaseData().entrySet()) {
-            for (Entry<String, ShardingSphereSchemaData> schemaDataEntry : 
databaseDataEntry.getValue().getSchemaData().entrySet()) {
-                persistService.getShardingSphereDataPersistService().persist(
-                        
metaDataContexts.getMetaData().getDatabase(databaseDataEntry.getKey()), 
schemaDataEntry.getKey(), schemaDataEntry.getValue());
-            }
-        }
-    }
-    
-    private Collection<String> getDatabaseNames(final Map<String, 
DatabaseConfiguration> databaseConfigs) {
-        return instanceContext.getInstance().getMetaData() instanceof 
JDBCInstanceMetaData
-                ? databaseConfigs.keySet()
-                : 
persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames();
-    }
-    
-    private Map<String, DatabaseConfiguration> 
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames, 
final Map<String, DatabaseConfiguration> databaseConfigs) {
-        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs)));
-    }
-    
-    private DatabaseConfiguration createEffectiveDatabaseConfiguration(final 
String databaseName, final Map<String, DatabaseConfiguration> databaseConfigs) {
-        closeGeneratedDataSources(databaseName, databaseConfigs);
-        Map<String, DataSourceConfiguration> dataSources = 
persistService.loadDataSourceConfigurations(databaseName);
-        Collection<RuleConfiguration> databaseRuleConfigs = 
persistService.getDatabaseRulePersistService().load(databaseName);
-        return new DataSourceGeneratedDatabaseConfiguration(dataSources, 
databaseRuleConfigs);
-    }
-    
-    private void closeGeneratedDataSources(final String databaseName, final 
Map<String, ? extends DatabaseConfiguration> databaseConfigs) {
-        if (databaseConfigs.containsKey(databaseName) && 
!databaseConfigs.get(databaseName).getStorageUnits().isEmpty()) {
-            
databaseConfigs.get(databaseName).getDataSources().values().forEach(each -> new 
DataSourcePoolDestroyer(each).asyncDestroy());
-        }
-    }
-    
-    private Map<String, Collection<ShardingSphereSchema>> loadSchemas(final 
Collection<String> databaseNames) {
-        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> persistService.getDatabaseMetaDataFacade().getSchema().load(each)));
-    }
-    
     /**
      * Create meta data contexts by switch resource.
      *
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/LocalConfigurationMetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/LocalConfigurationMetaDataContextsFactory.java
new file mode 100644
index 00000000000..23b3aaa4440
--- /dev/null
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/LocalConfigurationMetaDataContextsFactory.java
@@ -0,0 +1,107 @@
+/*
+ * 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.mode.metadata.factory.type;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereDatabaseData;
+import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaData;
+import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * Local configuration meta data contexts factory.
+ */
+@RequiredArgsConstructor
+public final class LocalConfigurationMetaDataContextsFactory {
+    
+    private final MetaDataPersistService persistService;
+    
+    private final ComputeNodeInstanceContext instanceContext;
+    
+    /**
+     * Create meta data contexts.
+     *
+     * @param param context manager builder parameter
+     * @return meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public MetaDataContexts create(final ContextManagerBuilderParameter param) 
throws SQLException {
+        ConfigurationProperties props = new 
ConfigurationProperties(param.getProps());
+        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(param.getDatabaseConfigs(), props, 
instanceContext);
+        MetaDataContexts result = 
createMetaDataContexts(param.getGlobalRuleConfigs(), 
param.getGlobalDataSources(), databases, props);
+        persistDatabaseConfigurations(result, param);
+        persistMetaData(result);
+        return result;
+    }
+    
+    private MetaDataContexts createMetaDataContexts(final 
Collection<RuleConfiguration> globalRuleConfigs, final Map<String, DataSource> 
globalDataSources,
+                                                    final 
Collection<ShardingSphereDatabase> databases, final ConfigurationProperties 
props) {
+        Collection<ShardingSphereRule> globalRules = 
GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props);
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, new ResourceMetaData(globalDataSources), new 
RuleMetaData(globalRules), props);
+        ShardingSphereStatistics statistics = 
ShardingSphereStatisticsFactory.create(metaData, 
persistService.getShardingSphereDataPersistService().load(metaData));
+        return new MetaDataContexts(metaData, statistics);
+    }
+    
+    private void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param) {
+        Collection<RuleConfiguration> globalRuleConfigs = 
metadataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations();
+        persistService.persistGlobalRuleConfiguration(globalRuleConfigs, 
param.getProps());
+        for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
+            ShardingSphereDatabase database = 
metadataContexts.getMetaData().getDatabase(entry.getKey());
+            Map<String, DataSource> dataSources = 
database.getResourceMetaData().getStorageUnits().entrySet().stream()
+                    .collect(Collectors.toMap(Entry::getKey, each -> 
each.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new));
+            persistService.persistConfigurations(entry.getKey(), 
entry.getValue(), dataSources, database.getRuleMetaData().getRules());
+        }
+    }
+    
+    private void persistMetaData(final MetaDataContexts metaDataContexts) {
+        metaDataContexts.getMetaData().getAllDatabases().forEach(each -> 
each.getAllSchemas().forEach(schema -> {
+            if (schema.isEmpty()) {
+                
persistService.getDatabaseMetaDataFacade().getSchema().add(each.getName(), 
schema.getName());
+            }
+            
persistService.getDatabaseMetaDataFacade().getTable().persist(each.getName(), 
schema.getName(), schema.getAllTables());
+        }));
+        for (Entry<String, ShardingSphereDatabaseData> databaseDataEntry : 
metaDataContexts.getStatistics().getDatabaseData().entrySet()) {
+            for (Entry<String, ShardingSphereSchemaData> schemaDataEntry : 
databaseDataEntry.getValue().getSchemaData().entrySet()) {
+                persistService.getShardingSphereDataPersistService().persist(
+                        
metaDataContexts.getMetaData().getDatabase(databaseDataEntry.getKey()), 
schemaDataEntry.getKey(), schemaDataEntry.getValue());
+            }
+        }
+    }
+}
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/RegisterCenterMetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/RegisterCenterMetaDataContextsFactory.java
new file mode 100644
index 00000000000..42461ec3d14
--- /dev/null
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/type/RegisterCenterMetaDataContextsFactory.java
@@ -0,0 +1,110 @@
+/*
+ * 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.mode.metadata.factory.type;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
+import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceGeneratedDatabaseConfiguration;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
+import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
+import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import 
org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Register center meta data contexts factory.
+ */
+@RequiredArgsConstructor
+public final class RegisterCenterMetaDataContextsFactory {
+    
+    private final MetaDataPersistService persistService;
+    
+    private final ComputeNodeInstanceContext instanceContext;
+    
+    /**
+     * Create meta data contexts.
+     *
+     * @param param context manager builder parameter
+     * @return meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public MetaDataContexts create(final ContextManagerBuilderParameter param) 
throws SQLException {
+        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = 
createEffectiveDatabaseConfigurations(getDatabaseNames(param.getDatabaseConfigs()),
 param.getDatabaseConfigs());
+        Collection<RuleConfiguration> globalRuleConfigs = 
persistService.getGlobalRuleService().load();
+        // TODO load global data sources from persist service
+        Map<String, DataSource> globalDataSources = 
param.getGlobalDataSources();
+        ConfigurationProperties props = new 
ConfigurationProperties(persistService.getPropsService().load());
+        Collection<ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(effectiveDatabaseConfigs, 
loadSchemas(effectiveDatabaseConfigs.keySet()), props, instanceContext);
+        return createMetaDataContexts(globalRuleConfigs, globalDataSources, 
databases, props);
+    }
+    
+    private Collection<String> getDatabaseNames(final Map<String, 
DatabaseConfiguration> databaseConfigs) {
+        return instanceContext.getInstance().getMetaData() instanceof 
JDBCInstanceMetaData
+                ? databaseConfigs.keySet()
+                : 
persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames();
+    }
+    
+    private Map<String, DatabaseConfiguration> 
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames, 
final Map<String, DatabaseConfiguration> databaseConfigs) {
+        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs)));
+    }
+    
+    private DatabaseConfiguration createEffectiveDatabaseConfiguration(final 
String databaseName, final Map<String, DatabaseConfiguration> databaseConfigs) {
+        closeGeneratedDataSources(databaseName, databaseConfigs);
+        Map<String, DataSourceConfiguration> dataSources = 
persistService.loadDataSourceConfigurations(databaseName);
+        Collection<RuleConfiguration> databaseRuleConfigs = 
persistService.getDatabaseRulePersistService().load(databaseName);
+        return new DataSourceGeneratedDatabaseConfiguration(dataSources, 
databaseRuleConfigs);
+    }
+    
+    private void closeGeneratedDataSources(final String databaseName, final 
Map<String, ? extends DatabaseConfiguration> databaseConfigs) {
+        if (databaseConfigs.containsKey(databaseName) && 
!databaseConfigs.get(databaseName).getStorageUnits().isEmpty()) {
+            
databaseConfigs.get(databaseName).getDataSources().values().forEach(each -> new 
DataSourcePoolDestroyer(each).asyncDestroy());
+        }
+    }
+    
+    private Map<String, Collection<ShardingSphereSchema>> loadSchemas(final 
Collection<String> databaseNames) {
+        return databaseNames.stream().collect(Collectors.toMap(each -> each, 
each -> persistService.getDatabaseMetaDataFacade().getSchema().load(each)));
+    }
+    
+    private MetaDataContexts createMetaDataContexts(final 
Collection<RuleConfiguration> globalRuleConfigs, final Map<String, DataSource> 
globalDataSources,
+                                                    final 
Collection<ShardingSphereDatabase> databases, final ConfigurationProperties 
props) {
+        Collection<ShardingSphereRule> globalRules = 
GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props);
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, new ResourceMetaData(globalDataSources), new 
RuleMetaData(globalRules), props);
+        ShardingSphereStatistics statistics = 
ShardingSphereStatisticsFactory.create(metaData, 
persistService.getShardingSphereDataPersistService().load(metaData));
+        return new MetaDataContexts(metaData, statistics);
+    }
+}
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
index 996b7a7f16d..530a92899c6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 66539df3e15..4f7ef1d2467 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
similarity index 98%
rename from 
mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
rename to 
mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
index 79f8feeebcf..deca0c65f28 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.mode.metadata;
+package org.apache.shardingsphere.mode.metadata.factory;
 
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabases
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.mode.metadata.persist.service.config.database.DatabaseRulePersistService;
 import 
org.apache.shardingsphere.mode.metadata.persist.service.config.global.GlobalRulePersistService;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
index d3288bfad09..4dd8330d1f9 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
@@ -38,7 +38,7 @@ import 
org.apache.shardingsphere.mode.manager.cluster.persist.service.GlobalLock
 import org.apache.shardingsphere.mode.deliver.DeliverEventSubscriberRegistry;
 import 
org.apache.shardingsphere.mode.manager.cluster.workerid.ClusterWorkerIdGenerator;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositoryConfiguration;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
index bccb6da4eaa..99025d945c3 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
@@ -34,7 +34,7 @@ import 
org.apache.shardingsphere.mode.metadata.persist.service.config.database.D
 import 
org.apache.shardingsphere.mode.metadata.persist.service.metadata.DatabaseMetaDataPersistFacade;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import 
org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedType;
 import 
org.apache.shardingsphere.mode.persist.service.unified.ListenerAssistedPersistService;
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index 38737a3222d..be131af6663 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -28,7 +28,7 @@ import 
org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 import 
org.apache.shardingsphere.mode.manager.standalone.lock.StandaloneLockContext;
 import 
org.apache.shardingsphere.mode.manager.standalone.workerid.StandaloneWorkerIdGenerator;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository;
 
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
index 45018548fc6..dffa6d67eb3 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
@@ -37,7 +37,7 @@ import 
org.apache.shardingsphere.mode.metadata.persist.service.config.database.D
 import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.manager.RuleItemChangedBuilder;
 import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import 
org.apache.shardingsphere.mode.metadata.refresher.util.TableRefreshUtils;


Reply via email to