Ignore empty augmentations at runtime
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / ListNodeCodecContext.java
index 7380700b8525eb7032b11038560bc6c39d358f4c..e69b6e9281c5c45750dfa1b02b22564589a15f99 100644 (file)
@@ -8,73 +8,65 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D,ListSchemaNode> {
-    ListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype) {
+class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ListRuntimeType> {
+    ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype) {
         super(prototype);
     }
 
-    ListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype, final Method keyMethod) {
+    ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype,
+            final Method keyMethod) {
         super(prototype, keyMethod);
     }
 
     @Override
-    public D deserialize(final NormalizedNode<?, ?> node) {
+    public D deserialize(final NormalizedNode node) {
         if (node instanceof MapEntryNode) {
-            return fromMapEntry((MapEntryNode) node);
+            return createBindingProxy((MapEntryNode) node);
         } else if (node instanceof UnkeyedListEntryNode) {
-            return fromUnkeyedListEntry((UnkeyedListEntryNode) node);
+            return createBindingProxy((UnkeyedListEntryNode) node);
         } else {
             throw new IllegalStateException("Unsupported data type " + node.getClass());
         }
     }
 
     @Override
-    protected Object deserializeObject(final NormalizedNode<?, ?> node) {
+    protected Object deserializeObject(final NormalizedNode node) {
         if (node instanceof MapNode) {
             return fromMap((MapNode) node);
         } else if (node instanceof MapEntryNode) {
-            return fromMapEntry((MapEntryNode) node);
+            return createBindingProxy((MapEntryNode) node);
         } else if (node instanceof UnkeyedListNode) {
             return fromUnkeyedList((UnkeyedListNode) node);
         } else if (node instanceof UnkeyedListEntryNode) {
-            return fromUnkeyedListEntry((UnkeyedListEntryNode) node);
+            return createBindingProxy((UnkeyedListEntryNode) node);
         } else {
             throw new IllegalStateException("Unsupported data type " + node.getClass());
         }
     }
 
-    private List<D> fromMap(final MapNode nodes) {
-        List<D> ret = new ArrayList<>(nodes.getValue().size());
-        for (MapEntryNode node : nodes.getValue()) {
-            ret.add(fromMapEntry(node));
-        }
-        return ret;
-    }
-
-    private D fromMapEntry(final MapEntryNode node) {
-        return createBindingProxy(node);
+    @NonNull Object fromMap(final MapNode map, final int size) {
+        return LazyBindingList.create(this, size, map.body());
     }
 
-    private D fromUnkeyedListEntry(final UnkeyedListEntryNode node) {
-        return createBindingProxy(node);
+    private Object fromMap(final MapNode map) {
+        final int size;
+        // This should never happen, but we do need to ensure users never see an empty Map
+        return (size = map.size()) == 0 ? null : fromMap(map, size);
     }
 
-    private List<D> fromUnkeyedList(final UnkeyedListNode nodes) {
-        // FIXME: Could be this lazy transformed list?
-        List<D> ret = new ArrayList<>(nodes.getValue().size());
-        for (UnkeyedListEntryNode node : nodes.getValue()) {
-            ret.add(fromUnkeyedListEntry(node));
-        }
-        return ret;
+    private List<D> fromUnkeyedList(final UnkeyedListNode node) {
+        final int size;
+        // This should never happen, but we do need to ensure users never see an empty List
+        return (size = node.size()) == 0 ? null : LazyBindingList.create(this, size, node.body());
     }
-}
\ No newline at end of file
+}