X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-bierman02%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frest%2Fimpl%2FNormalizedNodeXmlBodyWriter.java;h=62d8667df9121bea4d44235eadb22c83d10be817;hb=580ecde4af04ece62a9eb1d6adc541e2125ac065;hp=df9b4f03b6bbea2de251268bd83293b72bb8018e;hpb=b1386bfad86dcaaca991d11177834a5a37bf740c;p=netconf.git diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java index df9b4f03b6..62d8667df9 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java @@ -7,12 +7,11 @@ */ package org.opendaylight.netconf.sal.rest.impl; -import com.google.common.base.Optional; -import com.google.common.base.Throwables; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.Map.Entry; import javanet.staxutils.IndentingXMLStreamWriter; @@ -27,21 +26,24 @@ import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.netconf.sal.rest.api.Draft02; import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter; import org.opendaylight.netconf.sal.rest.api.RestconfService; +import org.opendaylight.netconf.util.NetconfUtil; import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; 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.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.xml.sax.SAXException; /** * Normalized node writer for XML. @@ -50,8 +52,13 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; */ @Deprecated @Provider -@Produces({ Draft02.MediaTypes.API + RestconfService.XML, Draft02.MediaTypes.DATA + RestconfService.XML, - Draft02.MediaTypes.OPERATION + RestconfService.XML, MediaType.APPLICATION_XML, MediaType.TEXT_XML }) +@Produces({ + Draft02.MediaTypes.API + RestconfService.XML, + Draft02.MediaTypes.DATA + RestconfService.XML, + Draft02.MediaTypes.OPERATION + RestconfService.XML, + MediaType.APPLICATION_XML, + MediaType.TEXT_XML +}) public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter { private static final XMLOutputFactory XML_FACTORY; @@ -95,21 +102,30 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter data = context.getData(); + final NormalizedNode data = context.getData(); final SchemaPath schemaPath = pathContext.getSchemaNode().getPath(); - writeNormalizedNode(xmlWriter, schemaPath, pathContext, data, - Optional.fromNullable(context.getWriterParameters().getDepth())); + writeNormalizedNode(xmlWriter, schemaPath, pathContext, data, context.getWriterParameters().getDepth()); } private static void writeNormalizedNode(final XMLStreamWriter xmlWriter, final SchemaPath schemaPath, - final InstanceIdentifierContext pathContext, NormalizedNode data, final Optional depth) + final InstanceIdentifierContext pathContext, NormalizedNode data, final @Nullable Integer depth) throws IOException { final RestconfNormalizedNodeWriter nnWriter; - final SchemaContext schemaCtx = pathContext.getSchemaContext(); + final EffectiveModelContext schemaCtx = pathContext.getSchemaContext(); if (SchemaPath.ROOT.equals(schemaPath)) { nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, schemaPath, depth); - writeElements(xmlWriter, nnWriter, (ContainerNode) data); + if (data instanceof DOMSourceAnyxmlNode) { + try { + writeElements(xmlWriter, nnWriter, + (ContainerNode) NetconfUtil.transformDOMSourceToNormalizedNode(schemaCtx, + ((DOMSourceAnyxmlNode)data).body()).getResult()); + } catch (XMLStreamException | URISyntaxException | SAXException e) { + throw new IOException("Cannot write anyxml", e); + } + } else { + writeElements(xmlWriter, nnWriter, (ContainerNode) data); + } } else if (pathContext.getSchemaNode() instanceof RpcDefinition) { nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, ((RpcDefinition) pathContext.getSchemaNode()).getOutput().getPath(), depth); @@ -119,7 +135,9 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter depth) { + final EffectiveModelContext schemaContext, final SchemaPath schemaPath, final @Nullable Integer depth) { final NormalizedNodeStreamWriter xmlStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, schemaContext, schemaPath); - if (depth.isPresent()) { - return DepthAwareNormalizedNodeWriter.forStreamWriter(xmlStreamWriter, depth.get()); + if (depth != null) { + return DepthAwareNormalizedNodeWriter.forStreamWriter(xmlStreamWriter, depth); } return RestconfDelegatingNormalizedNodeWriter.forStreamWriter(xmlStreamWriter); } private static void writeElements(final XMLStreamWriter xmlWriter, final RestconfNormalizedNodeWriter nnWriter, - final ContainerNode data) - throws IOException { + final ContainerNode data) throws IOException { + final QName name = data.getIdentifier().getNodeType(); try { - final QName name = data.getNodeType(); xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, name.getLocalName(), name.getNamespace().toString()); xmlWriter.writeDefaultNamespace(name.getNamespace().toString()); - for (final NormalizedNode child : data.getValue()) { + for (final NormalizedNode child : data.body()) { nnWriter.write(child); } nnWriter.flush(); xmlWriter.writeEndElement(); xmlWriter.flush(); } catch (final XMLStreamException e) { - Throwables.propagate(e); + throw new IOException("Failed to write elements", e); } } }