1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.encrypt.rule;
19
20 import com.cedarsoftware.util.CaseInsensitiveMap;
21 import lombok.Getter;
22 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
23 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
24 import org.apache.shardingsphere.encrypt.exception.metadata.EncryptColumnNotFoundException;
25 import org.apache.shardingsphere.encrypt.exception.metadata.EncryptLogicColumnNotFoundException;
26 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
27 import org.apache.shardingsphere.encrypt.rule.column.item.AssistedQueryColumnItem;
28 import org.apache.shardingsphere.encrypt.rule.column.item.CipherColumnItem;
29 import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
30 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
31 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
32
33 import java.util.Collection;
34 import java.util.Map;
35 import java.util.Map.Entry;
36 import java.util.Optional;
37
38
39
40
41 @Getter
42 public final class EncryptTable {
43
44 private final String table;
45
46 private final Map<String, EncryptColumn> columns;
47
48 public EncryptTable(final EncryptTableRuleConfiguration config, final Map<String, EncryptAlgorithm> encryptors) {
49 table = config.getName();
50 columns = createEncryptColumns(config, encryptors);
51 }
52
53 private Map<String, EncryptColumn> createEncryptColumns(final EncryptTableRuleConfiguration config, final Map<String, EncryptAlgorithm> encryptors) {
54 Map<String, EncryptColumn> result = new CaseInsensitiveMap<>();
55 for (EncryptColumnRuleConfiguration each : config.getColumns()) {
56 result.put(each.getName(), createEncryptColumn(each, encryptors));
57 }
58 return result;
59 }
60
61 private EncryptColumn createEncryptColumn(final EncryptColumnRuleConfiguration config, final Map<String, EncryptAlgorithm> encryptors) {
62 EncryptColumn result = new EncryptColumn(config.getName(), new CipherColumnItem(config.getCipher().getName(), encryptors.get(config.getCipher().getEncryptorName())));
63 if (config.getAssistedQuery().isPresent()) {
64 result.setAssistedQuery(new AssistedQueryColumnItem(config.getAssistedQuery().get().getName(), encryptors.get(config.getAssistedQuery().get().getEncryptorName())));
65 }
66 if (config.getLikeQuery().isPresent()) {
67 result.setLikeQuery(new LikeQueryColumnItem(config.getLikeQuery().get().getName(), encryptors.get(config.getLikeQuery().get().getEncryptorName())));
68 }
69 return result;
70 }
71
72
73
74
75
76
77
78 public Optional<EncryptAlgorithm> findEncryptor(final String logicColumnName) {
79 return columns.containsKey(logicColumnName) ? Optional.of(columns.get(logicColumnName).getCipher().getEncryptor()) : Optional.empty();
80 }
81
82
83
84
85
86
87 public Collection<String> getLogicColumns() {
88 return columns.keySet();
89 }
90
91
92
93
94
95
96
97 public boolean isEncryptColumn(final String logicColumnName) {
98 return columns.containsKey(logicColumnName);
99 }
100
101
102
103
104
105
106
107 public EncryptColumn getEncryptColumn(final String logicColumnName) {
108 ShardingSpherePreconditions.checkState(isEncryptColumn(logicColumnName), () -> new EncryptColumnNotFoundException(table, logicColumnName));
109 return columns.get(logicColumnName);
110 }
111
112
113
114
115
116
117
118 public boolean isCipherColumn(final String columnName) {
119 return columns.values().stream().anyMatch(each -> each.getCipher().getName().equalsIgnoreCase(columnName));
120 }
121
122
123
124
125
126
127
128
129 public String getLogicColumnByCipherColumn(final String cipherColumnName) {
130 for (Entry<String, EncryptColumn> entry : columns.entrySet()) {
131 if (entry.getValue().getCipher().getName().equalsIgnoreCase(cipherColumnName)) {
132 return entry.getValue().getName();
133 }
134 }
135 throw new EncryptLogicColumnNotFoundException(cipherColumnName);
136 }
137
138
139
140
141
142
143
144
145 public String getLogicColumnByAssistedQueryColumn(final String assistQueryColumnName) {
146 for (Entry<String, EncryptColumn> entry : columns.entrySet()) {
147 if (entry.getValue().getAssistedQuery().isPresent() && entry.getValue().getAssistedQuery().get().getName().equalsIgnoreCase(assistQueryColumnName)) {
148 return entry.getValue().getName();
149 }
150 }
151 throw new EncryptLogicColumnNotFoundException(assistQueryColumnName);
152 }
153
154
155
156
157
158
159
160 public boolean isAssistedQueryColumn(final String columnName) {
161 return columns.values().stream().anyMatch(each -> columnName.equalsIgnoreCase(each.getAssistedQuery().map(AssistedQueryColumnItem::getName).orElse(null)));
162 }
163
164
165
166
167
168
169
170 public boolean isLikeQueryColumn(final String columnName) {
171 return columns.values().stream().anyMatch(each -> columnName.equalsIgnoreCase(each.getLikeQuery().map(LikeQueryColumnItem::getName).orElse(null)));
172 }
173 }