X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frest%2Fimpl%2FXmlNormalizedNodeBodyReader.java;h=bf668fa7fdd1583a2d0f3626d8f5e633a5da51b7;hb=fdb31721b3b17060158556f3e36be5800be18a07;hp=905cb50c3a8bbcc2f916fb62cdb2ec017903b45e;hpb=6561b5cd3b3d2d8bcb26a6c4f3b8efa52b63523d;p=controller.git diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlNormalizedNodeBodyReader.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlNormalizedNodeBodyReader.java index 905cb50c3a..bf668fa7fd 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlNormalizedNodeBodyReader.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/XmlNormalizedNodeBodyReader.java @@ -38,6 +38,8 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -83,6 +85,11 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro try { final Optional path = getIdentifierWithSchema(); + if (entityStream.available() < 1) { + // represent empty nopayload input + return new NormalizedNodeContext(path.get(), null); + } + final DocumentBuilder dBuilder; try { dBuilder = BUILDERFACTORY.newDocumentBuilder(); @@ -94,22 +101,29 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro final NormalizedNode result = parse(path.get(),doc); return new NormalizedNodeContext(path.get(),result); } catch (final Exception e) { - LOG.debug("Error parsing json input", e); + LOG.debug("Error parsing xml input", e); throw new RestconfDocumentedException("Error parsing input: " + e.getMessage(), ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); } } - private static NormalizedNode parse(final InstanceIdentifierContext pathContext,final Document doc) { + private static NormalizedNode parse(final InstanceIdentifierContext pathContext,final Document doc) { final List elements = Collections.singletonList(doc.getDocumentElement()); - DataSchemaNode schemaNode = pathContext.getSchemaNode(); + final SchemaNode schemaNodeContext = pathContext.getSchemaNode(); + DataSchemaNode schemaNode = null; + if (schemaNodeContext instanceof RpcDefinition) { + schemaNode = ((RpcDefinition) schemaNodeContext).getInput(); + } else if (schemaNodeContext instanceof DataSchemaNode) { + schemaNode = (DataSchemaNode) schemaNodeContext; + } else { + throw new IllegalStateException("Unknow SchemaNode"); + } final String docRootElm = doc.getDocumentElement().getLocalName(); final String schemaNodeName = pathContext.getSchemaNode().getQName().getLocalName(); - // TODO : do we want to really follow netconf-restconf specification ? if (!schemaNodeName.equalsIgnoreCase(docRootElm)) { final Collection children = ((DataNodeContainer) schemaNode).getChildNodes(); for (final DataSchemaNode child : children) { @@ -129,7 +143,7 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro } else if(schemaNode instanceof ListSchemaNode) { final ListSchemaNode casted = (ListSchemaNode) schemaNode; return parserFactory.getMapEntryNodeParser().parse(elements, casted); - } + } // FIXME : add another DataSchemaNode extensions e.g. LeafSchemaNode return null; } }