X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FLazyDataObjectModification.java;h=29cb1cdf2c1c1fcff76568ca639c36c8fd63091a;hb=11408d627adca7eb71ac956c3ad01f75b6b91596;hp=27785f55a9af125cf03ed60174b1a67e1a80ac41;hpb=0f351bbc28ddf2cddfe30c8d018646d81953fa17;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataObjectModification.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataObjectModification.java index 27785f55a9..29cb1cdf2c 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataObjectModification.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataObjectModification.java @@ -7,8 +7,11 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; +import static com.google.common.base.Verify.verify; +import static java.util.Objects.requireNonNull; +import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.UNMODIFIED; + import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -18,6 +21,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.ChoiceIn; @@ -29,7 +33,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,50 +51,57 @@ final class LazyDataObjectModification implements DataObje private static final Logger LOG = LoggerFactory.getLogger(LazyDataObjectModification.class); - private final BindingCodecTreeNode codec; + private final BindingDataObjectCodecTreeNode codec; private final DataTreeCandidateNode domData; private final PathArgument identifier; private volatile Collection> childNodesCache; private volatile ModificationType modificationType; - private LazyDataObjectModification(final BindingCodecTreeNode codec, final DataTreeCandidateNode domData) { - this.codec = Preconditions.checkNotNull(codec); - this.domData = Preconditions.checkNotNull(domData); + private LazyDataObjectModification(final BindingDataObjectCodecTreeNode codec, + final DataTreeCandidateNode domData) { + this.codec = requireNonNull(codec); + this.domData = requireNonNull(domData); this.identifier = codec.deserializePathArgument(domData.getIdentifier()); } - static LazyDataObjectModification create(final BindingCodecTreeNode codec, + static LazyDataObjectModification create(final BindingDataObjectCodecTreeNode codec, final DataTreeCandidateNode domData) { - return new LazyDataObjectModification<>(codec,domData); + return new LazyDataObjectModification<>(codec, domData); } - private static Collection> from(final BindingCodecTreeNode - parentCodec, final Collection domChildNodes) { + private static Collection> from( + final BindingDataObjectCodecTreeNode parentCodec, + final Collection domChildNodes) { final List> result = new ArrayList<>(domChildNodes.size()); populateList(result, parentCodec, domChildNodes); return result; } private static void populateList(final List> result, - final BindingCodecTreeNode parentCodec, final Collection domChildNodes) { + final BindingDataObjectCodecTreeNode parentCodec, + final Collection 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()); + verify(childCodec instanceof BindingDataObjectCodecTreeNode, "Unhandled codec %s for type %s", + childCodec, type); + populateList(result, type, (BindingDataObjectCodecTreeNode) 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); + } } } } @@ -98,7 +109,7 @@ final class LazyDataObjectModification implements DataObje } private static void populateList(final List> result, - final BindingStructuralType type, final BindingCodecTreeNode childCodec, + final BindingStructuralType type, final BindingDataObjectCodecTreeNode childCodec, final DataTreeCandidateNode domChildNode) { switch (type) { case INVISIBLE_LIST: @@ -117,9 +128,11 @@ final class LazyDataObjectModification implements DataObje } private static void populateListWithSingleCodec(final List> result, - final BindingCodecTreeNode codec, final Collection childNodes) { + final BindingDataObjectCodecTreeNode codec, final Collection childNodes) { for (final DataTreeCandidateNode child : childNodes) { - result.add(create(codec, child)); + if (child.getModificationType() != UNMODIFIED) { + result.add(create(codec, child)); + } } } @@ -234,16 +247,13 @@ final class LazyDataObjectModification implements DataObje @Override public DataObjectModification getModifiedChild(final PathArgument arg) { final List domArgumentList = new ArrayList<>(); - final BindingCodecTreeNode childCodec = codec.bindingPathArgumentChild(arg, domArgumentList); + final BindingDataObjectCodecTreeNode childCodec = codec.bindingPathArgumentChild(arg, domArgumentList); final Iterator toEnter = domArgumentList.iterator(); DataTreeCandidateNode current = domData; while (toEnter.hasNext() && current != null) { - current = current.getModifiedChild(toEnter.next()); - } - if (current != null) { - return create(childCodec, current); + current = current.getModifiedChild(toEnter.next()).orElse(null); } - return null; + return current != null && current.getModificationType() != UNMODIFIED ? create(childCodec, current) : null; } @Override @@ -286,7 +296,7 @@ final class LazyDataObjectModification implements DataObje return MoreObjects.toStringHelper(this).add("identifier", identifier).add("domData", domData).toString(); } - private T deserialize(final Optional> dataAfter) { + private T deserialize(final Optional dataAfter) { return dataAfter.map(codec::deserialize).orElse(null); } }