Fix Server-Sent Events routing
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / rests / utils / PlainPatchDataTransactionUtil.java
index 95e36e59522faa4b706b3f42b22f83d8a2784041..473ba0e3538567ddf2414552186796ad8ec87d00 100644 (file)
@@ -12,13 +12,11 @@ import com.google.common.util.concurrent.FluentFuture;
 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.restconf.nb.rfc8040.rests.transactions.RestconfTransaction;
 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,36 @@ 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();
-
+        final RestconfTransaction transaction = strategy.prepareWriteExecution();
         YangInstanceIdentifier path = payload.getInstanceIdentifierContext().getInstanceIdentifier();
-        NormalizedNode<?, ?> data = payload.getData();
+        NormalizedNode data = payload.getData();
 
         try {
-            mergeDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, path, data, tx, schemaContext);
+            LOG.trace("Merge CONFIGURATION within Restconf Patch: {} with payload {}", path, data);
+            TransactionUtil.ensureParentsByMerge(path, schemaContext, transaction);
+            transaction.merge(path, data);
         } catch (final RestconfDocumentedException e) {
-            tx.cancel();
-            transactionChain.close();
-
+            transaction.cancel();
             throw new IllegalArgumentException(e);
         }
 
-        final FluentFuture<? extends CommitInfo> future = tx.commit();
+        final FluentFuture<? extends CommitInfo> future = transaction.commit();
         final ResponseFactory response = new ResponseFactory(Status.OK);
 
-        FutureCallbackTx.addCallback(future,
-                RestconfDataServiceConstant.PatchData.PATCH_TX_TYPE,
-                response,
-                transactionChain); // closes transactionChain, may throw
-
+        // closes transactionChain if any, may throw
+        FutureCallbackTx.addCallback(future, PatchDataTransactionUtil.PATCH_TX_TYPE, response, strategy, path);
         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 schemaContext global schema context
-     */
-    private static void mergeDataWithinTransaction(final LogicalDatastoreType dataStore,
-                                                   final YangInstanceIdentifier path,
-                                                   final NormalizedNode<?, ?> payload,
-                                                   final DOMDataTreeWriteTransaction writeTransaction,
-                                                   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);
-    }
 }