Account for reported UNMODIFIED nodes 67/80267/4
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Feb 2019 16:00:14 +0000 (17:00 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Feb 2019 16:25:56 +0000 (17:25 +0100)
DataObjectModification has no way of expressing UNMODIFIED nodes,
but they can (and are) reported from DataTreeCandidateNode, hence
we end up reporting IllegalStateException when the user tries to
look at those nodes.

Make sure we take the node under consideration and do not report
unmodified children, hence preventing the ISE from happening.

JIRA: MDSAL-422
Change-Id: I34d36ae083c5ce3ad793eb584236f175f7a3a906
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/LazyDataObjectModification.java

index c3aff15e7a600f4fe83743e1ee77688273dc46db..1a21b98d0475a557854a7c6618ac716a1957a521 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.controller.md.sal.binding.impl;
 
  */
 package org.opendaylight.controller.md.sal.binding.impl;
 
-import com.google.common.base.Preconditions;
+import static java.util.Objects.requireNonNull;
+import static org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType.UNMODIFIED;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -54,14 +56,14 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     private volatile ModificationType modificationType;
 
     private LazyDataObjectModification(final BindingCodecTreeNode<T> codec, final DataTreeCandidateNode domData) {
     private volatile ModificationType modificationType;
 
     private LazyDataObjectModification(final BindingCodecTreeNode<T> codec, final DataTreeCandidateNode domData) {
-        this.codec = Preconditions.checkNotNull(codec);
-        this.domData = Preconditions.checkNotNull(domData);
+        this.codec = requireNonNull(codec);
+        this.domData = requireNonNull(domData);
         this.identifier = codec.deserializePathArgument(domData.getIdentifier());
     }
 
     static <T extends DataObject> LazyDataObjectModification<T> create(final BindingCodecTreeNode<T> codec,
             final DataTreeCandidateNode domData) {
         this.identifier = codec.deserializePathArgument(domData.getIdentifier());
     }
 
     static <T extends DataObject> LazyDataObjectModification<T> create(final BindingCodecTreeNode<T> codec,
             final DataTreeCandidateNode domData) {
-        return new LazyDataObjectModification<>(codec,domData);
+        return new LazyDataObjectModification<>(codec, domData);
     }
 
     private static Collection<LazyDataObjectModification<? extends DataObject>> from(
     }
 
     private static Collection<LazyDataObjectModification<? extends DataObject>> from(
@@ -74,22 +76,24 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
             final BindingCodecTreeNode<?> parentCodec, final Collection<DataTreeCandidateNode> domChildNodes) {
         for (final DataTreeCandidateNode domChildNode : domChildNodes) {
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
             final BindingCodecTreeNode<?> parentCodec, final Collection<DataTreeCandidateNode> domChildNodes) {
         for (final DataTreeCandidateNode domChildNode : domChildNodes) {
-            final BindingStructuralType type = BindingStructuralType.from(domChildNode);
-            if (type != BindingStructuralType.NOT_ADDRESSABLE) {
-                /*
-                 *  Even if type is UNKNOWN, from perspective of BindingStructuralType
-                 *  we try to load codec for it. We will use that type to further specify
-                 *  debug log.
-                 */
-                try {
-                    final BindingCodecTreeNode<?> childCodec =
-                            parentCodec.yangPathArgumentChild(domChildNode.getIdentifier());
-                    populateList(result,type, childCodec, domChildNode);
-                } catch (final IllegalArgumentException e) {
-                    if (type == BindingStructuralType.UNKNOWN) {
-                        LOG.debug("Unable to deserialize unknown DOM node {}",domChildNode,e);
-                    } else {
-                        LOG.debug("Binding representation for DOM node {} was not found",domChildNode,e);
+            if (domChildNode.getModificationType() != UNMODIFIED) {
+                final BindingStructuralType type = BindingStructuralType.from(domChildNode);
+                if (type != BindingStructuralType.NOT_ADDRESSABLE) {
+                    /*
+                     *  Even if type is UNKNOWN, from perspective of BindingStructuralType
+                     *  we try to load codec for it. We will use that type to further specify
+                     *  debug log.
+                     */
+                    try {
+                        final BindingCodecTreeNode<?> childCodec =
+                                parentCodec.yangPathArgumentChild(domChildNode.getIdentifier());
+                        populateList(result, type, childCodec, domChildNode);
+                    } catch (final IllegalArgumentException e) {
+                        if (type == BindingStructuralType.UNKNOWN) {
+                            LOG.debug("Unable to deserialize unknown DOM node {}", domChildNode, e);
+                        } else {
+                            LOG.debug("Binding representation for DOM node {} was not found", domChildNode, e);
+                        }
                     }
                 }
             }
                     }
                 }
             }
@@ -119,7 +123,9 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     private static void populateListWithSingleCodec(final List<LazyDataObjectModification<? extends DataObject>> result,
             final BindingCodecTreeNode<?> codec, final Collection<DataTreeCandidateNode> childNodes) {
         for (final DataTreeCandidateNode child : childNodes) {
     private static void populateListWithSingleCodec(final List<LazyDataObjectModification<? extends DataObject>> result,
             final BindingCodecTreeNode<?> codec, final Collection<DataTreeCandidateNode> childNodes) {
         for (final DataTreeCandidateNode child : childNodes) {
-            result.add(create(codec, child));
+            if (child.getModificationType() != UNMODIFIED) {
+                result.add(create(codec, child));
+            }
         }
     }
 
         }
     }
 
@@ -234,10 +240,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
         while (toEnter.hasNext() && current != null) {
             current = current.getModifiedChild(toEnter.next());
         }
         while (toEnter.hasNext() && current != null) {
             current = current.getModifiedChild(toEnter.next());
         }
-        if (current != null) {
-            return create(childCodec, current);
-        }
-        return null;
+        return current != null && current.getModificationType() != UNMODIFIED ? create(childCodec, current) : null;
     }
 
     @Override
     }
 
     @Override