| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.beam.sdk.coders; |
| |
| import static org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkNotNull; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.math.BigInteger; |
| |
| /** |
| * A {@link BigIntegerCoder} encodes a {@link BigInteger} as a byte array containing the big endian |
| * two's-complement representation, encoded via {@link ByteArrayCoder}. |
| */ |
| public class BigIntegerCoder extends AtomicCoder<BigInteger> { |
| |
| public static BigIntegerCoder of() { |
| return INSTANCE; |
| } |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| private static final BigIntegerCoder INSTANCE = new BigIntegerCoder(); |
| private static final ByteArrayCoder BYTE_ARRAY_CODER = ByteArrayCoder.of(); |
| |
| private BigIntegerCoder() {} |
| |
| @Override |
| public void encode(BigInteger value, OutputStream outStream) throws IOException, CoderException { |
| encode(value, outStream, Context.NESTED); |
| } |
| |
| @Override |
| public void encode(BigInteger value, OutputStream outStream, Context context) |
| throws IOException, CoderException { |
| checkNotNull(value, String.format("cannot encode a null %s", BigInteger.class.getSimpleName())); |
| BYTE_ARRAY_CODER.encode(value.toByteArray(), outStream, context); |
| } |
| |
| @Override |
| public BigInteger decode(InputStream inStream) throws IOException, CoderException { |
| return decode(inStream, Context.NESTED); |
| } |
| |
| @Override |
| public BigInteger decode(InputStream inStream, Context context) |
| throws IOException, CoderException { |
| return new BigInteger(BYTE_ARRAY_CODER.decode(inStream, context)); |
| } |
| |
| @Override |
| public void verifyDeterministic() { |
| BYTE_ARRAY_CODER.verifyDeterministic(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @return {@code true}. This coder is injective. |
| */ |
| @Override |
| public boolean consistentWithEquals() { |
| return true; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @return {@code true}, because {@link #getEncodedElementByteSize} runs in constant time. |
| */ |
| @Override |
| public boolean isRegisterByteSizeObserverCheap(BigInteger value) { |
| return true; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @return the size of the encoding as a byte array according to {@link ByteArrayCoder} |
| */ |
| @Override |
| protected long getEncodedElementByteSize(BigInteger value) throws Exception { |
| checkNotNull(value, String.format("cannot encode a null %s", BigInteger.class.getSimpleName())); |
| return BYTE_ARRAY_CODER.getEncodedElementByteSize(value.toByteArray()); |
| } |
| } |