From 72ac6b9f40f3f68d722fa2358cfffc647f96f747 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 22 Nov 2020 11:13:16 +0100 Subject: [PATCH] Update StoreTreeNode methods StoreTreeNode.getChild() is forcing users to work on optional, which is introducing no small amount of complexity. Furthermore it is not inline with our naming -- that method should be findChild() at the very least. JIRA: YANGTOOLS-1181 Change-Id: Ie1c69664c46a9f83154730835d42dcb93778b4a6 Signed-off-by: Robert Varga --- .../data/api/schema/tree/StoreTreeNode.java | 33 +++++++++++++++++-- .../data/api/schema/tree/StoreTreeNodes.java | 29 ++++++++-------- .../tree/spi/AbstractContainerNode.java | 5 +-- .../schema/tree/spi/LazyContainerNode.java | 5 ++- .../tree/spi/LazyMutableContainerNode.java | 11 ++----- .../tree/spi/MaterializedContainerNode.java | 5 ++- .../spi/MaterializedMutableContainerNode.java | 5 ++- .../schema/tree/spi/SimpleContainerNode.java | 5 ++- .../data/api/schema/tree/spi/ValueNode.java | 7 ++-- ...bstractModifiedNodeBasedCandidateNode.java | 5 +-- ...ractNodeContainerModificationStrategy.java | 25 +++++++------- .../schema/tree/AbstractReadyIterator.java | 6 ++-- .../impl/schema/tree/AbstractValidation.java | 4 +-- .../tree/ChoiceModificationStrategy.java | 4 +-- ...DataNodeContainerModificationStrategy.java | 17 +++++----- .../tree/InMemoryDataTreeModification.java | 5 ++- .../InMemoryDataTreeModificationCursor.java | 5 ++- .../tree/LeafSetModificationStrategy.java | 5 ++- .../schema/tree/ListModificationStrategy.java | 6 ++-- .../schema/tree/MapModificationStrategy.java | 6 ++-- .../tree/ModificationApplyOperation.java | 10 +++--- .../data/impl/schema/tree/ModifiedNode.java | 8 ++--- .../tree/OperationWithModification.java | 10 +++--- .../tree/SchemaAwareApplyOperation.java | 8 ++--- .../tree/ValueNodeModificationStrategy.java | 2 +- 25 files changed, 121 insertions(+), 110 deletions(-) diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNode.java index b163c834dc..0671cf5bd9 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNode.java @@ -7,8 +7,12 @@ */ package org.opendaylight.yangtools.yang.data.api.schema.tree; +import static com.google.common.base.Verify.verifyNotNull; + +import com.google.common.base.VerifyException; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; /** @@ -21,9 +25,32 @@ public interface StoreTreeNode> { /** * Returns a direct child of the node. * - * @param child Identifier of child - * @return Optional with node if the child is existing, {@link Optional#empty()} otherwise. + * @param arg Identifier of child + * @return A node if the child is existing, {@code null} otherwise. + * @throws NullPointerException when {@code child} is null + */ + @Nullable C childByArg(PathArgument arg); + + /** + * Returns a direct child of the node. + * + * @param arg Identifier of child + * @return A child node + * @throws NullPointerException when {@code child} is null + * @throws VerifyException if the child does not exist + */ + default @NonNull C getChildByArg(final PathArgument arg) { + return verifyNotNull(childByArg(arg), "Child %s does not exist"); + } + + /** + * Returns a direct child of the node. + * + * @param arg Identifier of child + * @return Optional with node if the child exists, {@link Optional#empty()} otherwise. * @throws NullPointerException when {@code child} is null */ - @NonNull Optional getChild(PathArgument child); + @NonNull default Optional findChildByArg(final PathArgument arg) { + return Optional.ofNullable(childByArg(arg)); + } } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNodes.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNodes.java index d68faa14f3..8417179bca 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNodes.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/StoreTreeNodes.java @@ -38,12 +38,12 @@ public final class StoreTreeNodes { */ public static > Optional findNode(final T tree, final YangInstanceIdentifier path) { - Optional current = Optional.of(tree); + T current = tree; Iterator pathIter = path.getPathArguments().iterator(); - while (current.isPresent() && pathIter.hasNext()) { - current = current.get().getChild(pathIter.next()); + while (current != null && pathIter.hasNext()) { + current = current.childByArg(pathIter.next()); } - return current; + return Optional.ofNullable(current); } public static > T findNodeChecked(final T tree, final YangInstanceIdentifier path) { @@ -51,12 +51,11 @@ public final class StoreTreeNodes { int depth = 1; for (PathArgument pathArg : path.getPathArguments()) { - Optional potential = current.getChild(pathArg); - if (potential.isEmpty()) { + current = current.childByArg(pathArg); + if (current == null) { throw new IllegalArgumentException(String.format("Child %s is not present in tree.", path.getAncestor(depth))); } - current = potential.get(); ++depth; } return current; @@ -78,19 +77,19 @@ public final class StoreTreeNodes { public static > Entry findClosestsOrFirstMatch(final T tree, final YangInstanceIdentifier path, final Predicate predicate) { - Optional parent = Optional.of(tree); - Optional current = Optional.of(tree); + T parent = tree; + T current = tree; int nesting = 0; Iterator pathIter = path.getPathArguments().iterator(); - while (current.isPresent() && pathIter.hasNext() && !predicate.test(current.get())) { + while (current != null && pathIter.hasNext() && !predicate.test(current)) { parent = current; - current = current.get().getChild(pathIter.next()); + current = current.childByArg(pathIter.next()); nesting++; } - if (current.isPresent()) { + if (current != null) { final YangInstanceIdentifier currentPath = path.getAncestor(nesting); - return new SimpleImmutableEntry<>(currentPath, current.get()); + return new SimpleImmutableEntry<>(currentPath, current); } /* @@ -100,13 +99,13 @@ public final class StoreTreeNodes { * present. At any rate we verify state just to be on the safe side. */ verify(nesting > 0); - return new SimpleImmutableEntry<>(path.getAncestor(nesting - 1), parent.get()); + return new SimpleImmutableEntry<>(path.getAncestor(nesting - 1), parent); } public static > Optional getChild(final Optional parent, final PathArgument child) { if (parent.isPresent()) { - return parent.get().getChild(child); + return parent.get().findChildByArg(child); } return Optional.empty(); } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/AbstractContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/AbstractContainerNode.java index 74e5746bcc..bd2a01698f 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/AbstractContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/AbstractContainerNode.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import java.util.Optional; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; @@ -26,9 +27,9 @@ abstract class AbstractContainerNode extends AbstractTreeNode { return (NormalizedNodeContainer>) getData(); } - protected final Optional getChildFromData(final PathArgument childId) { + protected final @Nullable TreeNode getChildFromData(final PathArgument childId) { // We do not cache the instantiated node as it is dirt cheap - return Optional.ofNullable(getChildFromData(castData(), childId, getVersion())); + return getChildFromData(castData(), childId, getVersion()); } static TreeNode getChildFromData(final NormalizedNodeContainer> data, diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyContainerNode.java index 6c877dce21..511b2975ba 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyContainerNode.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.collect.Collections2; import java.util.Map; -import java.util.Optional; import org.opendaylight.yangtools.util.MapAdaptor; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -39,9 +38,9 @@ final class LazyContainerNode extends AbstractModifiedContainerNode { } @Override - public Optional getChild(final PathArgument childId) { + public TreeNode childByArg(final PathArgument arg) { final TreeNode modified; - return (modified = getModifiedChild(childId)) == null ? getChildFromData(childId) : Optional.of(modified); + return (modified = getModifiedChild(arg)) == null ? getChildFromData(arg) : modified; } @Override diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyMutableContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyMutableContainerNode.java index 437edeed8a..e0b3e0198e 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyMutableContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/LazyMutableContainerNode.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import java.util.Map; -import java.util.Optional; import org.opendaylight.yangtools.util.MapAdaptor; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -26,12 +25,8 @@ final class LazyMutableContainerNode extends AbstractMutableContainerNode { } @Override - public Optional getChild(final PathArgument childId) { - final TreeNode modified = getModifiedChild(childId); - if (modified != null) { - return Optional.of(modified); - } - - return Optional.ofNullable(AbstractContainerNode.getChildFromData(getData(), childId, getVersion())); + public TreeNode childByArg(final PathArgument arg) { + final TreeNode modified = getModifiedChild(arg); + return modified != null ? modified : AbstractContainerNode.getChildFromData(getData(), arg, getVersion()); } } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedContainerNode.java index 7ce74dbd8b..d7c5fa7d6d 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedContainerNode.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import java.util.Map; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -22,8 +21,8 @@ final class MaterializedContainerNode extends AbstractModifiedContainerNode { } @Override - public Optional getChild(final PathArgument childId) { - return Optional.ofNullable(getModifiedChild(childId)); + public TreeNode childByArg(final PathArgument arg) { + return getModifiedChild(arg); } @Override diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedMutableContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedMutableContainerNode.java index c787e47047..8d325526ce 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedMutableContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/MaterializedMutableContainerNode.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import java.util.Map; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; final class MaterializedMutableContainerNode extends AbstractMutableContainerNode { @@ -17,7 +16,7 @@ final class MaterializedMutableContainerNode extends AbstractMutableContainerNod } @Override - public Optional getChild(final PathArgument child) { - return Optional.ofNullable(getModifiedChild(child)); + public TreeNode childByArg(final PathArgument arg) { + return getModifiedChild(arg); } } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/SimpleContainerNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/SimpleContainerNode.java index ba152bf6c6..d5a7c581f9 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/SimpleContainerNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/SimpleContainerNode.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import com.google.common.base.MoreObjects.ToStringHelper; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -26,8 +25,8 @@ final class SimpleContainerNode extends AbstractContainerNode { } @Override - public Optional getChild(final PathArgument child) { - return getChildFromData(child); + public TreeNode childByArg(final PathArgument arg) { + return getChildFromData(arg); } @Override diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/ValueNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/ValueNode.java index a2b750d2b2..c2180b8ec9 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/ValueNode.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/ValueNode.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.data.api.schema.tree.spi; import com.google.common.base.MoreObjects.ToStringHelper; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; @@ -27,9 +26,9 @@ final class ValueNode extends AbstractTreeNode { } @Override - public Optional getChild(final PathArgument childId) { - LOG.warn("Attempted to access child {} of value-node {}", childId, this); - return Optional.empty(); + public TreeNode childByArg(final PathArgument arg) { + LOG.warn("Attempted to access child {} of value-node {}", arg, this); + return null; } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractModifiedNodeBasedCandidateNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractModifiedNodeBasedCandidateNode.java index 25e44a74fe..64dab70884 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractModifiedNodeBasedCandidateNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractModifiedNodeBasedCandidateNode.java @@ -49,7 +49,7 @@ abstract class AbstractModifiedNodeBasedCandidateNode implements DataTreeCandida } private static TreeNode childMeta(final TreeNode parent, final PathArgument id) { - return parent == null ? null : parent.getChild(id).orElse(null); + return parent == null ? null : parent.childByArg(id); } private static boolean canHaveChildren(final @Nullable TreeNode oldMeta, final @Nullable TreeNode newMeta) { @@ -127,7 +127,8 @@ abstract class AbstractModifiedNodeBasedCandidateNode implements DataTreeCandida case APPEARED: case DISAPPEARED: case SUBTREE_MODIFIED: - return mod.getChild(identifier).map(this::childNode); + final ModifiedNode child = mod.childByArg(identifier); + return child == null ? Optional.empty() : Optional.of(childNode(child)); case UNMODIFIED: if (!canHaveChildren(oldMeta, newMeta)) { return Optional.empty(); 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 50ef3b0b7e..36a22a0064 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 @@ -49,8 +49,8 @@ abstract class AbstractNodeContainerModificationStrategy return entryStrategy.getSchema(); } - final Optional entryStrategy() { - return Optional.of(entryStrategy); + final @NonNull ModificationApplyOperation entryStrategy() { + return entryStrategy; } @Override @@ -112,14 +112,13 @@ abstract class AbstractNodeContainerModificationStrategy if (verifyChildrenStructure) { final NormalizedNodeContainer container = (NormalizedNodeContainer) writtenValue; for (final NormalizedNode child : container.getValue()) { - final Optional childOp = getChild(child.getIdentifier()); - if (childOp.isPresent()) { - childOp.get().fullVerifyStructure(child); - } else { + final ModificationApplyOperation childOp = childByArg(child.getIdentifier()); + if (childOp == null) { throw new SchemaValidationFailedException(String.format( - "Node %s is not a valid child of %s according to the schema.", - child.getIdentifier(), container.getIdentifier())); + "Node %s is not a valid child of %s according to the schema.", + child.getIdentifier(), container.getIdentifier())); } + childOp.fullVerifyStructure(child); } optionalVerifyValueChildren(writtenValue); @@ -151,14 +150,14 @@ abstract class AbstractNodeContainerModificationStrategy protected final void recursivelyVerifyStructure(final NormalizedNode value) { final NormalizedNodeContainer container = (NormalizedNodeContainer) value; for (final NormalizedNode child : container.getValue()) { - final Optional childOp = getChild(child.getIdentifier()); - if (!childOp.isPresent()) { + final ModificationApplyOperation childOp = childByArg(child.getIdentifier()); + if (childOp == null) { throw new SchemaValidationFailedException( String.format("Node %s is not a valid child of %s according to the schema.", child.getIdentifier(), container.getIdentifier())); } - childOp.get().recursivelyVerifyStructure(child); + childOp.recursivelyVerifyStructure(child); } } @@ -214,7 +213,7 @@ abstract class AbstractNodeContainerModificationStrategy for (final ModifiedNode mod : modifications) { final PathArgument id = mod.getIdentifier(); - final Optional cm = meta.getChild(id); + final Optional cm = meta.findChildByArg(id); final Optional result = resolveChildOperation(id).apply(mod, cm, nodeVersion); if (result.isPresent()) { @@ -410,7 +409,7 @@ abstract class AbstractNodeContainerModificationStrategy final TreeNode current, final Version version) throws DataValidationFailedException { for (final NodeModification childMod : modification.getChildren()) { final PathArgument childId = childMod.getIdentifier(); - final Optional childMeta = current.getChild(childId); + final Optional childMeta = current.findChildByArg(childId); path.push(childId); try { diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractReadyIterator.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractReadyIterator.java index 160ce6609d..ad3913251e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractReadyIterator.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractReadyIterator.java @@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull; import java.util.Collection; import java.util.Iterator; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version; abstract class AbstractReadyIterator { @@ -37,10 +36,9 @@ abstract class AbstractReadyIterator { // through it via re-entering this method on the child iterator. while (children.hasNext()) { final ModifiedNode child = children.next(); - final Optional childOperation = op.getChild(child.getIdentifier()); - checkState(childOperation.isPresent(), "Schema for child %s is not present.", child.getIdentifier()); + final ModificationApplyOperation childOp = op.childByArg(child.getIdentifier()); + checkState(childOp != null, "Schema for child %s is not present.", child.getIdentifier()); final Collection grandChildren = child.getChildren(); - final ModificationApplyOperation childOp = childOperation.get(); if (grandChildren.isEmpty()) { // The child is empty, seal it diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractValidation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractValidation.java index 98ff474db5..d72b17a878 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractValidation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractValidation.java @@ -35,8 +35,8 @@ abstract class AbstractValidation extends ModificationApplyOperation { } @Override - public final Optional getChild(final PathArgument child) { - return delegate.getChild(child); + public final ModificationApplyOperation childByArg(final PathArgument arg) { + return delegate.childByArg(arg); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java index b79371f48d..a5ba03432e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java @@ -101,8 +101,8 @@ final class ChoiceModificationStrategy extends Visible { } @Override - public Optional getChild(final PathArgument child) { - return Optional.ofNullable(childNodes.get(child)); + public ModificationApplyOperation childByArg(final PathArgument arg) { + return childNodes.get(arg); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataNodeContainerModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataNodeContainerModificationStrategy.java index 4fde21bdd0..f3c08e9e44 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataNodeContainerModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataNodeContainerModificationStrategy.java @@ -14,6 +14,7 @@ import com.google.common.collect.ImmutableMap.Builder; import java.util.Optional; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -50,15 +51,15 @@ class DataNodeContainerModificationStrategy getChild(final PathArgument identifier) { + public final ModificationApplyOperation childByArg(final PathArgument arg) { final ImmutableMap local = children; - final ModificationApplyOperation existing = local.get(identifier); + final ModificationApplyOperation existing = local.get(arg); if (existing != null) { - return Optional.of(existing); + return existing; } - final ModificationApplyOperation childOperation = resolveChild(identifier); - return childOperation != null ? appendChild(local, identifier, childOperation) : Optional.empty(); + final ModificationApplyOperation childOperation = resolveChild(arg); + return childOperation != null ? appendChild(local, arg, childOperation) : null; } private ModificationApplyOperation resolveChild(final PathArgument identifier) { @@ -85,7 +86,7 @@ class DataNodeContainerModificationStrategy appendChild( + private @Nullable ModificationApplyOperation appendChild( final ImmutableMap initial, final PathArgument identifier, final ModificationApplyOperation computed) { @@ -100,14 +101,14 @@ class DataNodeContainerModificationStrategy potential = operation.getChild(pathArg); - if (!potential.isPresent()) { + operation = operation.childByArg(pathArg); + if (operation == null) { throw new SchemaValidationFailedException(String.format("Child %s is not present in schema tree.", path.getAncestor(depth))); } - operation = potential.get(); ++depth; modification = modification.modifyChild(pathArg, operation, version); 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 ff926179bc..34eb3425be 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 @@ -35,9 +35,8 @@ final class InMemoryDataTreeModificationCursor extends AbstractCursor potential = op.getApplyOperation().getChild(child); - if (potential.isPresent()) { - final ModificationApplyOperation operation = potential.get(); + final ModificationApplyOperation operation = op.getApplyOperation().childByArg(child); + if (operation != null) { final ModifiedNode modification = op.getModification().modifyChild(child, operation, getParent().getVersion()); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/LeafSetModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/LeafSetModificationStrategy.java index 0ff785aa07..6e3f15d3f8 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/LeafSetModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/LeafSetModificationStrategy.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.tree; -import java.util.Optional; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -38,7 +37,7 @@ final class LeafSetModificationStrategy extends Invisible { } @Override - public Optional getChild(final PathArgument identifier) { - return identifier instanceof NodeWithValue ? entryStrategy() : Optional.empty(); + public ModificationApplyOperation childByArg(final PathArgument arg) { + return arg instanceof NodeWithValue ? entryStrategy() : null; } } \ No newline at end of file diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListModificationStrategy.java index b311687dea..a13d004756 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListModificationStrategy.java @@ -107,7 +107,7 @@ final class ListModificationStrategy extends SchemaAwareApplyOperation cm = meta.getChild(id); + final Optional cm = meta.findChildByArg(id); final Optional result = resolveChildOperation(id).apply(mod, cm, nodeVersion); if (result.isPresent()) { @@ -125,8 +125,8 @@ final class ListModificationStrategy extends SchemaAwareApplyOperation getChild(final PathArgument child) { - return child instanceof NodeIdentifier ? Optional.of(entryStrategy) : Optional.empty(); + public ModificationApplyOperation childByArg(final PathArgument arg) { + return arg instanceof NodeIdentifier ? entryStrategy : null; } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MapModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MapModificationStrategy.java index 25f508c4be..62826dac26 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MapModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MapModificationStrategy.java @@ -11,9 +11,9 @@ import static java.util.Objects.requireNonNull; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration; @@ -55,8 +55,8 @@ final class MapModificationStrategy extends Invisible { } @Override - public Optional getChild(final YangInstanceIdentifier.PathArgument identifier) { - return identifier instanceof NodeIdentifierWithPredicates ? entryStrategy() : Optional.empty(); + public ModificationApplyOperation childByArg(final PathArgument arg) { + return arg instanceof NodeIdentifierWithPredicates ? entryStrategy() : null; } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationApplyOperation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationApplyOperation.java index 75d4ae93f0..5147357848 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationApplyOperation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationApplyOperation.java @@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version; * Implementation notes *
    *
  • Implementations MUST expose all nested suboperations which operates on child nodes expose via - * {@link #getChild(PathArgument)} method.
  • + * {@link #findChildByArg(PathArgument)} method. *
  • Same suboperations SHOULD be used when invoked via {@link #apply(ModifiedNode, Optional, Version)}, * if applicable.
  • *
  • There are exactly two base implementations: @@ -114,13 +114,13 @@ abstract class ModificationApplyOperation implements StoreTreeNode value, Version version); /** - * Returns a suboperation for specified tree node. + * {@inheritDoc} * - * @return Reference to suboperation for specified tree node, {@link Optional#empty()} - * if suboperation is not supported for specified tree node. + * @return Reference to suboperation for specified tree node, {@code null} if suboperation is not supported for + * specified tree node. */ @Override - public abstract Optional getChild(PathArgument child); + public abstract ModificationApplyOperation childByArg(PathArgument arg); abstract void recursivelyVerifyStructure(NormalizedNode value); 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 b666eed4f8..969d2e8253 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 @@ -114,12 +114,12 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode getChild(final PathArgument child) { - return Optional.ofNullable(children.get(child)); + public ModifiedNode childByArg(final PathArgument arg) { + return children.get(arg); } private Optional metadataFromSnapshot(final @NonNull PathArgument child) { - return original.isPresent() ? original.get().getChild(child) : Optional.empty(); + return original.isPresent() ? original.get().findChildByArg(child) : Optional.empty(); } private Optional metadataFromData(final @NonNull PathArgument child, final Version modVersion) { @@ -130,7 +130,7 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode> read(final PathArgument child, final Version version) { - final Optional maybeChild = modification.getChild(child); - if (maybeChild.isPresent()) { - final ModifiedNode childNode = maybeChild.get(); - + final ModifiedNode childNode = modification.childByArg(child); + if (childNode != null) { Optional snapshot = childNode.getSnapshot(); if (snapshot == null) { // Snapshot is not present, force instantiation - snapshot = applyOperation.getChild(child).get().apply(childNode, childNode.getOriginal(), version); + snapshot = applyOperation.getChildByArg(child).apply(childNode, childNode.getOriginal(), version); } return snapshot.map(TreeNode::getData); @@ -75,7 +73,7 @@ final class OperationWithModification { } if (snapshot.isPresent()) { - return snapshot.get().getChild(child).map(TreeNode::getData); + return snapshot.get().findChildByArg(child).map(TreeNode::getData); } return Optional.empty(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java index 9531d837ac..bc7dd85056 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java @@ -115,10 +115,10 @@ abstract class SchemaAwareApplyOperation extends Modificat "Node children was modified by other transaction"); } - protected final ModificationApplyOperation resolveChildOperation(final PathArgument child) { - final Optional potential = getChild(child); - checkArgument(potential.isPresent(), "Operation for child %s is not defined.", child); - return potential.get(); + protected final @NonNull ModificationApplyOperation resolveChildOperation(final PathArgument child) { + final ModificationApplyOperation potential = childByArg(child); + checkArgument(potential != null, "Operation for child %s is not defined.", child); + return potential; } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ValueNodeModificationStrategy.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ValueNodeModificationStrategy.java index 0251d535ba..75fb5cdc75 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ValueNodeModificationStrategy.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ValueNodeModificationStrategy.java @@ -38,7 +38,7 @@ final class ValueNodeModificationStrategy getChild(final PathArgument child) { + public ModificationApplyOperation childByArg(final PathArgument arg) { throw new UnsupportedOperationException("Node " + schema + " is leaf type node. Child nodes not allowed"); } -- 2.36.6