1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.hadoop.hbase.io.encoding;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.DataInputStream;
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.nio.ByteBuffer;
24
25 import org.apache.commons.io.IOUtils;
26 import org.apache.hadoop.classification.InterfaceAudience;
27 import org.apache.hadoop.hbase.io.TagCompressionContext;
28 import org.apache.hadoop.hbase.io.compress.Compression;
29 import org.apache.hadoop.hbase.io.crypto.Cipher;
30 import org.apache.hadoop.hbase.io.crypto.Decryptor;
31 import org.apache.hadoop.hbase.io.crypto.Encryption;
32 import org.apache.hadoop.hbase.io.hfile.HFileContext;
33 import org.apache.hadoop.hbase.io.util.StreamUtils;
34 import org.apache.hadoop.hbase.util.Bytes;
35
36
37
38
39
40
41
42
43 @InterfaceAudience.Private
44 public class HFileBlockDefaultDecodingContext implements
45 HFileBlockDecodingContext {
46 private final HFileContext fileContext;
47 private TagCompressionContext tagCompressionContext;
48
49 public HFileBlockDefaultDecodingContext(HFileContext fileContext) {
50 this.fileContext = fileContext;
51 }
52
53 @Override
54 public void prepareDecoding(int onDiskSizeWithoutHeader, int uncompressedSizeWithoutHeader,
55 ByteBuffer blockBufferWithoutHeader, byte[] onDiskBlock, int offset) throws IOException {
56 InputStream in = new DataInputStream(new ByteArrayInputStream(onDiskBlock, offset,
57 onDiskSizeWithoutHeader));
58
59 Encryption.Context cryptoContext = fileContext.getEncryptionContext();
60 if (cryptoContext != Encryption.Context.NONE) {
61
62 Cipher cipher = cryptoContext.getCipher();
63 Decryptor decryptor = cipher.getDecryptor();
64 decryptor.setKey(cryptoContext.getKey());
65
66
67
68
69
70
71
72
73
74
75 int ivLength = in.read();
76 if (ivLength > 0) {
77 byte[] iv = new byte[ivLength];
78 IOUtils.readFully(in, iv);
79 decryptor.setIv(iv);
80
81
82
83 decryptor.reset();
84 in = decryptor.createDecryptionStream(in);
85 }
86 onDiskSizeWithoutHeader -= Bytes.SIZEOF_BYTE + ivLength;
87 }
88
89 Compression.Algorithm compression = fileContext.getCompression();
90 if (compression != Compression.Algorithm.NONE) {
91 Compression.decompress(blockBufferWithoutHeader.array(),
92 blockBufferWithoutHeader.arrayOffset(), in, onDiskSizeWithoutHeader,
93 uncompressedSizeWithoutHeader, compression);
94 } else {
95 IOUtils.readFully(in, blockBufferWithoutHeader.array(),
96 blockBufferWithoutHeader.arrayOffset(), onDiskSizeWithoutHeader);
97 }
98 }
99
100 @Override
101 public HFileContext getHFileContext() {
102 return this.fileContext;
103 }
104
105 public TagCompressionContext getTagCompressionContext() {
106 return tagCompressionContext;
107 }
108
109 public void setTagCompressionContext(TagCompressionContext tagCompressionContext) {
110 this.tagCompressionContext = tagCompressionContext;
111 }
112 }