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 d9f70bdce39 Add MetaDataChangedEventBuilder (#34060)
d9f70bdce39 is described below
commit d9f70bdce394b77112fda3f69d382a5acfd847b6
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Dec 14 22:54:57 2024 +0800
Add MetaDataChangedEventBuilder (#34060)
* Add MetaDataChangedEventBuilder
* Add MetaDataChangedEventBuilder
---
.../builder/MetaDataChangedEventBuilder.java} | 59 ++++------
.../builder/MetaDataChangedEventBuilderTest.java} | 57 ++--------
.../RuleConfigurationChangedEventBuilderTest.java | 3 +-
.../type/DatabaseMetaDataChangedListener.java | 126 +--------------------
.../type/DatabaseMetaDataChangedListenerTest.java | 94 +++------------
5 files changed, 56 insertions(+), 283 deletions(-)
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilder.java
similarity index 77%
copy from
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
copy to
mode/core/src/main/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilder.java
index 50838500209..d8b5bed3288 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListener.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilder.java
@@ -15,17 +15,14 @@
* limitations under the License.
*/
-package
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type;
+package org.apache.shardingsphere.mode.event.builder;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
import
org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode;
import
org.apache.shardingsphere.metadata.persist.node.metadata.TableMetaDataNode;
import
org.apache.shardingsphere.metadata.persist.node.metadata.ViewMetaDataNode;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationChangedEventBuilder;
import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent;
@@ -39,49 +36,41 @@ import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.Table
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent;
-import
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener;
import java.util.Optional;
/**
- * Database meta data changed listener.
+ * Meta data changed event builder.
*/
-@RequiredArgsConstructor
-public final class DatabaseMetaDataChangedListener implements
DataChangedEventListener {
+public final class MetaDataChangedEventBuilder {
- private final EventBusContext eventBusContext;
-
- private final RuleConfigurationChangedEventBuilder
ruleConfigChangedEventBuilder = new RuleConfigurationChangedEventBuilder();
-
- @Override
- public void onChange(final DataChangedEvent event) {
- createDispatchEvent(event).ifPresent(eventBusContext::post);
- }
-
- private Optional<DispatchEvent> createDispatchEvent(final DataChangedEvent
event) {
+ /**
+ * Build meta data changed event.
+ *
+ * @param databaseName database name
+ * @param event data changed event
+ * @return built event
+ */
+ public Optional<DispatchEvent> build(final String databaseName, final
DataChangedEvent event) {
String key = event.getKey();
- Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseNameBySchemaNode(key);
- if (!databaseName.isPresent()) {
- return Optional.empty();
- }
Optional<String> schemaName = DatabaseMetaDataNode.getSchemaName(key);
if (schemaName.isPresent()) {
- return createSchemaChangedEvent(databaseName.get(),
schemaName.get(), event);
+ return buildSchemaChangedEvent(databaseName, schemaName.get(),
event);
}
schemaName = DatabaseMetaDataNode.getSchemaNameByTableNode(key);
if (schemaName.isPresent() && isTableMetaDataChanged(event.getKey())) {
- return createTableChangedEvent(databaseName.get(),
schemaName.get(), event);
+ return buildTableChangedEvent(databaseName, schemaName.get(),
event);
}
if (schemaName.isPresent() && isViewMetaDataChanged(event.getKey())) {
- return createViewChangedEvent(databaseName.get(),
schemaName.get(), event);
+ return buildViewChangedEvent(databaseName, schemaName.get(),
event);
}
if (DataSourceMetaDataNode.isDataSourcesNode(key)) {
- return createDataSourceChangedEvent(databaseName.get(), event);
+ return buildDataSourceChangedEvent(databaseName, event);
}
- return ruleConfigChangedEventBuilder.build(databaseName.get(), event);
+ return Optional.empty();
}
- private Optional<DispatchEvent> createSchemaChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildSchemaChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
switch (event.getType()) {
case ADDED:
case UPDATED:
@@ -97,7 +86,7 @@ public final class DatabaseMetaDataChangedListener implements
DataChangedEventLi
return TableMetaDataNode.isTableActiveVersionNode(key) ||
TableMetaDataNode.isTableNode(key);
}
- private Optional<DispatchEvent> createTableChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildTableChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& TableMetaDataNode.isTableActiveVersionNode(event.getKey())) {
String tableName =
TableMetaDataNode.getTableNameByActiveVersionNode(event.getKey()).orElseThrow(()
-> new IllegalStateException("Table name not found."));
return Optional.of(new TableCreatedOrAlteredEvent(databaseName,
schemaName, tableName, event.getKey(), event.getValue()));
@@ -113,7 +102,7 @@ public final class DatabaseMetaDataChangedListener
implements DataChangedEventLi
return ViewMetaDataNode.isViewActiveVersionNode(key) ||
ViewMetaDataNode.isViewNode(key);
}
- private Optional<DispatchEvent> createViewChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildViewChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& ViewMetaDataNode.isViewActiveVersionNode(event.getKey())) {
String viewName =
ViewMetaDataNode.getViewNameByActiveVersionNode(event.getKey()).orElseThrow(()
-> new IllegalStateException("View name not found."));
return Optional.of(new ViewCreatedOrAlteredEvent(databaseName,
schemaName, viewName, event.getKey(), event.getValue()));
@@ -125,17 +114,17 @@ public final class DatabaseMetaDataChangedListener
implements DataChangedEventLi
return Optional.empty();
}
- private Optional<DispatchEvent> createDataSourceChangedEvent(final String
databaseName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildDataSourceChangedEvent(final String
databaseName, final DataChangedEvent event) {
if
(DataSourceMetaDataNode.isDataSourceUnitActiveVersionNode(event.getKey()) ||
DataSourceMetaDataNode.isDataSourceUnitNode(event.getKey())) {
- return createStorageUnitChangedEvent(databaseName, event);
+ return buildStorageUnitChangedEvent(databaseName, event);
}
if
(DataSourceMetaDataNode.isDataSourceNodeActiveVersionNode(event.getKey()) ||
DataSourceMetaDataNode.isDataSourceNodeNode(event.getKey())) {
- return createStorageNodeChangedEvent(databaseName, event);
+ return buildStorageNodeChangedEvent(databaseName, event);
}
return Optional.empty();
}
- private Optional<DispatchEvent> createStorageUnitChangedEvent(final String
databaseName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildStorageUnitChangedEvent(final String
databaseName, final DataChangedEvent event) {
Optional<String> dataSourceUnitName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceUnitActiveVersionNode(event.getKey());
if (dataSourceUnitName.isPresent()) {
if (Type.ADDED == event.getType()) {
@@ -152,7 +141,7 @@ public final class DatabaseMetaDataChangedListener
implements DataChangedEventLi
return Optional.empty();
}
- private Optional<DispatchEvent> createStorageNodeChangedEvent(final String
databaseName, final DataChangedEvent event) {
+ private Optional<DispatchEvent> buildStorageNodeChangedEvent(final String
databaseName, final DataChangedEvent event) {
Optional<String> dataSourceNodeName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceNodeActiveVersionNode(event.getKey());
if (dataSourceNodeName.isPresent()) {
if (Type.ADDED == event.getType()) {
diff --git
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilderTest.java
similarity index 73%
copy from
mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
copy to
mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilderTest.java
index d1fda9c64ac..60e9320caa9 100644
---
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/MetaDataChangedEventBuilderTest.java
@@ -15,13 +15,10 @@
* limitations under the License.
*/
-package
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type;
+package org.apache.shardingsphere.mode.event.builder;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationChangedEventBuilder;
import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent;
@@ -35,60 +32,31 @@ import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.Table
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent;
-import org.junit.jupiter.api.BeforeEach;
-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 org.mockito.Mock;
-import org.mockito.internal.configuration.plugins.Plugins;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.mockito.junit.jupiter.MockitoSettings;
-import org.mockito.quality.Strictness;
import java.util.Optional;
import java.util.stream.Stream;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
-@ExtendWith(MockitoExtension.class)
-@MockitoSettings(strictness = Strictness.LENIENT)
-class DatabaseMetaDataChangedListenerTest {
-
- private DatabaseMetaDataChangedListener listener;
-
- @Mock
- private EventBusContext eventBusContext;
-
- @BeforeEach
- void setUp() {
- listener = new DatabaseMetaDataChangedListener(eventBusContext);
- setMockedBuilder();
- }
-
- @SneakyThrows(ReflectiveOperationException.class)
- private void setMockedBuilder() {
- RuleConfigurationChangedEventBuilder ruleConfigChangedEventBuilder =
mock(RuleConfigurationChangedEventBuilder.class);
- when(ruleConfigChangedEventBuilder.build(eq("foo_db"),
any(DataChangedEvent.class))).thenReturn(Optional.of(new
AlterUniqueRuleItemEvent("foo_db", "key", "value", "type")));
-
Plugins.getMemberAccessor().set(DatabaseMetaDataChangedListener.class.getDeclaredField("ruleConfigChangedEventBuilder"),
listener, ruleConfigChangedEventBuilder);
- }
+class MetaDataChangedEventBuilderTest {
@ParameterizedTest(name = "{0}")
@ArgumentsSource(TestCaseArgumentsProvider.class)
- void assertOnChangeWithMetaData(final String name, final String eventKey,
final Type type, final Class<? extends DispatchEvent> toBePostedEventType) {
- listener.onChange(new DataChangedEvent(eventKey, "value", type));
+ void assertBuild(final String name, final String eventKey, final Type
type, final Class<? extends DispatchEvent> toBePostedEventType) {
+ Optional<DispatchEvent> actual = new
MetaDataChangedEventBuilder().build("foo_db", new DataChangedEvent(eventKey,
"value", type));
if (null == toBePostedEventType) {
- verify(eventBusContext, times(0)).post(any());
+ assertFalse(actual.isPresent());
} else {
- verify(eventBusContext).post(any(toBePostedEventType));
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), instanceOf(toBePostedEventType));
}
}
@@ -124,8 +92,7 @@ class DatabaseMetaDataChangedListenerTest {
Arguments.of("invalidRegisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.ADDED, null),
Arguments.of("invalidUnregisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.DELETED,
null),
Arguments.of("ignoreChangeStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.IGNORED, null),
- Arguments.of("invalidChangeDataSource",
"/metadata/foo_db/data_sources/other", Type.ADDED, null),
- Arguments.of("changeRule",
"/metadata/foo_db/schemas/foo_schema/rule/", Type.ADDED,
AlterUniqueRuleItemEvent.class));
+ Arguments.of("invalidChangeDataSource",
"/metadata/foo_db/data_sources/other", Type.ADDED, null));
}
}
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/RuleConfigurationChangedEventBuilderTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/RuleConfigurationChangedEventBuilderTest.java
index e9a1fbd1ea7..9d888833df2 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/RuleConfigurationChangedEventBuilderTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/event/builder/RuleConfigurationChangedEventBuilderTest.java
@@ -61,8 +61,7 @@ class RuleConfigurationChangedEventBuilderTest {
@ParameterizedTest(name = "{0}")
@ArgumentsSource(TestCaseArgumentsProvider.class)
- void assertBuild(final String name, final String eventKey, final String
eventValue, final DataChangedEvent.Type type,
- final boolean isEventPresent, final Class<? extends
DispatchEvent> dispatchEventClass) {
+ 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));
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 50838500209..e0d6c155378 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
@@ -20,25 +20,10 @@ package
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.t
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
-import
org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode;
-import
org.apache.shardingsphere.metadata.persist.node.metadata.TableMetaDataNode;
-import
org.apache.shardingsphere.metadata.persist.node.metadata.ViewMetaDataNode;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import
org.apache.shardingsphere.mode.event.builder.MetaDataChangedEventBuilder;
import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationChangedEventBuilder;
import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeUnregisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent;
import
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener;
import java.util.Optional;
@@ -49,10 +34,12 @@ import java.util.Optional;
@RequiredArgsConstructor
public final class DatabaseMetaDataChangedListener implements
DataChangedEventListener {
- private final EventBusContext eventBusContext;
+ private final MetaDataChangedEventBuilder metaDataChangedEventBuilder =
new MetaDataChangedEventBuilder();
private final RuleConfigurationChangedEventBuilder
ruleConfigChangedEventBuilder = new RuleConfigurationChangedEventBuilder();
+ private final EventBusContext eventBusContext;
+
@Override
public void onChange(final DataChangedEvent event) {
createDispatchEvent(event).ifPresent(eventBusContext::post);
@@ -64,108 +51,7 @@ public final class DatabaseMetaDataChangedListener
implements DataChangedEventLi
if (!databaseName.isPresent()) {
return Optional.empty();
}
- Optional<String> schemaName = DatabaseMetaDataNode.getSchemaName(key);
- if (schemaName.isPresent()) {
- return createSchemaChangedEvent(databaseName.get(),
schemaName.get(), event);
- }
- schemaName = DatabaseMetaDataNode.getSchemaNameByTableNode(key);
- if (schemaName.isPresent() && isTableMetaDataChanged(event.getKey())) {
- return createTableChangedEvent(databaseName.get(),
schemaName.get(), event);
- }
- if (schemaName.isPresent() && isViewMetaDataChanged(event.getKey())) {
- return createViewChangedEvent(databaseName.get(),
schemaName.get(), event);
- }
- if (DataSourceMetaDataNode.isDataSourcesNode(key)) {
- return createDataSourceChangedEvent(databaseName.get(), event);
- }
- return ruleConfigChangedEventBuilder.build(databaseName.get(), event);
- }
-
- private Optional<DispatchEvent> createSchemaChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- switch (event.getType()) {
- case ADDED:
- case UPDATED:
- return Optional.of(new SchemaAddedEvent(databaseName,
schemaName));
- case DELETED:
- return Optional.of(new SchemaDeletedEvent(databaseName,
schemaName));
- default:
- return Optional.empty();
- }
- }
-
- private boolean isTableMetaDataChanged(final String key) {
- return TableMetaDataNode.isTableActiveVersionNode(key) ||
TableMetaDataNode.isTableNode(key);
- }
-
- private Optional<DispatchEvent> createTableChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& TableMetaDataNode.isTableActiveVersionNode(event.getKey())) {
- String tableName =
TableMetaDataNode.getTableNameByActiveVersionNode(event.getKey()).orElseThrow(()
-> new IllegalStateException("Table name not found."));
- return Optional.of(new TableCreatedOrAlteredEvent(databaseName,
schemaName, tableName, event.getKey(), event.getValue()));
- }
- if (Type.DELETED == event.getType() &&
TableMetaDataNode.isTableNode(event.getKey())) {
- String tableName =
TableMetaDataNode.getTableName(event.getKey()).orElseThrow(() -> new
IllegalStateException("Table name not found."));
- return Optional.of(new TableDroppedEvent(databaseName, schemaName,
tableName));
- }
- return Optional.empty();
- }
-
- private boolean isViewMetaDataChanged(final String key) {
- return ViewMetaDataNode.isViewActiveVersionNode(key) ||
ViewMetaDataNode.isViewNode(key);
- }
-
- private Optional<DispatchEvent> createViewChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& ViewMetaDataNode.isViewActiveVersionNode(event.getKey())) {
- String viewName =
ViewMetaDataNode.getViewNameByActiveVersionNode(event.getKey()).orElseThrow(()
-> new IllegalStateException("View name not found."));
- return Optional.of(new ViewCreatedOrAlteredEvent(databaseName,
schemaName, viewName, event.getKey(), event.getValue()));
- }
- if (Type.DELETED == event.getType() &&
ViewMetaDataNode.isViewNode(event.getKey())) {
- String viewName =
ViewMetaDataNode.getViewName(event.getKey()).orElseThrow(() -> new
IllegalStateException("View name not found."));
- return Optional.of(new ViewDroppedEvent(databaseName, schemaName,
viewName, event.getKey(), event.getValue()));
- }
- return Optional.empty();
- }
-
- private Optional<DispatchEvent> createDataSourceChangedEvent(final String
databaseName, final DataChangedEvent event) {
- if
(DataSourceMetaDataNode.isDataSourceUnitActiveVersionNode(event.getKey()) ||
DataSourceMetaDataNode.isDataSourceUnitNode(event.getKey())) {
- return createStorageUnitChangedEvent(databaseName, event);
- }
- if
(DataSourceMetaDataNode.isDataSourceNodeActiveVersionNode(event.getKey()) ||
DataSourceMetaDataNode.isDataSourceNodeNode(event.getKey())) {
- return createStorageNodeChangedEvent(databaseName, event);
- }
- return Optional.empty();
- }
-
- private Optional<DispatchEvent> createStorageUnitChangedEvent(final String
databaseName, final DataChangedEvent event) {
- Optional<String> dataSourceUnitName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceUnitActiveVersionNode(event.getKey());
- if (dataSourceUnitName.isPresent()) {
- if (Type.ADDED == event.getType()) {
- return Optional.of(new
StorageUnitRegisteredEvent(databaseName, dataSourceUnitName.get(),
event.getKey(), event.getValue()));
- }
- if (Type.UPDATED == event.getType()) {
- return Optional.of(new StorageUnitAlteredEvent(databaseName,
dataSourceUnitName.get(), event.getKey(), event.getValue()));
- }
- }
- dataSourceUnitName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceUnitNode(event.getKey());
- if (Type.DELETED == event.getType() && dataSourceUnitName.isPresent())
{
- return Optional.of(new StorageUnitUnregisteredEvent(databaseName,
dataSourceUnitName.get()));
- }
- return Optional.empty();
- }
-
- private Optional<DispatchEvent> createStorageNodeChangedEvent(final String
databaseName, final DataChangedEvent event) {
- Optional<String> dataSourceNodeName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceNodeActiveVersionNode(event.getKey());
- if (dataSourceNodeName.isPresent()) {
- if (Type.ADDED == event.getType()) {
- return Optional.of(new
StorageNodeRegisteredEvent(databaseName, dataSourceNodeName.get(),
event.getKey(), event.getValue()));
- }
- if (Type.UPDATED == event.getType()) {
- return Optional.of(new StorageNodeAlteredEvent(databaseName,
dataSourceNodeName.get(), event.getKey(), event.getValue()));
- }
- }
- dataSourceNodeName =
DataSourceMetaDataNode.getDataSourceNameByDataSourceNodeNode(event.getKey());
- if (Type.DELETED == event.getType() && dataSourceNodeName.isPresent())
{
- return Optional.of(new StorageNodeUnregisteredEvent(databaseName,
dataSourceNodeName.get()));
- }
- return Optional.empty();
+ Optional<DispatchEvent> metaDataChangedEvent =
metaDataChangedEventBuilder.build(databaseName.get(), event);
+ return metaDataChangedEvent.isPresent() ? metaDataChangedEvent :
ruleConfigChangedEventBuilder.build(databaseName.get(), event);
}
}
diff --git
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
index d1fda9c64ac..d1cdabd4faa 100644
---
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
+++
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/event/dispatch/listener/type/DatabaseMetaDataChangedListenerTest.java
@@ -17,50 +17,20 @@
package
org.apache.shardingsphere.mode.manager.cluster.event.dispatch.listener.type;
-import lombok.SneakyThrows;
import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationChangedEventBuilder;
-import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeRegisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.StorageNodeUnregisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitRegisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.StorageUnitUnregisteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableCreatedOrAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.TableDroppedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewCreatedOrAlteredEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.ViewDroppedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent;
import org.junit.jupiter.api.BeforeEach;
+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 org.mockito.Mock;
-import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.jupiter.MockitoExtension;
-import org.mockito.junit.jupiter.MockitoSettings;
-import org.mockito.quality.Strictness;
-
-import java.util.Optional;
-import java.util.stream.Stream;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-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(MockitoExtension.class)
-@MockitoSettings(strictness = Strictness.LENIENT)
class DatabaseMetaDataChangedListenerTest {
private DatabaseMetaDataChangedListener listener;
@@ -71,61 +41,23 @@ class DatabaseMetaDataChangedListenerTest {
@BeforeEach
void setUp() {
listener = new DatabaseMetaDataChangedListener(eventBusContext);
- setMockedBuilder();
}
- @SneakyThrows(ReflectiveOperationException.class)
- private void setMockedBuilder() {
- RuleConfigurationChangedEventBuilder ruleConfigChangedEventBuilder =
mock(RuleConfigurationChangedEventBuilder.class);
- when(ruleConfigChangedEventBuilder.build(eq("foo_db"),
any(DataChangedEvent.class))).thenReturn(Optional.of(new
AlterUniqueRuleItemEvent("foo_db", "key", "value", "type")));
-
Plugins.getMemberAccessor().set(DatabaseMetaDataChangedListener.class.getDeclaredField("ruleConfigChangedEventBuilder"),
listener, ruleConfigChangedEventBuilder);
+ @Test
+ void assertOnChangeWithoutDatabase() {
+ listener.onChange(new DataChangedEvent("/metadata", "value",
Type.IGNORED));
+ verify(eventBusContext, times(0)).post(any());
}
- @ParameterizedTest(name = "{0}")
- @ArgumentsSource(TestCaseArgumentsProvider.class)
- void assertOnChangeWithMetaData(final String name, final String eventKey,
final Type type, final Class<? extends DispatchEvent> toBePostedEventType) {
- listener.onChange(new DataChangedEvent(eventKey, "value", type));
- if (null == toBePostedEventType) {
- verify(eventBusContext, times(0)).post(any());
- } else {
- verify(eventBusContext).post(any(toBePostedEventType));
- }
+ @Test
+ void assertOnChangeWithMetaDataChanged() {
+ listener.onChange(new
DataChangedEvent("/metadata/foo_db/schemas/foo_schema", "value", Type.ADDED));
+ verify(eventBusContext).post(any());
}
- private static class TestCaseArgumentsProvider implements
ArgumentsProvider {
-
- @Override
- public final Stream<? extends Arguments> provideArguments(final
ExtensionContext extensionContext) {
- return Stream.of(
- Arguments.of("changeWithoutDatabase", "/metadata",
Type.IGNORED, null),
- Arguments.of("addSchema",
"/metadata/foo_db/schemas/foo_schema", Type.ADDED, SchemaAddedEvent.class),
- Arguments.of("updateSchema",
"/metadata/foo_db/schemas/foo_schema", Type.UPDATED, SchemaAddedEvent.class),
- Arguments.of("deleteSchema",
"/metadata/foo_db/schemas/foo_schema", Type.DELETED, SchemaDeletedEvent.class),
- Arguments.of("ignoreChangeSchema",
"/metadata/foo_db/schemas/foo_schema", Type.IGNORED, null),
- Arguments.of("addTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.ADDED, TableCreatedOrAlteredEvent.class),
- Arguments.of("updateTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.UPDATED, TableCreatedOrAlteredEvent.class),
- Arguments.of("deleteTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", Type.DELETED,
TableDroppedEvent.class),
- Arguments.of("invalidAddTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", Type.ADDED, null),
- Arguments.of("invalidDeleteTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.DELETED, null),
- Arguments.of("addView",
"/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version/0",
Type.ADDED, ViewCreatedOrAlteredEvent.class),
- Arguments.of("updateView",
"/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version/0",
Type.UPDATED, ViewCreatedOrAlteredEvent.class),
- Arguments.of("deleteView",
"/metadata/foo_db/schemas/foo_schema/views/foo_view", Type.DELETED,
ViewDroppedEvent.class),
- Arguments.of("invalidAddView",
"/metadata/foo_db/schemas/foo_schema/views/foo_view", Type.ADDED, null),
- Arguments.of("invalidDeleteView",
"/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version/0",
Type.DELETED, null),
- Arguments.of("registerStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.ADDED,
StorageUnitRegisteredEvent.class),
- Arguments.of("alterStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.UPDATED,
StorageUnitAlteredEvent.class),
- Arguments.of("unregisterStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit", Type.DELETED,
StorageUnitUnregisteredEvent.class),
- Arguments.of("invalidRegisterStorageNode",
"/metadata/foo_db/data_sources/units/foo_unit", Type.ADDED, null),
- Arguments.of("invalidUnregisterStorageNode",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.DELETED,
null),
- Arguments.of("ignoreChangeStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit", Type.IGNORED, null),
- Arguments.of("registerStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.ADDED,
StorageNodeRegisteredEvent.class),
- Arguments.of("alterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.UPDATED,
StorageNodeAlteredEvent.class),
- Arguments.of("unregisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.DELETED,
StorageNodeUnregisteredEvent.class),
- Arguments.of("invalidRegisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.ADDED, null),
- Arguments.of("invalidUnregisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.DELETED,
null),
- Arguments.of("ignoreChangeStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.IGNORED, null),
- Arguments.of("invalidChangeDataSource",
"/metadata/foo_db/data_sources/other", Type.ADDED, null),
- Arguments.of("changeRule",
"/metadata/foo_db/schemas/foo_schema/rule/", Type.ADDED,
AlterUniqueRuleItemEvent.class));
- }
+ @Test
+ void assertOnChangeWithRuleConfigurationChanged() {
+ listener.onChange(new
DataChangedEvent("/metadata/foo_db/schemas/foo_schema/rule/", "value",
Type.ADDED));
+ verify(eventBusContext, times(0)).post(any());
}
}