From: Robert Varga Date: Sun, 13 Mar 2022 15:06:43 +0000 (+0100) Subject: Convert BigDecimal/Decimal64 in yang-data-codec-binfmt X-Git-Tag: v8.0.0~1 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=yangtools.git;a=commitdiff_plain;h=24db9d039414fe5277b4c04f2fd1e752b627dac9 Convert BigDecimal/Decimal64 in yang-data-codec-binfmt Our internal representation is Decimal64, make sure we adjust it as we are reading data in and handle it on writeout. JIRA: YANGTOOLS-556 Change-Id: Ie83b26467ac987a21c6b2dbd6726559db4e6169d Signed-off-by: Robert Varga --- diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataInput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataInput.java index b056ca07a6..bb362e7de7 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataInput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataInput.java @@ -16,7 +16,6 @@ import com.google.common.collect.Sets; import java.io.DataInput; import java.io.IOException; import java.io.StringReader; -import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -27,6 +26,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.dom.DOMSource; import org.opendaylight.yangtools.util.ImmutableOffsetMapTemplate; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -369,7 +369,7 @@ abstract class AbstractLithiumDataInput extends AbstractNormalizedNodeDataInput return readStringBytes(); case LithiumValue.BIG_DECIMAL_TYPE: - return new BigDecimal(input.readUTF()); + return Decimal64.valueOf(input.readUTF()); case LithiumValue.BIG_INTEGER_TYPE: return new BigInteger(input.readUTF()); diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataOutput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataOutput.java index a9f0979e53..a0458ce5f8 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataOutput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataOutput.java @@ -32,6 +32,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -67,6 +68,7 @@ abstract class AbstractLithiumDataOutput extends AbstractNormalizedNodeDataOutpu .put(Short.class, LithiumValue.SHORT_TYPE) .put(BigInteger.class, LithiumValue.BIG_INTEGER_TYPE) .put(BigDecimal.class, LithiumValue.BIG_DECIMAL_TYPE) + .put(Decimal64.class, LithiumValue.BIG_DECIMAL_TYPE) .put(byte[].class, LithiumValue.BINARY_TYPE) .put(Empty.class, LithiumValue.EMPTY_TYPE) .build(); diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataInput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataInput.java index 6c3f2c59eb..84e01af845 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataInput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataInput.java @@ -19,7 +19,6 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import java.io.DataInput; import java.io.IOException; import java.io.StringReader; -import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -29,6 +28,7 @@ import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier; import org.opendaylight.yangtools.util.xml.UntrustedXML; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -746,7 +746,7 @@ abstract class AbstractMagnesiumDataInput extends AbstractNormalizedNodeDataInpu return Uint64.fromLongBits(input.readInt() & 0xFFFFFFFFL); case MagnesiumValue.BIGDECIMAL: // FIXME: use string -> BigDecimal cache - return new BigDecimal(input.readUTF()); + return Decimal64.valueOf(input.readUTF()); case MagnesiumValue.BIGINTEGER: return readBigInteger(); case MagnesiumValue.STRING_EMPTY: diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataOutput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataOutput.java index 7ced29f0c2..659cae5d88 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataOutput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataOutput.java @@ -29,6 +29,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.rfc8528.data.api.MountPointIdentifier; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -365,8 +366,9 @@ abstract class AbstractMagnesiumDataOutput extends AbstractNormalizedNodeDataOut output.writeByte(MagnesiumValue.EMPTY); } else if (value instanceof Set) { writeValue((Set) value); - } else if (value instanceof BigDecimal) { - writeValue((BigDecimal) value); + } else if (value instanceof BigDecimal || value instanceof Decimal64) { + output.writeByte(MagnesiumValue.BIGDECIMAL); + output.writeUTF(value.toString()); } else if (value instanceof BigInteger) { writeValue((BigInteger) value); } else { @@ -466,11 +468,6 @@ abstract class AbstractMagnesiumDataOutput extends AbstractNormalizedNodeDataOut } } - private void writeValue(final BigDecimal value) throws IOException { - output.writeByte(MagnesiumValue.BIGDECIMAL); - output.writeUTF(value.toString()); - } - abstract void writeValue(BigInteger value) throws IOException; private void writeValue(final String value) throws IOException { diff --git a/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/TestModel.java b/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/TestModel.java index 78982a345b..50e15263a8 100644 --- a/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/TestModel.java +++ b/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/TestModel.java @@ -13,12 +13,12 @@ import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.ma import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import java.math.BigDecimal; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; @@ -209,7 +209,7 @@ public final class TestModel { .withChild(ImmutableNodes.leafNode(SHORT_LEAF_QNAME, SHORT_ID)) .withChild(ImmutableNodes.leafNode(BYTE_LEAF_QNAME, BYTE_ID)) .withChild(ImmutableNodes.leafNode(TestModel.BIGINTEGER_LEAF_QNAME, uint64.apply("100"))) - .withChild(ImmutableNodes.leafNode(TestModel.BIGDECIMAL_LEAF_QNAME, BigDecimal.valueOf(1.2))) + .withChild(ImmutableNodes.leafNode(TestModel.BIGDECIMAL_LEAF_QNAME, Decimal64.valueOf("1.2"))) .withChild(ImmutableNodes.leafNode(SOME_REF_QNAME, instanceID)) .withChild(ImmutableNodes.leafNode(MYIDENTITY_QNAME, DESC_QNAME)) .withChild(Builders.unkeyedListBuilder()