From 0c6c0cc55f3ea57ff2f6bd15f9fdf97a5d4a0f08 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 4 Nov 2018 19:31:16 +0100 Subject: [PATCH] Do not issue empty list merges List nodes undergo atomatic lifecycle, i.e. they are created as needed. This means we do issue an empty merge when a list entry is written from binding -- reducing the number of operations issued in typical operation. Also mark BindingToNormalizedNodeCodec.getDefaultNodeFor() as deprecated, because it should never have been public in the first place. JIRA: MDSAL-383 Change-Id: Ie41dbd9d238990f3e136043b87d002bf55557501 Signed-off-by: Robert Varga --- .../dom/adapter/AbstractWriteTransaction.java | 72 ++++--------------- .../adapter/BindingToNormalizedNodeCodec.java | 8 +++ 2 files changed, 20 insertions(+), 60 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java index 059b498440..f1162ab306 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractWriteTransaction.java @@ -7,7 +7,8 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; + import com.google.common.util.concurrent.FluentFuture; import java.util.Map.Entry; import java.util.Optional; @@ -16,7 +17,6 @@ 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.Identifiable; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -32,76 +32,30 @@ public abstract class AbstractWriteTransaction void put(final LogicalDatastoreType store, - final InstanceIdentifier path, final U data, final boolean createParents) { - Preconditions.checkArgument(!path.isWildcarded(), "Cannot put data into wildcarded path %s", path); + public final void put(final LogicalDatastoreType store, final InstanceIdentifier path, + final U data, final boolean createParents) { + checkArgument(!path.isWildcarded(), "Cannot put data into wildcarded path %s", path); final Entry> normalized = getCodec().toNormalizedNode(path, data); if (createParents) { ensureParentsByMerge(store, normalized.getKey(), path); - } else { - ensureListParentIfNeeded(store,path,normalized); } getDelegate().put(store, normalized.getKey(), normalized.getValue()); } - public final void merge(final LogicalDatastoreType store, - final InstanceIdentifier path, final U data,final boolean createParents) { - Preconditions.checkArgument(!path.isWildcarded(), "Cannot merge data into wildcarded path %s", path); + public final void merge(final LogicalDatastoreType store, final InstanceIdentifier path, + final U data,final boolean createParents) { + checkArgument(!path.isWildcarded(), "Cannot merge data into wildcarded path %s", path); final Entry> normalized = getCodec().toNormalizedNode(path, data); if (createParents) { ensureParentsByMerge(store, normalized.getKey(), path); - } else { - ensureListParentIfNeeded(store,path,normalized); } getDelegate().merge(store, normalized.getKey(), normalized.getValue()); } - /** - * Ensures list parent if item is list, otherwise noop. - * - *

- * One of properties of binding specification is that it is imposible - * to represent list as a whole and thus it is impossible to write - * empty variation of MapNode without creating parent node, with - * empty list. - * - *

- * This actually makes writes such as - *

-     * put("Nodes", new NodesBuilder().build());
-     * put("Nodes/Node[key]", new NodeBuilder().setKey("key").build());
-     * 
- * To result in three DOM operations: - *
-     * put("/nodes",domNodes);
-     * merge("/nodes/node",domNodeList);
-     * put("/nodes/node/node[key]",domNode);
-     * 
- * - *

- * In order to allow that to be inserted if necessary, if we know - * item is list item, we will try to merge empty MapNode or OrderedNodeMap - * to ensure list exists. - * - * @param store Data Store type - * @param path Path to data (Binding Aware) - * @param normalized Normalized version of data to be written - */ - private void ensureListParentIfNeeded(final LogicalDatastoreType store, final InstanceIdentifier path, - final Entry> normalized) { - if (Identifiable.class.isAssignableFrom(path.getTargetType())) { - final YangInstanceIdentifier parentMapPath = normalized.getKey().getParent(); - Preconditions.checkArgument(parentMapPath != null, "Map path %s does not have a parent", path); - - final NormalizedNode emptyParent = getCodec().getDefaultNodeFor(parentMapPath); - getDelegate().merge(store, parentMapPath, emptyParent); - } - } - /** * Use {@link YangInstanceIdentifier#getParent()} instead. */ @@ -111,8 +65,8 @@ public abstract class AbstractWriteTransaction path) { - Preconditions.checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); + protected final void doDelete(final LogicalDatastoreType store, final InstanceIdentifier path) { + checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path); getDelegate().delete(store, normalized); @@ -142,5 +95,4 @@ public abstract class AbstractWriteTransaction getDefaultNodeFor(final YangInstanceIdentifier parentMapPath) { final BindingCodecTreeNode mapCodec = requireNonNull( codecRegistry.getCodecContext().getSubtreeCodec(parentMapPath), -- 2.36.6