Introduce CREATE_SUBSCRIPTION_RPC_PATH
[netconf.git] / netconf / sal-netconf-connector / src / main / java / org / opendaylight / netconf / sal / connect / netconf / util / NetconfMessageTransformUtil.java
index defc0025e6295a288d5e6f44d67310d832237c15..2987e253a76933a2c3d223b1b204b7a11adeea95 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.netconf.sal.connect.netconf.util;
 
+import static org.opendaylight.netconf.util.NetconfUtil.NETCONF_DATA_QNAME;
+import static org.opendaylight.netconf.util.NetconfUtil.NETCONF_QNAME;
+
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 import java.io.IOException;
 import java.net.URI;
 import java.time.Instant;
@@ -40,6 +42,7 @@ import org.opendaylight.netconf.api.xml.XmlUtil;
 import org.opendaylight.netconf.notifications.NetconfNotification;
 import org.opendaylight.netconf.sal.connect.util.MessageCounter;
 import org.opendaylight.netconf.util.NetconfUtil;
+import org.opendaylight.netconf.util.NodeContainerProxy;
 import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.edit.config.input.EditContent;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
@@ -62,7 +65,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
 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.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
 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.Builders;
@@ -114,11 +116,8 @@ public final class NetconfMessageTransformUtil {
     public static final QName IETF_NETCONF_NOTIFICATIONS =
             QName.create(NetconfCapabilityChange.QNAME, "ietf-netconf-notifications").intern();
 
-    public static final QName NETCONF_QNAME =
-            QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "netconf").intern();
     public static final URI NETCONF_URI = NETCONF_QNAME.getNamespace();
 
-    public static final QName NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data").intern();
     public static final NodeIdentifier NETCONF_DATA_NODEID = NodeIdentifier.create(NETCONF_DATA_QNAME);
 
     public static final QName NETCONF_RPC_REPLY_QNAME = QName.create(NETCONF_QNAME, "rpc-reply").intern();
@@ -207,6 +206,8 @@ public final class NetconfMessageTransformUtil {
     public static final ContainerNode CREATE_SUBSCRIPTION_RPC_CONTENT = Builders.containerBuilder()
             .withNodeIdentifier(NodeIdentifier.create(CREATE_SUBSCRIPTION_RPC_QNAME)).build();
 
+    public static final SchemaPath CREATE_SUBSCRIPTION_RPC_PATH = toPath(CREATE_SUBSCRIPTION_RPC_QNAME);
+
     public static final NodeIdentifier NETCONF_FILTER_NODEID = NodeIdentifier.create(NETCONF_FILTER_QNAME);
 
     public static final DataContainerChild<?, ?> EMPTY_FILTER;
@@ -344,7 +345,7 @@ public final class NetconfMessageTransformUtil {
             final Optional<ModifyAction> operation,
             final Optional<NormalizedNode<?, ?>> lastChildOverride) {
         final NormalizedNode<?, ?> configContent;
-
+        final NormalizedMetadata metadata;
         if (dataPath.isEmpty()) {
             Preconditions.checkArgument(lastChildOverride.isPresent(),
                     "Data has to be present when creating structure for top level element");
@@ -352,11 +353,12 @@ public final class NetconfMessageTransformUtil {
                     "Data has to be either container or a list node when creating structure for top level element, "
                             + "but was: %s", lastChildOverride.get());
             configContent = lastChildOverride.get();
+            metadata = null;
         } else {
             configContent = ImmutableNodes.fromInstanceId(ctx, dataPath, lastChildOverride);
+            metadata = operation.map(oper -> leafMetadata(dataPath, oper)).orElse(null);
         }
 
-        final NormalizedMetadata metadata = operation.map(oper -> leafMetadata(configContent, oper)).orElse(null);
         final Element element = XmlUtil.createElement(BLANK_DOCUMENT, NETCONF_CONFIG_QNAME.getLocalName(),
                 Optional.of(NETCONF_CONFIG_QNAME.getNamespace().toString()));
 
@@ -370,30 +372,14 @@ public final class NetconfMessageTransformUtil {
                 .build();
     }
 
-    private static NormalizedMetadata leafMetadata(final NormalizedNode<?, ?> node, final ModifyAction oper) {
-        final Deque<Builder> builders = new ArrayDeque<>();
+    private static NormalizedMetadata leafMetadata(final YangInstanceIdentifier path, final ModifyAction oper) {
+        final List<PathArgument> args = path.getPathArguments();
+        final Deque<Builder> builders = new ArrayDeque<>(args.size());
 
         // Step one: open builders
-        NormalizedNode<?, ?> currentNode = node;
-        do {
-            builders.push(ImmutableNormalizedMetadata.builder().withIdentifier(currentNode.getIdentifier()));
-            if (currentNode instanceof NormalizedNodeContainer) {
-                final Collection<NormalizedNode<?, ?>> children =
-                        ((NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) currentNode).getValue();
-                switch (children.size()) {
-                    case 0:
-                        currentNode = null;
-                        break;
-                    case 1:
-                        currentNode = Iterables.getOnlyElement(children);
-                        break;
-                    default:
-                        throw new IllegalStateException("Unexpected container " + currentNode);
-                }
-            } else {
-                currentNode = null;
-            }
-        } while (currentNode != null);
+        for (PathArgument arg : args) {
+            builders.push(ImmutableNormalizedMetadata.builder().withIdentifier(arg));
+        }
 
         // Step two: set the top builder's metadata
         builders.peek().withAnnotation(NETCONF_OPERATION_QNAME_LEGACY, oper.toString().toLowerCase(Locale.US));
@@ -481,7 +467,7 @@ public final class NetconfMessageTransformUtil {
         final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
                 domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
 
-        Element specificActionElement = document.createElement(action);
+        final Element specificActionElement = document.createElement(action);
         actionData.appendChild(specificActionElement);
         rpcNS.appendChild(actionNS);
         document.appendChild(rpcNS);
@@ -493,7 +479,7 @@ public final class NetconfMessageTransformUtil {
         if (iterator.hasNext()) {
             final PathArgument next = iterator.next();
 
-            DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
+            final DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
             Preconditions.checkArgument(current != null, "Invalid input: schema for argument %s not found", next);
 
             if (current.isMixin()) {