Clean up XmlNormalizedNodeBodyWriter 55/107855/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 13 Sep 2023 16:28:22 +0000 (18:28 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 14 Sep 2023 07:48:22 +0000 (09:48 +0200)
We are hunting down the actual state used from
InstanceIdentifierContext, this patch gets us a bit closer and it also
shows we have some oddities going on.

JIRA: NETCONF-1157
Change-Id: I0d623ddf11a00e93d45838ed9d316cee2eb9b715
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/jersey/providers/XmlNormalizedNodeBodyWriter.java

index 4855c00585e31bdcfbc6e298cc9d4f1b9833d7dd..ad0b33adb3cd367015c0350d38a372c328717242 100644 (file)
@@ -38,7 +38,6 @@ import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStr
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 
@@ -60,7 +59,6 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
                         final MediaType mediaType,
                         final MultivaluedMap<String, Object> httpHeaders,
                         final OutputStream entityStream) throws IOException, WebApplicationException {
-        final InstanceIdentifierContext pathContext = context.getInstanceIdentifierContext();
         if (context.getData() == null) {
             return;
         }
@@ -78,21 +76,18 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             if (prettyPrint != null && prettyPrint.value()) {
                 xmlWriter = new IndentingXMLStreamWriter(xmlWriter);
             }
-        } catch (final XMLStreamException | FactoryConfigurationError e) {
+        } catch (XMLStreamException | FactoryConfigurationError e) {
             throw new IllegalStateException(e);
         }
-        final NormalizedNode data = context.getData();
 
-        writeNormalizedNode(xmlWriter,  pathContext, data, context.getWriterParameters().depth(),
-                context.getWriterParameters().fields());
+        writeNormalizedNode(xmlWriter, context.getInstanceIdentifierContext(), context.getData(),
+            context.getWriterParameters().depth(), context.getWriterParameters().fields());
     }
 
     private static void writeNormalizedNode(final XMLStreamWriter xmlWriter,
             final InstanceIdentifierContext pathContext, final NormalizedNode data, final DepthParam depth,
             final List<Set<QName>> fields) throws IOException {
-        final RestconfNormalizedNodeWriter nnWriter;
-        final SchemaNode schemaNode = pathContext.getSchemaNode();
-
+        final var schemaNode = pathContext.getSchemaNode();
         if (schemaNode instanceof RpcDefinition rpc) {
             // RpcDefinition is not supported as initial codec in XMLStreamWriter, so we need to emit initial output
             // declaration.
@@ -100,16 +95,18 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             stack.enterSchemaTree(rpc.getQName());
             stack.enterSchemaTree(rpc.getOutput().getQName());
 
-            nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
+            final var nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
             writeElements(xmlWriter, nnWriter, (ContainerNode) data);
+            nnWriter.flush();
         } else if (schemaNode instanceof ActionDefinition action) {
             // ActionDefinition is not supported as initial codec in XMLStreamWriter, so we need to emit initial output
             // declaration.
             final var stack = pathContext.inference().toSchemaInferenceStack();
             stack.enterSchemaTree(action.getOutput().getQName());
 
-            nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
+            final var nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
             writeElements(xmlWriter, nnWriter, (ContainerNode) data);
+            nnWriter.flush();
         } else {
             final var stack = pathContext.inference().toSchemaInferenceStack();
             final boolean isRoot;
@@ -119,8 +116,8 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             } else {
                 isRoot = true;
             }
-            nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
 
+            final var nnWriter = createNormalizedNodeWriter(xmlWriter, stack.toInference(), depth, fields);
             if (data instanceof MapEntryNode mapEntry) {
                 // Restconf allows returning one list item. We need to wrap it
                 // in map node in order to serialize it properly
@@ -134,9 +131,8 @@ public class XmlNormalizedNodeBodyWriter extends AbstractNormalizedNodeBodyWrite
             } else {
                 nnWriter.write(data);
             }
+            nnWriter.flush();
         }
-
-        nnWriter.flush();
     }
 
     private static RestconfNormalizedNodeWriter createNormalizedNodeWriter(final XMLStreamWriter xmlWriter,