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      try {
41        builder.mergeFrom(is);
42        int consumed = is.getTotalBytesRead();
43        src.setPosition(src.getPosition() + consumed);
44        return consumed;
45      } catch (IOException e) {
46        throw new RuntimeException("Error while skipping type.", e);
47      }
48    }
49  
50    @Override
51    public CellProtos.Cell decode(PositionedByteRange src) {
52      CellProtos.Cell.Builder builder = CellProtos.Cell.newBuilder();
53      CodedInputStream is = inputStreamFromByteRange(src);
54      try {
55        CellProtos.Cell ret = builder.mergeFrom(is).build();
56        src.setPosition(src.getPosition() + is.getTotalBytesRead());
57        return ret;
58      } catch (IOException e) {
59        throw new RuntimeException("Error while decoding type.", e);
60      }
61    }
62  
63    @Override
64    public int encode(PositionedByteRange dst, CellProtos.Cell val) {
65      CodedOutputStream os = outputStreamFromByteRange(dst);
66      try {
67        int before = os.spaceLeft(), after, written;
68        val.writeTo(os);
69        after = os.spaceLeft();
70        written = before - after;
71        dst.setPosition(dst.getPosition() + written);
72        return written;
73      } catch (IOException e) {
74        throw new RuntimeException("Error while encoding type.", e);
75      }
76    }
77  }