From 500a001ce41eb932997d70c43c9e7d07dbcca843 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 18 Jun 2019 21:26:20 +0200 Subject: [PATCH] Do not emit empty lists to NormalizedNodes This patch changes the representation of empty Binding lists in DOM world. Empty lists are equivalent to being non-present, hence they are not emitted. This mirrors the getFoo()/nonnullFoo() accessor duality, i.e. empty lists can be instantiated on-demand as placeholders for nulls. In DOM world, list nodes are virtual containers, which do not hold any semantics and are created on demand -- hence it does not make sense to pass them down to DOM. This does not create data tree operation changes, as lists are not directly addressable, hence their WRITE/MERGE semantics are shared by their parent. Empty merges have not semantic value, as empty lists disappear on touch. Empty writes end up correctly observing lifecycle -- empty lists end up disappearing, just as they would be expected if they have undergone a lifecycle event (such as an empty merge). JIRA: MDSAL-456 Change-Id: I78efc4aa4c3b4100ff52490fefe94e2f65f43efc Signed-off-by: Robert Varga --- .../dom/codec/impl/DataObjectStreamer.java | 19 +++++++++++++------ .../test/AugmentationSubstitutionTest.java | 2 -- ...ormalizedNodeSerializeDeserializeTest.java | 2 +- .../test/model/util/ListsBindingUtils.java | 4 ++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamer.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamer.java index 9e652a558a..691a1ca337 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamer.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamer.java @@ -140,8 +140,9 @@ public abstract class DataObjectStreamer implements DataOb protected static final void streamList(final Class childClass, final DataObjectStreamer childStreamer, final DataObjectSerializerRegistry registry, final BindingStreamEventWriter writer, final List value) throws IOException { - if (value != null) { - writer.startUnkeyedList(childClass, value.size()); + final int size = nullSize(value); + if (size != 0) { + writer.startUnkeyedList(childClass, size); commonStreamList(registry, writer, childStreamer, value); } } @@ -149,8 +150,9 @@ public abstract class DataObjectStreamer implements DataOb protected static final > void streamMap(final Class childClass, final DataObjectStreamer childStreamer, final DataObjectSerializerRegistry registry, final BindingStreamEventWriter writer, final List value) throws IOException { - if (value != null) { - writer.startMapNode(childClass, value.size()); + final int size = nullSize(value); + if (size != 0) { + writer.startMapNode(childClass, size); commonStreamList(registry, writer, childStreamer, value); } } @@ -158,8 +160,9 @@ public abstract class DataObjectStreamer implements DataOb protected static final > void streamOrderedMap(final Class childClass, final DataObjectStreamer childStreamer, final DataObjectSerializerRegistry registry, final BindingStreamEventWriter writer, final List value) throws IOException { - if (value != null) { - writer.startOrderedMapNode(childClass, value.size()); + final int size = nullSize(value); + if (size != 0) { + writer.startOrderedMapNode(childClass, size); commonStreamList(registry, writer, childStreamer, value); } } @@ -208,4 +211,8 @@ public abstract class DataObjectStreamer implements DataOb private static boolean tryCache(final BindingStreamEventWriter writer, final T value) { return writer instanceof BindingSerializer ? ((BindingSerializer) writer).serialize(value) == null : true; } + + private static int nullSize(final List list) { + return list == null ? 0 : list.size(); + } } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationSubstitutionTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationSubstitutionTest.java index 144a5b4d9a..6f3a2cb121 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationSubstitutionTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationSubstitutionTest.java @@ -9,7 +9,6 @@ package org.opendaylight.mdsal.binding.dom.codec.test; import static org.junit.Assert.assertEquals; -import java.util.Collections; import java.util.Optional; import org.junit.Test; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.RpcComplexUsesAugment; @@ -74,7 +73,6 @@ public class AugmentationSubstitutionTest extends AbstractBindingCodecTest { .setContainerWithUses(new ContainerWithUsesBuilder() .setLeafFromGrouping("foo") .build()) - .setListViaUses(Collections.emptyList()) .build(); } } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/NormalizedNodeSerializeDeserializeTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/NormalizedNodeSerializeDeserializeTest.java index 731ce67c70..a5ed9879fb 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/NormalizedNodeSerializeDeserializeTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/NormalizedNodeSerializeDeserializeTest.java @@ -137,7 +137,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec private static ContainerNode getEmptyTop() { return ImmutableContainerNodeBuilder.create() .withNodeIdentifier(new NodeIdentifier(TOP_QNAME)) - .withChild(mapNodeBuilder(TOP_LEVEL_LIST_QNAME).build()).build(); + .build(); } private static final QName AGUMENT_STRING_Q = QName.create(TOP_QNAME, "augmented-string"); diff --git a/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/mdsal/binding/test/model/util/ListsBindingUtils.java b/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/mdsal/binding/test/model/util/ListsBindingUtils.java index f2e72f76cf..c3d0490cc5 100644 --- a/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/mdsal/binding/test/model/util/ListsBindingUtils.java +++ b/binding/mdsal-binding-test-model/src/main/java/org/opendaylight/mdsal/binding/test/model/util/ListsBindingUtils.java @@ -58,6 +58,10 @@ public final class ListsBindingUtils { return path(key).augmentation(augmentation); } + public static Top top() { + return new TopBuilder().build(); + } + public static Top top(final TopLevelList... listItems) { return new TopBuilder().setTopLevelList(Arrays.asList(listItems)).build(); } -- 2.36.6