1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.metadata.persist;
19
20 import lombok.Getter;
21 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
22 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
23 import org.apache.shardingsphere.infra.config.rule.decorator.RuleConfigurationDecorator;
24 import org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
25 import org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
26 import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
27 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
28 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
29 import org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
30 import org.apache.shardingsphere.metadata.persist.service.config.database.datasource.DataSourceNodePersistService;
31 import org.apache.shardingsphere.metadata.persist.service.config.database.datasource.DataSourceUnitPersistService;
32 import org.apache.shardingsphere.metadata.persist.service.config.database.rule.DatabaseRulePersistService;
33 import org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRulePersistService;
34 import org.apache.shardingsphere.metadata.persist.service.config.global.PropertiesPersistService;
35 import org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
36 import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
37 import org.apache.shardingsphere.mode.spi.PersistRepository;
38
39 import javax.sql.DataSource;
40 import java.util.Collection;
41 import java.util.LinkedHashMap;
42 import java.util.LinkedList;
43 import java.util.Map;
44 import java.util.Map.Entry;
45 import java.util.Optional;
46 import java.util.Properties;
47 import java.util.stream.Collectors;
48
49
50
51
52 @Getter
53 public final class MetaDataPersistService implements MetaDataBasedPersistService {
54
55 private final PersistRepository repository;
56
57 private final MetaDataVersionPersistService metaDataVersionPersistService;
58
59 private final DataSourceUnitPersistService dataSourceUnitService;
60
61 private final DataSourceNodePersistService dataSourceNodeService;
62
63 private final DatabaseMetaDataPersistService databaseMetaDataService;
64
65 private final DatabaseRulePersistService databaseRulePersistService;
66
67 private final GlobalRulePersistService globalRuleService;
68
69 private final PropertiesPersistService propsService;
70
71 private final ShardingSphereDataPersistService shardingSphereDataPersistService;
72
73 public MetaDataPersistService(final PersistRepository repository) {
74 this.repository = repository;
75 metaDataVersionPersistService = new MetaDataVersionPersistService(repository);
76 dataSourceUnitService = new DataSourceUnitPersistService(repository);
77 dataSourceNodeService = new DataSourceNodePersistService(repository);
78 databaseMetaDataService = new DatabaseMetaDataPersistService(repository, metaDataVersionPersistService);
79 databaseRulePersistService = new DatabaseRulePersistService(repository);
80 globalRuleService = new GlobalRulePersistService(repository, metaDataVersionPersistService);
81 propsService = new PropertiesPersistService(repository, metaDataVersionPersistService);
82 shardingSphereDataPersistService = new ShardingSphereDataPersistService(repository);
83 }
84
85
86
87
88
89
90
91 @Override
92 public void persistGlobalRuleConfiguration(final Collection<RuleConfiguration> globalRuleConfigs, final Properties props) {
93 globalRuleService.persist(globalRuleConfigs);
94 propsService.persist(props);
95 }
96
97 @Override
98 public void persistConfigurations(final String databaseName, final DatabaseConfiguration databaseConfigs, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules) {
99 Map<String, DataSourcePoolProperties> propsMap = getDataSourcePoolPropertiesMap(databaseConfigs);
100 if (propsMap.isEmpty() && databaseConfigs.getRuleConfigurations().isEmpty()) {
101 databaseMetaDataService.addDatabase(databaseName);
102 } else {
103 dataSourceUnitService.persist(databaseName, propsMap);
104 databaseRulePersistService.persist(databaseName, decorateRuleConfigs(databaseName, dataSources, rules));
105 }
106 }
107
108 @SuppressWarnings({"unchecked", "rawtypes"})
109 private Collection<RuleConfiguration> decorateRuleConfigs(final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules) {
110 Collection<RuleConfiguration> result = new LinkedList<>();
111 for (ShardingSphereRule each : rules) {
112 RuleConfiguration ruleConfig = each.getConfiguration();
113 Optional<RuleConfigurationDecorator> decorator = TypedSPILoader.findService(RuleConfigurationDecorator.class, ruleConfig.getClass());
114 result.add(decorator.map(optional -> optional.decorate(databaseName, dataSources, rules, ruleConfig)).orElse(ruleConfig));
115 }
116 return result;
117 }
118
119 private Map<String, DataSourcePoolProperties> getDataSourcePoolPropertiesMap(final DatabaseConfiguration databaseConfigs) {
120 return databaseConfigs.getStorageUnits().entrySet().stream()
121 .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
122 }
123
124 @Override
125 public Map<String, DataSourceConfiguration> loadDataSourceConfigurations(final String databaseName) {
126 return dataSourceUnitService.load(databaseName).entrySet().stream().collect(Collectors.toMap(Entry::getKey,
127 entry -> DataSourcePoolPropertiesCreator.createConfiguration(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
128 }
129 }