X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fstore%2Fimpl%2Ftree%2FTreeNodeUtils.java;h=732352dd34bbf974b6d897984d9b731c72e5e591;hb=1c79202684429691381362a27303514f8d2cb59f;hp=dc893098775419177a8899e11cdd15c9dc98fd16;hpb=822e5c6c51346ef6ca8254b5597b95742a05fc7d;p=controller.git diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java index dc89309877..732352dd34 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/TreeNodeUtils.java @@ -8,15 +8,23 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree; import java.util.AbstractMap.SimpleEntry; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; -public class TreeNodeUtils { +public final class TreeNodeUtils { + private TreeNodeUtils() { + throw new UnsupportedOperationException("Utility class should not be instantiated"); + } /** * Finds a node in tree @@ -35,6 +43,18 @@ public class TreeNodeUtils { return current; } + public static > T findNodeChecked(final T tree, final InstanceIdentifier path) { + T current = tree; + List nested = new ArrayList<>(path.getPath().size()); + for(PathArgument pathArg : path.getPath()) { + Optional potential = current.getChild(pathArg); + nested.add(pathArg); + Preconditions.checkArgument(potential.isPresent(),"Child %s is not present in tree.",nested); + current = potential.get(); + } + return current; + } + /** * Finds a node or closest parent in the tree * @@ -44,12 +64,16 @@ public class TreeNodeUtils { * */ public static > Map.Entry findClosest(final T tree, final InstanceIdentifier path) { + return findClosestsOrFirstMatch(tree, path, Predicates.alwaysFalse()); + } + + public static > Map.Entry findClosestsOrFirstMatch(final T tree, final InstanceIdentifier path, final Predicate predicate) { Optional parent = Optional.of(tree); Optional current = Optional. of(tree); int nesting = 0; Iterator pathIter = path.getPath().iterator(); - while (current.isPresent() && pathIter.hasNext()) { + while (current.isPresent() && pathIter.hasNext() && !predicate.apply(current.get())) { parent = current; current = current.get().getChild(pathIter.next()); nesting++; @@ -58,9 +82,16 @@ public class TreeNodeUtils { final InstanceIdentifier currentPath = new InstanceIdentifier(path.getPath().subList(0, nesting)); return new SimpleEntry(currentPath,current.get()); } - // Nesting minus one is safe, since current is allways present when nesting = 0 - // so this prat of code is never triggered, in cases nesting == 0; + + /* + * Subtracting 1 from nesting level at this point is safe, because we + * cannot reach here with nesting == 0: that would mean the above check + * for current.isPresent() failed, which it cannot, as current is always + * present. At any rate we check state just to be on the safe side. + */ + Preconditions.checkState(nesting > 0); final InstanceIdentifier parentPath = new InstanceIdentifier(path.getPath().subList(0, nesting - 1)); + return new SimpleEntry(parentPath,parent.get()); }