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%2FBindingDOMWriteTransactionAdapter.java;h=565f070f46723b77fb8807f669eb93093199e5ba;hb=94fb90ab450470ee1b3225d737cd394f034ea932;hp=8f1e639436c9e3afaa3cddb5a60f5bcea14539d2;hpb=da806477aeff64b035d8258f4c9156142a715d3d;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java index 8f1e639436..565f070f46 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java @@ -9,61 +9,118 @@ package org.opendaylight.mdsal.binding.dom.adapter; import static com.google.common.base.Preconditions.checkArgument; +import com.google.common.base.VerifyException; import com.google.common.util.concurrent.FluentFuture; -import java.util.Map.Entry; +import java.util.HashSet; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.WriteTransaction; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingAugmentationCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer.AugmentationResult; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer.NodeResult; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer.NormalizedResult; import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; class BindingDOMWriteTransactionAdapter extends AbstractForwardedTransaction implements WriteTransaction { - BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) { - super(delegateTx, codec); + BindingDOMWriteTransactionAdapter(final AdapterContext adapterContext, final T delegateTx) { + super(adapterContext, delegateTx); } @Override public final void put(final LogicalDatastoreType store, final InstanceIdentifier path, final U data) { - final Entry> normalized = toNormalized("put", path, data); - getDelegate().put(store, normalized.getKey(), normalized.getValue()); + put(store, toNormalized("put", path, data)); } + private void put(final LogicalDatastoreType store, final NormalizedResult normalized) { + final var delegate = getDelegate(); + final var domPath = normalized.path(); + + if (normalized instanceof AugmentationResult augment) { + // Augmentation: put() child nodes provided with augmentation, delete() those having no data + final var putIds = new HashSet(); + for (var child : augment.children()) { + final var childId = child.name(); + delegate.put(store, domPath.node(childId), child); + putIds.add(childId); + } + for (var childId : augment.possibleChildren()) { + if (!putIds.contains(childId)) { + delegate.delete(store, domPath.node(childId)); + } + } + } else if (normalized instanceof NodeResult node) { + delegate.put(store, domPath, node.node()); + } else { + throw new VerifyException("Unhandled result " + normalized); + } + } + + @Deprecated @Override public final void mergeParentStructurePut(final LogicalDatastoreType store, final InstanceIdentifier path, final U data) { - final Entry> normalized = toNormalized("put", - path, data); - ensureParentsByMerge(store, normalized.getKey(), path); - getDelegate().put(store, normalized.getKey(), normalized.getValue()); + final var serializer = adapterContext().currentSerializer(); + final var normalized = toNormalized(serializer, "put", path, data); + ensureParentsByMerge(serializer, store, normalized); + put(store, normalized); } @Override public final void merge(final LogicalDatastoreType store, final InstanceIdentifier path, final D data) { - final Entry> normalized = toNormalized("merge", path, data); - getDelegate().merge(store, normalized.getKey(), normalized.getValue()); + merge(store, toNormalized("merge", path, data)); + } + + private void merge(final LogicalDatastoreType store, final NormalizedResult normalized) { + final var delegate = getDelegate(); + final var domPath = normalized.path(); + + if (normalized instanceof AugmentationResult augment) { + // Augmentation: merge individual children + for (var child : augment.children()) { + delegate.merge(store, domPath.node(child.name()), child); + } + } else if (normalized instanceof NodeResult node) { + delegate.merge(store, domPath, node.node()); + } else { + throw new VerifyException("Unhandled result " + normalized); + } } + @Deprecated @Override public final void mergeParentStructureMerge(final LogicalDatastoreType store, final InstanceIdentifier path, final U data) { - final Entry> normalized = toNormalized("merge", path, data); - ensureParentsByMerge(store, normalized.getKey(), path); - getDelegate().merge(store, normalized.getKey(), normalized.getValue()); + final var serializer = adapterContext().currentSerializer(); + final var normalized = toNormalized(serializer, "merge", path, data); + ensureParentsByMerge(serializer, store, normalized); + merge(store, normalized); } @Override public final void delete(final LogicalDatastoreType store, final InstanceIdentifier path) { checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); + final var serializer = adapterContext().currentSerializer(); - final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path); - getDelegate().delete(store, normalized); + // Lookup the codec and the corresponding path + final var codecWithPath = serializer.getSubtreeCodecWithPath(path); + final var domPath = codecWithPath.path(); + final var delegate = getDelegate(); + if (codecWithPath.codec() instanceof BindingAugmentationCodecTreeNode augmentCodec) { + // Deletion of an augmentation: issue a delete on all potential children of the augmentation + for (var childPath : augmentCodec.childPathArguments()) { + delegate.delete(store, domPath.node(childPath)); + } + } else { + delegate.delete(store, domPath); + } } @Override @@ -76,27 +133,40 @@ class BindingDOMWriteTransactionAdapter e return getDelegate().cancel(); } + @Override + public FluentFuture completionFuture() { + return getDelegate().completionFuture(); + } + /** * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their * underlying transaction. * + * @param serializer Current serializer * @param store an instance of LogicalDatastoreType - * @param domPath an instance of YangInstanceIdentifier - * @param path an instance of InstanceIdentifier + * @param normalized NormalizedResult of the operation */ - private void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath, - final InstanceIdentifier path) { - final YangInstanceIdentifier parentPath = domPath.getParent(); + private void ensureParentsByMerge(final CurrentAdapterSerializer serializer, final LogicalDatastoreType store, + final NormalizedResult normalized) { + final var path = normalized.path(); + // AugmentationResult already points to parent path + final var parentPath = normalized instanceof AugmentationResult ? path : path.getParent(); if (parentPath != null && !parentPath.isEmpty()) { - final NormalizedNode parentNode = ImmutableNodes.fromInstanceId( - getCodec().runtimeContext().getSchemaContext(), parentPath); - getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode); + final var parentNode = ImmutableNodes.fromInstanceId(serializer.getRuntimeContext().modelContext(), + parentPath); + getDelegate().merge(store, YangInstanceIdentifier.of(parentNode.name()), parentNode); } } - private Entry> toNormalized( - final String operation, final InstanceIdentifier path, final U data) { + private @NonNull NormalizedResult toNormalized(final String operation, + final InstanceIdentifier path, final U data) { + return toNormalized(adapterContext().currentSerializer(), operation, path, data); + } + + private static @NonNull NormalizedResult toNormalized( + final CurrentAdapterSerializer serializer, final String operation, final InstanceIdentifier path, + final U data) { checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path); - return getCodec().toNormalizedNode(path, data); + return serializer.toNormalizedNode(path, data); } }