From 6967076db665e1ca30eb4a4eee94f4a350edceb0 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 12 Jun 2023 17:48:36 +0200 Subject: [PATCH] Clean up NormalizedNodeStreamWriterStack.enterDataTree() We have a lot of shared codepaths, let's centralize them in a more useful enterDataTree() method, which also checks the return type and updates schemaStack. Change-Id: Ide1b196bda3003c7abc5be9e25d788759c8cef6e Signed-off-by: Robert Varga --- .../util/NormalizedNodeStreamWriterStack.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java index 61d2df0dc2..42be874d27 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java @@ -42,7 +42,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.ChoiceEffectiveStatement; 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; @@ -178,7 +177,7 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { return schema == null ? root : schema; } - private SchemaNode enterDataTree(final PathArgument name) { + 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); @@ -191,10 +190,21 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { return ret; } + private @NonNull T enterDataTree(final PathArgument name, + final @NonNull Class expectedClass, final @NonNull String humanString) { + final var schema = enterDataTree(name); + final T casted; + try { + casted = expectedClass.cast(schema); + } catch (ClassCastException e) { + throw new IllegalArgumentException("Node " + schema + " is not " + humanString, e); + } + schemaStack.push(casted); + return casted; + } + public void startList(final PathArgument name) { - final SchemaNode schema = enterDataTree(name); - checkArgument(schema instanceof ListSchemaNode, "Node %s is not a list", schema); - schemaStack.push(schema); + enterDataTree(name, ListSchemaNode.class, "a list"); } public void startListItem(final PathArgument name) throws IOException { @@ -204,15 +214,11 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { } public void startLeafNode(final NodeIdentifier name) throws IOException { - final SchemaNode schema = enterDataTree(name); - checkArgument(schema instanceof LeafSchemaNode, "Node %s is not a leaf", schema); - schemaStack.push(schema); + enterDataTree(name, LeafSchemaNode.class, "a leaf"); } public void startLeafSet(final NodeIdentifier name) { - final SchemaNode schema = enterDataTree(name); - checkArgument(schema instanceof LeafListSchemaNode, "Node %s is not a leaf-list", schema); - schemaStack.push(schema); + enterDataTree(name, LeafListSchemaNode.class, "a leaf-list"); } private @NonNull LeafListSchemaNode leafSetEntryNode(final QName qname) { @@ -237,7 +243,7 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { public void startChoiceNode(final NodeIdentifier name) { LOG.debug("Enter choice {}", name); - final ChoiceEffectiveStatement stmt = dataTree.enterChoice(name.getNodeType()); + final var stmt = dataTree.enterChoice(name.getNodeType()); verify(stmt instanceof ChoiceSchemaNode, "Node %s is not a choice", stmt); schemaStack.push((ChoiceSchemaNode) stmt); } @@ -252,29 +258,24 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver { // 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; + schemaStack.push(schema); } else { - schema = enterDataTree(name); - checkArgument(schema instanceof ContainerLike, "Node %s is not a container", schema); + schema = enterDataTree(name, ContainerLike.class, "a container"); } - schemaStack.push(schema); return schema; } public void startAnyxmlNode(final NodeIdentifier name) { - final SchemaNode schema = enterDataTree(name); - checkArgument(schema instanceof AnyxmlSchemaNode, "Node %s is not anyxml", schema); - schemaStack.push(schema); + enterDataTree(name, AnyxmlSchemaNode.class, "anyxml"); } public void startAnydataNode(final NodeIdentifier name) { - final SchemaNode schema = enterDataTree(name); - checkArgument(schema instanceof AnydataSchemaNode, "Node %s is not anydata", schema); - schemaStack.push(schema); + enterDataTree(name, AnydataSchemaNode.class, "anydata"); } public Object endNode() { - final Object ret = schemaStack.pop(); + 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) { -- 2.36.6