1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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 }