From: Robert Varga Date: Tue, 1 Aug 2023 12:59:20 +0000 (+0200) Subject: Clean up {Post,Put}DataTransactionUtil.submitData() X-Git-Tag: v7.0.0~762 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F85%2F107185%2F1;hp=145915bd9a6bed695cb86ef4bca926f788037f2f;p=netconf.git Clean up {Post,Put}DataTransactionUtil.submitData() Use a switch expression on insert() and also dispatch directly. JIRA: NETCONF-1107 Change-Id: I26a910d7d20aedcaf3fe4d6cd39d4a21eb7fc6ca Signed-off-by: Robert Varga --- diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PostDataTransactionUtil.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PostDataTransactionUtil.java index 1e8c4b22a0..89c437ffca 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PostDataTransactionUtil.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PostDataTransactionUtil.java @@ -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 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 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(); } /** diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java index 1dfef6a954..fb8ef5fca1 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java @@ -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 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) {