Eliminate PutDataTransactionUtil 99/107799/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Sep 2023 21:18:38 +0000 (23:18 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Sep 2023 22:23:15 +0000 (00:23 +0200)
The implementation here is inherently tied to RestconfStrategy. Rehost
methods to RestconfStrategy and PostDataTransactionUtil (for now).

JIRA: NETCONF-1125
Change-Id: I45ce8428ff08324bf2e97de6bde9e6f5ea896bb8
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfDataServiceImpl.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PostDataTransactionUtil.java
restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java [deleted file]
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/MdsalRestconfStrategyTest.java
restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/NetconfRestconfStrategyTest.java

index 522d7f512670524e88c8102c87b6412ae1061d3d..12acd86482285f514d13aff599a9add87a623a12 100644 (file)
@@ -85,7 +85,6 @@ import org.opendaylight.restconf.nb.rfc8040.rests.transactions.MdsalRestconfStra
 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.PatchDataTransactionUtil;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.PostDataTransactionUtil;
-import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.ReadDataTransactionUtil;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfStreamsConstants;
 import org.opendaylight.restconf.nb.rfc8040.streams.StreamsConfiguration;
@@ -377,7 +376,7 @@ public final class RestconfDataServiceImpl {
         final var req = bindResourceRequest(identifier, body);
 
         return switch (
-            PutDataTransactionUtil.putData(req.path(), req.data(), req.modelContext(), req.strategy(), params)) {
+            req.strategy().putData(req.path(), req.data(), req.modelContext(), params)) {
             // Note: no Location header, as it matches the request path
             case CREATED -> Response.status(Status.CREATED).build();
             case REPLACED -> Response.noContent().build();
index 6143cf7c55dfb06b714ccb3a8775095f2c4cbda3..76df4d0bcb71c5b19e8de275dd27a089a20327ca 100644 (file)
@@ -20,14 +20,22 @@ import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
+import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
+import org.opendaylight.restconf.api.query.PointParam;
 import org.opendaylight.restconf.common.errors.RestconfFuture;
 import org.opendaylight.restconf.common.errors.SettableRestconfFuture;
+import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
+import org.opendaylight.restconf.nb.rfc8040.rests.utils.PostDataTransactionUtil;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.TransactionUtil;
+import org.opendaylight.restconf.nb.rfc8040.utils.parser.YangInstanceIdentifierDeserializer;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 /**
  * Baseline execution strategy for various RESTCONF operations.
@@ -165,4 +173,108 @@ public abstract class RestconfStrategy {
             }
         }, MoreExecutors.directExecutor());
     }
+
+    /**
+     * Check mount point and prepare variables for put data to DS. Close {@link DOMTransactionChain} if any
+     * inside of object {@link RestconfStrategy} provided as a parameter if any.
+     *
+     * @param path          path of data
+     * @param data          data
+     * @param schemaContext reference to {@link EffectiveModelContext}
+     * @param params        {@link WriteDataParams}
+     * @return A {@link CreateOrReplaceResult}
+     */
+    public @NonNull CreateOrReplaceResult putData(final YangInstanceIdentifier path, final NormalizedNode data,
+            final EffectiveModelContext schemaContext, final WriteDataParams params) {
+        final var exists = TransactionUtil.syncAccess(exists(LogicalDatastoreType.CONFIGURATION, path), path);
+        TransactionUtil.syncCommit(submitData(path, schemaContext, data, params), "PUT", path);
+        return exists ? CreateOrReplaceResult.REPLACED : CreateOrReplaceResult.CREATED;
+    }
+
+    /**
+     * Put data to DS.
+     *
+     * @param path          path of data
+     * @param schemaContext {@link SchemaContext}
+     * @param data          data
+     * @param params        {@link WriteDataParams}
+     * @return A {@link ListenableFuture}
+     */
+    private ListenableFuture<? extends CommitInfo> submitData(final YangInstanceIdentifier path,
+            final EffectiveModelContext schemaContext, final NormalizedNode data, final WriteDataParams params) {
+        final var transaction = prepareWriteExecution();
+        final var insert = params.insert();
+        if (insert == null) {
+            return makePut(path, schemaContext, transaction, data);
+        }
+
+        final var parentPath = path.coerceParent();
+        PostDataTransactionUtil.checkListAndOrderedType(schemaContext, parentPath);
+
+        return switch (insert) {
+            case FIRST -> {
+                final var readData = transaction.readList(parentPath);
+                if (readData == null || readData.isEmpty()) {
+                    yield makePut(path, schemaContext, transaction, data);
+                }
+                transaction.remove(parentPath);
+                transaction.replace(path, data, schemaContext);
+                transaction.replace(parentPath, readData, schemaContext);
+                yield transaction.commit();
+            }
+            case LAST -> makePut(path, schemaContext, transaction, data);
+            case BEFORE -> {
+                final var readData = transaction.readList(parentPath);
+                if (readData == null || readData.isEmpty()) {
+                    yield makePut(path, schemaContext, transaction, data);
+                }
+                insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(), readData, true);
+                yield transaction.commit();
+            }
+            case AFTER -> {
+                final var readData = transaction.readList(parentPath);
+                if (readData == null || readData.isEmpty()) {
+                    yield makePut(path, schemaContext, transaction, data);
+                }
+                insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(), readData, false);
+                yield transaction.commit();
+            }
+        };
+    }
+
+    private static void insertWithPointPut(final RestconfTransaction transaction, final YangInstanceIdentifier path,
+            final NormalizedNode data, final EffectiveModelContext schemaContext, final PointParam point,
+            final NormalizedNodeContainer<?> readList, final boolean before) {
+        transaction.remove(path.getParent());
+        final var pointArg = YangInstanceIdentifierDeserializer.create(schemaContext, point.value()).path
+            .getLastPathArgument();
+        int lastItemPosition = 0;
+        for (var nodeChild : readList.body()) {
+            if (nodeChild.name().equals(pointArg)) {
+                break;
+            }
+            lastItemPosition++;
+        }
+        if (!before) {
+            lastItemPosition++;
+        }
+        int lastInsertedPosition = 0;
+        final var emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent());
+        transaction.merge(YangInstanceIdentifier.of(emptySubtree.name()), emptySubtree);
+        for (var nodeChild : readList.body()) {
+            if (lastInsertedPosition == lastItemPosition) {
+                transaction.replace(path, data, schemaContext);
+            }
+            final var childPath = path.coerceParent().node(nodeChild.name());
+            transaction.replace(childPath, nodeChild, schemaContext);
+            lastInsertedPosition++;
+        }
+    }
+
+    private static ListenableFuture<? extends CommitInfo> makePut(final YangInstanceIdentifier path,
+            final EffectiveModelContext schemaContext, final RestconfTransaction transaction,
+            final NormalizedNode data) {
+        transaction.replace(path, data, schemaContext);
+        return transaction.commit();
+    }
 }
index 544707c1721cf44d56d341801dfbea851f955063..810894ba4b30de183e1e29db7de220bf6f39fea2 100644 (file)
@@ -24,7 +24,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,6 +57,27 @@ public final class PostDataTransactionUtil {
         TransactionUtil.syncCommit(submitData(path, data, strategy, schemaContext, params), "POST", path);
     }
 
+    public static DataSchemaNode checkListAndOrderedType(final EffectiveModelContext ctx,
+            final YangInstanceIdentifier path) {
+        final var dataSchemaNode = DataSchemaContextTree.from(ctx).findChild(path).orElseThrow().dataSchemaNode();
+
+        final String message;
+        if (dataSchemaNode instanceof ListSchemaNode listSchema) {
+            if (listSchema.isUserOrdered()) {
+                return listSchema;
+            }
+            message = "Insert parameter can be used only with ordered-by user list.";
+        } else if (dataSchemaNode instanceof LeafListSchemaNode leafListSchema) {
+            if (leafListSchema.isUserOrdered()) {
+                return leafListSchema;
+            }
+            message = "Insert parameter can be used only with ordered-by user leaf-list.";
+        } else {
+            message = "Insert parameter can be used only with list or leaf-list";
+        }
+        throw new RestconfDocumentedException(message, ErrorType.PROTOCOL, ErrorTag.BAD_ELEMENT);
+    }
+
     /**
      * Post data by type.
      *
@@ -74,7 +99,7 @@ public final class PostDataTransactionUtil {
         }
 
         final var parentPath = path.coerceParent();
-        PutDataTransactionUtil.checkListAndOrderedType(schemaContext, parentPath);
+        checkListAndOrderedType(schemaContext, parentPath);
         final var grandParentPath = parentPath.coerceParent();
 
         return switch (insert) {
diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java
deleted file mode 100644 (file)
index fd1997a..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * 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.restconf.nb.rfc8040.rests.utils;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.common.api.CommitInfo;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
-import org.opendaylight.restconf.api.query.PointParam;
-import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
-import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
-import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
-import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy.CreateOrReplaceResult;
-import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfTransaction;
-import org.opendaylight.restconf.nb.rfc8040.utils.parser.YangInstanceIdentifierDeserializer;
-import org.opendaylight.yangtools.yang.common.ErrorTag;
-import org.opendaylight.yangtools.yang.common.ErrorType;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-
-/**
- * Util class for put data to DS.
- */
-public final class PutDataTransactionUtil {
-    private PutDataTransactionUtil() {
-        // Hidden on purpose
-    }
-
-    /**
-     * Check mount point and prepare variables for put data to DS. Close {@link DOMTransactionChain} if any
-     * inside of object {@link RestconfStrategy} provided as a parameter if any.
-     *
-     * @param path          path of data
-     * @param data          data
-     * @param schemaContext reference to {@link EffectiveModelContext}
-     * @param strategy      object that perform the actual DS operations
-     * @param params        {@link WriteDataParams}
-     * @return A {@link CreateOrReplaceResult}
-     */
-    public static @NonNull CreateOrReplaceResult putData(final YangInstanceIdentifier path, final NormalizedNode data,
-            final EffectiveModelContext schemaContext, final RestconfStrategy strategy, final WriteDataParams params) {
-        final var exists = TransactionUtil.syncAccess(strategy.exists(LogicalDatastoreType.CONFIGURATION, path), path);
-        TransactionUtil.syncCommit(submitData(path, schemaContext, strategy, data, params), "PUT", path);
-        return exists ? CreateOrReplaceResult.REPLACED : CreateOrReplaceResult.CREATED;
-    }
-
-    /**
-     * Put data to DS.
-     *
-     * @param path          path of data
-     * @param schemaContext {@link SchemaContext}
-     * @param strategy      object that perform the actual DS operations
-     * @param data          data
-     * @param params        {@link WriteDataParams}
-     * @return A {@link ListenableFuture}
-     */
-    private static ListenableFuture<? extends CommitInfo> submitData(final YangInstanceIdentifier path,
-            final EffectiveModelContext schemaContext, final RestconfStrategy strategy, final NormalizedNode data,
-            final WriteDataParams params) {
-        final var transaction = strategy.prepareWriteExecution();
-        final var insert = params.insert();
-        if (insert == null) {
-            return makePut(path, schemaContext, transaction, data);
-        }
-
-        final var parentPath = path.coerceParent();
-        checkListAndOrderedType(schemaContext, parentPath);
-
-        return switch (insert) {
-            case FIRST -> {
-                final var readData = transaction.readList(parentPath);
-                if (readData == null || readData.isEmpty()) {
-                    yield makePut(path, schemaContext, transaction, data);
-                }
-                transaction.remove(parentPath);
-                transaction.replace(path, data, schemaContext);
-                transaction.replace(parentPath, readData, schemaContext);
-                yield transaction.commit();
-            }
-            case LAST -> makePut(path, schemaContext, transaction, data);
-            case BEFORE -> {
-                final var readData = transaction.readList(parentPath);
-                if (readData == null || readData.isEmpty()) {
-                    yield makePut(path, schemaContext, transaction, data);
-                }
-                insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(), readData, true);
-                yield transaction.commit();
-            }
-            case AFTER -> {
-                final var readData = transaction.readList(parentPath);
-                if (readData == null || readData.isEmpty()) {
-                    yield makePut(path, schemaContext, transaction, data);
-                }
-                insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(), readData, false);
-                yield transaction.commit();
-            }
-        };
-    }
-
-    private static void insertWithPointPut(final RestconfTransaction transaction,
-                                           final YangInstanceIdentifier path,
-                                           final NormalizedNode data,
-                                           final EffectiveModelContext schemaContext, final PointParam point,
-                                           final NormalizedNodeContainer<?> readList, final boolean before) {
-        transaction.remove(path.getParent());
-        final var pointArg = YangInstanceIdentifierDeserializer.create(schemaContext, point.value()).path
-            .getLastPathArgument();
-        int lastItemPosition = 0;
-        for (var nodeChild : readList.body()) {
-            if (nodeChild.name().equals(pointArg)) {
-                break;
-            }
-            lastItemPosition++;
-        }
-        if (!before) {
-            lastItemPosition++;
-        }
-        int lastInsertedPosition = 0;
-        final var emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent());
-        transaction.merge(YangInstanceIdentifier.of(emptySubtree.name()), emptySubtree);
-        for (var nodeChild : readList.body()) {
-            if (lastInsertedPosition == lastItemPosition) {
-                transaction.replace(path, data, schemaContext);
-            }
-            final YangInstanceIdentifier childPath = path.coerceParent().node(nodeChild.name());
-            transaction.replace(childPath, nodeChild, schemaContext);
-            lastInsertedPosition++;
-        }
-    }
-
-    private static ListenableFuture<? extends CommitInfo> makePut(final YangInstanceIdentifier path,
-            final EffectiveModelContext schemaContext, final RestconfTransaction transaction,
-            final NormalizedNode data) {
-        transaction.replace(path, data, schemaContext);
-        return transaction.commit();
-    }
-
-    public static DataSchemaNode checkListAndOrderedType(final EffectiveModelContext ctx,
-            final YangInstanceIdentifier path) {
-        final var dataSchemaNode = DataSchemaContextTree.from(ctx).findChild(path).orElseThrow().dataSchemaNode();
-
-        final String message;
-        if (dataSchemaNode instanceof ListSchemaNode listSchema) {
-            if (listSchema.isUserOrdered()) {
-                return listSchema;
-            }
-            message = "Insert parameter can be used only with ordered-by user list.";
-        } else if (dataSchemaNode instanceof LeafListSchemaNode leafListSchema) {
-            if (leafListSchema.isUserOrdered()) {
-                return leafListSchema;
-            }
-            message = "Insert parameter can be used only with ordered-by user leaf-list.";
-        } else {
-            message = "Insert parameter can be used only with list or leaf-list";
-        }
-        throw new RestconfDocumentedException(message, ErrorType.PROTOCOL, ErrorTag.BAD_ELEMENT);
-    }
-}
index d65154b9ee3d66f46cbf2436d0ab11f6b2061e9c..91a6a4a343ed7e6a6feaae646eb33bf378ca7fd6 100644 (file)
@@ -34,7 +34,6 @@ import org.opendaylight.restconf.api.query.ContentParam;
 import org.opendaylight.restconf.api.query.WithDefaultsParam;
 import org.opendaylight.restconf.common.patch.PatchStatusContext;
 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
-import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.ReadDataTransactionUtil;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -115,8 +114,8 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
 
-        PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
-            new MdsalRestconfStrategy(mockDataBroker), WriteDataParams.empty());
+        new MdsalRestconfStrategy(mockDataBroker).putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX);
     }
@@ -129,8 +128,7 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
 
-        PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new MdsalRestconfStrategy(mockDataBroker),
-            WriteDataParams.empty());
+        new MdsalRestconfStrategy(mockDataBroker).putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, WriteDataParams.empty());
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, GAP_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF);
     }
@@ -144,8 +142,9 @@ public final class MdsalRestconfStrategyTest extends AbstractRestconfStrategyTes
                 .when(read).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         doNothing().when(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS);
         doReturn(CommitInfo.emptyFluentFuture()).when(readWrite).commit();
-        PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
-            new MdsalRestconfStrategy(mockDataBroker), WriteDataParams.empty());
+
+        new MdsalRestconfStrategy(mockDataBroker).putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(read).exists(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID);
         verify(readWrite).put(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS);
     }
index 5e9f2f5908ca51f194d2011a9cb61607d1d1eb90..9248b0edacc8e3c496be3e33e9c0ca29072dd6e1 100644 (file)
@@ -29,7 +29,6 @@ import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.dom.api.NetconfDataTreeService;
 import org.opendaylight.restconf.common.patch.PatchStatusContext;
 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
-import org.opendaylight.restconf.nb.rfc8040.rests.utils.PutDataTransactionUtil;
 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
@@ -125,8 +124,8 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
 
-        PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
-            new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(netconfService).lock();
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
@@ -141,8 +140,8 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX, Optional.empty());
 
-        PutDataTransactionUtil.putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
-            new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(JUKEBOX_IID, EMPTY_JUKEBOX, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, EMPTY_JUKEBOX,
             Optional.empty());
@@ -155,8 +154,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
 
-        PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
-            WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, WriteDataParams.empty());
         verify(netconfService).getConfig(GAP_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
     }
@@ -169,8 +167,7 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
 
-        PutDataTransactionUtil.putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, new NetconfRestconfStrategy(netconfService),
-            WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(GAP_IID, GAP_LEAF, JUKEBOX_SCHEMA, WriteDataParams.empty());
         verify(netconfService).getConfig(GAP_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, GAP_IID, GAP_LEAF, Optional.empty());
     }
@@ -182,8 +179,8 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
 
-        PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
-            new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
             Optional.empty());
@@ -197,8 +194,8 @@ public final class NetconfRestconfStrategyTest extends AbstractRestconfStrategyT
         doReturn(Futures.immediateFuture(new DefaultDOMRpcResult())).when(netconfService)
             .replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS, Optional.empty());
 
-        PutDataTransactionUtil.putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
-            new NetconfRestconfStrategy(netconfService), WriteDataParams.empty());
+        new NetconfRestconfStrategy(netconfService).putData(JUKEBOX_IID, JUKEBOX_WITH_BANDS, JUKEBOX_SCHEMA,
+            WriteDataParams.empty());
         verify(netconfService).getConfig(JUKEBOX_IID);
         verify(netconfService).replace(LogicalDatastoreType.CONFIGURATION, JUKEBOX_IID, JUKEBOX_WITH_BANDS,
             Optional.empty());