Use SchemaInferenceStack in SchemaOrderedNormalizedNodeWriter 12/95112/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 10 Feb 2021 12:53:43 +0000 (13:53 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 10 Feb 2021 13:18:58 +0000 (14:18 +0100)
SchemaOrderedNormalizedNodeWriter's use of SchemaUtils is rather
straightforward, let's migrate it to SchemaInferenceStack.

JIRA: YANGTOOLS-1230
Change-Id: I9b17d0f9f737df7127a48d7cd60dae0a2b2b594f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaOrderedNormalizedNodeWriterTest.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaOrderedNormalizedNodeWriter.java

index 10bdf9eb8bf0e22a8fd559ed663265b8e98005e9..1542366c1446f42914ce2257fa860e3ef73f314d 100644 (file)
@@ -32,7 +32,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.SchemaOrderedNormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 import org.xml.sax.SAXException;
 
@@ -95,8 +94,7 @@ public class SchemaOrderedNormalizedNodeWriterTest {
         EffectiveModelContext schemaContext = getSchemaContext("/bug1848/foo.yang");
         NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext);
 
-        try (SchemaOrderedNormalizedNodeWriter nnw = new SchemaOrderedNormalizedNodeWriter(writer, schemaContext,
-            SchemaPath.ROOT)) {
+        try (SchemaOrderedNormalizedNodeWriter nnw = new SchemaOrderedNormalizedNodeWriter(writer, schemaContext)) {
 
             List<MapEntryNode> rule1Names = new ArrayList<>();
             rule1Names.add(ImmutableNodes.mapEntry(createQName(FOO_NAMESPACE, RULE_NODE),
@@ -155,7 +153,7 @@ public class SchemaOrderedNormalizedNodeWriterTest {
         EffectiveModelContext schemaContext = getSchemaContext("/bug1848/order.yang");
         NormalizedNodeStreamWriter writer = XMLStreamNormalizedNodeStreamWriter.create(xmlStreamWriter, schemaContext);
 
-        try (NormalizedNodeWriter nnw = new SchemaOrderedNormalizedNodeWriter(writer, schemaContext, SchemaPath.ROOT)) {
+        try (NormalizedNodeWriter nnw = new SchemaOrderedNormalizedNodeWriter(writer, schemaContext)) {
 
             ContainerNode cont = Builders.containerBuilder()
                     .withNodeIdentifier(getNodeIdentifier(ORDER_NAMESPACE, "cont"))
index 0af9338c35052f5535ee4f19b89a5180dd4faf74..f0244875b108422ef913a430b230bf083713a1fc 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.ArrayListMultimap;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
-import java.util.Objects;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
@@ -27,15 +28,14 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 /**
  * This is an iterator over a {@link NormalizedNode}. Unlike {@link NormalizedNodeWriter}, this iterates over elements
  * in the order as they are defined in YANG file.
  */
 public class SchemaOrderedNormalizedNodeWriter extends NormalizedNodeWriter {
-    private static final Logger LOG = LoggerFactory.getLogger(SchemaOrderedNormalizedNodeWriter.class);
     private final EffectiveModelContext schemaContext;
     private final SchemaNode root;
 
@@ -44,29 +44,41 @@ public class SchemaOrderedNormalizedNodeWriter extends NormalizedNodeWriter {
     /**
      * Create a new writer backed by a {@link NormalizedNodeStreamWriter}.
      *
-     * @param writer
-     *            Back-end writer
-     * @param schemaContext
-     *            Schema context
-     * @param path
-     *            path
+     * @param writer Back-end writer
+     * @param schemaContext Associated {@link EffectiveModelContext}
+     */
+    public SchemaOrderedNormalizedNodeWriter(final NormalizedNodeStreamWriter writer,
+            final EffectiveModelContext schemaContext) {
+        super(writer);
+        this.root = this.schemaContext = requireNonNull(schemaContext);
+    }
+
+    /**
+     * Create a new writer backed by a {@link NormalizedNodeStreamWriter}.
+     *
+     * @param writer Back-end writer
+     * @param schemaContext Associated {@link EffectiveModelContext}
+     * @param path root path
      */
     public SchemaOrderedNormalizedNodeWriter(final NormalizedNodeStreamWriter writer,
             final EffectiveModelContext schemaContext, final SchemaPath path) {
         super(writer);
-        this.schemaContext = schemaContext;
-        final Collection<SchemaNode> schemaNodes = SchemaUtils.findParentSchemaNodesOnPath(schemaContext, path);
-        Preconditions.checkArgument(!schemaNodes.isEmpty(), "Unable to find schema node for supplied schema path: %s",
-                path);
-        if (schemaNodes.size() > 1) {
-            LOG.warn("More possible schema nodes {} for supplied schema path {}", schemaNodes, path);
+        this.schemaContext = requireNonNull(schemaContext);
+
+        final SchemaInferenceStack stack = SchemaInferenceStack.ofInstantiatedPath(schemaContext, path);
+        if (!stack.isEmpty()) {
+            final EffectiveStatement<QName, ?> current = stack.currentStatement();
+            // FIXME: this should be one of NormalizedNodeContainer/NotificationDefinition/OperationDefinition
+            checkArgument(current instanceof SchemaNode, "Instantiating at %s is not supported", current);
+            root = (SchemaNode) current;
+        } else {
+            root = schemaContext;
         }
-        this.root = schemaNodes.iterator().next();
     }
 
     @Override
     public SchemaOrderedNormalizedNodeWriter write(final NormalizedNode node) throws IOException {
-        if (Objects.equals(root, schemaContext)) {
+        if (schemaContext.equals(root)) {
             currentSchemaNode = schemaContext.dataChildByName(node.getNodeType());
         } else {
             currentSchemaNode = root;