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 c3aff15..1a21b98 100644 (file)
@@ -7,7 +7,9 @@
  */
 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;
@@ -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) {
-        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) {
-        return new LazyDataObjectModification<>(codec,domData);
+        return new LazyDataObjectModification<>(codec, domData);
     }
 
     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) {
-            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) {
-            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());
         }
-        if (current != null) {
-            return create(childCodec, current);
-        }
-        return null;
+        return current != null && current.getModificationType() != UNMODIFIED ? create(childCodec, current) : null;
     }
 
     @Override

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.