1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.mode.metadata.builder;
19
20 import com.google.common.base.Strings;
21 import org.apache.shardingsphere.mode.path.rule.RuleNodePath;
22 import org.apache.shardingsphere.mode.path.rule.item.NamedRuleItemNodePath;
23 import org.apache.shardingsphere.mode.path.rule.item.UniqueRuleItemNodePath;
24 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
25 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
26 import org.apache.shardingsphere.mode.event.DataChangedEvent;
27 import org.apache.shardingsphere.mode.event.NamedRuleItemChangedEventCreator;
28 import org.apache.shardingsphere.mode.event.UniqueRuleItemChangedEventCreator;
29 import org.apache.shardingsphere.mode.spi.RuleNodePathProvider;
30
31 import java.util.Map.Entry;
32 import java.util.Optional;
33
34
35
36
37 public final class RuleConfigurationEventBuilder {
38
39
40
41
42
43
44
45
46 public Optional<GovernanceEvent> build(final String databaseName, final DataChangedEvent event) {
47 for (RuleNodePathProvider each : ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) {
48 Optional<GovernanceEvent> result = build(each.getRuleNodePath(), databaseName, event);
49 if (result.isPresent()) {
50 return result;
51 }
52 }
53 return Optional.empty();
54 }
55
56 private Optional<GovernanceEvent> build(final RuleNodePath ruleNodePath, final String databaseName, final DataChangedEvent event) {
57 if (!ruleNodePath.getRoot().isValidatedPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
58 return Optional.empty();
59 }
60 for (Entry<String, NamedRuleItemNodePath> entry : ruleNodePath.getNamedItems().entrySet()) {
61 Optional<String> itemName = entry.getValue().getNameByActiveVersion(event.getKey());
62 if (itemName.isPresent()) {
63 return Optional.of(new NamedRuleItemChangedEventCreator().create(databaseName, itemName.get(), event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
64 }
65 }
66 for (Entry<String, UniqueRuleItemNodePath> entry : ruleNodePath.getUniqueItems().entrySet()) {
67 if (entry.getValue().isActiveVersionPath(event.getKey())) {
68 return Optional.of(new UniqueRuleItemChangedEventCreator().create(databaseName, event, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
69 }
70 }
71 return Optional.empty();
72 }
73 }