Create NetconfDataTreeService with base and additional operations for netconf
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / rests / utils / PlainPatchDataTransactionUtil.java
index 95e36e59522faa4b706b3f42b22f83d8a2784041..371b155f1b3475e10585210c7a7e2130d8f80863 100644 (file)
@@ -13,12 +13,10 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
 import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
 import org.opendaylight.restconf.common.context.NormalizedNodeContext;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
-import org.opendaylight.restconf.nb.rfc8040.rests.transactions.TransactionVarsWrapper;
+import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
@@ -36,62 +34,54 @@ public final class PlainPatchDataTransactionUtil {
     }
 
     /**
-     * Prepare variables for put data to DS. Close {@link DOMTransactionChain} inside of object
-     * {@link TransactionVarsWrapper} provided as a parameter.
+     * Prepare variables for put data to DS. Close {@link DOMTransactionChain} if any inside of object
+     * {@link RestconfStrategy} provided as a parameter if any.
      *
-     * @param payload
-     *             data to put
-     * @param schemaContext
-     *             reference to {@link EffectiveModelContext}
-     * @param transactionNode
-     *             wrapper of variables for transaction
+     * @param payload       data to put
+     * @param schemaContext reference to {@link EffectiveModelContext}
+     * @param strategy      object that perform the actual DS operations
      * @return {@link Response}
      */
     public static Response patchData(final NormalizedNodeContext payload,
-                                     final TransactionVarsWrapper transactionNode,
+                                     final RestconfStrategy strategy,
                                      final EffectiveModelContext schemaContext) {
 
-        final DOMTransactionChain transactionChain = transactionNode.getTransactionChain();
-        final DOMDataTreeReadWriteTransaction tx = transactionChain.newReadWriteTransaction();
-
+        strategy.prepareReadWriteExecution();
         YangInstanceIdentifier path = payload.getInstanceIdentifierContext().getInstanceIdentifier();
         NormalizedNode<?, ?> data = payload.getData();
 
         try {
-            mergeDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, path, data, tx, schemaContext);
+            mergeDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, path, data, strategy, schemaContext);
         } catch (final RestconfDocumentedException e) {
-            tx.cancel();
-            transactionChain.close();
-
+            strategy.cancel();
             throw new IllegalArgumentException(e);
         }
 
-        final FluentFuture<? extends CommitInfo> future = tx.commit();
+        final FluentFuture<? extends CommitInfo> future = strategy.commit();
         final ResponseFactory response = new ResponseFactory(Status.OK);
 
-        FutureCallbackTx.addCallback(future,
-                RestconfDataServiceConstant.PatchData.PATCH_TX_TYPE,
-                response,
-                transactionChain); // closes transactionChain, may throw
+        FutureCallbackTx.addCallback(future, RestconfDataServiceConstant.PatchData.PATCH_TX_TYPE, response,
+                strategy.getTransactionChain()); // closes transactionChain if any, may throw
 
         return response.build();
     }
 
     /**
      * Merge data within one transaction.
-     * @param dataStore Datastore to merge data to
-     * @param path Path for data to be merged
-     * @param payload Data to be merged
-     * @param writeTransaction Transaction
+     *
+     * @param dataStore     Datastore to merge data to
+     * @param path          Path for data to be merged
+     * @param payload       Data to be merged
+     * @param strategy      Object that perform the actual DS operations
      * @param schemaContext global schema context
      */
     private static void mergeDataWithinTransaction(final LogicalDatastoreType dataStore,
                                                    final YangInstanceIdentifier path,
                                                    final NormalizedNode<?, ?> payload,
-                                                   final DOMDataTreeWriteTransaction writeTransaction,
+                                                   final RestconfStrategy strategy,
                                                    final EffectiveModelContext schemaContext) {
         LOG.trace("Merge {} within Restconf Patch: {} with payload {}", dataStore.name(), path, payload);
-        TransactionUtil.ensureParentsByMerge(path, schemaContext, writeTransaction);
-        writeTransaction.merge(dataStore, path, payload);
+        TransactionUtil.ensureParentsByMerge(path, schemaContext, strategy);
+        strategy.merge(dataStore, path, payload);
     }
 }