Squash empty MapNode/UnkeyedListNode objects to null 91/89191/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 21 Apr 2020 09:43:55 +0000 (11:43 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 21 Apr 2020 09:46:55 +0000 (11:46 +0200)
When we encounter an empty keyed/unkeyed list, we need to treat
it as it were not present. This adjusts the appropriate codecs
to ensure that is the case.

JIRA: MDSAL-452
Change-Id: Iba70207642e014d59a94cc09a69da988ee71c63f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/KeyedListNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ListNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NormalizedNodeSerializeDeserializeTest.java

index 33515324b23fc64a8ca636ba4a6b3d6f0753e1ab..dd44e6896ae2f33203b015c27f15ac576312964e 100644 (file)
@@ -19,7 +19,6 @@ import java.lang.invoke.WrongMethodTypeException;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
@@ -57,10 +56,9 @@ abstract class KeyedListNodeCodecContext<D extends DataObject & Identifiable<?>>
         }
 
         @Override
-        Map<?, D> fromMap(final MapNode nodes) {
-            final Collection<MapEntryNode> value = nodes.getValue();
-            final Builder<Object, D> builder = ImmutableMap.builderWithExpectedSize(value.size());
+        Object fromMap(final MapNode map, final Collection<MapEntryNode> value) {
             // FIXME: Could be this lazy transformed map?
+            final Builder<Object, D> builder = ImmutableMap.builderWithExpectedSize(value.size());
             for (MapEntryNode node : value) {
                 final D entry = fromMapEntry(node);
                 builder.put(getKey(entry), entry);
index fe7a09363772304328ee30014d7faa949cf475da..83e38fdc20f692864a2717d0251f534961febcab 100644 (file)
@@ -56,10 +56,15 @@ class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<
         }
     }
 
-    Object fromMap(final MapNode nodes) {
-        final Collection<MapEntryNode> value = nodes.getValue();
-        final Builder<D> builder = ImmutableList.builderWithExpectedSize(value.size());
+    private Object fromMap(final MapNode map) {
+        final Collection<MapEntryNode> value = map.getValue();
+        // This should never happen, but we do need to ensure users never see an empty Map
+        return value.isEmpty() ? null : fromMap(map, value);
+    }
+
+    Object fromMap(final MapNode map, final Collection<MapEntryNode> value) {
         // FIXME: Could be this lazy transformed list?
+        final Builder<D> builder = ImmutableList.builderWithExpectedSize(value.size());
         for (MapEntryNode node : value) {
             builder.add(createBindingProxy(node));
         }
@@ -76,6 +81,11 @@ class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<
 
     private List<D> fromUnkeyedList(final UnkeyedListNode nodes) {
         final Collection<UnkeyedListEntryNode> value = nodes.getValue();
+        if (value.isEmpty()) {
+            // This should never happen, but we do need to ensure users never see an empty List
+            return null;
+        }
+
         // FIXME: Could be this lazy transformed list?
         final Builder<D> builder = ImmutableList.builderWithExpectedSize(value.size());
         for (UnkeyedListEntryNode node : value) {
index fee017b0366cae4017b7dbadcbf71ecb42d46e72..ef24786cfe51eaf678850649187c6d4a98f03638 100644 (file)
@@ -232,7 +232,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         for (Entry<Class<? extends Augmentation<Top>>, ? extends Augmentation<Top>> augment : augments.entrySet()) {
             topBuilder.addAugmentation(augment.getKey(), augment.getValue());
         }
-        return topBuilder.setTopLevelList(Collections.emptyMap()).build();
+        return topBuilder.build();
     }
 
     @Test