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 extends Augmentation>> 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 extends Augmentation>> 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();
+ }
}