Bump MRI upstreams
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / rests / utils / PutDataTransactionUtil.java
index 0d42f064ba95d4b9b140122cc81ab96cf76fb717..dbe01ad079db3c654b1fff297a137f66e2ce2dae 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.restconf.common.errors.RestconfError;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag;
 import org.opendaylight.restconf.common.errors.RestconfError.ErrorType;
 import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
+import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfTransaction;
 import org.opendaylight.restconf.nb.rfc8040.rests.utils.RestconfDataServiceConstant.PostPutQueryParameters.Insert;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -74,10 +75,11 @@ public final class PutDataTransactionUtil {
      * @param payload data
      */
     public static void validTopLevelNodeName(final YangInstanceIdentifier path, final NormalizedNodeContext payload) {
-        final String payloadName = payload.getData().getNodeType().getLocalName();
+        final String payloadName = payload.getData().getIdentifier().getNodeType().getLocalName();
 
         if (path.isEmpty()) {
-            if (!payload.getData().getNodeType().equals(RestconfDataServiceConstant.NETCONF_BASE_QNAME)) {
+            if (!payload.getData().getIdentifier().getNodeType().equals(
+                RestconfDataServiceConstant.NETCONF_BASE_QNAME)) {
                 throw new RestconfDocumentedException("Instance identifier has to contain at least one path argument",
                         ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE);
             }
@@ -101,7 +103,7 @@ public final class PutDataTransactionUtil {
         final InstanceIdentifierContext<?> iiWithData = payload.getInstanceIdentifierContext();
         final PathArgument lastPathArgument = iiWithData.getInstanceIdentifier().getLastPathArgument();
         final SchemaNode schemaNode = iiWithData.getSchemaNode();
-        final NormalizedNode<?, ?> data = payload.getData();
+        final NormalizedNode data = payload.getData();
         if (schemaNode instanceof ListSchemaNode) {
             final List<QName> keyDefinitions = ((ListSchemaNode) schemaNode).getKeyDefinition();
             if (lastPathArgument instanceof NodeIdentifierWithPredicates && data instanceof MapEntryNode) {
@@ -145,17 +147,17 @@ public final class PutDataTransactionUtil {
                                    final RestconfStrategy strategy, final Insert insert, final String point) {
         final YangInstanceIdentifier path = payload.getInstanceIdentifierContext().getInstanceIdentifier();
 
-        strategy.prepareReadWriteExecution();
         final FluentFuture<Boolean> existsFuture = strategy.exists(LogicalDatastoreType.CONFIGURATION, path);
+        final FutureDataFactory<Boolean> existsResponse = new FutureDataFactory<>();
+        FutureCallbackTx.addCallback(existsFuture, PUT_TX_TYPE, existsResponse);
+
+        final ResponseFactory responseFactory =
+            new ResponseFactory(existsResponse.result ? Status.NO_CONTENT : Status.CREATED);
         final FluentFuture<? extends CommitInfo> submitData = submitData(path, schemaContext, strategy,
-                payload.getData(), insert, point);
-        final ResponseFactory response = new ResponseFactory();
+            payload.getData(), insert, point);
         //This method will close transactionChain if any
-        FutureCallbackTx.addCallback(submitData, PUT_TX_TYPE, response, strategy.getTransactionChain());
-
-        final FutureDataFactory<Boolean> isExists = new FutureDataFactory<>();
-        FutureCallbackTx.addCallback(existsFuture, PUT_TX_TYPE, isExists);
-        return response.status(isExists.result ? Status.NO_CONTENT : Status.CREATED).build();
+        FutureCallbackTx.addCallback(submitData, PUT_TX_TYPE, responseFactory, strategy, path);
+        return responseFactory.build();
     }
 
     /**
@@ -172,42 +174,43 @@ public final class PutDataTransactionUtil {
     private static FluentFuture<? extends CommitInfo> submitData(final YangInstanceIdentifier path,
                                                                  final EffectiveModelContext schemaContext,
                                                                  final RestconfStrategy strategy,
-                                                                 final NormalizedNode<?, ?> data,
+                                                                 final NormalizedNode data,
                                                                  final Insert insert, final String point) {
+        final RestconfTransaction transaction = strategy.prepareWriteExecution();
         if (insert == null) {
-            return makePut(path, schemaContext, strategy, data);
+            return makePut(path, schemaContext, transaction, data);
         }
 
         checkListAndOrderedType(schemaContext, path);
-        final NormalizedNode<?, ?> readData;
+        final NormalizedNode readData;
         switch (insert) {
             case FIRST:
                 readData = readList(strategy, path.getParent());
-                if (readData == null || ((NormalizedNodeContainer<?, ?, ?>) readData).getValue().isEmpty()) {
-                    return makePut(path, schemaContext, strategy, data);
+                if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
+                    return makePut(path, schemaContext, transaction, data);
                 }
-                strategy.remove(LogicalDatastoreType.CONFIGURATION, path.getParent());
-                strategy.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
-                strategy.replace(LogicalDatastoreType.CONFIGURATION, path.getParent(), readData, schemaContext);
-                return strategy.commit();
+                transaction.remove(LogicalDatastoreType.CONFIGURATION, path.getParent());
+                transaction.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
+                transaction.replace(LogicalDatastoreType.CONFIGURATION, path.getParent(), readData, schemaContext);
+                return transaction.commit();
             case LAST:
-                return makePut(path, schemaContext, strategy, data);
+                return makePut(path, schemaContext, transaction, data);
             case BEFORE:
                 readData = readList(strategy, path.getParent());
-                if (readData == null || ((NormalizedNodeContainer<?, ?, ?>) readData).getValue().isEmpty()) {
-                    return makePut(path, schemaContext, strategy, data);
+                if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
+                    return makePut(path, schemaContext, transaction, data);
                 }
-                insertWithPointPut(strategy, path, data, schemaContext, point,
-                    (NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) readData, true);
-                return strategy.commit();
+                insertWithPointPut(transaction, path, data, schemaContext, point, (NormalizedNodeContainer<?>) readData,
+                    true);
+                return transaction.commit();
             case AFTER:
                 readData = readList(strategy, path.getParent());
-                if (readData == null || ((NormalizedNodeContainer<?, ?, ?>) readData).getValue().isEmpty()) {
-                    return makePut(path, schemaContext, strategy, data);
+                if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
+                    return makePut(path, schemaContext, transaction, data);
                 }
-                insertWithPointPut(strategy, path, data, schemaContext, point,
-                    (NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) readData, false);
-                return strategy.commit();
+                insertWithPointPut(transaction, path, data, schemaContext, point, (NormalizedNodeContainer<?>) readData,
+                    false);
+                return transaction.commit();
             default:
                 throw new RestconfDocumentedException(
                         "Used bad value of insert parameter. Possible values are first, last, before or after, "
@@ -217,22 +220,21 @@ public final class PutDataTransactionUtil {
 
     // FIXME: this method is only called from a context where we are modifying data. This should be part of strategy,
     //        requiring an already-open transaction. It also must return a future, so it can be properly composed.
-    static NormalizedNode<?, ?> readList(final RestconfStrategy strategy, final YangInstanceIdentifier path) {
-        return ReadDataTransactionUtil.readDataViaTransaction(strategy, LogicalDatastoreType.CONFIGURATION,
-            path,false);
+    static NormalizedNode readList(final RestconfStrategy strategy, final YangInstanceIdentifier path) {
+        return ReadDataTransactionUtil.readDataViaTransaction(strategy, LogicalDatastoreType.CONFIGURATION, path,
+            false);
     }
 
-    private static void insertWithPointPut(final RestconfStrategy strategy,
+    private static void insertWithPointPut(final RestconfTransaction transaction,
                                            final YangInstanceIdentifier path,
-                                           final NormalizedNode<?, ?> data,
+                                           final NormalizedNode data,
                                            final EffectiveModelContext schemaContext, final String point,
-                                           final NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>> readList,
-                                           final boolean before) {
-        strategy.remove(LogicalDatastoreType.CONFIGURATION, path.getParent());
+                                           final NormalizedNodeContainer<?> readList, final boolean before) {
+        transaction.remove(LogicalDatastoreType.CONFIGURATION, path.getParent());
         final InstanceIdentifierContext<?> instanceIdentifier =
             ParserIdentifier.toInstanceIdentifier(point, schemaContext, Optional.empty());
         int lastItemPosition = 0;
-        for (final NormalizedNode<?, ?> nodeChild : readList.getValue()) {
+        for (final NormalizedNode nodeChild : readList.body()) {
             if (nodeChild.getIdentifier().equals(instanceIdentifier.getInstanceIdentifier().getLastPathArgument())) {
                 break;
             }
@@ -242,25 +244,26 @@ public final class PutDataTransactionUtil {
             lastItemPosition++;
         }
         int lastInsertedPosition = 0;
-        final NormalizedNode<?, ?> emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent());
-        strategy.merge(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.create(emptySubtree.getIdentifier()),
+        final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent());
+        transaction.merge(LogicalDatastoreType.CONFIGURATION,
+            YangInstanceIdentifier.create(emptySubtree.getIdentifier()),
             emptySubtree);
-        for (final NormalizedNode<?, ?> nodeChild : readList.getValue()) {
+        for (final NormalizedNode nodeChild : readList.body()) {
             if (lastInsertedPosition == lastItemPosition) {
-                strategy.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
+                transaction.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
             }
             final YangInstanceIdentifier childPath = path.getParent().node(nodeChild.getIdentifier());
-            strategy.replace(LogicalDatastoreType.CONFIGURATION, childPath, nodeChild, schemaContext);
+            transaction.replace(LogicalDatastoreType.CONFIGURATION, childPath, nodeChild, schemaContext);
             lastInsertedPosition++;
         }
     }
 
     private static FluentFuture<? extends CommitInfo> makePut(final YangInstanceIdentifier path,
                                                               final SchemaContext schemaContext,
-                                                              final RestconfStrategy strategy,
-                                                              final NormalizedNode<?, ?> data) {
-        strategy.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
-        return strategy.commit();
+                                                              final RestconfTransaction transaction,
+                                                              final NormalizedNode data) {
+        transaction.replace(LogicalDatastoreType.CONFIGURATION, path, data, schemaContext);
+        return transaction.commit();
     }
 
     public static DataSchemaNode checkListAndOrderedType(final EffectiveModelContext ctx,