Merge "Reduce/enhance logging in AbstractLeader"
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / sal / rest / impl / NormalizedNodeXmlBodyWriter.java
index bab26dfc012b1a620f2e0a619ef3d93d10b0bb2e..f61ec4e1c0941abef0fee706962b6a732af9c858 100644 (file)
@@ -26,9 +26,6 @@ import org.opendaylight.controller.sal.rest.api.Draft02;
 import org.opendaylight.controller.sal.rest.api.RestconfService;
 import org.opendaylight.controller.sal.restconf.impl.InstanceIdentifierContext;
 import org.opendaylight.controller.sal.restconf.impl.NormalizedNodeContext;
-import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException;
-import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorTag;
-import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -39,6 +36,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XMLStreamNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
@@ -71,19 +69,17 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
             final Annotation[] annotations, final MediaType mediaType,
             final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException,
             WebApplicationException {
-        InstanceIdentifierContext pathContext = t.getInstanceIdentifierContext();
+        final InstanceIdentifierContext<?> pathContext = t.getInstanceIdentifierContext();
         if (t.getData() == null) {
-            throw new RestconfDocumentedException(
-                    "Request could not be completed because the relevant data model content does not exist.",
-                    ErrorType.APPLICATION, ErrorTag.DATA_MISSING);
+            return;
         }
 
         XMLStreamWriter xmlWriter;
         try {
             xmlWriter = XML_FACTORY.createXMLStreamWriter(entityStream);
-        } catch (XMLStreamException e) {
+        } catch (final XMLStreamException e) {
             throw new IllegalStateException(e);
-        } catch (FactoryConfigurationError e) {
+        } catch (final FactoryConfigurationError e) {
             throw new IllegalStateException(e);
         }
         NormalizedNode<?, ?> data = t.getData();
@@ -92,13 +88,16 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
         boolean isDataRoot = false;
         if (SchemaPath.ROOT.equals(schemaPath)) {
             isDataRoot = true;
+        }  else if (pathContext.getSchemaNode() instanceof RpcDefinition) {
+            isDataRoot = true;
+            schemaPath = ((RpcDefinition) pathContext.getSchemaNode()).getOutput().getPath();
         } else {
             schemaPath = schemaPath.getParent();
         }
 
-        NormalizedNodeStreamWriter jsonWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter,
+        final NormalizedNodeStreamWriter jsonWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter,
                 pathContext.getSchemaContext(), schemaPath);
-        NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(jsonWriter);
+        final NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(jsonWriter);
         if (isDataRoot) {
             writeRootElement(xmlWriter, nnWriter, (ContainerNode) data);
         } else {
@@ -112,18 +111,18 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
         }
     }
 
-    private void writeRootElement(XMLStreamWriter xmlWriter, NormalizedNodeWriter nnWriter, ContainerNode data)
+    private void writeRootElement(final XMLStreamWriter xmlWriter, final NormalizedNodeWriter nnWriter, final ContainerNode data)
             throws IOException {
         try {
-            QName name = SchemaContext.NAME;
+            final QName name = SchemaContext.NAME;
             xmlWriter.writeStartElement(name.getNamespace().toString(), name.getLocalName());
-            for (DataContainerChild<? extends PathArgument, ?> child : data.getValue()) {
+            for (final DataContainerChild<? extends PathArgument, ?> child : data.getValue()) {
                 nnWriter.write(child);
             }
             nnWriter.flush();
             xmlWriter.writeEndElement();
             xmlWriter.flush();
-        } catch (XMLStreamException e) {
+        } catch (final XMLStreamException e) {
             Throwables.propagate(e);
         }
     }