1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.types;
19
20 import org.apache.hadoop.hbase.classification.InterfaceAudience;
21 import org.apache.hadoop.hbase.classification.InterfaceStability;
22 import org.apache.hadoop.hbase.util.Order;
23 import org.apache.hadoop.hbase.util.PositionedByteRange;
24 import org.apache.hadoop.hbase.util.SimplePositionedMutableByteRange;
25
26
27
28
29
30
31
32 @InterfaceAudience.Public
33 @InterfaceStability.Evolving
34 public class FixedLengthWrapper<T> implements DataType<T> {
35
36 protected final DataType<T> base;
37 protected final int length;
38
39
40
41
42
43
44 public FixedLengthWrapper(DataType<T> base, int length) {
45 this.base = base;
46 this.length = length;
47 }
48
49
50
51
52 public int getLength() { return length; }
53
54 @Override
55 public boolean isOrderPreserving() { return base.isOrderPreserving(); }
56
57 @Override
58 public Order getOrder() { return base.getOrder(); }
59
60 @Override
61 public boolean isNullable() { return base.isNullable(); }
62
63 @Override
64 public boolean isSkippable() { return true; }
65
66 @Override
67 public int encodedLength(T val) { return length; }
68
69 @Override
70 public Class<T> encodedClass() { return base.encodedClass(); }
71
72 @Override
73 public int skip(PositionedByteRange src) {
74 src.setPosition(src.getPosition() + this.length);
75 return this.length;
76 }
77
78 @Override
79 public T decode(PositionedByteRange src) {
80 if (src.getRemaining() < length) {
81 throw new IllegalArgumentException("Not enough buffer remaining. src.offset: "
82 + src.getOffset() + " src.length: " + src.getLength() + " src.position: "
83 + src.getPosition() + " max length: " + length);
84 }
85
86 PositionedByteRange b = new SimplePositionedMutableByteRange(length);
87 src.get(b.getBytes());
88 return base.decode(b);
89 }
90
91 @Override
92 public int encode(PositionedByteRange dst, T val) {
93 if (dst.getRemaining() < length) {
94 throw new IllegalArgumentException("Not enough buffer remaining. dst.offset: "
95 + dst.getOffset() + " dst.length: " + dst.getLength() + " dst.position: "
96 + dst.getPosition() + " max length: " + length);
97 }
98 int written = base.encode(dst, val);
99 if (written > length) {
100 throw new IllegalArgumentException("Length of encoded value (" + written
101 + ") exceeds max length (" + length + ").");
102 }
103
104 for (; written < length; written++) { dst.put((byte) 0x00); }
105 return written;
106 }
107 }