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.mode.manager.cluster;
19  
20  import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
21  import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
22  import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
23  import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
24  import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
25  import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
26  import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
27  import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
28  import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
29  import org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseBasedPersistService;
30  import org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
31  import org.apache.shardingsphere.mode.manager.ContextManager;
32  import org.apache.shardingsphere.mode.manager.ContextManagerAware;
33  import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
34  
35  import java.util.Collection;
36  import java.util.Collections;
37  import java.util.LinkedHashMap;
38  import java.util.Map;
39  import java.util.Properties;
40  import java.util.stream.Collectors;
41  
42  /**
43   * Cluster mode context manager.
44   */
45  public final class ClusterModeContextManager implements ModeContextManager, ContextManagerAware {
46      
47      private ContextManager contextManager;
48      
49      @Override
50      public void createDatabase(final String databaseName) {
51          contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().addDatabase(databaseName);
52      }
53      
54      @Override
55      public void dropDatabase(final String databaseName) {
56          contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().dropDatabase(databaseName);
57      }
58      
59      @Override
60      public void createSchema(final String databaseName, final String schemaName) {
61          contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().addSchema(databaseName, schemaName);
62      }
63      
64      @Override
65      public void alterSchema(final AlterSchemaPOJO alterSchemaPOJO) {
66          String databaseName = alterSchemaPOJO.getDatabaseName();
67          String schemaName = alterSchemaPOJO.getSchemaName();
68          ShardingSphereSchema schema = contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getSchema(schemaName);
69          DatabaseMetaDataBasedPersistService databaseMetaDataService = contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
70          databaseMetaDataService.persistByAlterConfiguration(databaseName, alterSchemaPOJO.getRenameSchemaName(), schema);
71          databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, alterSchemaPOJO.getRenameSchemaName(), schema.getViews());
72          databaseMetaDataService.dropSchema(databaseName, schemaName);
73      }
74      
75      @Override
76      public void dropSchema(final String databaseName, final Collection<String> schemaNames) {
77          DatabaseMetaDataBasedPersistService databaseMetaDataService = contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
78          schemaNames.forEach(each -> databaseMetaDataService.dropSchema(databaseName, each));
79      }
80      
81      @Override
82      public void alterSchemaMetaData(final AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO) {
83          String databaseName = alterSchemaMetaDataPOJO.getDatabaseName();
84          String schemaName = alterSchemaMetaDataPOJO.getSchemaName();
85          Map<String, ShardingSphereTable> tables = alterSchemaMetaDataPOJO.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName, table -> table));
86          Map<String, ShardingSphereView> views = alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName, view -> view));
87          DatabaseMetaDataBasedPersistService databaseMetaDataService = contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
88          databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, schemaName, tables);
89          databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, schemaName, views);
90          alterSchemaMetaDataPOJO.getDroppedTables().forEach(each -> databaseMetaDataService.getTableMetaDataPersistService().delete(databaseName, schemaName, each));
91          alterSchemaMetaDataPOJO.getDroppedViews().forEach(each -> databaseMetaDataService.getViewMetaDataPersistService().delete(databaseName, schemaName, each));
92      }
93      
94      @Override
95      public void registerStorageUnits(final String databaseName, final Map<String, DataSourcePoolProperties> toBeRegisteredProps) {
96          contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().persistConfigurations(databaseName, toBeRegisteredProps);
97      }
98      
99      @Override
100     public void alterStorageUnits(final String databaseName, final Map<String, DataSourcePoolProperties> toBeUpdatedProps) {
101         DatabaseBasedPersistService<Map<String, DataSourcePoolProperties>> dataSourceService = contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService();
102         contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService().switchActiveVersion(dataSourceService.persistConfigurations(databaseName, toBeUpdatedProps));
103     }
104     
105     @Override
106     public void unregisterStorageUnits(final String databaseName, final Collection<String> toBeDroppedStorageUnitNames) {
107         contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().deleteConfigurations(databaseName,
108                 getToBeDroppedDataSourcePoolProperties(contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().load(databaseName), toBeDroppedStorageUnitNames));
109     }
110     
111     private Map<String, DataSourcePoolProperties> getToBeDroppedDataSourcePoolProperties(final Map<String, DataSourcePoolProperties> propsMap, final Collection<String> toBeDroppedResourceNames) {
112         Map<String, DataSourcePoolProperties> result = new LinkedHashMap<>();
113         for (String each : toBeDroppedResourceNames) {
114             if (propsMap.containsKey(each)) {
115                 result.put(each, propsMap.get(each));
116             }
117         }
118         return result;
119     }
120     
121     @Override
122     public void alterSingleRuleConfiguration(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) {
123         ruleConfigs.removeIf(each -> !each.getClass().isAssignableFrom(SingleRuleConfiguration.class));
124         contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService()
125                 .switchActiveVersion(contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persistConfigurations(databaseName, ruleConfigs));
126     }
127     
128     @Override
129     public Collection<MetaDataVersion> alterRuleConfiguration(final String databaseName, final RuleConfiguration toBeAlteredRuleConfig) {
130         if (null != toBeAlteredRuleConfig) {
131             return contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persistConfigurations(databaseName, Collections.singleton(toBeAlteredRuleConfig));
132         }
133         return Collections.emptyList();
134     }
135     
136     @Override
137     public void removeRuleConfigurationItem(final String databaseName, final RuleConfiguration toBeRemovedRuleConfig) {
138         if (null != toBeRemovedRuleConfig) {
139             contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().deleteConfigurations(databaseName, Collections.singleton(toBeRemovedRuleConfig));
140         }
141     }
142     
143     @Override
144     public void removeRuleConfiguration(final String databaseName, final String ruleName) {
145         contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().delete(databaseName, ruleName);
146     }
147     
148     @Override
149     public void alterGlobalRuleConfiguration(final RuleConfiguration toBeAlteredRuleConfig) {
150         contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService().persist(Collections.singleton(toBeAlteredRuleConfig));
151     }
152     
153     @Override
154     public void alterProperties(final Properties props) {
155         contextManager.getMetaDataContexts().getPersistService().getPropsService().persist(props);
156     }
157     
158     @Override
159     public void setContextManagerAware(final ContextManager contextManager) {
160         this.contextManager = contextManager;
161     }
162 }