From d0dbb419174786ae930c5a6838d032f0975add38 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 8 Apr 2019 21:44:08 +0200 Subject: [PATCH] Add DataNodeContainer.findDataChildByName(QName, QName...) This is a utility method, which traverses the tree of nodes, equivalent to individually checking and calling findDataChildByName(QName). It stops when any component is not found. Change-Id: I98f3c0f4ba6f32fe8f984547f20b84981db07f3f Signed-off-by: Robert Varga --- .../leafref/context/LeafRefContextTest.java | 4 +-- .../LeafRefContextTreeBuilderTest.java | 7 ++--- .../yang/model/api/DataNodeContainer.java | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTest.java index 5f8c1463d0..7722201216 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTest.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTest.java @@ -20,7 +20,6 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContext; import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextUtils; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -69,8 +68,7 @@ public class LeafRefContextTest { final DataSchemaNode targetNode = rootMod.findDataChildByName(q2).get(); final DataSchemaNode cont1Node = rootMod.findDataChildByName(q3).get(); final DataSchemaNode cont2Node = rootMod.findDataChildByName(q4).get(); - final DataSchemaNode name1Node = ((DataNodeContainer) ((DataNodeContainer) rootMod.getDataChildByName(q3)) - .getDataChildByName(q5)).getDataChildByName(q6); + final DataSchemaNode name1Node = rootMod.findDataChildByName(q3, q5, q6).get(); assertTrue(LeafRefContextUtils.isLeafRef(leafRefNode, rootLeafRefContext)); assertFalse(LeafRefContextUtils.isLeafRef(targetNode, rootLeafRefContext)); diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTreeBuilderTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTreeBuilderTest.java index 784ee08bc7..1ca9962e58 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTreeBuilderTest.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTreeBuilderTest.java @@ -23,7 +23,6 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContext; import org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextUtils; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -155,8 +154,7 @@ public class LeafRefContextTreeBuilderTest { final LeafRefContext odlContrProjNameCtx = rootLeafRefContext.getReferencingChildByName(q1) .getReferencingChildByName(q2).getReferencingChildByName(q3); - final DataSchemaNode odlContrProjNameNode = ((DataNodeContainer) ((DataNodeContainer) tstMod - .getDataChildByName(q1)).getDataChildByName(q2)).getDataChildByName(q3); + final DataSchemaNode odlContrProjNameNode = tstMod.findDataChildByName(q1, q2, q3).get(); final LeafRefContext foundOdlContrProjNameCtx = LeafRefContextUtils.getLeafRefReferencingContext( odlContrProjNameNode, rootLeafRefContext); @@ -176,8 +174,7 @@ public class LeafRefContextTreeBuilderTest { final LeafRefContext leafRefCtx = rootLeafRefContext.getReferencedChildByName(q1).getReferencedChildByName(q2) .getReferencedChildByName(q3); - final DataSchemaNode odlProjNameNode = ((DataNodeContainer) ((DataNodeContainer) tstMod.getDataChildByName(q1)) - .getDataChildByName(q2)).getDataChildByName(q3); + final DataSchemaNode odlProjNameNode = tstMod.findDataChildByName(q1, q2, q3).get(); LeafRefContext foundOdlProjNameCtx = LeafRefContextUtils.getLeafRefReferencingContext(odlProjNameNode, rootLeafRefContext); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java index c6ad90375b..2658835321 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java @@ -82,6 +82,34 @@ public interface DataNodeContainer { */ Optional findDataChildByName(QName name); + /** + * Returns the child node corresponding to the specified name. + * + *

+ * Note that the nodes searched are NOT {@code data nodes}, but rather {@link DataSchemaNode}s, + * hence {@link ChoiceSchemaNode} and {@link CaseSchemaNode} are returned instead of their matching children. + * + * @param first QName of first child + * @param others QNames of subsequent children + * @return child node of this DataNodeContainer if child with given name is present, empty otherwise + * @throws NullPointerException if any argument is null + */ + default Optional findDataChildByName(QName first, QName... others) { + Optional optCurrent = findDataChildByName(first); + for (QName qname : others) { + if (optCurrent.isPresent()) { + final DataSchemaNode current = optCurrent.get(); + if (current instanceof DataNodeContainer) { + optCurrent = ((DataNodeContainer) current).findDataChildByName(qname); + continue; + } + } + + return Optional.empty(); + } + return optCurrent; + } + /** * Returns grouping nodes used ny this container. * -- 2.36.6