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;
}
/**
- * 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);
- }
}