1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.mask.merge.dql;
19
20 import org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
21 import org.apache.shardingsphere.infra.merge.result.MergedResult;
22 import org.apache.shardingsphere.infra.merge.result.impl.decorator.DecoratorMergedResult;
23 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
24 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
25 import org.apache.shardingsphere.mask.rule.MaskRule;
26 import org.apache.shardingsphere.mask.spi.MaskAlgorithm;
27 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
28
29 import java.sql.SQLException;
30 import java.util.Optional;
31
32
33
34
35 public final class MaskMergedResult extends DecoratorMergedResult {
36
37 private final ShardingSphereDatabase database;
38
39 private final ShardingSphereMetaData metaData;
40
41 private final SelectStatementContext selectStatementContext;
42
43 public MaskMergedResult(final ShardingSphereDatabase database, final ShardingSphereMetaData metaData, final SelectStatementContext selectStatementContext, final MergedResult mergedResult) {
44 super(mergedResult);
45 this.database = database;
46 this.metaData = metaData;
47 this.selectStatementContext = selectStatementContext;
48 }
49
50 @SuppressWarnings({"rawtypes", "unchecked"})
51 @Override
52 public Object getValue(final int columnIndex, final Class<?> type) throws SQLException {
53 Optional<ColumnSegmentBoundInfo> columnSegmentBoundInfo = selectStatementContext.findColumnBoundInfo(columnIndex);
54 if (!columnSegmentBoundInfo.isPresent()) {
55 return getMergedResult().getValue(columnIndex, type);
56 }
57 String originalTableName = columnSegmentBoundInfo.get().getOriginalTable().getValue();
58 String originalColumnName = columnSegmentBoundInfo.get().getOriginalColumn().getValue();
59 ShardingSphereDatabase database = metaData.containsDatabase(columnSegmentBoundInfo.get().getOriginalDatabase().getValue())
60 ? metaData.getDatabase(columnSegmentBoundInfo.get().getOriginalDatabase().getValue())
61 : this.database;
62 Optional<MaskRule> rule = database.getRuleMetaData().findSingleRule(MaskRule.class);
63 if (!rule.isPresent() || !rule.get().findMaskTable(originalTableName).map(optional -> optional.findAlgorithm(originalColumnName).isPresent()).orElse(false)) {
64 return getMergedResult().getValue(columnIndex, type);
65 }
66 Optional<MaskAlgorithm> maskAlgorithm = rule.get().findMaskTable(originalTableName).flatMap(optional -> optional.findAlgorithm(originalColumnName));
67 if (!maskAlgorithm.isPresent()) {
68 return getMergedResult().getValue(columnIndex, type);
69 }
70 Object originalValue = getMergedResult().getValue(columnIndex, Object.class);
71 return null == originalValue ? null : maskAlgorithm.get().mask(originalValue);
72 }
73 }