import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
XMLStreamWriter xmlWriter;
try {
xmlWriter = XML_FACTORY.createXMLStreamWriter(entityStream, StandardCharsets.UTF_8.name());
- if (context.getWriterParameters().prettyPrint()) {
+
+ final var prettyPrint = context.getWriterParameters().prettyPrint();
+ if (prettyPrint != null && prettyPrint.value()) {
xmlWriter = new IndentingXMLStreamWriter(xmlWriter);
}
} catch (final XMLStreamException | FactoryConfigurationError e) {
((ActionDefinition) pathContext.getSchemaNode()).getOutput().getPath(), depth, fields);
writeElements(xmlWriter, nnWriter, (ContainerNode) data);
} else {
- if (SchemaPath.ROOT.equals(path)) {
+ final boolean isRoot = SchemaPath.ROOT.equals(path);
+ if (isRoot) {
nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth, fields);
} else {
nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path.getParent(), depth, fields);
nnWriter.write(ImmutableNodes.mapNodeBuilder(data.getIdentifier().getNodeType())
.addChild((MapEntryNode) data)
.build());
+ } else if (isRoot) {
+ if (data instanceof ContainerNode && ((ContainerNode) data).isEmpty()) {
+ writeEmptyDataNode(xmlWriter, data);
+ } else {
+ writeAndWrapInDataNode(xmlWriter, nnWriter, data);
+ }
} else {
nnWriter.write(data);
}
private static RestconfNormalizedNodeWriter createNormalizedNodeWriter(final XMLStreamWriter xmlWriter,
final EffectiveModelContext schemaContext, final SchemaPath schemaPath, final DepthParam depth,
final List<Set<QName>> fields) {
- final NormalizedNodeStreamWriter xmlStreamWriter = XMLStreamNormalizedNodeStreamWriter
- .create(xmlWriter, schemaContext, schemaPath);
- return ParameterAwareNormalizedNodeWriter.forStreamWriter(xmlStreamWriter, depth, fields);
+ return ParameterAwareNormalizedNodeWriter.forStreamWriter(
+ XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, schemaContext, schemaPath), depth, fields);
+ }
+
+ private static void writeAndWrapInDataNode(final XMLStreamWriter xmlWriter,
+ final RestconfNormalizedNodeWriter nnWriter, final NormalizedNode data) throws IOException {
+ final QName nodeType = data.getIdentifier().getNodeType();
+ final String namespace = nodeType.getNamespace().toString();
+ try {
+ xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, nodeType.getLocalName(), namespace);
+ xmlWriter.writeDefaultNamespace(namespace);
+ nnWriter.write(data);
+ xmlWriter.writeEndElement();
+ xmlWriter.flush();
+ } catch (XMLStreamException e) {
+ throw new IOException("Failed to write elements", e);
+ }
+ }
+
+ private static void writeEmptyDataNode(final XMLStreamWriter xmlWriter, final NormalizedNode data)
+ throws IOException {
+ final QName nodeType = data.getIdentifier().getNodeType();
+ final String namespace = nodeType.getNamespace().toString();
+ try {
+ xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, nodeType.getLocalName(), namespace);
+ xmlWriter.writeDefaultNamespace(namespace);
+ xmlWriter.writeEndElement();
+ xmlWriter.flush();
+ } catch (XMLStreamException e) {
+ throw new IOException("Failed to write elements", e);
+ }
}
private static void writeElements(final XMLStreamWriter xmlWriter, final RestconfNormalizedNodeWriter nnWriter,
final ContainerNode data) throws IOException {
- final QName name = data.getIdentifier().getNodeType();
+ final QName nodeType = data.getIdentifier().getNodeType();
+ final String namespace = nodeType.getNamespace().toString();
try {
- xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX,
- name.getLocalName(), name.getNamespace().toString());
- xmlWriter.writeDefaultNamespace(name.getNamespace().toString());
+ xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, nodeType.getLocalName(), namespace);
+ xmlWriter.writeDefaultNamespace(namespace);
for (final NormalizedNode child : data.body()) {
nnWriter.write(child);
}