X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-rfc8040%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Frestconf%2Fnb%2Frfc8040%2Frests%2Futils%2FPutDataTransactionUtil.java;h=c9f7d6379d11bdfe774700d9692c14f11b9761a6;hb=29b17bf8f2f82bf293455f6dea3da4bfbd838bb8;hp=d8cd95f35ed34080962c67fbb2c0b1b8ecba9e98;hpb=355bc98a2fd60f8067c05a262c7dd4766edc0ba3;p=netconf.git diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java index d8cd95f35e..c9f7d6379d 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/utils/PutDataTransactionUtil.java @@ -7,8 +7,8 @@ */ package org.opendaylight.restconf.nb.rfc8040.rests.utils; -import com.google.common.collect.Maps; import com.google.common.util.concurrent.FluentFuture; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -18,14 +18,14 @@ 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.InstanceIdentifierContext; import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; +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.common.validation.RestconfValidationUtils; import org.opendaylight.restconf.nb.rfc8040.handlers.TransactionChainHandler; -import org.opendaylight.restconf.nb.rfc8040.references.SchemaContextRef; import org.opendaylight.restconf.nb.rfc8040.rests.transactions.TransactionVarsWrapper; import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier; import org.opendaylight.yangtools.yang.common.QName; @@ -42,6 +42,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -114,8 +115,7 @@ public final class PutDataTransactionUtil { if (schemaNode instanceof ListSchemaNode) { final List keyDefinitions = ((ListSchemaNode) schemaNode).getKeyDefinition(); if (lastPathArgument instanceof NodeIdentifierWithPredicates && data instanceof MapEntryNode) { - final Map uriKeyValues = ((NodeIdentifierWithPredicates) lastPathArgument) - .getKeyValues(); + final Map uriKeyValues = ((NodeIdentifierWithPredicates) lastPathArgument).asMap(); isEqualUriAndPayloadKeyValues(uriKeyValues, (MapEntryNode) data, keyDefinitions); } } @@ -123,13 +123,13 @@ public final class PutDataTransactionUtil { private static void isEqualUriAndPayloadKeyValues(final Map uriKeyValues, final MapEntryNode payload, final List keyDefinitions) { - final Map mutableCopyUriKeyValues = Maps.newHashMap(uriKeyValues); + final Map mutableCopyUriKeyValues = new HashMap<>(uriKeyValues); for (final QName keyDefinition : keyDefinitions) { - final Object uriKeyValue = mutableCopyUriKeyValues.remove(keyDefinition); - RestconfValidationUtils.checkDocumentedError(uriKeyValue != null, ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, - "Missing key " + keyDefinition + " in URI."); + final Object uriKeyValue = RestconfDocumentedException.throwIfNull( + mutableCopyUriKeyValues.remove(keyDefinition), ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, + "Missing key %s in URI.", keyDefinition); - final Object dataKeyValue = payload.getIdentifier().getKeyValues().get(keyDefinition); + final Object dataKeyValue = payload.getIdentifier().getValue(keyDefinition); if (!uriKeyValue.equals(dataKeyValue)) { final String errMsg = "The value '" + uriKeyValue + "' for key '" + keyDefinition.getLocalName() @@ -141,12 +141,13 @@ public final class PutDataTransactionUtil { } /** - * Check mount point and prepare variables for put data to DS. + * Check mount point and prepare variables for put data to DS. Close {@link DOMTransactionChain} inside of object + * {@link TransactionVarsWrapper} provided as a parameter. * * @param payload * data to put - * @param schemaCtxRef - * reference to {@link SchemaContext} + * @param schemaContext + * reference to {@link EffectiveModelContext} * @param transactionNode * wrapper of variables for transaction * @param point @@ -155,10 +156,9 @@ public final class PutDataTransactionUtil { * query parameter * @return {@link Response} */ - public static Response putData(final NormalizedNodeContext payload, final SchemaContextRef schemaCtxRef, + public static Response putData(final NormalizedNodeContext payload, final EffectiveModelContext schemaContext, final TransactionVarsWrapper transactionNode, final String insert, final String point) { final YangInstanceIdentifier path = payload.getInstanceIdentifierContext().getInstanceIdentifier(); - final SchemaContext schemaContext = schemaCtxRef.get(); final DOMDataTreeReadWriteTransaction readWriteTransaction = transactionNode.getTransactionChain().newReadWriteTransaction(); @@ -172,7 +172,9 @@ public final class PutDataTransactionUtil { new ResponseFactory(existsResponse.result ? Status.NO_CONTENT : Status.CREATED); final FluentFuture submitData = submitData(path, schemaContext, transactionNode.getTransactionChainHandler(), readWriteTransaction, payload.getData(), insert, point); - FutureCallbackTx.addCallback(submitData, RestconfDataServiceConstant.PutData.PUT_TX_TYPE, responseFactory); + //This method will close transactionChain + FutureCallbackTx.addCallback(submitData, RestconfDataServiceConstant.PutData.PUT_TX_TYPE, responseFactory, + transactionNode.getTransactionChain()); return responseFactory.build(); } @@ -194,7 +196,7 @@ public final class PutDataTransactionUtil { * @return {@link FluentFuture} */ private static FluentFuture submitData(final YangInstanceIdentifier path, - final SchemaContext schemaContext, final TransactionChainHandler transactionChainHandler, + final EffectiveModelContext schemaContext, final TransactionChainHandler transactionChainHandler, final DOMDataTreeReadWriteTransaction readWriteTransaction, final NormalizedNode data, final String insert, final String point) { if (insert == null) { @@ -287,13 +289,15 @@ public final class PutDataTransactionUtil { } } default: - throw new RestconfDocumentedException("Used bad value of insert parameter. Possible values are " - + "first, last, before or after, but was: " + insert); + throw new RestconfDocumentedException( + "Used bad value of insert parameter. Possible values are first, last, before or after, " + + "but was: " + insert, RestconfError.ErrorType.PROTOCOL, ErrorTag.BAD_ATTRIBUTE); } } - public static NormalizedNode readList(final YangInstanceIdentifier path, final SchemaContext schemaContext, - final TransactionChainHandler transactionChainHandler, final DataSchemaNode schemaNode) { + public static NormalizedNode readList(final YangInstanceIdentifier path, + final EffectiveModelContext schemaContext, final TransactionChainHandler transactionChainHandler, + final DataSchemaNode schemaNode) { final InstanceIdentifierContext iid = new InstanceIdentifierContext( path.getParent(), schemaNode, null, schemaContext); final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(iid, null, transactionChainHandler); @@ -304,7 +308,7 @@ public final class PutDataTransactionUtil { private static void insertWithPointLeafListPut(final DOMDataTreeReadWriteTransaction rwTransaction, final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final NormalizedNode data, final SchemaContext schemaContext, final String point, + final NormalizedNode data, final EffectiveModelContext schemaContext, final String point, final OrderedLeafSetNode readLeafList, final boolean before) { rwTransaction.delete(datastore, path.getParent()); final InstanceIdentifierContext instanceIdentifier = @@ -334,7 +338,7 @@ public final class PutDataTransactionUtil { private static void insertWithPointListPut(final DOMDataTreeReadWriteTransaction writeTx, final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final NormalizedNode data, final SchemaContext schemaContext, final String point, + final NormalizedNode data, final EffectiveModelContext schemaContext, final String point, final OrderedMapNode readList, final boolean before) { writeTx.delete(datastore, path.getParent()); final InstanceIdentifierContext instanceIdentifier = @@ -408,17 +412,20 @@ public final class PutDataTransactionUtil { if (dataSchemaNode instanceof ListSchemaNode) { if (!((ListSchemaNode) dataSchemaNode).isUserOrdered()) { - throw new RestconfDocumentedException("Insert parameter can be used only with ordered-by user list."); + throw new RestconfDocumentedException("Insert parameter can be used only with ordered-by user list.", + RestconfError.ErrorType.PROTOCOL, ErrorTag.BAD_ELEMENT); } return dataSchemaNode; } if (dataSchemaNode instanceof LeafListSchemaNode) { if (!((LeafListSchemaNode) dataSchemaNode).isUserOrdered()) { throw new RestconfDocumentedException( - "Insert parameter can be used only with ordered-by user leaf-list."); + "Insert parameter can be used only with ordered-by user leaf-list.", + RestconfError.ErrorType.PROTOCOL, ErrorTag.BAD_ELEMENT); } return dataSchemaNode; } - throw new RestconfDocumentedException("Insert parameter can be used only with list or leaf-list"); + throw new RestconfDocumentedException("Insert parameter can be used only with list or leaf-list", + RestconfError.ErrorType.PROTOCOL, ErrorTag.BAD_ELEMENT); } }