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 d3c5bcc230d Use RuleConfigurationChangedHandler to instead of 
RuleConfigurationChangedEventBuilder (#34228)
d3c5bcc230d is described below

commit d3c5bcc230d718e1bc725cdaf3895029363597d1
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jan 2 23:53:48 2025 +0800

    Use RuleConfigurationChangedHandler to instead of 
RuleConfigurationChangedEventBuilder (#34228)
    
    * Use RuleConfigurationChangedHandler to instead of 
RuleConfigurationChangedEventBuilder
    
    * Use RuleConfigurationChangedHandler to instead of 
RuleConfigurationChangedEventBuilder
---
 .../cluster/ClusterContextManagerBuilder.java      |   2 +-
 .../RuleConfigurationChangedEventBuilder.java      |  94 ---------------
 .../dispatch/event/rule/RuleItemChangedEvent.java  |  33 ------
 .../event/rule/alter/AlterNamedRuleItemEvent.java  |  39 -------
 .../event/rule/alter/AlterRuleItemEvent.java       |  47 --------
 .../event/rule/alter/AlterUniqueRuleItemEvent.java |  37 ------
 .../event/rule/drop/DropNamedRuleItemEvent.java    |  35 ------
 .../event/rule/drop/DropRuleItemEvent.java         |  33 ------
 .../event/rule/drop/DropUniqueRuleItemEvent.java   |  33 ------
 .../{ => metadata}/MetaDataChangedHandler.java     |   2 +-
 .../{ => metadata}/SchemaChangedHandler.java       |   2 +-
 .../{ => metadata}/StorageNodeChangedHandler.java  |   2 +-
 .../{ => metadata}/StorageUnitChangedHandler.java  |   2 +-
 .../{ => metadata}/TableChangedHandler.java        |   2 +-
 .../{ => metadata}/ViewChangedHandler.java         |   2 +-
 .../rule/RuleConfigurationChangedHandler.java      | 117 +++++++++++++++++++
 .../type/DatabaseMetaDataChangedListener.java      |  27 +++--
 .../ClusterDispatchEventSubscriberRegistry.java    |   8 +-
 .../subscriber/type/RuleItemChangedSubscriber.java |  93 ---------------
 .../RuleConfigurationChangedEventBuilderTest.java  | 125 --------------------
 .../{ => metadata}/MetaDataChangedHandlerTest.java |   2 +-
 .../rule/RuleConfigurationChangedHandlerTest.java  | 128 +++++++++++++++++++++
 .../type/RuleItemChangedSubscriberTest.java        |  66 -----------
 23 files changed, 269 insertions(+), 662 deletions(-)

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 cdca1a7fdab..b614155a1f6 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
@@ -83,7 +83,7 @@ public final class ClusterContextManagerBuilder implements 
ContextManagerBuilder
         new DataChangedEventListenerRegistry(contextManager, 
getDatabaseNames(param, 
contextManager.getPersistServiceFacade().getMetaDataPersistService())).register();
         ClusterEventSubscriberRegistry eventSubscriberRegistry = new 
ClusterEventSubscriberRegistry(contextManager.getComputeNodeInstanceContext().getEventBusContext());
         
eventSubscriberRegistry.register(createDeliverEventSubscribers(repository));
-        eventSubscriberRegistry.register(new 
ClusterDispatchEventSubscriberRegistry(contextManager).getSubscribers());
+        eventSubscriberRegistry.register(new 
ClusterDispatchEventSubscriberRegistry().getSubscribers());
     }
     
     private Collection<String> getDatabaseNames(final 
ContextManagerBuilderParameter param, final MetaDataPersistService 
metaDataPersistService) {
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java
deleted file mode 100644
index a4cd3342568..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilder.java
+++ /dev/null
@@ -1,94 +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.cluster.event.dispatch.builder;
-
-import com.google.common.base.Strings;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent;
-import org.apache.shardingsphere.mode.path.rule.RuleNodePath;
-import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath;
-import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath;
-import org.apache.shardingsphere.mode.spi.RuleNodePathProvider;
-
-import java.util.Map.Entry;
-import java.util.Optional;
-
-/**
- * Rule configuration changed event builder.
- */
-public final class RuleConfigurationChangedEventBuilder {
-    
-    /**
-     * Build rule changed event.
-     *
-     * @param databaseName database name
-     * @param event data changed event
-     * @return built event
-     */
-    public Optional<DispatchEvent> build(final String databaseName, final 
DataChangedEvent event) {
-        for (RuleNodePathProvider each : 
ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) {
-            Optional<DispatchEvent> result = build(each.getRuleNodePath(), 
databaseName, event);
-            if (result.isPresent()) {
-                return result;
-            }
-        }
-        return Optional.empty();
-    }
-    
-    private Optional<DispatchEvent> build(final RuleNodePath ruleNodePath, 
final String databaseName, final DataChangedEvent event) {
-        if (!ruleNodePath.getRoot().isValidatedPath(event.getKey()) || 
Type.DELETED != event.getType() && Strings.isNullOrEmpty(event.getValue())) {
-            return Optional.empty();
-        }
-        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
-            Optional<String> itemName;
-            if (Type.ADDED == event.getType() || Type.UPDATED == 
event.getType()) {
-                itemName = 
entry.getValue().getNameByActiveVersion(event.getKey());
-            } else {
-                itemName = entry.getValue().getNameByItemPath(event.getKey());
-            }
-            if (itemName.isPresent()) {
-                return Optional.of(create(databaseName, itemName.get(), event, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
-            }
-        }
-        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
-            if (entry.getValue().isActiveVersionPath(event.getKey())) {
-                return Optional.of(create(databaseName, event, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
-            }
-        }
-        return Optional.empty();
-    }
-    
-    private RuleItemChangedEvent create(final String databaseName, final 
String itemName, final DataChangedEvent event, final String type) {
-        return Type.ADDED == event.getType() || Type.UPDATED == event.getType()
-                ? new AlterNamedRuleItemEvent(databaseName, itemName, 
event.getKey(), event.getValue(), type)
-                : new DropNamedRuleItemEvent(databaseName, itemName, type);
-    }
-    
-    private RuleItemChangedEvent create(final String databaseName, final 
DataChangedEvent event, final String type) {
-        return Type.ADDED == event.getType() || Type.UPDATED == event.getType()
-                ? new AlterUniqueRuleItemEvent(databaseName, event.getKey(), 
event.getValue(), type)
-                : new DropUniqueRuleItemEvent(databaseName, type);
-    }
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java
deleted file mode 100644
index 61004bbfec2..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/RuleItemChangedEvent.java
+++ /dev/null
@@ -1,33 +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.cluster.event.dispatch.event.rule;
-
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent;
-
-/**
- * Rule item changed event.
- */
-public interface RuleItemChangedEvent extends DispatchEvent {
-    
-    /**
-     * Get rule item type.
-     *
-     * @return rule item type
-     */
-    String getType();
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java
deleted file mode 100644
index 00fba8b5fc2..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterNamedRuleItemEvent.java
+++ /dev/null
@@ -1,39 +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.cluster.event.dispatch.event.rule.alter;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-/**
- * Alter named rule item event.
- */
-@RequiredArgsConstructor
-@Getter
-public final class AlterNamedRuleItemEvent implements AlterRuleItemEvent {
-    
-    private final String databaseName;
-    
-    private final String itemName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
-    
-    private final String type;
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java
deleted file mode 100644
index b22f8a97f1d..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterRuleItemEvent.java
+++ /dev/null
@@ -1,47 +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.cluster.event.dispatch.event.rule.alter;
-
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent;
-
-/**
- * Alter rule item event.
- */
-public interface AlterRuleItemEvent extends RuleItemChangedEvent {
-    
-    /**
-     * Get database name.
-     *
-     * @return database name
-     */
-    String getDatabaseName();
-    
-    /**
-     * Get active version key.
-     *
-     * @return active version key
-     */
-    String getActiveVersionKey();
-    
-    /**
-     * Get active version.
-     *
-     * @return active version
-     */
-    String getActiveVersion();
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java
deleted file mode 100644
index fc1107ede6a..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/alter/AlterUniqueRuleItemEvent.java
+++ /dev/null
@@ -1,37 +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.cluster.event.dispatch.event.rule.alter;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-/**
- * Alter unique rule item event.
- */
-@RequiredArgsConstructor
-@Getter
-public final class AlterUniqueRuleItemEvent implements AlterRuleItemEvent {
-    
-    private final String databaseName;
-    
-    private final String activeVersionKey;
-    
-    private final String activeVersion;
-    
-    private final String type;
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java
deleted file mode 100644
index 51bb4531ac9..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropNamedRuleItemEvent.java
+++ /dev/null
@@ -1,35 +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.cluster.event.dispatch.event.rule.drop;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-/**
- * Drop named rule item event.
- */
-@RequiredArgsConstructor
-@Getter
-public final class DropNamedRuleItemEvent implements DropRuleItemEvent {
-    
-    private final String databaseName;
-    
-    private final String itemName;
-    
-    private final String type;
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java
deleted file mode 100644
index 84793caea33..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropRuleItemEvent.java
+++ /dev/null
@@ -1,33 +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.cluster.event.dispatch.event.rule.drop;
-
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.RuleItemChangedEvent;
-
-/**
- * Drop rule item event.
- */
-public interface DropRuleItemEvent extends RuleItemChangedEvent {
-    
-    /**
-     * Get database name.
-     *
-     * @return database name
-     */
-    String getDatabaseName();
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java
deleted file mode 100644
index 1b466cdb8cf..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/event/rule/drop/DropUniqueRuleItemEvent.java
+++ /dev/null
@@ -1,33 +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.cluster.event.dispatch.event.rule.drop;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-/**
- * Drop unique rule item event.
- */
-@RequiredArgsConstructor
-@Getter
-public final class DropUniqueRuleItemEvent implements DropRuleItemEvent {
-    
-    private final String databaseName;
-    
-    private final String type;
-}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandler.java
similarity index 99%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandler.java
index 45b3ae2c54a..3938653164f 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
 import 
org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/SchemaChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/SchemaChangedHandler.java
similarity index 98%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/SchemaChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/SchemaChangedHandler.java
index e06af0c2afb..e4a7287b746 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/SchemaChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/SchemaChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.mode.metadata.refresher.ShardingSphereStatisticsRefreshEngine;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageNodeChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageNodeChangedHandler.java
similarity index 98%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageNodeChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageNodeChangedHandler.java
index 08118079737..46847319a3d 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageNodeChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageNodeChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageUnitChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageUnitChangedHandler.java
similarity index 99%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageUnitChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageUnitChangedHandler.java
index fff5ccacaf5..5573781aa5c 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/StorageUnitChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/StorageUnitChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import com.google.common.base.Preconditions;
 import lombok.RequiredArgsConstructor;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/TableChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/TableChangedHandler.java
similarity index 99%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/TableChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/TableChangedHandler.java
index 860fbc52c65..c4a617e5b1f 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/TableChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/TableChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/ViewChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/ViewChangedHandler.java
similarity index 99%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/ViewChangedHandler.java
rename to 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/ViewChangedHandler.java
index 1612947e174..6bc01b6aa4b 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/ViewChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/ViewChangedHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandler.java
new file mode 100644
index 00000000000..5dca721ef45
--- /dev/null
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandler.java
@@ -0,0 +1,117 @@
+/*
+ * 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.cluster.event.dispatch.handler.database.rule;
+
+import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.path.rule.RuleNodePath;
+import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath;
+import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath;
+import org.apache.shardingsphere.mode.spi.RuleNodePathProvider;
+import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem;
+import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem;
+
+import java.sql.SQLException;
+import java.util.Map.Entry;
+import java.util.Optional;
+
+/**
+ * Rule configuration changed handler.
+ */
+@RequiredArgsConstructor
+public final class RuleConfigurationChangedHandler {
+    
+    private final ContextManager contextManager;
+    
+    /**
+     * Handle rule changed.
+     *
+     * @param databaseName database name
+     * @param event data changed event
+     * @throws SQLException SQL Exception
+     */
+    public void handle(final String databaseName, final DataChangedEvent 
event) throws SQLException {
+        for (RuleNodePathProvider each : 
ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) {
+            if (handle(each.getRuleNodePath(), databaseName, event)) {
+                return;
+            }
+        }
+    }
+    
+    private boolean handle(final RuleNodePath ruleNodePath, final String 
databaseName, final DataChangedEvent event) throws SQLException {
+        if (!ruleNodePath.getRoot().isValidatedPath(event.getKey()) || 
Type.DELETED != event.getType() && Strings.isNullOrEmpty(event.getValue())) {
+            return false;
+        }
+        return handleNamedRuleItems(ruleNodePath, databaseName, event) || 
handleUniqueRuleItems(ruleNodePath, databaseName, event);
+    }
+    
+    private boolean handleNamedRuleItems(final RuleNodePath ruleNodePath, 
final String databaseName, final DataChangedEvent event) throws SQLException {
+        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
+            Optional<String> itemName = getItemName(event, entry.getValue());
+            if (itemName.isPresent()) {
+                handleNamedRuleItem(ruleNodePath, databaseName, 
itemName.get(), entry.getKey(), event);
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private void handleNamedRuleItem(final RuleNodePath ruleNodePath, final 
String databaseName, final String itemName, final String path, final 
DataChangedEvent event) throws SQLException {
+        String type = ruleNodePath.getRoot().getRuleType() + "." + path;
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            
contextManager.getMetaDataContextManager().getRuleItemManager().alterRuleItem(new
 AlterNamedRuleItem(databaseName, itemName, event.getKey(), event.getValue(), 
type));
+        } else if (Type.DELETED == event.getType()) {
+            
contextManager.getMetaDataContextManager().getRuleItemManager().dropRuleItem(new
 DropNamedRuleItem(databaseName, itemName, type));
+        }
+    }
+    
+    private boolean handleUniqueRuleItems(final RuleNodePath ruleNodePath, 
final String databaseName, final DataChangedEvent event) throws SQLException {
+        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
+            if (entry.getValue().isActiveVersionPath(event.getKey())) {
+                handleUniqueRuleItem(ruleNodePath, databaseName, 
entry.getKey(), event);
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private void handleUniqueRuleItem(final RuleNodePath ruleNodePath, final 
String databaseName, final String path, final DataChangedEvent event) throws 
SQLException {
+        String type = ruleNodePath.getRoot().getRuleType() + "." + path;
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            
contextManager.getMetaDataContextManager().getRuleItemManager().alterRuleItem(new
 AlterUniqueRuleItem(databaseName, event.getKey(), event.getValue(), type));
+        } else if (Type.DELETED == event.getType()) {
+            
contextManager.getMetaDataContextManager().getRuleItemManager().dropRuleItem(new
 DropUniqueRuleItem(databaseName, type));
+        }
+    }
+    
+    private Optional<String> getItemName(final DataChangedEvent event, final 
NamedRuleItemNodePath ruleItemNodePath) {
+        if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
+            return ruleItemNodePath.getNameByActiveVersion(event.getKey());
+        }
+        if (Type.DELETED == event.getType()) {
+            return ruleItemNodePath.getNameByItemPath(event.getKey());
+        }
+        return Optional.empty();
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
index 37fa76bfb75..f026ee4f0cf 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
@@ -18,14 +18,15 @@
 package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type;
 
 import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
 import org.apache.shardingsphere.mode.manager.ContextManager;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.builder.RuleConfigurationChangedEventBuilder;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.MetaDataChangedHandler;
+import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata.MetaDataChangedHandler;
+import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.rule.RuleConfigurationChangedHandler;
 import 
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener;
 
+import java.sql.SQLException;
 import java.util.Optional;
 
 /**
@@ -38,19 +39,17 @@ public final class DatabaseMetaDataChangedListener 
implements DataChangedEventLi
     
     @Override
     public void onChange(final DataChangedEvent event) {
-        
createDispatchEvent(event).ifPresent(contextManager.getComputeNodeInstanceContext().getEventBusContext()::post);
-    }
-    
-    private Optional<DispatchEvent> createDispatchEvent(final DataChangedEvent 
event) {
-        String key = event.getKey();
-        Optional<String> databaseName = 
DatabaseMetaDataNode.getDatabaseNameBySchemaNode(key);
+        Optional<String> databaseName = 
DatabaseMetaDataNode.getDatabaseNameBySchemaNode(event.getKey());
         if (!databaseName.isPresent()) {
-            return Optional.empty();
+            return;
+        }
+        if (new 
MetaDataChangedHandler(contextManager).handle(databaseName.get(), event)) {
+            return;
         }
-        boolean handleCompleted = new 
MetaDataChangedHandler(contextManager).handle(databaseName.get(), event);
-        if (handleCompleted) {
-            return Optional.empty();
+        try {
+            new 
RuleConfigurationChangedHandler(contextManager).handle(databaseName.get(), 
event);
+        } catch (final SQLException ex) {
+            throw new SQLWrapperException(ex);
         }
-        return new 
RuleConfigurationChangedEventBuilder().build(databaseName.get(), event);
     }
 }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java
index 8d6f5ebf1d4..0fd96631791 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/ClusterDispatchEventSubscriberRegistry.java
@@ -19,12 +19,10 @@ package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.util.eventbus.EventSubscriber;
-import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.CacheEvictedSubscriber;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type.RuleItemChangedSubscriber;
 
-import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 /**
  * Cluster dispatch event subscriber registry.
@@ -34,7 +32,7 @@ public final class ClusterDispatchEventSubscriberRegistry {
     
     private final Collection<EventSubscriber> subscribers;
     
-    public ClusterDispatchEventSubscriberRegistry(final ContextManager 
contextManager) {
-        subscribers = Arrays.asList(new 
RuleItemChangedSubscriber(contextManager), new CacheEvictedSubscriber());
+    public ClusterDispatchEventSubscriberRegistry() {
+        subscribers = Collections.singleton(new CacheEvictedSubscriber());
     }
 }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java
deleted file mode 100644
index 0dc53fd1c9c..00000000000
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriber.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.type;
-
-import com.google.common.eventbus.Subscribe;
-import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.subscriber.DispatchEventSubscriber;
-import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager;
-import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem;
-import org.apache.shardingsphere.mode.spi.item.AlterRuleItem;
-import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem;
-import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem;
-import org.apache.shardingsphere.mode.spi.item.DropRuleItem;
-import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem;
-
-import java.sql.SQLException;
-
-/**
- * Rule item changed subscriber.
- */
-@RequiredArgsConstructor
-public final class RuleItemChangedSubscriber implements 
DispatchEventSubscriber {
-    
-    private final RuleItemManager ruleItemManager;
-    
-    public RuleItemChangedSubscriber(final ContextManager contextManager) {
-        ruleItemManager = 
contextManager.getMetaDataContextManager().getRuleItemManager();
-    }
-    
-    /**
-     * Renew with alter rule item.
-     *
-     * @param event alter rule item event
-     * @throws SQLException SQL Exception
-     */
-    @Subscribe
-    public void renew(final AlterRuleItemEvent event) throws SQLException {
-        // TODO remove the event and this subscriber
-        ruleItemManager.alterRuleItem(convertToAlterRuleItem(event));
-    }
-    
-    /**
-     * Renew with drop rule item.
-     *
-     * @param event drop rule item event
-     * @throws SQLException SQL Exception
-     */
-    @Subscribe
-    public void renew(final DropRuleItemEvent event) throws SQLException {
-        // TODO remove the event and this subscriber
-        ruleItemManager.dropRuleItem(convertToDropRuleItem(event));
-    }
-    
-    private AlterRuleItem convertToAlterRuleItem(final AlterRuleItemEvent 
event) {
-        if (event instanceof AlterNamedRuleItemEvent) {
-            AlterNamedRuleItemEvent alterNamedRuleItemEvent = 
(AlterNamedRuleItemEvent) event;
-            return new 
AlterNamedRuleItem(alterNamedRuleItemEvent.getDatabaseName(), 
alterNamedRuleItemEvent.getItemName(), event.getActiveVersionKey(), 
event.getActiveVersion(), event.getType());
-        }
-        AlterUniqueRuleItemEvent alterUniqueRuleItemEvent = 
(AlterUniqueRuleItemEvent) event;
-        return new 
AlterUniqueRuleItem(alterUniqueRuleItemEvent.getDatabaseName(), 
alterUniqueRuleItemEvent.getActiveVersionKey(), event.getActiveVersion(), 
event.getType());
-    }
-    
-    private DropRuleItem convertToDropRuleItem(final DropRuleItemEvent event) {
-        if (event instanceof DropNamedRuleItemEvent) {
-            DropNamedRuleItemEvent dropNamedRuleItemEvent = 
(DropNamedRuleItemEvent) event;
-            return new 
DropNamedRuleItem(dropNamedRuleItemEvent.getDatabaseName(), 
dropNamedRuleItemEvent.getItemName(), event.getType());
-        }
-        DropUniqueRuleItemEvent dropUniqueRuleItemEvent = 
(DropUniqueRuleItemEvent) event;
-        return new 
DropUniqueRuleItem(dropUniqueRuleItemEvent.getDatabaseName(), event.getType());
-    }
-}
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java
deleted file mode 100644
index 719cee3b2b7..00000000000
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/builder/RuleConfigurationChangedEventBuilderTest.java
+++ /dev/null
@@ -1,125 +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.cluster.event.dispatch.builder;
-
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.DispatchEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterUniqueRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropUniqueRuleItemEvent;
-import org.apache.shardingsphere.mode.path.rule.RuleNodePath;
-import org.apache.shardingsphere.mode.spi.RuleNodePathProvider;
-import org.apache.shardingsphere.test.mock.AutoMockExtension;
-import org.apache.shardingsphere.test.mock.StaticMockSettings;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.junit.jupiter.api.extension.ExtensionContext;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.ArgumentsProvider;
-import org.junit.jupiter.params.provider.ArgumentsSource;
-
-import java.util.Collections;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ShardingSphereServiceLoader.class)
-class RuleConfigurationChangedEventBuilderTest {
-    
-    @Test
-    void assertBuildWithoutRuleNodePathProvider() {
-        
when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.emptyList());
-        assertFalse(new RuleConfigurationChangedEventBuilder().build("foo_db", 
new DataChangedEvent("k", "v", Type.IGNORED)).isPresent());
-    }
-    
-    @ParameterizedTest(name = "{0}")
-    @ArgumentsSource(TestCaseArgumentsProvider.class)
-    void assertBuild(final String name, final String eventKey, final String 
eventValue, final Type type, final boolean isEventPresent, final Class<? 
extends DispatchEvent> dispatchEventClass) {
-        RuleNodePathProvider ruleNodePathProvider = 
mock(RuleNodePathProvider.class, RETURNS_DEEP_STUBS);
-        when(ruleNodePathProvider.getRuleNodePath()).thenReturn(new 
RuleNodePath("fixture", Collections.singleton("named"), 
Collections.singleton("unique")));
-        
when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.singleton(ruleNodePathProvider));
-        Optional<DispatchEvent> actual = new 
RuleConfigurationChangedEventBuilder().build("foo_db", new 
DataChangedEvent(eventKey, eventValue, type));
-        assertThat(actual.isPresent(), is(isEventPresent));
-        if (actual.isPresent()) {
-            if (dispatchEventClass == AlterNamedRuleItemEvent.class) {
-                assertDispatchEvent((AlterNamedRuleItemEvent) actual.get());
-            } else if (dispatchEventClass == DropNamedRuleItemEvent.class) {
-                assertDispatchEvent((DropNamedRuleItemEvent) actual.get());
-            } else if (dispatchEventClass == AlterUniqueRuleItemEvent.class) {
-                assertDispatchEvent((AlterUniqueRuleItemEvent) actual.get());
-            } else if (dispatchEventClass == DropUniqueRuleItemEvent.class) {
-                assertDispatchEvent((DropUniqueRuleItemEvent) actual.get());
-            } else {
-                fail("No such event type.");
-            }
-        }
-    }
-    
-    private void assertDispatchEvent(final AlterNamedRuleItemEvent actual) {
-        assertThat(actual.getDatabaseName(), is("foo_db"));
-        assertThat(actual.getItemName(), is("xxx"));
-        assertThat(actual.getType(), is("fixture.named"));
-    }
-    
-    private void assertDispatchEvent(final DropNamedRuleItemEvent actual) {
-        assertThat(actual.getDatabaseName(), is("foo_db"));
-        assertThat(actual.getItemName(), is("xxx"));
-        assertThat(actual.getType(), is("fixture.named"));
-    }
-    
-    private void assertDispatchEvent(final AlterUniqueRuleItemEvent actual) {
-        assertThat(actual.getDatabaseName(), is("foo_db"));
-        assertThat(actual.getActiveVersionKey(), 
is("/metadata/fixture/rules/fixture/unique/active_version"));
-        assertThat(actual.getActiveVersion(), is("foo"));
-        assertThat(actual.getType(), is("fixture.unique"));
-    }
-    
-    private void assertDispatchEvent(final DropUniqueRuleItemEvent actual) {
-        assertThat(actual.getDatabaseName(), is("foo_db"));
-        assertThat(actual.getType(), is("fixture.unique"));
-    }
-    
-    private static class TestCaseArgumentsProvider implements 
ArgumentsProvider {
-        
-        @Override
-        public Stream<? extends Arguments> provideArguments(final 
ExtensionContext extensionContext) {
-            return Stream.of(
-                    Arguments.of("InvalidPath", 
"/metadata/invalid/rules/fixture", "foo", Type.ADDED, false, null),
-                    Arguments.of("AddEventWithEmptyValue", 
"/metadata/fixture/rules/fixture/versions/0", "", Type.ADDED, false, null),
-                    Arguments.of("PathNotFound", 
"/metadata/fixture/rules/fixture/versions/0", "foo", Type.ADDED, false, null),
-                    Arguments.of("AddEventWithNamedRuleItemNodePath", 
"/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", Type.ADDED, 
true, AlterNamedRuleItemEvent.class),
-                    Arguments.of("UpdateEventWithNamedRuleItemNodePath", 
"/metadata/fixture/rules/fixture/named/xxx/active_version", "foo", 
Type.UPDATED, true, AlterNamedRuleItemEvent.class),
-                    Arguments.of("DeleteEventWithNamedRuleItemNodePath", 
"/metadata/fixture/rules/fixture/named/xxx", "foo", Type.DELETED, true, 
DropNamedRuleItemEvent.class),
-                    Arguments.of("AddEventWithUniqueRuleItemNodePath", 
"/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.ADDED, 
true, AlterUniqueRuleItemEvent.class),
-                    Arguments.of("UpdateEventWithUniqueRuleItemNodePath", 
"/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.UPDATED, 
true, AlterUniqueRuleItemEvent.class),
-                    Arguments.of("DeleteEventWithUniqueRuleItemNodePath", 
"/metadata/fixture/rules/fixture/unique/active_version", "foo", Type.DELETED, 
true, DropUniqueRuleItemEvent.class));
-        }
-    }
-}
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandlerTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandlerTest.java
similarity index 99%
rename from 
mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandlerTest.java
rename to 
mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandlerTest.java
index 63cc3544f24..c9a002d7a1b 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/MetaDataChangedHandlerTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/metadata/MetaDataChangedHandlerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database;
+package 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.handler.database.metadata;
 
 import 
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandlerTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandlerTest.java
new file mode 100644
index 00000000000..5a7eb4e9cac
--- /dev/null
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/handler/database/rule/RuleConfigurationChangedHandlerTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.cluster.event.dispatch.handler.database.rule;
+
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.path.rule.RuleNodePath;
+import org.apache.shardingsphere.mode.spi.RuleNodePathProvider;
+import org.apache.shardingsphere.mode.spi.item.AlterNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.item.AlterUniqueRuleItem;
+import org.apache.shardingsphere.mode.spi.item.DropNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.item.DropUniqueRuleItem;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+
+import java.sql.SQLException;
+import java.util.Collections;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ShardingSphereServiceLoader.class)
+class RuleConfigurationChangedHandlerTest {
+    
+    private RuleConfigurationChangedHandler handler;
+    
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private ContextManager contextManager;
+    
+    @BeforeEach
+    void setUp() {
+        handler = new RuleConfigurationChangedHandler(contextManager);
+        RuleNodePathProvider ruleNodePathProvider = 
mock(RuleNodePathProvider.class, RETURNS_DEEP_STUBS);
+        when(ruleNodePathProvider.getRuleNodePath()).thenReturn(new 
RuleNodePath("fixture", Collections.singleton("named"), 
Collections.singleton("unique")));
+        
when(ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)).thenReturn(Collections.singleton(ruleNodePathProvider));
+    }
+    
+    @Test
+    void assertHandleWithInvalidPath() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/invalid/rules/fixture", "foo", Type.ADDED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).alterRuleItem(any());
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).dropRuleItem(any());
+    }
+    
+    @Test
+    void assertHandleWithEmptyValue() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/versions/0", "", Type.ADDED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).alterRuleItem(any());
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).dropRuleItem(any());
+    }
+    
+    @Test
+    void assertHandleWithPathNotFound() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/versions/0", "foo", 
Type.ADDED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).alterRuleItem(any());
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).dropRuleItem(any());
+    }
+    
+    @Test
+    void assertHandleWithIgnoreType() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/named/xxx/active_version", 
"foo", Type.IGNORED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).alterRuleItem(any());
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager(), 
times(0)).dropRuleItem(any());
+    }
+    
+    @Test
+    void assertHandleWithNamedRuleItemAdded() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/named/xxx/active_version", 
"foo", Type.ADDED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterNamedRuleItem.class));
+    }
+    
+    @Test
+    void assertHandleWithNamedRuleItemAltered() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/named/xxx/active_version", 
"foo", Type.UPDATED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterNamedRuleItem.class));
+    }
+    
+    @Test
+    void assertHandleWithNamedRuleItemDropped() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/named/xxx", "foo", 
Type.DELETED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropNamedRuleItem.class));
+    }
+    
+    @Test
+    void assertHandleWithUniqueRuleItemAdded() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/unique/active_version", 
"foo", Type.ADDED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterUniqueRuleItem.class));
+    }
+    
+    @Test
+    void assertHandleWithUniqueRuleItemAltered() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/unique/active_version", 
"foo", Type.UPDATED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterUniqueRuleItem.class));
+    }
+    
+    @Test
+    void assertHandleWithUniqueRuleItemDropped() throws SQLException {
+        handler.handle("foo_db", new 
DataChangedEvent("/metadata/fixture/rules/fixture/unique/active_version", 
"foo", Type.DELETED));
+        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropUniqueRuleItem.class));
+    }
+}
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java
deleted file mode 100644
index 7b842beb042..00000000000
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/subscriber/type/RuleItemChangedSubscriberTest.java
+++ /dev/null
@@ -1,66 +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.cluster.event.dispatch.subscriber.type;
-
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.alter.AlterRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropNamedRuleItemEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.event.rule.drop.DropRuleItemEvent;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.mode.spi.item.AlterRuleItem;
-import org.apache.shardingsphere.mode.spi.item.DropRuleItem;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.sql.SQLException;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-@ExtendWith(MockitoExtension.class)
-class RuleItemChangedSubscriberTest {
-    
-    private RuleItemChangedSubscriber subscriber;
-    
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private ContextManager contextManager;
-    
-    @BeforeEach
-    void setUp() {
-        subscriber = new RuleItemChangedSubscriber(contextManager);
-    }
-    
-    @Test
-    void assertRenewWithAlterRuleItemEvent() throws SQLException {
-        AlterRuleItemEvent event = mock(AlterNamedRuleItemEvent.class);
-        subscriber.renew(event);
-        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).alterRuleItem(any(AlterRuleItem.class));
-    }
-    
-    @Test
-    void assertRenewWithDropRuleItemEvent() throws SQLException {
-        DropRuleItemEvent event = mock(DropNamedRuleItemEvent.class);
-        subscriber.renew(event);
-        
verify(contextManager.getMetaDataContextManager().getRuleItemManager()).dropRuleItem(any(DropRuleItem.class));
-    }
-}

Reply via email to