1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.shadow.route.engine;
19
20 import org.apache.shardingsphere.infra.route.context.RouteContext;
21 import org.apache.shardingsphere.infra.route.context.RouteMapper;
22 import org.apache.shardingsphere.infra.route.context.RouteUnit;
23 import org.apache.shardingsphere.shadow.rule.ShadowRule;
24
25 import java.util.Collection;
26 import java.util.LinkedList;
27 import java.util.Map;
28 import java.util.Optional;
29
30
31
32
33 public interface ShadowRouteEngine {
34
35
36
37
38
39
40
41 void route(RouteContext routeContext, ShadowRule rule);
42
43
44
45
46
47
48
49
50 default void decorateRouteContext(final RouteContext routeContext, final ShadowRule rule, final Map<String, String> shadowDataSourceMappings) {
51 Collection<RouteUnit> toBeRemovedRouteUnit = new LinkedList<>();
52 Collection<RouteUnit> toBeAddedRouteUnit = new LinkedList<>();
53 for (RouteUnit each : routeContext.getRouteUnits()) {
54 String logicName = each.getDataSourceMapper().getLogicName();
55 String actualName = each.getDataSourceMapper().getActualName();
56 Optional<String> sourceDataSourceName = rule.getSourceDataSourceName(actualName);
57 if (sourceDataSourceName.isPresent()) {
58 String shadowDataSourceName = shadowDataSourceMappings.get(sourceDataSourceName.get());
59 toBeRemovedRouteUnit.add(each);
60 toBeAddedRouteUnit.add(null == shadowDataSourceName
61 ? new RouteUnit(new RouteMapper(logicName, sourceDataSourceName.get()), each.getTableMappers())
62 : new RouteUnit(new RouteMapper(logicName, shadowDataSourceName), each.getTableMappers()));
63 }
64 }
65 routeContext.getRouteUnits().removeAll(toBeRemovedRouteUnit);
66 routeContext.getRouteUnits().addAll(toBeAddedRouteUnit);
67 }
68 }