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%2FLazyDataTreeModification.java;h=4e486c65d411fe0b89faea2e3c00e3a8872f45c2;hb=b8a896e6dfc47374f99efee157683dc8a7ef8860;hp=7d2a72d58bfa00fa1acd8f2bc24313a3ebf4b743;hpb=5f0d949e98b09557790f567b9e7d2470a560dde8;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java index 7d2a72d58b..4e486c65d4 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java @@ -7,78 +7,100 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; -import com.google.common.base.Preconditions; +import static java.util.Objects.requireNonNull; + +import com.google.common.base.MoreObjects; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Map.Entry; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.api.DataObjectModification; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate; -import org.opendaylight.yangtools.binding.data.codec.api.BindingCodecTreeNode; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate; /** * Lazily translated {@link DataTreeModification} based on {@link DataTreeCandidate}. * - * {@link DataTreeModification} represents Data tree change event, - * but whole tree is not translated or resolved eagerly, but only child nodes - * which are directly accessed by user of data object modification. - * + *

+ * {@link DataTreeModification} represents Data tree change event, but whole tree is not translated or resolved eagerly, + * but only child nodes which are directly accessed by user of data object modification. */ -class LazyDataTreeModification implements DataTreeModification { +final class LazyDataTreeModification implements DataTreeModification { + private final @NonNull DataTreeIdentifier path; + private final @NonNull DataObjectModification rootNode; - private final DataTreeIdentifier path; - private final DataObjectModification rootNode; + private LazyDataTreeModification(final DataTreeIdentifier path, final DataObjectModification modification) { + this.path = requireNonNull(path); + rootNode = requireNonNull(modification); + } - LazyDataTreeModification(DataTreeIdentifier path, final DataObjectModification modification) { - this.path = Preconditions.checkNotNull(path); - this.rootNode = Preconditions.checkNotNull(modification); + @SuppressWarnings({"unchecked", "rawtypes"}) + static @Nullable DataTreeModification from(final CurrentAdapterSerializer serializer, + final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType, + final @Nullable Class> augment) { + final var bindingPath = createBindingPath(serializer, domChange.getRootPath(), augment); + final var codec = serializer.getSubtreeCodec(bindingPath); + final var modification = LazyDataObjectModification.from(codec, domChange.getRootNode()); + return modification == null ? null + : new LazyDataTreeModification(DataTreeIdentifier.of(datastoreType, bindingPath), modification); } - @Override - public DataObjectModification getRootNode() { - return rootNode; + static @Nullable DataTreeModification from(final CurrentAdapterSerializer serializer, + final DOMDataTreeCandidate candidate, final @Nullable Class augment) { + final var domRootPath = candidate.getRootPath(); + @SuppressWarnings("unchecked") + final var bindingPath = (InstanceIdentifier) createBindingPath(serializer, domRootPath.path(), augment); + final var codec = serializer.getSubtreeCodec(bindingPath); + @SuppressWarnings("unchecked") + final var modification = (DataObjectModification) LazyDataObjectModification.from(codec, + candidate.getRootNode()); + return modification == null ? null + : new LazyDataTreeModification<>(DataTreeIdentifier.of(domRootPath.datastore(), bindingPath), modification); } - @Override - public DataTreeIdentifier getRootPath() { - return path; + static @NonNull List> from(final CurrentAdapterSerializer codec, + final List domChanges, final LogicalDatastoreType datastoreType, + final @Nullable Class> augment) { + final var result = new ArrayList>(domChanges.size()); + for (var domChange : domChanges) { + final var bindingChange = LazyDataTreeModification.from(codec, domChange, datastoreType, augment); + if (bindingChange != null) { + result.add(bindingChange); + } + } + return result; } + // We are given a DOM path, which does not reflect augmentations, as those are not representable in NormalizedNode + // world. This method takes care of reconstructing the InstanceIdentifier, appending the missing Augmentation. This + // important to get the correct codec into the mix -- otherwise we would be operating on the parent container's + // codec and mis-report what is actually going on. @SuppressWarnings({"unchecked", "rawtypes"}) - static DataTreeModification create(final BindingToNormalizedNodeCodec codec, final DataTreeCandidate domChange, - final LogicalDatastoreType datastoreType) { - final Entry, BindingCodecTreeNode> codecCtx = - codec.getSubtreeCodec(domChange.getRootPath()); - final DataTreeIdentifier path = DataTreeIdentifier.create(datastoreType, codecCtx.getKey()); - final DataObjectModification modification = - LazyDataObjectModification.create(codecCtx.getValue(), domChange.getRootNode()); - return new LazyDataTreeModification(path, modification); + private static @NonNull InstanceIdentifier createBindingPath(final CurrentAdapterSerializer serializer, + final YangInstanceIdentifier domPath, final @Nullable Class augment) { + final var bindingPath = serializer.coerceInstanceIdentifier(domPath); + return augment == null ? bindingPath : bindingPath.augmentation((Class) augment.asSubclass(Augmentation.class)); } - static Collection> from(final BindingToNormalizedNodeCodec codec, - final Collection domChanges, final LogicalDatastoreType datastoreType) { - final List> result = new ArrayList<>(domChanges.size()); - for (final DataTreeCandidate domChange : domChanges) { - result.add(LazyDataTreeModification.create(codec, domChange, datastoreType)); - } - return result; + @Override + public DataObjectModification getRootNode() { + return rootNode; } - static DataTreeModification create(BindingToNormalizedNodeCodec codec, - DOMDataTreeCandidate candidate) { - final Entry, BindingCodecTreeNode> codecCtx = - codec.getSubtreeCodec(candidate.getRootPath().getRootIdentifier()); - final DataTreeIdentifier path = - DataTreeIdentifier.create(candidate.getRootPath().getDatastoreType(), codecCtx.getKey()); - final DataObjectModification modification = - LazyDataObjectModification.create(codecCtx.getValue(), candidate.getRootNode()); - return new LazyDataTreeModification(path, modification); + @Override + public DataTreeIdentifier getRootPath() { + return path; } + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("path", path).add("rootNode", rootNode).toString(); + } }