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%2Fget%2FAbstractGet.java;h=f02bc08adf0a1c5c95d34b225a1e64cc1a966049;hb=9d217801ee72b49cfd68d9499bb57359d1e14d0e;hp=5acceb359b8bc24b1b59f16571db049abebd8c1b;hpb=e0460d542f7088c543e51fd01917b3d360a1c1e2;p=netconf.git diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java index 5acceb359b..f02bc08adf 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/get/AbstractGet.java @@ -5,23 +5,21 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.mdsal.connector.ops.get; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Optional; -import com.google.common.base.Throwables; import com.google.common.collect.Iterables; import java.io.IOException; +import java.util.Optional; 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.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.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.ops.Datastore; @@ -30,10 +28,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; 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.api.schema.stream.NormalizedNodeWriter; -import org.opendaylight.yangtools.yang.data.impl.codec.xml.XMLStreamNormalizedNodeStreamWriter; +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.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -62,6 +62,7 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { protected Node transformNormalizedNode(final Document document, final NormalizedNode data, final YangInstanceIdentifier dataRoot) { + final DOMResult result = new DOMResult(document.createElement(XmlNetconfConstants.DATA_KEY)); final XMLStreamWriter xmlWriter = getXmlStreamWriter(result); @@ -71,11 +72,19 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { final NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(nnStreamWriter, true); - writeRootElement(xmlWriter, nnWriter, (ContainerNode) data); + if (data instanceof ContainerNode) { + writeRootElement(xmlWriter, nnWriter, (ContainerNode) data); + } else if (data instanceof MapNode) { + writeRootElement(xmlWriter, nnWriter, (MapNode) data); + } else { + throw new IllegalArgumentException("Unable to transform node of type: " + data.getClass().toString() + + " offending node: " + data.toString()); + } + return result.getNode(); } - private XMLStreamWriter getXmlStreamWriter(final DOMResult result) { + private static XMLStreamWriter getXmlStreamWriter(final DOMResult result) { try { return XML_OUTPUT_FACTORY.createXMLStreamWriter(result); } catch (final XMLStreamException e) { @@ -83,12 +92,12 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { } } - private SchemaPath getSchemaPath(final YangInstanceIdentifier dataRoot) { + private static SchemaPath getSchemaPath(final YangInstanceIdentifier dataRoot) { return SchemaPath.create( Iterables.transform(dataRoot.getPathArguments(), PathArgument::getNodeType), dataRoot.equals(ROOT)); } - private void writeRootElement(final XMLStreamWriter xmlWriter, final NormalizedNodeWriter nnWriter, + private static void writeRootElement(final XMLStreamWriter xmlWriter, final NormalizedNodeWriter nnWriter, final ContainerNode data) { try { if (data.getNodeType().equals(SchemaContext.NAME)) { @@ -101,12 +110,29 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { nnWriter.flush(); xmlWriter.flush(); } catch (XMLStreamException | IOException e) { - Throwables.propagate(e); + throw new RuntimeException(e); + } + } + + private static void writeRootElement(final XMLStreamWriter xmlWriter, final NormalizedNodeWriter nnWriter, + final MapNode data) { + try { + if (data.getNodeType().equals(SchemaContext.NAME)) { + for (final MapEntryNode child : data.getValue()) { + nnWriter.write(child); + } + } else { + nnWriter.write(data); + } + nnWriter.flush(); + xmlWriter.flush(); + } catch (XMLStreamException | IOException e) { + throw new RuntimeException(e); } } protected Element serializeNodeWithParentStructure(final Document document, final YangInstanceIdentifier dataRoot, - final NormalizedNode node) { + final NormalizedNode node) { if (!dataRoot.equals(ROOT)) { return (Element) transformNormalizedNode(document, ImmutableNodes.fromInstanceId(schemaContext.getCurrentContext(), dataRoot, node), @@ -129,7 +155,7 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { final Optional filterElement = operationElement.getOnlyChildElementOptionally(FILTER); if (filterElement.isPresent()) { if (filterElement.get().getChildElements().size() == 0) { - return Optional.absent(); + return Optional.empty(); } return Optional.of(getInstanceIdentifierFromFilter(filterElement.get())); } @@ -161,7 +187,7 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { try { validateInputRpc(xml, operationName); } catch (final DocumentedException e) { - throw new DocumentedException("Incorrect RPC: " + e.getMessage(), e.getErrorType(), e.getErrorTag(), + throw new DocumentedException("Incorrect RPC: " + e.getMessage(), e, e.getErrorType(), e.getErrorTag(), e.getErrorSeverity(), e.getErrorInfo()); } @@ -169,8 +195,8 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { try { sourceDatastore = parseSource(xml); } catch (final DocumentedException e) { - throw new DocumentedException("Get-config source attribute error: " + e.getMessage(), e.getErrorType(), - e.getErrorTag(), e.getErrorSeverity(), e.getErrorInfo()); + throw new DocumentedException("Get-config source attribute error: " + e.getMessage(), e, + e.getErrorType(), e.getErrorTag(), e.getErrorSeverity(), e.getErrorInfo()); } return new GetConfigExecution(sourceDatastore); @@ -179,10 +205,9 @@ public abstract class AbstractGet extends AbstractSingletonNetconfOperation { private static Optional parseSource(final XmlElement xml) throws DocumentedException { final Optional sourceElement = xml.getOnlyChildElementOptionally(XmlNetconfConstants.SOURCE_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); - return sourceElement.isPresent() ? Optional.of(Datastore.valueOf(sourceElement.get().getOnlyChildElement().getName())) - : Optional.absent(); + : Optional.empty(); } private static void validateInputRpc(final XmlElement xml, final String operationName) throws