Add DataNodeContainer.findDataChildByName(QName, QName...) 51/81451/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 8 Apr 2019 19:44:08 +0000 (21:44 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 8 Apr 2019 21:46:35 +0000 (23:46 +0200)
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 <robert.varga@pantheon.tech>
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/leafref/context/LeafRefContextTreeBuilderTest.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DataNodeContainer.java

index 5f8c1463d0182a57a091b93abf067ae5a4348f76..77222012162f6b8f35285942e12cb6f140aa75b2 100644 (file)
@@ -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));
index 784ee08bc712d6bdcffe44c5ff7563c0b2c709a0..1ca9962e5896ec62207d3de38dc0c7e31e882337 100644 (file)
@@ -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);
index c6ad90375bfbd3266483ae571e05a0deff08ff6d..2658835321d1205ad9c3aa9ef0660325e098ec26 100644 (file)
@@ -82,6 +82,34 @@ public interface DataNodeContainer {
      */
     Optional<DataSchemaNode> findDataChildByName(QName name);
 
+    /**
+     * Returns the child node corresponding to the specified name.
+     *
+     * <p>
+     * Note that the nodes searched are <strong>NOT</strong> {@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<DataSchemaNode> findDataChildByName(QName first, QName... others) {
+        Optional<DataSchemaNode> 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.
      *