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.rule.event.rule.alter.AlterNamedRuleItemEvent;
22 import org.apache.shardingsphere.infra.rule.event.rule.alter.AlterRuleItemEvent;
23 import org.apache.shardingsphere.infra.rule.event.rule.drop.DropNamedRuleItemEvent;
24 import org.apache.shardingsphere.infra.rule.event.rule.drop.DropRuleItemEvent;
25 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
26 import org.apache.shardingsphere.mode.spi.RuleItemConfigurationChangedProcessor;
27 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
28 import org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
29 import org.apache.shardingsphere.shadow.metadata.nodepath.ShadowRuleNodePathProvider;
30 import org.apache.shardingsphere.shadow.rule.ShadowRule;
31 import org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration;
32
33
34
35
36 public final class ShadowDataSourceChangedProcessor implements RuleItemConfigurationChangedProcessor<ShadowRuleConfiguration, ShadowDataSourceConfiguration> {
37
38 @Override
39 public ShadowDataSourceConfiguration swapRuleItemConfiguration(final AlterRuleItemEvent event, final String yamlContent) {
40 YamlShadowDataSourceConfiguration yamlConfig = YamlEngine.unmarshal(yamlContent, YamlShadowDataSourceConfiguration.class);
41 return new ShadowDataSourceConfiguration(((AlterNamedRuleItemEvent) event).getItemName(), yamlConfig.getProductionDataSourceName(), yamlConfig.getShadowDataSourceName());
42 }
43
44 @Override
45 public ShadowRuleConfiguration findRuleConfiguration(final ShardingSphereDatabase database) {
46 return database.getRuleMetaData().findSingleRule(ShadowRule.class).map(ShadowRule::getConfiguration).orElseGet(ShadowRuleConfiguration::new);
47 }
48
49 @Override
50 public void changeRuleItemConfiguration(final AlterRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig, final ShadowDataSourceConfiguration toBeChangedItemConfig) {
51
52 currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(toBeChangedItemConfig.getName()));
53 currentRuleConfig.getDataSources().add(toBeChangedItemConfig);
54 }
55
56 @Override
57 public void dropRuleItemConfiguration(final DropRuleItemEvent event, final ShadowRuleConfiguration currentRuleConfig) {
58 currentRuleConfig.getDataSources().removeIf(each -> each.getName().equals(((DropNamedRuleItemEvent) event).getItemName()));
59 }
60
61 @Override
62 public String getType() {
63 return ShadowRuleNodePathProvider.RULE_TYPE + "." + ShadowRuleNodePathProvider.DATA_SOURCES;
64 }
65 }