From: Robert Varga Date: Mon, 8 Apr 2019 01:15:57 +0000 (+0200) Subject: Fix NONE operation node with automatic lifecycle X-Git-Tag: v2.0.18~4 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F27%2F81427%2F1;p=yangtools.git Fix NONE operation node with automatic lifecycle In case when previous operations fizzle into a NONE operation on top of a non-present node, automatic lifecycle would fail because there is no node to disappear. Fix this case by not requiring the delegate operation to return a present node. JIRA: YANGTOOLS-938 Change-Id: I6b4a01af61e148efa0bae3953dd5aa80b2e63398 Signed-off-by: Robert Varga (cherry picked from commit 1f36b5e960a68f80d8dcf0d3f259f22f74bf2495) --- diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java index 4d3f22d58d..ce735c009c 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java @@ -63,21 +63,21 @@ final class StructuralContainerModificationStrategy extends DelegatingModificati // The only way a tree node can disappear is through delete (which we handle here explicitly) or through // actions of disappearResult(). It is therefore safe to perform Optional.get() on the results of // delegate.apply() - final TreeNode ret; + final Optional ret; if (modification.getOperation() == LogicalOperation.DELETE) { if (modification.getChildren().isEmpty()) { return delegate.apply(modification, storeMeta, version); } // Delete with children, implies it really is an empty write - ret = delegate.applyWrite(modification, emptyNode, storeMeta, version); + ret = Optional.of(delegate.applyWrite(modification, emptyNode, storeMeta, version)); } else if (modification.getOperation() == LogicalOperation.TOUCH && !storeMeta.isPresent()) { ret = applyTouch(modification, storeMeta, version); } else { // No special handling required here, run normal apply operation - ret = delegate.apply(modification, storeMeta, version).get(); + ret = delegate.apply(modification, storeMeta, version); } - return disappearResult(modification, ret, storeMeta); + return ret.isPresent() ? disappearResult(modification, ret.get(), storeMeta) : ret; } @Override @@ -95,7 +95,7 @@ final class StructuralContainerModificationStrategy extends DelegatingModificati return Optional.of(TreeNodeFactory.createTreeNode(emptyNode, version)); } - private TreeNode applyTouch(final ModifiedNode modification, final Optional storeMeta, + private Optional applyTouch(final ModifiedNode modification, final Optional storeMeta, final Version version) { // Container is not present, let's take care of the 'magically appear' part of our job final Optional ret = delegate.apply(modification, fakeMeta(version), version); @@ -104,7 +104,7 @@ final class StructuralContainerModificationStrategy extends DelegatingModificati if (modification.getModificationType() == ModificationType.SUBTREE_MODIFIED) { modification.resolveModificationType(ModificationType.APPEARED); } - return ret.get(); + return ret; } private static Optional disappearResult(final ModifiedNode modification, final TreeNode result,