X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fmdsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fmdsal%2Fconnector%2Fops%2FRuntimeRpc.java;h=a2f8c1b6ef3d6f86bee692b606c9689ef2aa1cd9;hb=afce5ad359932ef84f239e59888fe041ac7113c9;hp=2b18e2c2c569e1624a51ddaf15e5f8e1f959827d;hpb=4469e472b3208c5d472ce3970f4a875f9fae830e;p=netconf.git diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java index 2b18e2c2c5..a2f8c1b6ef 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/RuntimeRpc.java @@ -9,7 +9,6 @@ package org.opendaylight.netconf.mdsal.connector.ops; import com.google.common.base.Optional; -import com.google.common.base.Throwables; import com.google.common.util.concurrent.CheckedFuture; import java.io.IOException; import java.net.URI; @@ -21,17 +20,18 @@ import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.dom.DOMResult; -import org.opendaylight.controller.config.util.xml.DocumentedException; -import org.opendaylight.controller.config.util.xml.DocumentedException.ErrorSeverity; -import org.opendaylight.controller.config.util.xml.DocumentedException.ErrorTag; -import org.opendaylight.controller.config.util.xml.DocumentedException.ErrorType; -import org.opendaylight.controller.config.util.xml.XmlElement; -import org.opendaylight.controller.config.util.xml.XmlMappingConstants; -import org.opendaylight.controller.config.util.xml.XmlUtil; +import javax.xml.transform.dom.DOMSource; import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import org.opendaylight.netconf.api.DocumentedException; +import org.opendaylight.netconf.api.DocumentedException.ErrorSeverity; +import org.opendaylight.netconf.api.DocumentedException.ErrorTag; +import org.opendaylight.netconf.api.DocumentedException.ErrorType; +import org.opendaylight.netconf.api.NetconfDocumentedException; +import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.mapping.api.HandlingPriority; import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; @@ -41,9 +41,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; 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.codec.xml.XmlParserStream; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; import org.opendaylight.yangtools.yang.data.impl.schema.SchemaOrderedNormalizedNodeWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser.DomToNormalizedNodeParserFactory; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; @@ -104,8 +105,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { //this returns module with the newest revision if more then 1 module with same namespace is found private Optional getModule(final URI namespaceURI) { - return Optional.fromNullable( - schemaContext.getCurrentContext().findModuleByNamespaceAndRevision(namespaceURI, null)); + return Optional.fromJavaUtil(schemaContext.getCurrentContext().findModule(namespaceURI)); } private static Optional getRpcDefinitionFromModule(final Module module, final URI namespaceURI, @@ -129,7 +129,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { netconfOperationNamespace = operationElement.getNamespace(); } catch (final DocumentedException e) { LOG.debug("Cannot retrieve netconf operation namespace from message due to ", e); - throw new DocumentedException("Cannot retrieve netconf operation namespace from message", + throw new DocumentedException("Cannot retrieve netconf operation namespace from message", e, ErrorType.PROTOCOL, ErrorTag.UNKNOWN_NAMESPACE, ErrorSeverity.ERROR); } @@ -181,7 +181,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { final Map attributes = requestElement.getAttributes(); final Element response = handle(document, operationElement, subsequentOperation); - final Element rpcReply = XmlUtil.createElement(document, XmlMappingConstants.RPC_REPLY_KEY, + final Element rpcReply = XmlUtil.createElement(document, XmlNetconfConstants.RPC_REPLY_KEY, Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); if (XmlElement.fromDomElement(response).hasNamespace()) { @@ -206,7 +206,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { private Node transformNormalizedNode(final Document document, final NormalizedNode data, final SchemaPath rpcOutputPath) { - final DOMResult result = new DOMResult(document.createElement(XmlMappingConstants.RPC_REPLY_KEY)); + final DOMResult result = new DOMResult(document.createElement(XmlNetconfConstants.RPC_REPLY_KEY)); final XMLStreamWriter xmlWriter = getXmlStreamWriter(result); @@ -243,7 +243,7 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { nnWriter.flush(); xmlWriter.flush(); } catch (XMLStreamException | IOException e) { - Throwables.propagate(e); + throw new RuntimeException(e); } } @@ -254,12 +254,26 @@ public class RuntimeRpc extends AbstractSingletonNetconfOperation { * @param input input container schema node, or null if rpc does not take any input * @return parsed rpc into normalized node, or null if input schema is null */ + @SuppressWarnings("checkstyle:IllegalCatch") @Nullable - private NormalizedNode rpcToNNode(final XmlElement element, @Nullable final ContainerSchemaNode input) { - return input.getChildNodes().isEmpty() ? null : DomToNormalizedNodeParserFactory - .getInstance(DomUtils.defaultValueCodecProvider(), schemaContext.getCurrentContext()) - .getContainerNodeParser() - .parse(Collections.singletonList(element.getDomElement()), input); + private NormalizedNode rpcToNNode(final XmlElement element, @Nullable final ContainerSchemaNode input) + throws DocumentedException { + if (input == null || input.getChildNodes().isEmpty()) { + return null; + } + + final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); + final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); + final XmlParserStream xmlParser = XmlParserStream.create(writer, schemaContext.getCurrentContext(), input); + + try { + xmlParser.traverse(new DOMSource(element.getDomElement())); + } catch (final Exception ex) { + throw new NetconfDocumentedException("Error parsing input: " + ex.getMessage(), ex, ErrorType.PROTOCOL, + ErrorTag.MALFORMED_MESSAGE, ErrorSeverity.ERROR); + } + + return resultHolder.getResult(); } }