1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.readwritesplitting.rule.changed;
19
20 import com.google.common.base.Strings;
21 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
22 import org.apache.shardingsphere.infra.rule.event.rule.alter.AlterNamedRuleItemEvent;
23 import org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
24 import org.apache.shardingsphere.infra.rule.event.rule.drop.DropNamedRuleItemEvent;
25 import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
26 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
27 import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor;
28 import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
29 import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration;
30 import org.apache.shardingsphere.readwritesplitting.api.transaction.TransactionalReadQueryStrategy;
31 import org.apache.shardingsphere.readwritesplitting.metadata.nodepath.ReadwriteSplittingRuleNodePathProvider;
32 import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
33 import org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceGroupRuleConfiguration;
34
35 import java.util.LinkedHashMap;
36 import java.util.LinkedList;
37 import java.util.Optional;
38
39
40
41
42 public final class ReadwriteSplittingDataSourceChangedProcessor
43 implements
44 RuleItemConfigurationChangedProcessor<ReadwriteSplittingRuleConfiguration, ReadwriteSplittingDataSourceGroupRuleConfiguration> {
45
46 @Override
47 public ReadwriteSplittingDataSourceGroupRuleConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) {
48 YamlReadwriteSplittingDataSourceGroupRuleConfiguration yamlDataSourceGroupRuleConfig = YamlEngine.unmarshal(yamlContent, YamlReadwriteSplittingDataSourceGroupRuleConfiguration.class);
49 return new ReadwriteSplittingDataSourceGroupRuleConfiguration(((AlterNamedRuleItemEvent) event).getItemName(), yamlDataSourceGroupRuleConfig.getWriteDataSourceName(),
50 yamlDataSourceGroupRuleConfig.getReadDataSourceNames(), getTransactionalReadQueryStrategy(yamlDataSourceGroupRuleConfig), yamlDataSourceGroupRuleConfig.getLoadBalancerName());
51 }
52
53 private TransactionalReadQueryStrategy getTransactionalReadQueryStrategy(final YamlReadwriteSplittingDataSourceGroupRuleConfiguration yamlDataSourceGroupRuleConfig) {
54 return Strings.isNullOrEmpty(yamlDataSourceGroupRuleConfig.getTransactionalReadQueryStrategy())
55 ? TransactionalReadQueryStrategy.DYNAMIC
56 : TransactionalReadQueryStrategy.valueOf(yamlDataSourceGroupRuleConfig.getTransactionalReadQueryStrategy());
57 }
58
59 @Override
60 public ReadwriteSplittingRuleConfiguration findRuleConfiguration(final ShardingSphereDatabase database) {
61 Optional<ReadwriteSplittingRule> rule = database.getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
62 return rule.map(ReadwriteSplittingRule::getConfiguration)
63 .orElseGet(() -> new ReadwriteSplittingRuleConfiguration(new LinkedList<>(), new LinkedHashMap<>()));
64 }
65
66 @Override
67 public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ReadwriteSplittingRuleConfiguration currentRuleConfig,
68 final ReadwriteSplittingDataSourceGroupRuleConfiguration toBeChangedItemConfig) {
69
70 currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName()));
71 currentRuleConfig.getDataSourceGroups().add(toBeChangedItemConfig);
72 }
73
74 @Override
75 public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
76 currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName()));
77 }
78
79 @Override
80 public String getType() {
81 return ReadwriteSplittingRuleNodePathProvider.RULE_TYPE + "." + ReadwriteSplittingRuleNodePathProvider.DATA_SOURCES;
82 }
83 }