import com.google.common.util.concurrent.FluentFuture;
import java.net.URI;
+import java.util.Collection;
import java.util.Optional;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.opendaylight.mdsal.common.api.CommitInfo;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
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.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.data.api.YangInstanceIdentifier;
*/
public final class PostDataTransactionUtil {
private PostDataTransactionUtil() {
- throw new UnsupportedOperationException("Util class.");
+ // Hidden on purpose
}
/**
* data
* @param transactionNode
* wrapper for transaction data
- * @param schemaContextRef
- * reference to actual {@link SchemaContext}
+ * @param schemaContext
+ * reference to current {@link EffectiveModelContext}
* @param point
* point
* @param insert
* @return {@link Response}
*/
public static Response postData(final UriInfo uriInfo, final NormalizedNodeContext payload,
- final TransactionVarsWrapper transactionNode, final SchemaContextRef schemaContextRef, final String insert,
- final String point) {
+ final TransactionVarsWrapper transactionNode, final EffectiveModelContext schemaContext,
+ final String insert, final String point) {
final FluentFuture<? extends CommitInfo> future = submitData(
payload.getInstanceIdentifierContext().getInstanceIdentifier(), payload.getData(),
- transactionNode, schemaContextRef.get(), insert, point);
- final URI location = PostDataTransactionUtil.resolveLocation(uriInfo, transactionNode, schemaContextRef);
+ transactionNode, schemaContext, insert, point);
+ final URI location = resolveLocation(uriInfo, transactionNode, schemaContext, payload.getData());
final ResponseFactory dataFactory = new ResponseFactory(Status.CREATED).location(location);
//This method will close transactionChain
FutureCallbackTx.addCallback(future, RestconfDataServiceConstant.PostData.POST_TX_TYPE, dataFactory,
if (insert == null) {
makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
return newReadWriteTransaction.commit();
- } else {
- final DataSchemaNode schemaNode = PutDataTransactionUtil.checkListAndOrderedType(schemaContext, path);
- switch (insert) {
- case "first":
- if (schemaNode instanceof ListSchemaNode) {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
- final OrderedMapNode readList = (OrderedMapNode) readData;
- if (readList == null || readList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION,
- path.getParent().getParent());
- simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data,
- schemaContext, transactionChain);
- makePost(path, readData, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- }
- } else {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+ }
- final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
- if (readLeafList == null || readLeafList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION,
- path.getParent().getParent());
- simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data,
- schemaContext, transactionChain);
- makePost(path, readData, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- }
+ final DataSchemaNode schemaNode = PutDataTransactionUtil.checkListAndOrderedType(schemaContext, path);
+ switch (insert) {
+ case "first":
+ if (schemaNode instanceof ListSchemaNode) {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+ final OrderedMapNode readList = (OrderedMapNode) readData;
+ if (readList == null || readList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
}
- case "last":
- makePost(path, data, schemaContext, transactionChain,
+
+ newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, path.getParent().getParent());
+ simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data, schemaContext,
+ transactionChain);
+ makePost(path, readData, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
+ } else {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+
+ final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
+ if (readLeafList == null || readLeafList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain,
newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
+ }
+
+ newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, path.getParent().getParent());
+ simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data, schemaContext,
+ transactionChain);
+ makePost(path, readData, schemaContext, transactionChain, newReadWriteTransaction);
return newReadWriteTransaction.commit();
- case "before":
- if (schemaNode instanceof ListSchemaNode) {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
- final OrderedMapNode readList = (OrderedMapNode) readData;
- if (readList == null || readList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path,
- data, schemaContext, point, readList, true,
- transactionChain);
- return newReadWriteTransaction.commit();
- }
- } else {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+ }
+ case "last":
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
+ case "before":
+ if (schemaNode instanceof ListSchemaNode) {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+ final OrderedMapNode readList = (OrderedMapNode) readData;
+ if (readList == null || readList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
+ }
- final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
- if (readLeafList == null || readLeafList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION,
- path, data, schemaContext, point, readLeafList, true,
- transactionChain);
- return newReadWriteTransaction.commit();
- }
+ insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path,
+ data, schemaContext, point, readList, true, transactionChain);
+ return newReadWriteTransaction.commit();
+ } else {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+
+ final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
+ if (readLeafList == null || readLeafList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
}
- case "after":
- if (schemaNode instanceof ListSchemaNode) {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
- final OrderedMapNode readList = (OrderedMapNode) readData;
- if (readList == null || readList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path,
- data, schemaContext, point, readList, false,
- transactionChain);
- return newReadWriteTransaction.commit();
- }
- } else {
- final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
- schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
- final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
- if (readLeafList == null || readLeafList.getValue().isEmpty()) {
- makePost(path, data, schemaContext, transactionChain,
- newReadWriteTransaction);
- return newReadWriteTransaction.commit();
- } else {
- insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION,
- path, data, schemaContext, point, readLeafList, true,
- transactionChain);
- return newReadWriteTransaction.commit();
- }
+ insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION,
+ path, data, schemaContext, point, readLeafList, true, transactionChain);
+ return newReadWriteTransaction.commit();
+ }
+ case "after":
+ if (schemaNode instanceof ListSchemaNode) {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+ final OrderedMapNode readList = (OrderedMapNode) readData;
+ if (readList == null || readList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
}
- default:
- throw new RestconfDocumentedException(
- "Used bad value of insert parameter. Possible values are first, last, before or after, "
- + "but was: " + insert, RestconfError.ErrorType.PROTOCOL,
- RestconfError.ErrorTag.BAD_ATTRIBUTE);
- }
+
+ insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path,
+ data, schemaContext, point, readList, false,
+ transactionChain);
+ return newReadWriteTransaction.commit();
+ } else {
+ final NormalizedNode<?, ?> readData = PutDataTransactionUtil.readList(path.getParent(),
+ schemaContext, transactionNode.getTransactionChainHandler(), schemaNode);
+
+ final OrderedLeafSetNode<?> readLeafList = (OrderedLeafSetNode<?>) readData;
+ if (readLeafList == null || readLeafList.getValue().isEmpty()) {
+ makePost(path, data, schemaContext, transactionChain, newReadWriteTransaction);
+ return newReadWriteTransaction.commit();
+ }
+
+ insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION,
+ path, data, schemaContext, point, readLeafList, true, transactionChain);
+ return newReadWriteTransaction.commit();
+ }
+ default:
+ throw new RestconfDocumentedException(
+ "Used bad value of insert parameter. Possible values are first, last, before or after, but was: "
+ + insert, RestconfError.ErrorType.PROTOCOL, RestconfError.ErrorTag.BAD_ATTRIBUTE);
}
}
* uri info
* @param transactionNode
* wrapper for data of transaction
- * @param schemaContextRef
+ * @param schemaContext
* reference to {@link SchemaContext}
* @return {@link URI}
*/
private static URI resolveLocation(final UriInfo uriInfo, final TransactionVarsWrapper transactionNode,
- final SchemaContextRef schemaContextRef) {
+ final EffectiveModelContext schemaContext, final NormalizedNode<?, ?> data) {
if (uriInfo == null) {
return null;
}
- final UriBuilder uriBuilder = uriInfo.getBaseUriBuilder();
- uriBuilder.path("data");
- uriBuilder.path(ParserIdentifier
- .stringFromYangInstanceIdentifier(transactionNode.getInstanceIdentifier().getInstanceIdentifier(),
- schemaContextRef.get()));
+ YangInstanceIdentifier path = transactionNode.getInstanceIdentifier().getInstanceIdentifier();
+
+ if (data instanceof MapNode) {
+ final Collection<MapEntryNode> children = ((MapNode) data).getValue();
+ if (!children.isEmpty()) {
+ path = path.node(children.iterator().next().getIdentifier());
+ }
+ }
- return uriBuilder.build();
+ return uriInfo.getBaseUriBuilder()
+ .path("data")
+ .path(ParserIdentifier.stringFromYangInstanceIdentifier(path, schemaContext))
+ .build();
}
private static void simplePost(final DOMDataTreeReadWriteTransaction rwTransaction,