View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.hadoop.hbase.types;
19  
20  import com.google.protobuf.CodedInputStream;
21  import com.google.protobuf.CodedOutputStream;
22  import org.apache.hadoop.hbase.protobuf.generated.CellProtos;
23  import org.apache.hadoop.hbase.util.PositionedByteRange;
24  
25  import java.io.IOException;
26  
27  /**
28   * An example for using protobuf objects with {@link DataType} API.
29   */
30  public class PBCell extends PBType<CellProtos.Cell> {
31    @Override
32    public Class<CellProtos.Cell> encodedClass() {
33      return CellProtos.Cell.class;
34    }
35  
36    @Override
37    public int skip(PositionedByteRange src) {
38      CellProtos.Cell.Builder builder = CellProtos.Cell.newBuilder();
39      CodedInputStream is = inputStreamFromByteRange(src);
40      is.setSizeLimit(src.getLength());
41      try {
42        builder.mergeFrom(is);
43        int consumed = is.getTotalBytesRead();
44        src.setPosition(src.getPosition() + consumed);
45        return consumed;
46      } catch (IOException e) {
47        throw new RuntimeException("Error while skipping type.", e);
48      }
49    }
50  
51    @Override
52    public CellProtos.Cell decode(PositionedByteRange src) {
53      CellProtos.Cell.Builder builder = CellProtos.Cell.newBuilder();
54      CodedInputStream is = inputStreamFromByteRange(src);
55      is.setSizeLimit(src.getLength());
56      try {
57        CellProtos.Cell ret = builder.mergeFrom(is).build();
58        src.setPosition(src.getPosition() + is.getTotalBytesRead());
59        return ret;
60      } catch (IOException e) {
61        throw new RuntimeException("Error while decoding type.", e);
62      }
63    }
64  
65    @Override
66    public int encode(PositionedByteRange dst, CellProtos.Cell val) {
67      CodedOutputStream os = outputStreamFromByteRange(dst);
68      try {
69        int before = os.spaceLeft(), after, written;
70        val.writeTo(os);
71        after = os.spaceLeft();
72        written = before - after;
73        dst.setPosition(dst.getPosition() + written);
74        return written;
75      } catch (IOException e) {
76        throw new RuntimeException("Error while encoding type.", e);
77      }
78    }
79  }