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.util.yaml.YamlEngine;
23 import org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor;
24 import org.apache.shardingsphere.mode.spi.rule.RuleChangedItemType;
25 import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration;
26 import org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration;
27 import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
28 import org.apache.shardingsphere.readwritesplitting.transaction.TransactionalReadQueryStrategy;
29 import org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceGroupRuleConfiguration;
30
31 import java.util.LinkedHashMap;
32 import java.util.LinkedList;
33
34
35
36
37 public final class ReadwriteSplittingDataSourceChangedProcessor
38 implements
39 RuleItemConfigurationChangedProcessor<ReadwriteSplittingRuleConfiguration, ReadwriteSplittingDataSourceGroupRuleConfiguration> {
40
41 @Override
42 public ReadwriteSplittingDataSourceGroupRuleConfiguration swapRuleItemConfiguration(final String itemName, final String yamlContent) {
43 YamlReadwriteSplittingDataSourceGroupRuleConfiguration yamlDataSourceGroupRuleConfig = YamlEngine.unmarshal(yamlContent, YamlReadwriteSplittingDataSourceGroupRuleConfiguration.class);
44 return new ReadwriteSplittingDataSourceGroupRuleConfiguration(itemName, yamlDataSourceGroupRuleConfig.getWriteDataSourceName(),
45 yamlDataSourceGroupRuleConfig.getReadDataSourceNames(), getTransactionalReadQueryStrategy(yamlDataSourceGroupRuleConfig), yamlDataSourceGroupRuleConfig.getLoadBalancerName());
46 }
47
48 private TransactionalReadQueryStrategy getTransactionalReadQueryStrategy(final YamlReadwriteSplittingDataSourceGroupRuleConfiguration yamlDataSourceGroupRuleConfig) {
49 return Strings.isNullOrEmpty(yamlDataSourceGroupRuleConfig.getTransactionalReadQueryStrategy())
50 ? TransactionalReadQueryStrategy.DYNAMIC
51 : TransactionalReadQueryStrategy.valueOf(yamlDataSourceGroupRuleConfig.getTransactionalReadQueryStrategy());
52 }
53
54 @Override
55 public ReadwriteSplittingRuleConfiguration findRuleConfiguration(final ShardingSphereDatabase database) {
56 return database.getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class).map(ReadwriteSplittingRule::getConfiguration)
57 .orElseGet(() -> new ReadwriteSplittingRuleConfiguration(new LinkedList<>(), new LinkedHashMap<>()));
58 }
59
60 @Override
61 public void changeRuleItemConfiguration(final String itemName, final ReadwriteSplittingRuleConfiguration currentRuleConfig,
62 final ReadwriteSplittingDataSourceGroupRuleConfiguration toBeChangedItemConfig) {
63
64 currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName()));
65 currentRuleConfig.getDataSourceGroups().add(toBeChangedItemConfig);
66 }
67
68 @Override
69 public void dropRuleItemConfiguration(final String itemName, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
70 currentRuleConfig.getDataSourceGroups().removeIf(each -> each.getName().equals(itemName));
71 }
72
73 @Override
74 public RuleChangedItemType getType() {
75 return new RuleChangedItemType("readwrite_splitting", "data_source_groups");
76 }
77 }