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

tuichenchuxin 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 5e7e0524e78 Move refresh global rule and database rule to 
ContextManager (#26440)
5e7e0524e78 is described below

commit 5e7e0524e78a4f32e03f7eb2ef9de0f8b779e4c5
Author: zhaojinchao <[email protected]>
AuthorDate: Tue Jun 20 14:06:57 2023 +0800

    Move refresh global rule and database rule to ContextManager (#26440)
    
    * Move refresh new metadata to ContextManager
    
    * Fix ci
---
 .../infra/metadata/version/MetaDataVersion.java    |  2 +
 .../schema/NewTableMetaDataPersistService.java     | 23 ++++++
 .../schema/NewViewMetaDataPersistService.java      | 25 ++++++
 .../schema/SchemaMetaDataPersistService.java       | 14 ++++
 .../schema/TableMetaDataPersistService.java        |  7 ++
 .../service/schema/ViewMetaDataPersistService.java |  7 ++
 .../mode/manager/ContextManager.java               | 89 ++++++++++++++++++++++
 .../NewConfigurationChangedSubscriber.java         | 37 +--------
 8 files changed, 170 insertions(+), 34 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
index ab62861af65..da264a93aaf 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
@@ -17,11 +17,13 @@
 
 package org.apache.shardingsphere.infra.metadata.version;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
 /**
  * Meta data version.
  */
+@Getter
 @RequiredArgsConstructor
 public final class MetaDataVersion {
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
index 5d0ed10ee40..e517d32a559 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.metadata.persist.service.schema;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
@@ -30,6 +31,7 @@ import org.apache.shardingsphere.mode.spi.PersistRepository;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.List;
 import java.util.Map.Entry;
@@ -59,6 +61,27 @@ public final class NewTableMetaDataPersistService implements 
SchemaMetaDataPersi
         }
     }
     
+    @Override
+    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereTable> 
tables) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
+        for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
+            String tableName = entry.getKey().toLowerCase();
+            if (Strings.isNullOrEmpty(getActiveVersion(databaseName, 
schemaName, tableName))) {
+                
repository.persist(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
 schemaName, tableName), DEFAULT_VERSION);
+            }
+            List<String> versions = 
repository.getChildrenKeys(NewDatabaseMetaDataNode.getTableVersionsNode(databaseName,
 schemaName, tableName));
+            String nextActiveVersion = versions.isEmpty() ? DEFAULT_VERSION : 
String.valueOf(Integer.parseInt(versions.get(0)) + 1);
+            String persistKey = 
NewDatabaseMetaDataNode.getTableVersionNode(databaseName, schemaName, 
tableName, nextActiveVersion);
+            repository.persist(persistKey, YamlEngine.marshal(new 
YamlTableSwapper().swapToYamlConfiguration(entry.getValue())));
+            result.add(new MetaDataVersion(persistKey, 
getActiveVersion(databaseName, schemaName, tableName), nextActiveVersion));
+        }
+        return result;
+    }
+    
+    private String getActiveVersion(final String databaseName, final String 
schemaName, final String tableName) {
+        return 
repository.getDirectly(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
 schemaName, tableName));
+    }
+    
     @Override
     public Map<String, ShardingSphereTable> load(final String databaseName, 
final String schemaName) {
         Collection<String> tableNames = 
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName,
 schemaName));
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
index b8e5536e3a2..9503bb48688 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewViewMetaDataPersistService.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.metadata.persist.service.schema;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereView;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlViewSwapper;
@@ -30,6 +31,7 @@ import org.apache.shardingsphere.mode.spi.PersistRepository;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.List;
 import java.util.Map.Entry;
@@ -59,6 +61,29 @@ public final class NewViewMetaDataPersistService implements 
SchemaMetaDataPersis
         }
     }
     
+    @Override
+    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereView> 
views) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
+        for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
+            String viewName = entry.getKey().toLowerCase();
+            if (Strings.isNullOrEmpty(getActiveVersion(databaseName, 
schemaName, viewName))) {
+                
repository.persist(NewDatabaseMetaDataNode.getViewActiveVersionNode(databaseName,
 schemaName, viewName), DEFAULT_VERSION);
+            }
+            List<String> versions = 
repository.getChildrenKeys(NewDatabaseMetaDataNode.getViewVersionsNode(databaseName,
 schemaName, viewName));
+            String nextActiveVersion = 
NewDatabaseMetaDataNode.getViewVersionNode(databaseName, schemaName, viewName, 
versions.isEmpty()
+                    ? DEFAULT_VERSION
+                    : String.valueOf(Integer.parseInt(versions.get(0)) + 1));
+            String persistKey = 
NewDatabaseMetaDataNode.getViewVersionNode(databaseName, schemaName, viewName, 
nextActiveVersion);
+            repository.persist(persistKey, YamlEngine.marshal(new 
YamlViewSwapper().swapToYamlConfiguration(entry.getValue())));
+            result.add(new MetaDataVersion(persistKey, 
getActiveVersion(databaseName, schemaName, viewName), nextActiveVersion));
+        }
+        return result;
+    }
+    
+    private String getActiveVersion(final String databaseName, final String 
schemaName, final String viewName) {
+        return 
repository.getDirectly(NewDatabaseMetaDataNode.getViewActiveVersionNode(databaseName,
 schemaName, viewName));
+    }
+    
     @Override
     public Map<String, ShardingSphereView> load(final String databaseName, 
final String schemaName) {
         Collection<String> viewNames = 
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataViewsPath(databaseName,
 schemaName));
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
index 75c46f46f37..067cd061007 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
@@ -17,6 +17,10 @@
 
 package org.apache.shardingsphere.metadata.persist.service.schema;
 
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
+
+import java.util.Collection;
+
 /**
  * Schema meta data persist service.
  *
@@ -33,6 +37,16 @@ public interface SchemaMetaDataPersistService<T> {
      */
     void persist(String databaseName, String schemaName, T schema);
     
+    /**
+     * Persist schema meta data.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     * @return meta data versions
+     */
+    Collection<MetaDataVersion> persistSchemaMetaData(String databaseName, 
String schemaName, T schema);
+    
     /**
      * Load schema meta data.
      *
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
index 0216deb6932..ce2763c6f79 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.metadata.persist.service.schema;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
@@ -45,6 +46,12 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
                 YamlEngine.marshal(new 
YamlTableSwapper().swapToYamlConfiguration(value))));
     }
     
+    // TODO Remove this when metadata structure adjustment completed. #25485
+    @Override
+    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereTable> 
schema) {
+        return Collections.emptyList();
+    }
+    
     @Override
     public Map<String, ShardingSphereTable> load(final String databaseName, 
final String schemaName) {
         Collection<String> tableNames = 
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName,
 schemaName));
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
index c0c02d217d7..c54db42265b 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.metadata.persist.service.schema;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereView;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlViewSwapper;
@@ -45,6 +46,12 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
                 YamlEngine.marshal(new 
YamlViewSwapper().swapToYamlConfiguration(value))));
     }
     
+    // TODO Remove this when metadata structure adjustment completed. #25485
+    @Override
+    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereView> 
schema) {
+        return Collections.emptyList();
+    }
+    
     @Override
     public Map<String, ShardingSphereView> load(final String databaseName, 
final String schemaName) {
         Collection<String> viewNames = 
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataViewsPath(databaseName,
 schemaName));
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 76cf9adf4f9..15fb11d1629 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -43,6 +43,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.rule.identifier.type.MetaDataHeldRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
@@ -342,6 +344,30 @@ public final class ContextManager implements AutoCloseable 
{
         }
     }
     
+    /**
+     * Alter rule configuration.
+     *
+     * @param databaseName database name
+     * @param ruleConfig rule configurations
+     */
+    @SuppressWarnings("rawtypes")
+    public synchronized void alterRuleConfiguration(final String databaseName, 
final RuleConfiguration ruleConfig) {
+        try {
+            ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+            Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
+            rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(),
+                    ruleConfig, instanceContext));
+            database.getRuleMetaData().getRules().clear();
+            database.getRuleMetaData().getRules().addAll(rules);
+            MetaDataContexts reloadMetaDataContexts = 
createMetaDataContextsByAlterRule(databaseName, false, null, 
database.getRuleMetaData().getConfigurations());
+            alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+            metaDataContexts.set(reloadMetaDataContexts);
+            
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
+        } catch (final SQLException ex) {
+            log.error("Alter database: {} rule configurations failed", 
databaseName, ex);
+        }
+    }
+    
     /**
      * Alter schema meta data.
      * 
@@ -410,6 +436,23 @@ public final class ContextManager implements AutoCloseable 
{
         return result;
     }
     
+    /**
+     * Create meta data contexts by alter rule.
+     *
+     * @param databaseName database name
+     * @param internalLoadMetaData internal load meta data
+     * @param switchingResource switching resource
+     * @param ruleConfigs rule configs
+     * @return MetaDataContexts meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public MetaDataContexts createMetaDataContextsByAlterRule(final String 
databaseName, final boolean internalLoadMetaData, final SwitchingResource 
switchingResource,
+                                                              final 
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+        Map<String, ShardingSphereDatabase> changedDatabases = 
createChangedDatabases(databaseName, internalLoadMetaData, switchingResource, 
ruleConfigs);
+        return newMetaDataContexts(new ShardingSphereMetaData(changedDatabases,
+                metaDataContexts.get().getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.get().getMetaData().getProps()));
+    }
+    
     /**
      * Create meta data contexts.
      * 
@@ -516,6 +559,52 @@ public final class ContextManager implements AutoCloseable 
{
         metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
     }
     
+    /**
+     * Alter global rule configuration.
+     *
+     * @param ruleName rule name
+     * @param ruleConfig global rule configuration
+     */
+    @SuppressWarnings("rawtypes")
+    public synchronized void alterGlobalRuleConfiguration(final String 
ruleName, final RuleConfiguration ruleConfig) {
+        Collection<ShardingSphereRule> rules = 
removeSingleGlobalRule(ruleName);
+        
rules.addAll(GlobalRulesBuilder.buildRules(Collections.singletonList(ruleConfig),
 metaDataContexts.get().getMetaData().getDatabases(),
+                metaDataContexts.get().getMetaData().getProps()));
+        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().clear();
+        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
+        ShardingSphereMetaData toBeChangedMetaData = new 
ShardingSphereMetaData(
+                metaDataContexts.get().getMetaData().getDatabases(), 
metaDataContexts.get().getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.get().getMetaData().getProps());
+        metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
+    }
+    
+    /**
+     * Drop global rule configuration.
+     *
+     * @param ruleName rule name
+     */
+    @SuppressWarnings("rawtypes")
+    public synchronized void dropGlobalRuleConfiguration(final String 
ruleName) {
+        Collection<ResourceHeldRule> staleResourceHeldRules = 
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class);
+        staleResourceHeldRules.forEach(ResourceHeldRule::closeStaleResource);
+        Collection<ShardingSphereRule> rules = 
removeSingleGlobalRule(ruleName);
+        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().clear();
+        
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
+        ShardingSphereMetaData toBeChangedMetaData = new 
ShardingSphereMetaData(metaDataContexts.get().getMetaData().getDatabases(),
+                new 
ShardingSphereRuleMetaData(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules()),
 metaDataContexts.get().getMetaData().getProps());
+        metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
+    }
+    
+    private Collection<ShardingSphereRule> removeSingleGlobalRule(final String 
ruleSimpleName) {
+        Collection<ShardingSphereRule> result = new 
LinkedList<>(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules());
+        for (ShardingSphereRule each : result) {
+            if (!each.getType().equals(ruleSimpleName)) {
+                continue;
+            }
+            result.remove(each);
+        }
+        return result;
+    }
+    
     /**
      * Alter properties.
      * 
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
index 549eaf4b167..a8d50514928 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
@@ -20,17 +20,9 @@ package 
org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
 import com.google.common.eventbus.Subscribe;
 import 
org.apache.shardingsphere.infra.config.rule.global.event.AlterGlobalRuleConfigurationEvent;
 import 
org.apache.shardingsphere.infra.config.rule.global.event.DeleteGlobalRuleConfigurationEvent;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
-import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import 
org.apache.shardingsphere.mode.event.config.DatabaseRuleConfigurationChangedEvent;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-
 /**
  * TODO Rename ConfigurationChangedSubscriber when metadata structure 
adjustment completed. #25485
  * New configuration changed subscriber.
@@ -52,13 +44,7 @@ public final class NewConfigurationChangedSubscriber {
      */
     @Subscribe
     public synchronized void renew(final DatabaseRuleConfigurationChangedEvent 
event) {
-        String databaseName = event.getDatabaseName();
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
-        Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
-        rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getResourceMetaData().getDataSources(), 
database.getRuleMetaData().getRules(),
-                event.getRuleConfig(), contextManager.getInstanceContext()));
-        database.getRuleMetaData().getRules().clear();
-        database.getRuleMetaData().getRules().addAll(rules);
+        contextManager.alterRuleConfiguration(event.getDatabaseName(), 
event.getRuleConfig());
     }
     
     /**
@@ -68,11 +54,7 @@ public final class NewConfigurationChangedSubscriber {
      */
     @Subscribe
     public synchronized void renew(final AlterGlobalRuleConfigurationEvent 
event) {
-        Collection<ShardingSphereRule> rules = 
removeSingleGlobalRule(event.getRuleSimpleName());
-        
rules.addAll(GlobalRulesBuilder.buildRules(Collections.singletonList(event.getConfig()),
 contextManager.getMetaDataContexts().getMetaData().getDatabases(),
-                
contextManager.getMetaDataContexts().getMetaData().getProps()));
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules().clear();
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
+        contextManager.alterGlobalRuleConfiguration(event.getRuleSimpleName(), 
event.getConfig());
     }
     
     /**
@@ -82,19 +64,6 @@ public final class NewConfigurationChangedSubscriber {
      */
     @Subscribe
     public synchronized void renew(final DeleteGlobalRuleConfigurationEvent 
event) {
-        Collection<ShardingSphereRule> rules = 
removeSingleGlobalRule(event.getRuleSimpleName());
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules().clear();
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
-    }
-    
-    private Collection<ShardingSphereRule> removeSingleGlobalRule(final String 
ruleSimpleName) {
-        Collection<ShardingSphereRule> result = new 
LinkedList<>(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules());
-        for (ShardingSphereRule each : result) {
-            if (!each.getType().equals(ruleSimpleName)) {
-                continue;
-            }
-            result.remove(each);
-        }
-        return result;
+        contextManager.dropGlobalRuleConfiguration(event.getRuleSimpleName());
     }
 }

Reply via email to