X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;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=b2ec119ca942ac33ba2b7fbdecbaf26ee5831ceb;hp=67cfde2e8c06e571b4a1ce248b42ca549d5eb53b;hb=f2439a364be2129ab6d50eb15ad2df1a0ecac21f;hpb=8b3405d23e3018afdc4cb5e99bab442ced26e304 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 67cfde2e8c..b2ec119ca9 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,13 +8,18 @@ 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 { @@ -35,6 +40,19 @@ 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 +62,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++; @@ -62,6 +84,14 @@ public class TreeNodeUtils { // so this prat of code is never triggered, in cases nesting == 0; final InstanceIdentifier parentPath = new InstanceIdentifier(path.getPath().subList(0, nesting - 1)); return new SimpleEntry(parentPath,parent.get()); + + } + + public static > Optional getChild(final Optional parent,final PathArgument child) { + if(parent.isPresent()) { + return parent.get().getChild(child); + } + return Optional.absent(); } }