From fce70654f7d387a8454c8441459ffff03ad0f1a2 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 25 Jan 2016 10:58:55 +0100 Subject: [PATCH] BUG-4295: fix merge callsite This is a fixup of the previous patch. The problem was expanding a merge into a new node, which used a direct value propagation with a merge. That is not correct, as the merge should be pushed via ModificationApplyOperation, which in case of unkeyed lists will turn it into a write. Change-Id: I93c8be80e4467b5d3a1e20f26f5576bd701b1375 Signed-off-by: Robert Varga (cherry picked from commit dfe3c8193b6fd06090de7221e51e5857b75517b6) --- .../AbstractNodeContainerModificationStrategy.java | 14 ++------------ .../schema/tree/InMemoryDataTreeModification.java | 2 +- .../tree/InMemoryDataTreeModificationCursor.java | 2 +- .../yang/data/impl/schema/tree/ModifiedNode.java | 8 ++++---- .../tree/UnkeyedListModificationStrategy.java | 4 ++-- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractNodeContainerModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractNodeContainerModificationStrategy.java index 831c818647..c6190f1cbc 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractNodeContainerModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractNodeContainerModificationStrategy.java @@ -160,7 +160,7 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl final Collection> children = ((NormalizedNodeContainer) value).getValue(); for (NormalizedNode c : children) { final PathArgument id = c.getIdentifier(); - modification.modifyChild(id, resolveChildOperation(id).getChildPolicy(), version); + modification.modifyChild(id, resolveChildOperation(id), version); } return applyTouch(modification, currentMeta, version); } @@ -169,7 +169,7 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl final Collection> children, final Version version) { for (NormalizedNode c : children) { final ModificationApplyOperation childOp = resolveChildOperation(c.getIdentifier()); - final ModifiedNode childNode = modification.modifyChild(c.getIdentifier(), childOp.getChildPolicy(), version); + final ModifiedNode childNode = modification.modifyChild(c.getIdentifier(), childOp, version); childOp.mergeIntoModifiedNode(childNode, c, version); } } @@ -231,16 +231,6 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl throw new IllegalArgumentException("Unsupported operation " + modification.getOperation()); } - @SuppressWarnings({"rawtypes", "unchecked"}) - private NormalizedNode createEmptyValue(NormalizedNode value, - Collection> children) { - NormalizedNodeContainerBuilder builder = createBuilder(value); - for (NormalizedNode child : children) { - builder.removeChild(child.getIdentifier()); - } - return builder.build(); - } - @Override protected TreeNode applyTouch(final ModifiedNode modification, final TreeNode currentMeta, final Version version) { /* diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java index a32e75bbc6..cf9b2c3377 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java @@ -159,7 +159,7 @@ final class InMemoryDataTreeModification extends AbstractCursorAware implements operation = potential.get(); ++i; - modification = modification.modifyChild(pathArg, operation.getChildPolicy(), version); + modification = modification.modifyChild(pathArg, operation, version); } return OperationWithModification.from(operation, modification); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModificationCursor.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModificationCursor.java index e13073af02..f837ac8d51 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModificationCursor.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModificationCursor.java @@ -34,7 +34,7 @@ final class InMemoryDataTreeModificationCursor extends AbstractCursor potential = op.getApplyOperation().getChild(child); if (potential.isPresent()) { final ModificationApplyOperation operation = potential.get(); - final ModifiedNode modification = op.getModification().modifyChild(child, operation.getChildPolicy(), + final ModifiedNode modification = op.getModification().modifyChild(child, operation, getParent().getVersion()); return OperationWithModification.from(operation, modification); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java index 299a52b577..49a7873ac7 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java @@ -167,12 +167,12 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode currentMetadata = findOriginalMetadata(child, modVersion); - final ModifiedNode newlyCreated = new ModifiedNode(child, currentMetadata, childPolicy); + final ModifiedNode newlyCreated = new ModifiedNode(child, currentMetadata, childOper.getChildPolicy()); if (operation == LogicalOperation.MERGE && value != null) { /* * We are attempting to modify a previously-unmodified part of a MERGE node. If the @@ -195,7 +195,7 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode> childData = ((NormalizedNodeContainer)value).getChild(child); if (childData.isPresent()) { - newlyCreated.updateValue(LogicalOperation.MERGE, childData.get()); + childOper.mergeIntoModifiedNode(newlyCreated, childData.get(), modVersion); } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java index 4b569cef0e..561f5fcc78 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java @@ -38,8 +38,8 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation { @Override protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, final Version version) { - // A merge operation is promoted into a write - return applyWrite(modification, Optional.of(currentMeta), version); + throw new IllegalStateException(String.format("Merge of modification %s on unkeyed list should never be called", + modification)); } @Override -- 2.36.6