Use SchemaNodeIdentifier.Descendant to map refined nodes 00/87800/7
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 16 Feb 2020 21:35:39 +0000 (22:35 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 17 Feb 2020 10:41:07 +0000 (11:41 +0100)
SchemaPath is completely ambiguous here, whereas we really want to
say 'Descendant' here -- that captures correctly how the path should
be interpreted.

JIRA: YANGTOOLS-1084
Change-Id: I5b6d9b75184dec419831ca7451de35e43812ea2b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UsesNode.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/uses/UsesEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingAndUsesStmtTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/GroupingTest.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/stmt/YangParserWithContextTest.java

index 72408f54f56d74b25d2308ecd0da2b031d1ffb2b..f4c60e4e959b7ebbb6073ef810a71b038cf8fcf2 100644 (file)
@@ -11,6 +11,7 @@ import java.util.Collection;
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 /**
  * Contains the methods for getting data and checking properties of the YANG <code>uses</code> substatement.
@@ -36,6 +37,5 @@ public interface UsesNode extends WhenConditionAware, WithStatus, CopyableNode {
      *
      * @return Map, where key is schema path of refined node and value is refined node
      */
-    // FIXME: 5.0.0: this should probably be SchemaPath.RelativeSchemaPath (which needs to be exposed)
-    @NonNull Map<SchemaPath, SchemaNode> getRefines();
+    @NonNull Map<Descendant, SchemaNode> getRefines();
 }
index cd927bad8bc25387f844427252b8c0116e7a215c..fe7d1cd9b342da8e0a3c31e893ff24d5d53e3b0f 100644 (file)
@@ -26,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
@@ -40,7 +40,7 @@ final class UsesEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<Q
         implements UsesEffectiveStatement, UsesNode {
     private final @NonNull SchemaPath groupingPath;
     private final boolean addedByUses;
-    private final @NonNull ImmutableMap<SchemaPath, SchemaNode> refines;
+    private final @NonNull ImmutableMap<Descendant, SchemaNode> refines;
     private final @NonNull ImmutableSet<AugmentationSchemaNode> augmentations;
     private final @Nullable RevisionAwareXPath whenCondition;
 
@@ -57,7 +57,7 @@ final class UsesEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<Q
 
         // initSubstatementCollections
         final Set<AugmentationSchemaNode> augmentationsInit = new LinkedHashSet<>();
-        final Map<SchemaPath, SchemaNode> refinesInit = new HashMap<>();
+        final Map<Descendant, SchemaNode> refinesInit = new HashMap<>();
         for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
             if (effectiveStatement instanceof AugmentationSchemaNode) {
                 final AugmentationSchemaNode augmentationSchema = (AugmentationSchemaNode) effectiveStatement;
@@ -65,8 +65,7 @@ final class UsesEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<Q
             }
             if (effectiveStatement instanceof RefineEffectiveStatementImpl) {
                 final RefineEffectiveStatementImpl refineStmt = (RefineEffectiveStatementImpl) effectiveStatement;
-                final SchemaNodeIdentifier identifier = refineStmt.argument();
-                refinesInit.put(identifier.asSchemaPath(), refineStmt.getRefineTargetNode());
+                refinesInit.put(refineStmt.argument(), refineStmt.getRefineTargetNode());
             }
         }
         this.augmentations = ImmutableSet.copyOf(augmentationsInit);
@@ -98,7 +97,7 @@ final class UsesEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<Q
     }
 
     @Override
-    public Map<SchemaPath, SchemaNode> getRefines() {
+    public Map<Descendant, SchemaNode> getRefines() {
         return refines;
     }
 
index 3b8f25ef8281176ce1aa87bdd9bb7b675f4a63c0..b419d94088886835aed60d822a02d27e9b7a5478 100644 (file)
@@ -7,13 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.stmt;
 
-import static org.hamcrest.CoreMatchers.anyOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
 
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
@@ -28,9 +27,9 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
@@ -96,7 +95,6 @@ public class GroupingAndUsesStmtTest {
         assertNotNull(result);
 
         final Module testModule = result.findModules("foo").iterator().next();
-        assertNotNull(testModule);
 
         final Collection<? extends UsesNode> usesNodes = testModule.getUses();
         assertEquals(1, usesNodes.size());
@@ -105,27 +103,23 @@ public class GroupingAndUsesStmtTest {
         assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
         assertEquals(1, usesNode.getAugmentations().size());
 
-        ContainerSchemaNode container = (ContainerSchemaNode) testModule.getDataChildByName(
-            QName.create(testModule.getQNameModule(), "peer"));
+        QName peer = QName.create(testModule.getQNameModule(), "peer");
+        ContainerSchemaNode container = (ContainerSchemaNode) testModule.getDataChildByName(peer);
         assertNotNull(container);
-        container = (ContainerSchemaNode) container.getDataChildByName(QName.create(testModule.getQNameModule(),
-            "destination"));
+        container = (ContainerSchemaNode) container.getDataChildByName(QName.create(peer, "destination"));
         assertEquals(1, container.getUses().size());
 
         usesNode = container.getUses().iterator().next();
         assertEquals("target", usesNode.getGroupingPath().getLastComponent().getLocalName());
 
-        final Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
+        final Map<Descendant, SchemaNode> refines = usesNode.getRefines();
         assertEquals(4, refines.size());
 
-        final Iterator<SchemaPath> refinesKeysIterator = refines.keySet().iterator();
-        SchemaPath path = refinesKeysIterator.next();
-        assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
-        path = refinesKeysIterator.next();
-        assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
-        path = refinesKeysIterator.next();
-        assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
-        path = refinesKeysIterator.next();
-        assertThat(path.getLastComponent().getLocalName(), anyOf(is("port"), is("address"), is("addresses"), is("id")));
+        assertEquals(ImmutableList.of(
+            Descendant.of(QName.create(peer, "port")),
+            Descendant.of(QName.create(peer, "address")),
+            Descendant.of(QName.create(peer, "addresses")),
+            Descendant.of(QName.create(peer, "addresses"), QName.create(peer, "id"))),
+            new ArrayList<>(refines.keySet()));
     }
 }
index 81e08091bd8c9a2b85447673a27ca6814ebc6363..f760260837de6e9c7b0f319d9be5a4b89411a126 100644 (file)
@@ -42,6 +42,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
@@ -70,14 +71,14 @@ public class GroupingTest {
         final Collection<? extends UsesNode> usesNodes = destination.getUses();
         assertEquals(1, usesNodes.size());
         final UsesNode usesNode = usesNodes.iterator().next();
-        final Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
+        final Map<Descendant, SchemaNode> refines = usesNode.getRefines();
         assertEquals(4, refines.size());
 
         LeafSchemaNode refineLeaf = null;
         ContainerSchemaNode refineContainer = null;
         ListSchemaNode refineList = null;
         LeafSchemaNode refineInnerLeaf = null;
-        for (final Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
+        for (final Map.Entry<Descendant, SchemaNode> entry : refines.entrySet()) {
             final SchemaNode value = entry.getValue();
             if ("address".equals(value.getQName().getLocalName())) {
                 refineLeaf = (LeafSchemaNode) destination.getDataChildByName(value.getQName());
@@ -89,7 +90,7 @@ public class GroupingTest {
         }
 
         assertNotNull(refineList);
-        for (final Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
+        for (final Map.Entry<Descendant, SchemaNode> entry : refines.entrySet()) {
             final SchemaNode value = entry.getValue();
             if ("id".equals(value.getQName().getLocalName())) {
                 refineInnerLeaf = (LeafSchemaNode) refineList.getDataChildByName(value.getQName());
index acbb2232eac843363c5756587b95535987167e06..e7557d8a64b3430af1fc2069696d9da7659d3f80 100644 (file)
@@ -44,6 +44,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
@@ -228,13 +229,13 @@ public class YangParserWithContextTest {
         assertEquals(expectedPath, usesNode.getGroupingPath());
 
         // test refine
-        final Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
+        final Map<Descendant, SchemaNode> refines = usesNode.getRefines();
         assertEquals(3, refines.size());
 
         LeafSchemaNode refineLeaf = null;
         ContainerSchemaNode refineContainer = null;
         ListSchemaNode refineList = null;
-        for (final Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
+        for (final Map.Entry<Descendant, SchemaNode> entry : refines.entrySet()) {
             final SchemaNode value = entry.getValue();
             if (value instanceof LeafSchemaNode) {
                 refineLeaf = (LeafSchemaNode) value;