Convert BigDecimal/Decimal64 in yang-data-codec-binfmt 04/100104/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 13 Mar 2022 15:06:43 +0000 (16:06 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 13 Mar 2022 15:07:32 +0000 (16:07 +0100)
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 <robert.varga@pantheon.tech>
codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataInput.java
codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractLithiumDataOutput.java
codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataInput.java
codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/AbstractMagnesiumDataOutput.java
codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/TestModel.java

index b056ca07a6a6a6f78642ab5bd6425b1ba4089cc6..bb362e7de7c93191eed25faf27016638ded17da8 100644 (file)
@@ -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());
index a9f0979e5333ef72dcabaf96d6e91652e29af08c..a0458ce5f8bcfd35d88121ac15ad9b5e796ae37e 100644 (file)
@@ -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();
index 6c3f2c59eb3245e51fa15d8f74ea9fdba6f53664..84e01af84550670e6ab7844e3a8971ad0fd028c3 100644 (file)
@@ -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:
index 7ced29f0c23268068e5db3306d3a32a880160da6..659cae5d883afe84225c6663d5ae5b9512e95267 100644 (file)
@@ -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 {
index 78982a345bc8e4266d01df85ca5bdeb113fdc641..50e15263a8f99b60e6ff6f45a2763bc809e19a7a 100644 (file)
@@ -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()