1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.security.visibility;
19
20 import java.io.IOException;
21 import java.util.Map;
22
23 import org.apache.hadoop.hbase.classification.InterfaceAudience;
24 import org.apache.hadoop.hbase.Cell;
25 import org.apache.hadoop.hbase.filter.FilterBase;
26 import org.apache.hadoop.hbase.util.ByteRange;
27 import org.apache.hadoop.hbase.util.Bytes;
28 import org.apache.hadoop.hbase.util.SimpleMutableByteRange;
29
30
31
32
33
34 @InterfaceAudience.Private
35 class VisibilityLabelFilter extends FilterBase {
36
37 private final VisibilityExpEvaluator expEvaluator;
38 private final Map<ByteRange, Integer> cfVsMaxVersions;
39 private final ByteRange curFamily;
40 private final ByteRange curQualifier;
41 private int curFamilyMaxVersions;
42 private int curQualMetVersions;
43
44 public VisibilityLabelFilter(VisibilityExpEvaluator expEvaluator,
45 Map<ByteRange, Integer> cfVsMaxVersions) {
46 this.expEvaluator = expEvaluator;
47 this.cfVsMaxVersions = cfVsMaxVersions;
48 this.curFamily = new SimpleMutableByteRange();
49 this.curQualifier = new SimpleMutableByteRange();
50 }
51
52 @Override
53 public ReturnCode filterKeyValue(Cell cell) throws IOException {
54 if (curFamily.getBytes() == null
55 || (Bytes.compareTo(curFamily.getBytes(), curFamily.getOffset(), curFamily.getLength(),
56 cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) != 0)) {
57 curFamily.set(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
58
59
60
61 curFamilyMaxVersions = cfVsMaxVersions.get(curFamily);
62
63 curQualifier.unset();
64 }
65 if (curQualifier.getBytes() == null
66 || (Bytes.compareTo(curQualifier.getBytes(), curQualifier.getOffset(),
67 curQualifier.getLength(), cell.getQualifierArray(), cell.getQualifierOffset(),
68 cell.getQualifierLength()) != 0)) {
69 curQualifier.set(cell.getQualifierArray(), cell.getQualifierOffset(),
70 cell.getQualifierLength());
71 curQualMetVersions = 0;
72 }
73 curQualMetVersions++;
74 if (curQualMetVersions > curFamilyMaxVersions) {
75 return ReturnCode.SKIP;
76 }
77
78 return this.expEvaluator.evaluate(cell) ? ReturnCode.INCLUDE : ReturnCode.SKIP;
79 }
80
81
82
83 @Override
84 public Cell transformCell(Cell v) {
85 return v;
86 }
87
88 @Override
89 public void reset() throws IOException {
90 this.curFamily.unset();
91 this.curQualifier.unset();
92 this.curFamilyMaxVersions = 0;
93 this.curQualMetVersions = 0;
94 }
95 }