1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.metadata.database.resource;
19
20 import lombok.Getter;
21 import lombok.RequiredArgsConstructor;
22 import org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
23 import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
24 import org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
25 import org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNodeAggregator;
26 import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
27
28 import javax.sql.DataSource;
29 import java.util.Collection;
30 import java.util.LinkedHashMap;
31 import java.util.LinkedList;
32 import java.util.Map;
33 import java.util.Map.Entry;
34 import java.util.stream.Collectors;
35
36
37
38
39 @RequiredArgsConstructor
40 @Getter
41 public final class ResourceMetaData {
42
43 private final Map<StorageNode, DataSource> dataSources;
44
45 private final Map<String, StorageUnit> storageUnits;
46
47 public ResourceMetaData(final Map<String, DataSource> dataSources) {
48 this.dataSources = StorageNodeAggregator.aggregateDataSources(dataSources);
49 Map<String, StorageNode> storageUnitNodeMap = dataSources.keySet().stream()
50 .collect(Collectors.toMap(each -> each, StorageNode::new, (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
51 Map<String, DataSourcePoolProperties> dataSourcePoolPropsMap = dataSources.entrySet().stream().collect(
52 Collectors.toMap(Entry::getKey, entry -> DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
53 storageUnits = new LinkedHashMap<>();
54 for (Entry<String, StorageNode> entry : storageUnitNodeMap.entrySet()) {
55 storageUnits.put(entry.getKey(), new StorageUnit(entry.getValue(), dataSourcePoolPropsMap.get(entry.getKey()), dataSources.get(entry.getValue().getName())));
56 }
57 }
58
59
60
61
62
63
64 public Collection<String> getAllInstanceDataSourceNames() {
65 Collection<String> result = new LinkedList<>();
66 for (String each : storageUnits.keySet()) {
67 if (!isExisted(each, result)) {
68 result.add(each);
69 }
70 }
71 return result;
72 }
73
74 private boolean isExisted(final String dataSourceName, final Collection<String> existedDataSourceNames) {
75 return existedDataSourceNames.stream().anyMatch(each -> storageUnits.get(dataSourceName).getConnectionProperties().isInSameDatabaseInstance(storageUnits.get(each).getConnectionProperties()));
76 }
77
78
79
80
81
82
83
84 public Collection<String> getNotExistedDataSources(final Collection<String> resourceNames) {
85 return resourceNames.stream().filter(each -> !storageUnits.containsKey(each)).collect(Collectors.toSet());
86 }
87 }