Clean up {Post,Put}DataTransactionUtil.submitData() 85/107185/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Aug 2023 12:59:20 +0000 (14:59 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 1 Aug 2023 13:11:31 +0000 (15:11 +0200)
Use a switch expression on insert() and also dispatch directly.

JIRA: NETCONF-1107
Change-Id: I26a910d7d20aedcaf3fe4d6cd39d4a21eb7fc6ca
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
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

index 1e8c4b22a04373993017da374f4e409aaa36d58b..89c437ffcacaf6381d5fec07181a86d8df39f98e 100644 (file)
@@ -15,7 +15,6 @@ import javax.ws.rs.core.UriInfo;
 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.InsertParam;
 import org.opendaylight.restconf.api.query.PointParam;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
@@ -78,62 +77,60 @@ public final class PostDataTransactionUtil {
     private static ListenableFuture<? extends CommitInfo> submitData(final YangInstanceIdentifier path,
             final NormalizedNode data, final RestconfStrategy strategy, final EffectiveModelContext schemaContext,
             final WriteDataParams params) {
-        final RestconfTransaction transaction = strategy.prepareWriteExecution();
-        final InsertParam insert = params.insert();
+        final var transaction = strategy.prepareWriteExecution();
+        final var insert = params.insert();
         if (insert == null) {
-            makePost(path, data, schemaContext, transaction);
-            return transaction.commit();
+            return makePost(path, data, schemaContext, transaction);
         }
 
-        PutDataTransactionUtil.checkListAndOrderedType(schemaContext, path);
-        final NormalizedNode readData;
-        switch (insert) {
-            case FIRST:
-                readData = PutDataTransactionUtil.readList(strategy, path.getParent().getParent());
+        final var parentPath = path.coerceParent();
+        PutDataTransactionUtil.checkListAndOrderedType(schemaContext, parentPath);
+        final var grandParentPath = parentPath.coerceParent();
+
+        return switch (insert) {
+            case FIRST -> {
+                final var readData = PutDataTransactionUtil.readList(strategy, grandParentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
                     transaction.replace(path, data, schemaContext);
-                    return transaction.commit();
+                    yield transaction.commit();
                 }
                 checkItemDoesNotExists(strategy.exists(LogicalDatastoreType.CONFIGURATION, path), path);
-                transaction.remove(path.getParent().getParent());
+                transaction.remove(grandParentPath);
                 transaction.replace(path, data, schemaContext);
-                transaction.replace(path.getParent().getParent(), readData, schemaContext);
-                return transaction.commit();
-            case LAST:
-                makePost(path, data, schemaContext, transaction);
-                return transaction.commit();
-            case BEFORE:
-                readData = PutDataTransactionUtil.readList(strategy, path.getParent().getParent());
+                transaction.replace(grandParentPath, readData, schemaContext);
+                yield transaction.commit();
+            }
+            case LAST -> makePost(path, data, schemaContext, transaction);
+            case BEFORE -> {
+                final var readData = PutDataTransactionUtil.readList(strategy, grandParentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
                     transaction.replace(path, data, schemaContext);
-                    return transaction.commit();
+                    yield transaction.commit();
                 }
                 checkItemDoesNotExists(strategy.exists(LogicalDatastoreType.CONFIGURATION, path), path);
                 insertWithPointPost(path, data, schemaContext, params.getPoint(),
                     (NormalizedNodeContainer<?>) readData, true, transaction);
-                return transaction.commit();
-            case AFTER:
-                readData = PutDataTransactionUtil.readList(strategy, path.getParent().getParent());
+                yield transaction.commit();
+            }
+            case AFTER -> {
+                final var readData = PutDataTransactionUtil.readList(strategy, grandParentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
                     transaction.replace(path, data, schemaContext);
-                    return transaction.commit();
+                    yield transaction.commit();
                 }
                 checkItemDoesNotExists(strategy.exists(LogicalDatastoreType.CONFIGURATION, path), path);
                 insertWithPointPost(path, data, schemaContext, params.getPoint(),
                     (NormalizedNodeContainer<?>) readData, false, transaction);
-                return transaction.commit();
-            default:
-                throw new RestconfDocumentedException(
-                    "Used bad value of insert parameter. Possible values are first, last, before or after, but was: "
-                        + insert, ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE);
-        }
+                yield transaction.commit();
+            }
+        };
     }
 
     private static void insertWithPointPost(final YangInstanceIdentifier path, final NormalizedNode data,
                                             final EffectiveModelContext schemaContext, final PointParam point,
                                             final NormalizedNodeContainer<?> readList, final boolean before,
                                             final RestconfTransaction transaction) {
-        final YangInstanceIdentifier parent = path.getParent().getParent();
+        final YangInstanceIdentifier parent = path.coerceParent().coerceParent();
         transaction.remove(parent);
         final var pointArg = YangInstanceIdentifierDeserializer.create(schemaContext, point.value()).path
             .getLastPathArgument();
@@ -160,8 +157,9 @@ public final class PostDataTransactionUtil {
         }
     }
 
-    private static void makePost(final YangInstanceIdentifier path, final NormalizedNode data,
-                                 final EffectiveModelContext schemaContext, final RestconfTransaction transaction) {
+    private static ListenableFuture<? extends CommitInfo> makePost(final YangInstanceIdentifier path,
+            final NormalizedNode data, final EffectiveModelContext schemaContext,
+            final RestconfTransaction transaction) {
         try {
             transaction.create(path, data, schemaContext);
         } catch (RestconfDocumentedException e) {
@@ -169,6 +167,8 @@ public final class PostDataTransactionUtil {
             transaction.cancel();
             throw e;
         }
+
+        return transaction.commit();
     }
 
     /**
index 1dfef6a9548c091cf8a1e8fd29b9d8e3d2f3f151..fb8ef5fca1ffce62406448850c7104e3de781785 100644 (file)
@@ -13,7 +13,6 @@ 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.DOMTransactionChain;
-import org.opendaylight.restconf.api.query.InsertParam;
 import org.opendaylight.restconf.api.query.PointParam;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
 import org.opendaylight.restconf.nb.rfc8040.WriteDataParams;
@@ -75,47 +74,46 @@ public final class PutDataTransactionUtil {
     private static ListenableFuture<? extends CommitInfo> submitData(final YangInstanceIdentifier path,
             final EffectiveModelContext schemaContext, final RestconfStrategy strategy, final NormalizedNode data,
             final WriteDataParams params) {
-        final RestconfTransaction transaction = strategy.prepareWriteExecution();
-        final InsertParam insert = params.insert();
+        final var transaction = strategy.prepareWriteExecution();
+        final var insert = params.insert();
         if (insert == null) {
             return makePut(path, schemaContext, transaction, data);
         }
 
-        checkListAndOrderedType(schemaContext, path);
-        final NormalizedNode readData;
-        switch (insert) {
-            case FIRST:
-                readData = readList(strategy, path.getParent());
+        final var parentPath = path.coerceParent();
+        checkListAndOrderedType(schemaContext, parentPath);
+
+        return switch (insert) {
+            case FIRST -> {
+                final var readData = readList(strategy, parentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
-                    return makePut(path, schemaContext, transaction, data);
+                    yield makePut(path, schemaContext, transaction, data);
                 }
-                transaction.remove(path.getParent());
+                transaction.remove(parentPath);
                 transaction.replace(path, data, schemaContext);
-                transaction.replace(path.getParent(), readData, schemaContext);
-                return transaction.commit();
-            case LAST:
-                return makePut(path, schemaContext, transaction, data);
-            case BEFORE:
-                readData = readList(strategy, path.getParent());
+                transaction.replace(parentPath, readData, schemaContext);
+                yield transaction.commit();
+            }
+            case LAST -> makePut(path, schemaContext, transaction, data);
+            case BEFORE -> {
+                final var readData = readList(strategy, parentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
-                    return makePut(path, schemaContext, transaction, data);
+                    yield makePut(path, schemaContext, transaction, data);
                 }
                 insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(),
                     (NormalizedNodeContainer<?>) readData, true);
-                return transaction.commit();
-            case AFTER:
-                readData = readList(strategy, path.getParent());
+                yield transaction.commit();
+            }
+            case AFTER -> {
+                final var readData = readList(strategy, parentPath);
                 if (readData == null || ((NormalizedNodeContainer<?>) readData).isEmpty()) {
-                    return makePut(path, schemaContext, transaction, data);
+                    yield makePut(path, schemaContext, transaction, data);
                 }
                 insertWithPointPut(transaction, path, data, schemaContext, params.getPoint(),
                     (NormalizedNodeContainer<?>) readData, false);
-                return transaction.commit();
-            default:
-                throw new RestconfDocumentedException(
-                        "Used bad value of insert parameter. Possible values are first, last, before or after, "
-                                + "but was: " + insert, ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE);
-        }
+                yield transaction.commit();
+            }
+        };
     }
 
     // FIXME: this method is only called from a context where we are modifying data. This should be part of strategy,
@@ -162,11 +160,10 @@ public final class PutDataTransactionUtil {
         return transaction.commit();
     }
 
+    // FIXME: take parentPath
     public static DataSchemaNode checkListAndOrderedType(final EffectiveModelContext ctx,
             final YangInstanceIdentifier path) {
-        final var dataSchemaNode = DataSchemaContextTree.from(ctx).findChild(path.getParent())
-            .orElseThrow()
-            .dataSchemaNode();
+        final var dataSchemaNode = DataSchemaContextTree.from(ctx).findChild(path).orElseThrow().dataSchemaNode();
 
         final String message;
         if (dataSchemaNode instanceof ListSchemaNode listSchema) {