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

duanzhengqiang 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 75c5b587ee9 Add RuleItemManager and remove 
StandaloneDeliverEventSubscriberRegistry (#31772)
75c5b587ee9 is described below

commit 75c5b587ee9bea1b5028e161f60463d5d8141e94
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Jun 20 16:29:06 2024 +0800

    Add RuleItemManager and remove StandaloneDeliverEventSubscriberRegistry 
(#31772)
---
 .../mode/service/MetaDataContextManager.java       |  4 ++
 .../mode/service/manager/RuleItemManager.java      | 83 ++++++++++++++++++++++
 .../StandaloneContextManagerBuilder.java           |  5 +-
 .../StandaloneMetaDataManagerPersistService.java   | 32 +++++----
 .../StandaloneDeliverEventSubscriberRegistry.java  | 32 ---------
 5 files changed, 107 insertions(+), 49 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
index 9eef46a5900..8451bc82891 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/MetaDataContextManager.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.service.manager.ConfigurationManager;
 import org.apache.shardingsphere.mode.service.manager.ResourceMetaDataManager;
+import org.apache.shardingsphere.mode.service.manager.RuleItemManager;
 import 
org.apache.shardingsphere.mode.service.manager.ShardingSphereDatabaseManager;
 
 import java.util.concurrent.atomic.AtomicReference;
@@ -38,10 +39,13 @@ public class MetaDataContextManager {
     
     private final ResourceMetaDataManager resourceMetaDataManager;
     
+    private final RuleItemManager ruleItemManager;
+    
     public MetaDataContextManager(final AtomicReference<MetaDataContexts> 
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
                                   final PersistServiceFacade 
persistServiceFacade) {
         databaseManager = new ShardingSphereDatabaseManager(metaDataContexts);
         configurationManager = new ConfigurationManager(metaDataContexts, 
computeNodeInstanceContext, persistServiceFacade);
         resourceMetaDataManager = new 
ResourceMetaDataManager(metaDataContexts, persistServiceFacade);
+        ruleItemManager = new RuleItemManager(metaDataContexts, 
persistServiceFacade, configurationManager);
     }
 }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
new file mode 100644
index 00000000000..69b17a9da94
--- /dev/null
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/service/manager/RuleItemManager.java
@@ -0,0 +1,83 @@
+/*
+ * 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.service.manager;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
+import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.service.PersistServiceFacade;
+import 
org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Rule item manager.
+ */
+@RequiredArgsConstructor
+public class RuleItemManager {
+    
+    private final AtomicReference<MetaDataContexts> metaDataContexts;
+    
+    private final PersistServiceFacade persistServiceFacade;
+    
+    private final ConfigurationManager configurationManager;
+    
+    /**
+     * Alter with rule item.
+     *
+     * @param event alter rule item event
+     */
+    @SuppressWarnings({"rawtypes", "unchecked", "unused"})
+    public void alterRuleItem(final AlterRuleItemEvent event) {
+        if 
(!event.getActiveVersion().equals(persistServiceFacade.getMetaDataPersistService().getMetaDataVersionPersistService()
+                .getActiveVersionByFullPath(event.getActiveVersionKey()))) {
+            return;
+        }
+        RuleItemConfigurationChangedProcessor processor = 
TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, 
event.getType());
+        String yamlContent = 
persistServiceFacade.getMetaDataPersistService().getMetaDataVersionPersistService()
+                .getVersionPathByActiveVersion(event.getActiveVersionKey(), 
event.getActiveVersion());
+        String databaseName = event.getDatabaseName();
+        RuleConfiguration currentRuleConfig = 
processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        synchronized (this) {
+            processor.changeRuleItemConfiguration(event, currentRuleConfig, 
processor.swapRuleItemConfiguration(event, yamlContent));
+            configurationManager.alterRuleConfiguration(databaseName, 
currentRuleConfig);
+        }
+    }
+    
+    /**
+     * Drop with rule item.
+     *
+     * @param event drop rule item event
+     */
+    @SuppressWarnings({"rawtypes", "unchecked", "unused"})
+    public void dropRuleItem(final DropRuleItemEvent event) {
+        String databaseName = event.getDatabaseName();
+        if 
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName)) {
+            return;
+        }
+        RuleItemConfigurationChangedProcessor processor = 
TypedSPILoader.getService(RuleItemConfigurationChangedProcessor.class, 
event.getType());
+        RuleConfiguration currentRuleConfig = 
processor.findRuleConfiguration(metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        synchronized (this) {
+            processor.dropRuleItemConfiguration(event, currentRuleConfig);
+            configurationManager.dropRuleConfiguration(databaseName, 
currentRuleConfig);
+        }
+    }
+}
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 ace35f29171..528a6e85ddb 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
@@ -27,7 +27,6 @@ import org.apache.shardingsphere.mode.lock.GlobalLockContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
-import 
org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneDeliverEventSubscriberRegistry;
 import 
org.apache.shardingsphere.mode.manager.standalone.workerid.generator.StandaloneWorkerIdGenerator;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
@@ -49,9 +48,7 @@ public final class StandaloneContextManagerBuilder implements 
ContextManagerBuil
         MetaDataPersistService persistService = new 
MetaDataPersistService(repository);
         ComputeNodeInstanceContext computeNodeInstanceContext = 
buildComputeNodeInstanceContext(param, eventBusContext);
         MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(persistService, param, 
computeNodeInstanceContext);
-        ContextManager result = new ContextManager(metaDataContexts, 
computeNodeInstanceContext, repository);
-        new StandaloneDeliverEventSubscriberRegistry(result).register();
-        return result;
+        return new ContextManager(metaDataContexts, 
computeNodeInstanceContext, repository);
     }
     
     private ComputeNodeInstanceContext buildComputeNodeInstanceContext(final 
ContextManagerBuilderParameter param, final EventBusContext eventBusContext) {
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
index f5600759226..0edcdfbc62c 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/service/StandaloneMetaDataManagerPersistService.java
@@ -29,6 +29,9 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchema
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import 
org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
+import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
 import 
org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
@@ -275,29 +278,32 @@ public final class 
StandaloneMetaDataManagerPersistService implements MetaDataMa
             Collection<MetaDataVersion> metaDataVersions = 
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
                     
.persistConfigurations(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 Collections.singletonList(toBeAlteredRuleConfig));
             
contextManager.getPersistServiceFacade().getMetaDataPersistService().getMetaDataVersionPersistService().switchActiveVersion(metaDataVersions);
-            sendDatabaseRuleChangedEvent(databaseName, metaDataVersions);
+            for (MetaDataVersion each : metaDataVersions) {
+                Optional<GovernanceEvent> ruleItemEvent = 
buildAlterRuleItemEvent(databaseName, each, Type.UPDATED);
+                if (ruleItemEvent.isPresent() && ruleItemEvent.get() 
instanceof AlterRuleItemEvent) {
+                    
contextManager.getMetaDataContextManager().getRuleItemManager().alterRuleItem((AlterRuleItemEvent)
 ruleItemEvent.get());
+                }
+            }
             clearServiceCache();
         }
         return Collections.emptyList();
     }
     
-    private void sendDatabaseRuleChangedEvent(final String databaseName, final 
Collection<MetaDataVersion> metaDataVersions) {
-        for (MetaDataVersion each : metaDataVersions) {
-            sendDatabaseRuleChangedEvent(databaseName, each);
-        }
-    }
-    
-    private void sendDatabaseRuleChangedEvent(final String databaseName, final 
MetaDataVersion metaDataVersion) {
-        ruleConfigurationEventBuilder.build(databaseName, new 
DataChangedEvent(metaDataVersion.getActiveVersionNodePath(), 
metaDataVersion.getNextActiveVersion(), Type.UPDATED))
-                .ifPresent(optional -> 
contextManager.getComputeNodeInstanceContext().getEventBusContext().post(optional));
+    private Optional<GovernanceEvent> buildAlterRuleItemEvent(final String 
databaseName, final MetaDataVersion metaDataVersion, final Type type) {
+        return ruleConfigurationEventBuilder.build(databaseName, new 
DataChangedEvent(metaDataVersion.getActiveVersionNodePath(), 
metaDataVersion.getNextActiveVersion(), type));
     }
     
     @Override
     public void removeRuleConfigurationItem(final String databaseName, final 
RuleConfiguration toBeRemovedRuleConfig) {
         if (null != toBeRemovedRuleConfig) {
-            sendDatabaseRuleChangedEvent(databaseName,
-                    
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
-                            .deleteConfigurations(databaseName, 
Collections.singleton(toBeRemovedRuleConfig)));
+            Collection<MetaDataVersion> metaDataVersions = 
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
+                    .deleteConfigurations(databaseName, 
Collections.singleton(toBeRemovedRuleConfig));
+            for (MetaDataVersion metaDataVersion : metaDataVersions) {
+                Optional<GovernanceEvent> ruleItemEvent = 
buildAlterRuleItemEvent(databaseName, metaDataVersion, Type.DELETED);
+                if (ruleItemEvent.isPresent() && ruleItemEvent.get() 
instanceof DropRuleItemEvent) {
+                    
contextManager.getMetaDataContextManager().getRuleItemManager().dropRuleItem((DropRuleItemEvent)
 ruleItemEvent.get());
+                }
+            }
             clearServiceCache();
         }
     }
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
deleted file mode 100644
index 210fd1bf319..00000000000
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/subscriber/StandaloneDeliverEventSubscriberRegistry.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.mode.manager.standalone.subscriber;
-
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.mode.subsciber.DeliverEventSubscriberRegistry;
-import org.apache.shardingsphere.mode.subsciber.RuleItemChangedSubscriber;
-
-/**
- * Standalone deliver event subscriber registry.
- */
-public final class StandaloneDeliverEventSubscriberRegistry extends 
DeliverEventSubscriberRegistry {
-    
-    public StandaloneDeliverEventSubscriberRegistry(final ContextManager 
contextManager) {
-        super(contextManager, new RuleItemChangedSubscriber(contextManager));
-    }
-}

Reply via email to