1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.shadow.rule.changed;
19
20 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
21 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
22 import org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor;
23 import org.apache.shardingsphere.mode.spi.rule.RuleChangedItemType;
24 import org.apache.shardingsphere.shadow.config.ShadowRuleConfiguration;
25 import org.apache.shardingsphere.shadow.config.datasource.ShadowDataSourceConfiguration;
26 import org.apache.shardingsphere.shadow.rule.ShadowRule;
27 import org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration;
28
29
30
31
32 public final class ShadowDataSourceChangedProcessor implements RuleItemConfigurationChangedProcessor<ShadowRuleConfiguration, ShadowDataSourceConfiguration> {
33
34 @Override
35 public ShadowDataSourceConfiguration swapRuleItemConfiguration(final String itemName, final String yamlContent) {
36 YamlShadowDataSourceConfiguration yamlConfig = YamlEngine.unmarshal(yamlContent, YamlShadowDataSourceConfiguration.class);
37 return new ShadowDataSourceConfiguration(itemName, yamlConfig.getProductionDataSourceName(), yamlConfig.getShadowDataSourceName());
38 }
39
40 @Override
41 public ShadowRuleConfiguration findRuleConfiguration(final ShardingSphereDatabase database) {
42 return database.getRuleMetaData().findSingleRule(ShadowRule.class).map(ShadowRule::getConfiguration).orElseGet(ShadowRuleConfiguration::new);
43 }
44
45 @Override
46 public void changeRuleItemConfiguration(final String itemName, final ShadowRuleConfiguration currentRuleConfig, final ShadowDataSourceConfiguration toBeChangedItemConfig) {
47
48 currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName()));
49 currentRuleConfig.getDataSources().add(toBeChangedItemConfig);
50 }
51
52 @Override
53 public void dropRuleItemConfiguration(final String itemName, final ShadowRuleConfiguration currentRuleConfig) {
54 currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(itemName));
55 }
56
57 @Override
58 public RuleChangedItemType getType() {
59 return new RuleChangedItemType("shadow", "data_sources");
60 }
61 }