View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * New meta data persist service.
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       * Persist global rule configurations.
87       *
88       * @param globalRuleConfigs global rule configurations
89       * @param props properties
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 }