Trim NodeIdentifierWithPredicates from post path 78/100378/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Apr 2022 08:28:07 +0000 (10:28 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Apr 2022 08:57:44 +0000 (10:57 +0200)
The identifier we are getting from DataSchemaContextTree does not have
correct predicates filled it. Make sure to trim it, as we are restoring
it properly after parse.

JIRA: NETCONF-869
Change-Id: Ia5103e25d0c2790c5c31bea356a29b69f43618b6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyReader.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/test/XmlBodyReaderTest.java

index 50e6af6852af7b6fee1551e4b223d454d2573523..84a79787f4356f6536b8a40ccff8664c7a331139 100644 (file)
@@ -51,6 +51,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -145,6 +146,12 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro
                     current = next;
                 } while (current.isMixin());
 
+                // We need to unwind the last identifier if it a NodeIdentifierWithPredicates, as it does not have
+                // any predicates at all. The real identifier is then added below
+                if (stack.currentStatement() instanceof ListEffectiveStatement) {
+                    iiToDataList.remove(iiToDataList.size() - 1);
+                }
+
                 inference = stack.toInference();
 
             } else {
index d7c629cf938b13a6052b9e3e3084762796705fa0..7d6813c22bb9c80867c12eb396cb7b9322a30a54 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -115,6 +116,12 @@ public class XmlNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReade
                     current = next;
                 } while (current.isMixin());
 
+                // We need to unwind the last identifier if it a NodeIdentifierWithPredicates, as it does not have
+                // any predicates at all. The real identifier is then added below
+                if (stack.currentStatement() instanceof ListEffectiveStatement) {
+                    iiToDataList.remove(iiToDataList.size() - 1);
+                }
+
                 inference = stack.toInference();
             } else {
                 // PUT
@@ -148,7 +155,7 @@ public class XmlNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReade
                 parsed = mapNode.body().iterator().next();
             }
 
-            if (schemaNode instanceof  ListSchemaNode && isPost()) {
+            if (schemaNode instanceof ListSchemaNode && isPost()) {
                 iiToDataList.add(parsed.getIdentifier());
             }
         } else {
index e8650c5779e8f2b20a8aba6795994383a01157e9..90db4c358db9ed7e5a0cf502f3b6241dd6c15a3a 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Set;
 import javax.ws.rs.core.MediaType;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.common.errors.RestconfError;
 import org.opendaylight.restconf.nb.rfc8040.TestRestconfUtils;
@@ -38,6 +39,8 @@ import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
@@ -51,6 +54,7 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 public class XmlBodyReaderTest extends AbstractBodyReaderTest {
     private static final QNameModule INSTANCE_IDENTIFIER_MODULE_QNAME = QNameModule.create(
         XMLNamespace.of("instance:identifier:module"), Revision.of("2014-01-17"));
+    private static final QName TOP_LEVEL_LIST = QName.create("foo", "2017-08-09", "top-level-list");
 
     private static EffectiveModelContext schemaContext;
 
@@ -90,6 +94,12 @@ public class XmlBodyReaderTest extends AbstractBodyReaderTest {
             XmlBodyReaderTest.class.getResourceAsStream("/foo-xml-test/foo.xml"));
         assertNotNull(payload);
 
+        final InstanceIdentifierContext iid = payload.getInstanceIdentifierContext();
+        assertEquals(YangInstanceIdentifier.create(
+            new NodeIdentifier(TOP_LEVEL_LIST),
+            NodeIdentifierWithPredicates.of(TOP_LEVEL_LIST, QName.create(TOP_LEVEL_LIST, "key-leaf"), "key-value")),
+            iid.getInstanceIdentifier());
+
         assertThat(payload.getData(), instanceOf(MapEntryNode.class));
         final MapEntryNode data = (MapEntryNode) payload.getData();
         assertEquals(2, data.size());