Clean up startContainerNode() 53/106453/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 12 Jun 2023 16:04:05 +0000 (18:04 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 12 Jun 2023 17:19:30 +0000 (17:19 +0000)
Returning a raw SchemaNode is not nice. Expose a ContainerLike, taking
advantage of Notification's tranformation capability. Also improve
internal tracking to guarantee a DataSchemaNode in schemaStack, which
is much more friendly than WithStatus.

Change-Id: Ie1a0989e0e7c54f93e4c6263f1240c5d664be900
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java

index 535ff6ee37e2016b8345eb9fcf2f5d3b69a9df9a..cb8ff42a1660c7898b6fde40ad4aaa144abbca1c 100644 (file)
@@ -35,7 +35,6 @@ import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
@@ -342,8 +341,7 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
      */
     @Override
     public final void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
-        final SchemaNode schema = tracker.startContainerNode(name);
-        final boolean isPresence = schema instanceof ContainerSchemaNode container
+        final boolean isPresence = tracker.startContainerNode(name) instanceof ContainerSchemaNode container
             ? container.isPresenceContainer() : DEFAULT_EMIT_EMPTY_CONTAINERS;
         context = new JSONStreamWriterNamedObjectContext(context, name, isPresence);
     }
index b9e50c6f701c7329885ce31c7e20d28c8d3ebda9..594e7fb068d0aaf7e6df2a7df0a8065d6762487c 100644 (file)
@@ -32,7 +32,6 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
@@ -121,7 +120,7 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter
 
     @Override
     public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
-        final SchemaNode schema = tracker.startContainerNode(name);
+        final var schema = tracker.startContainerNode(name);
         startElement(schema.getQName());
     }
 
index 42be874d27fc6f3d06c7dd7b0dd0377c22a46910..58e078a5e848840c25345878e3178bb0eec994b0 100644 (file)
@@ -13,6 +13,7 @@ import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.VerifyException;
 import java.io.IOException;
 import java.util.ArrayDeque;
 import java.util.Deque;
@@ -26,12 +27,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -42,7 +41,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
@@ -59,7 +57,7 @@ import org.slf4j.LoggerFactory;
 public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     private static final Logger LOG = LoggerFactory.getLogger(NormalizedNodeStreamWriterStack.class);
 
-    private final Deque<WithStatus> schemaStack = new ArrayDeque<>();
+    private final Deque<DataSchemaNode> schemaStack = new ArrayDeque<>();
     private final SchemaInferenceStack dataTree;
     private final DataNodeContainer root;
 
@@ -178,13 +176,13 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     }
 
     private @NonNull SchemaNode enterDataTree(final PathArgument name) {
-        final QName qname = name.getNodeType();
-        final DataTreeEffectiveStatement<?> stmt = dataTree.enterDataTree(qname);
-        verify(stmt instanceof SchemaNode, "Unexpected result %s", stmt);
-        final SchemaNode ret = (SchemaNode) stmt;
-        final Object parent = getParent();
-        if (parent instanceof ChoiceSchemaNode choice) {
-            final DataSchemaNode check = choice.findDataSchemaChild(qname).orElse(null);
+        final var qname = name.getNodeType();
+        final var stmt = dataTree.enterDataTree(qname);
+        if (!(stmt instanceof SchemaNode ret)) {
+            throw new VerifyException("Unexpected result " + stmt);
+        }
+        if (getParent() instanceof ChoiceSchemaNode choice) {
+            final var check = choice.findDataSchemaChild(qname).orElse(null);
             verify(check == ret, "Data tree result %s does not match choice result %s", ret, check);
         }
         return ret;
@@ -208,9 +206,10 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     }
 
     public void startListItem(final PathArgument name) throws IOException {
-        final Object schema = getParent();
-        checkArgument(schema instanceof ListSchemaNode, "List item is not appropriate");
-        schemaStack.push((ListSchemaNode) schema);
+        if (!(getParent() instanceof ListSchemaNode parentList)) {
+            throw new IllegalArgumentException("List item is not appropriate");
+        }
+        schemaStack.push(parentList);
     }
 
     public void startLeafNode(final NodeIdentifier name) throws IOException {
@@ -244,20 +243,23 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
     public void startChoiceNode(final NodeIdentifier name) {
         LOG.debug("Enter choice {}", name);
         final var stmt = dataTree.enterChoice(name.getNodeType());
-        verify(stmt instanceof ChoiceSchemaNode, "Node %s is not a choice", stmt);
-        schemaStack.push((ChoiceSchemaNode) stmt);
+        if (stmt instanceof ChoiceSchemaNode choice) {
+            schemaStack.push(choice);
+        } else {
+            throw new VerifyException("Node " + stmt + " is not a choice");
+        }
     }
 
-    public SchemaNode startContainerNode(final NodeIdentifier name) {
+    public @NonNull ContainerLike startContainerNode(final NodeIdentifier name) {
         LOG.debug("Enter container {}", name);
 
-        final SchemaNode schema;
+        final ContainerLike schema;
         if (schemaStack.isEmpty() && root instanceof NotificationDefinition notification) {
             // Special case for stacks initialized at notification. We pretend the first container is contained within
             // itself.
             // FIXME: 8.0.0: factor this special case out to something more reasonable, like being initialized at the
             //               Notification's parent and knowing to enterSchemaTree() instead of enterDataTree().
-            schema = notification;
+            schema = notification.toContainerLike();
             schemaStack.push(schema);
         } else {
             schema = enterDataTree(name, ContainerLike.class, "a container");
@@ -278,7 +280,7 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
         final var ret = schemaStack.pop();
         // If this is a data tree node, make sure it is updated. Before that, though, we need to check if this is not
         // actually listEntry -> list or leafListEntry -> leafList exit.
-        if (!(ret instanceof AugmentationSchemaNode) && getParent() != ret) {
+        if (getParent() != ret) {
             dataTree.exit();
         }
         return ret;