Rename netconf.api.ModifyAction to EffectiveOperation
[netconf.git] / netconf / sal-netconf-connector / src / main / java / org / opendaylight / netconf / sal / connect / netconf / util / NetconfMessageTransformUtil.java
index e740c6d9a91d5a5e1e1b7af76daea4daa45f64d8..c9d47815f6561eb074d26e369a7b99a2e4e81550 100644 (file)
@@ -34,8 +34,8 @@ import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.netconf.api.DocumentedException;
+import org.opendaylight.netconf.api.EffectiveOperation;
 import org.opendaylight.netconf.api.FailedNetconfMessage;
-import org.opendaylight.netconf.api.ModifyAction;
 import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.api.NetconfMessage;
 import org.opendaylight.netconf.api.xml.XmlElement;
@@ -81,8 +81,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.SchemaOrderedNormalizedN
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -139,23 +139,26 @@ public final class NetconfMessageTransformUtil {
     public static final @NonNull NodeIdentifier NETCONF_ERROR_OPTION_NODEID =
         NodeIdentifier.create(NETCONF_ERROR_OPTION_QNAME);
     public static final @NonNull QName NETCONF_RUNNING_QNAME = QName.create(NETCONF_QNAME, "running").intern();
+    public static final @NonNull NodeIdentifier NETCONF_RUNNING_NODEID = NodeIdentifier.create(NETCONF_RUNNING_QNAME);
     public static final @NonNull QName NETCONF_SOURCE_QNAME = QName.create(NETCONF_QNAME, "source").intern();
     public static final @NonNull NodeIdentifier NETCONF_SOURCE_NODEID = NodeIdentifier.create(NETCONF_SOURCE_QNAME);
     public static final @NonNull QName NETCONF_CANDIDATE_QNAME = QName.create(NETCONF_QNAME, "candidate").intern();
+    public static final @NonNull NodeIdentifier NETCONF_CANDIDATE_NODEID =
+        NodeIdentifier.create(NETCONF_CANDIDATE_QNAME);
     public static final @NonNull QName NETCONF_TARGET_QNAME = QName.create(NETCONF_QNAME, "target").intern();
     public static final @NonNull NodeIdentifier NETCONF_TARGET_NODEID = NodeIdentifier.create(NETCONF_TARGET_QNAME);
     public static final @NonNull QName NETCONF_CONFIG_QNAME = QName.create(NETCONF_QNAME, "config").intern();
     public static final @NonNull NodeIdentifier NETCONF_CONFIG_NODEID = NodeIdentifier.create(NETCONF_CONFIG_QNAME);
 
     public static final @NonNull QName NETCONF_COMMIT_QNAME = QName.create(NETCONF_QNAME, "commit").intern();
-    public static final @NonNull SchemaPath NETCONF_COMMIT_PATH = toPath(NETCONF_COMMIT_QNAME);
+    public static final @NonNull Absolute NETCONF_COMMIT_PATH = toPath(NETCONF_COMMIT_QNAME);
     public static final @NonNull QName NETCONF_VALIDATE_QNAME = QName.create(NETCONF_QNAME, "validate").intern();
     public static final @NonNull NodeIdentifier NETCONF_VALIDATE_NODEID = NodeIdentifier.create(NETCONF_VALIDATE_QNAME);
-    public static final @NonNull SchemaPath NETCONF_VALIDATE_PATH = toPath(NETCONF_VALIDATE_QNAME);
+    public static final @NonNull Absolute NETCONF_VALIDATE_PATH = toPath(NETCONF_VALIDATE_QNAME);
     public static final @NonNull QName NETCONF_COPY_CONFIG_QNAME = QName.create(NETCONF_QNAME, "copy-config").intern();
     public static final @NonNull NodeIdentifier NETCONF_COPY_CONFIG_NODEID =
         NodeIdentifier.create(NETCONF_COPY_CONFIG_QNAME);
-    public static final @NonNull SchemaPath NETCONF_COPY_CONFIG_PATH = toPath(NETCONF_COPY_CONFIG_QNAME);
+    public static final @NonNull Absolute NETCONF_COPY_CONFIG_PATH = toPath(NETCONF_COPY_CONFIG_QNAME);
 
     public static final @NonNull QName NETCONF_OPERATION_QNAME = QName.create(NETCONF_QNAME, "operation").intern();
     private static final @NonNull QName NETCONF_OPERATION_QNAME_LEGACY =
@@ -167,18 +170,18 @@ public final class NetconfMessageTransformUtil {
     public static final @NonNull QName NETCONF_EDIT_CONFIG_QNAME = QName.create(NETCONF_QNAME, "edit-config").intern();
     public static final @NonNull NodeIdentifier NETCONF_EDIT_CONFIG_NODEID =
         NodeIdentifier.create(NETCONF_EDIT_CONFIG_QNAME);
-    public static final @NonNull SchemaPath NETCONF_EDIT_CONFIG_PATH = toPath(NETCONF_EDIT_CONFIG_QNAME);
+    public static final @NonNull Absolute NETCONF_EDIT_CONFIG_PATH = toPath(NETCONF_EDIT_CONFIG_QNAME);
     public static final @NonNull QName NETCONF_GET_CONFIG_QNAME = QName.create(NETCONF_QNAME, "get-config");
     public static final @NonNull NodeIdentifier NETCONF_GET_CONFIG_NODEID =
         NodeIdentifier.create(NETCONF_GET_CONFIG_QNAME);
-    public static final @NonNull SchemaPath NETCONF_GET_CONFIG_PATH = toPath(NETCONF_GET_CONFIG_QNAME);
+    public static final @NonNull Absolute NETCONF_GET_CONFIG_PATH = toPath(NETCONF_GET_CONFIG_QNAME);
     public static final @NonNull QName NETCONF_DISCARD_CHANGES_QNAME = QName.create(NETCONF_QNAME, "discard-changes");
-    public static final @NonNull SchemaPath NETCONF_DISCARD_CHANGES_PATH = toPath(NETCONF_DISCARD_CHANGES_QNAME);
+    public static final @NonNull Absolute NETCONF_DISCARD_CHANGES_PATH = toPath(NETCONF_DISCARD_CHANGES_QNAME);
     public static final @NonNull QName NETCONF_TYPE_QNAME = QName.create(NETCONF_QNAME, "type").intern();
     public static final @NonNull QName NETCONF_FILTER_QNAME = QName.create(NETCONF_QNAME, "filter").intern();
     public static final @NonNull QName NETCONF_GET_QNAME = QName.create(NETCONF_QNAME, "get").intern();
     public static final @NonNull NodeIdentifier NETCONF_GET_NODEID = NodeIdentifier.create(NETCONF_GET_QNAME);
-    public static final @NonNull SchemaPath NETCONF_GET_PATH = toPath(NETCONF_GET_QNAME);
+    public static final @NonNull Absolute NETCONF_GET_PATH = toPath(NETCONF_GET_QNAME);
     public static final @NonNull QName NETCONF_RPC_QNAME = QName.create(NETCONF_QNAME, "rpc").intern();
     public static final QName YANG_QNAME = null;
     public static final URI NETCONF_ACTION_NAMESPACE = URI.create("urn:ietf:params:xml:ns:yang:1");
@@ -199,10 +202,10 @@ public final class NetconfMessageTransformUtil {
 
     public static final @NonNull QName NETCONF_LOCK_QNAME = QName.create(NETCONF_QNAME, "lock").intern();
     public static final @NonNull NodeIdentifier NETCONF_LOCK_NODEID = NodeIdentifier.create(NETCONF_LOCK_QNAME);
-    public static final @NonNull SchemaPath NETCONF_LOCK_PATH = toPath(NETCONF_LOCK_QNAME);
+    public static final @NonNull Absolute NETCONF_LOCK_PATH = toPath(NETCONF_LOCK_QNAME);
     public static final @NonNull QName NETCONF_UNLOCK_QNAME = QName.create(NETCONF_QNAME, "unlock").intern();
     public static final @NonNull NodeIdentifier NETCONF_UNLOCK_NODEID = NodeIdentifier.create(NETCONF_UNLOCK_QNAME);
-    public static final @NonNull SchemaPath NETCONF_UNLOCK_PATH = toPath(NETCONF_UNLOCK_QNAME);
+    public static final @NonNull Absolute NETCONF_UNLOCK_PATH = toPath(NETCONF_UNLOCK_QNAME);
 
     public static final @NonNull NodeIdentifier EDIT_CONTENT_NODEID = NodeIdentifier.create(EditContent.QNAME);
 
@@ -222,7 +225,7 @@ public final class NetconfMessageTransformUtil {
     public static final @NonNull ContainerNode CREATE_SUBSCRIPTION_RPC_CONTENT = Builders.containerBuilder()
             .withNodeIdentifier(NodeIdentifier.create(CREATE_SUBSCRIPTION_RPC_QNAME)).build();
 
-    public static final @NonNull SchemaPath CREATE_SUBSCRIPTION_RPC_PATH = toPath(CREATE_SUBSCRIPTION_RPC_QNAME);
+    public static final @NonNull Absolute CREATE_SUBSCRIPTION_RPC_PATH = toPath(CREATE_SUBSCRIPTION_RPC_QNAME);
 
     public static final @NonNull NodeIdentifier NETCONF_FILTER_NODEID = NodeIdentifier.create(NETCONF_FILTER_QNAME);
 
@@ -239,7 +242,7 @@ public final class NetconfMessageTransformUtil {
                                                        final EffectiveModelContext ctx) {
         final Element element = getNetconfFilterElement();
         try {
-            NetconfUtil.writeFilter(identifier, new DOMResult(element), SchemaPath.ROOT, ctx);
+            NetconfUtil.writeFilter(identifier, new DOMResult(element), ctx, null);
         } catch (IOException | XMLStreamException e) {
             throw new IllegalStateException("Unable to serialize filter element for path " + identifier, e);
         }
@@ -261,7 +264,7 @@ public final class NetconfMessageTransformUtil {
 
         for (final FieldsFilter filter : fieldsFilters) {
             try {
-                NetconfUtil.writeFilter(filter.path(), new DOMResult(element), SchemaPath.ROOT, ctx, filter.fields());
+                NetconfUtil.writeFilter(filter.path(), new DOMResult(element), ctx, null, filter.fields());
             } catch (IOException | XMLStreamException e) {
                 throw new IllegalStateException(String.format(
                         "Unable to serialize filter element for path %s with fields: %s",
@@ -322,8 +325,8 @@ public final class NetconfMessageTransformUtil {
                         ex.getLocalizedMessage(), null, infoBuilder.toString(), ex.getCause());
     }
 
-    public static NodeIdentifier toId(final PathArgument qname) {
-        return qname instanceof NodeIdentifier ? (NodeIdentifier) qname : toId(qname.getNodeType());
+    public static NodeIdentifier toId(final PathArgument arg) {
+        return arg instanceof NodeIdentifier nodeId ? nodeId : toId(arg.getNodeType());
     }
 
     public static NodeIdentifier toId(final QName nodeType) {
@@ -354,13 +357,13 @@ public final class NetconfMessageTransformUtil {
      *
      * @param ctx {@link EffectiveModelContext} device's model context
      * @param dataPath {@link YangInstanceIdentifier} path to data in device's data-store
-     * @param operation Optional of {@link ModifyAction} action to be invoked
+     * @param operation Optional of {@link EffectiveOperation} action to be invoked
      * @param lastChildOverride Optional of {@code NormalizedNode} data on which action will be invoked
      * @return {@link DOMSourceAnyxmlNode} containing edit-config structure
      */
     public static DOMSourceAnyxmlNode createEditConfigAnyxml(
             final EffectiveModelContext ctx, final YangInstanceIdentifier dataPath,
-            final Optional<ModifyAction> operation, final Optional<NormalizedNode> lastChildOverride) {
+            final Optional<EffectiveOperation> operation, final Optional<NormalizedNode> lastChildOverride) {
         if (dataPath.isEmpty()) {
             Preconditions.checkArgument(lastChildOverride.isPresent(),
                     "Data has to be present when creating structure for top level element");
@@ -385,10 +388,9 @@ public final class NetconfMessageTransformUtil {
                         nnWriter.write(lastChildOverride.get());
                     }
                 }
-                NetconfUtil.writeNormalizedNode(result.getResult(), metadata, new DOMResult(element),
-                        SchemaPath.ROOT, ctx);
+                NetconfUtil.writeNormalizedNode(result.getResult(), metadata, new DOMResult(element), ctx, null);
             } else {
-                NetconfUtil.writeNormalizedNode(dataPath, metadata, new DOMResult(element), SchemaPath.ROOT, ctx);
+                NetconfUtil.writeNormalizedNode(dataPath, metadata, new DOMResult(element), ctx, null);
             }
         } catch (final IOException | XMLStreamException e) {
             throw new IllegalStateException("Unable to serialize edit config content element for path " + dataPath, e);
@@ -398,7 +400,7 @@ public final class NetconfMessageTransformUtil {
                 .build();
     }
 
-    private static NormalizedMetadata leafMetadata(final YangInstanceIdentifier path, final ModifyAction oper) {
+    private static NormalizedMetadata leafMetadata(final YangInstanceIdentifier path, final EffectiveOperation oper) {
         final List<PathArgument> args = path.getPathArguments();
         final Deque<Builder> builders = new ArrayDeque<>(args.size());
 
@@ -423,14 +425,14 @@ public final class NetconfMessageTransformUtil {
     }
 
     public static DataContainerChild createEditConfigStructure(final EffectiveModelContext ctx,
-            final YangInstanceIdentifier dataPath, final Optional<ModifyAction> operation,
+            final YangInstanceIdentifier dataPath, final Optional<EffectiveOperation> operation,
             final Optional<NormalizedNode> lastChildOverride) {
         return Builders.choiceBuilder().withNodeIdentifier(EDIT_CONTENT_NODEID)
                 .withChild(createEditConfigAnyxml(ctx, dataPath, operation, lastChildOverride)).build();
     }
 
-    public static @NonNull SchemaPath toPath(final QName rpc) {
-        return SchemaPath.ROOT.createChild(rpc);
+    public static @NonNull Absolute toPath(final QName rpc) {
+        return Absolute.of(rpc);
     }
 
     public static Map.Entry<Instant, XmlElement> stripNotification(final NetconfMessage message) {
@@ -533,20 +535,19 @@ public final class NetconfMessageTransformUtil {
         }
     }
 
-    @SuppressWarnings("checkstyle:IllegalCatch")
     public static void writeNormalizedOperationInput(final ContainerNode normalized, final DOMResult result,
             final Absolute operationPath, final EffectiveModelContext baseNetconfCtx)
                 throws IOException, XMLStreamException {
-        final QName inputQName = YangConstants.operationInputQName(operationPath.lastNodeIdentifier().getModule());
-        // FIXME: eliminate this conversion
-        final SchemaPath inputPath = SchemaPath.of(operationPath).createChild(inputQName);
+        final var stack = SchemaInferenceStack.of(baseNetconfCtx, operationPath);
+        stack.enterSchemaTree(YangConstants.operationInputQName(operationPath.lastNodeIdentifier().getModule()));
+        final var inputInference = stack.toSchemaTreeInference();
 
         final XMLStreamWriter writer = NetconfUtil.XML_FACTORY.createXMLStreamWriter(result);
         try {
             try (NormalizedNodeStreamWriter normalizedNodeStreamWriter =
-                    XMLStreamNormalizedNodeStreamWriter.create(writer, baseNetconfCtx, inputPath)) {
+                    XMLStreamNormalizedNodeStreamWriter.create(writer, inputInference)) {
                 try (SchemaOrderedNormalizedNodeWriter normalizedNodeWriter =
-                        new SchemaOrderedNormalizedNodeWriter(normalizedNodeStreamWriter, baseNetconfCtx, inputPath)) {
+                        new SchemaOrderedNormalizedNodeWriter(normalizedNodeStreamWriter, inputInference)) {
                     final Collection<DataContainerChild> value = normalized.body();
                     normalizedNodeWriter.write(value);
                     normalizedNodeWriter.flush();
@@ -555,7 +556,7 @@ public final class NetconfMessageTransformUtil {
         } finally {
             try {
                 writer.close();
-            } catch (final Exception e) {
+            } catch (final XMLStreamException e) {
                 LOG.warn("Unable to close resource properly", e);
             }
         }