Remove SchemaContextRef
[netconf.git] / restconf / restconf-nb-rfc8040 / src / main / java / org / opendaylight / restconf / nb / rfc8040 / rests / utils / PostDataTransactionUtil.java
index 564e255b55ae46d820ab826cb4b78d673a2df7de..1e79b9a36f16af144d8c0f45a5cab653d5a307d7 100644 (file)
@@ -9,10 +9,10 @@ package org.opendaylight.restconf.nb.rfc8040.rests.utils;
 
 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;
@@ -22,7 +22,6 @@ 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.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;
@@ -44,7 +43,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
  */
 public final class PostDataTransactionUtil {
     private PostDataTransactionUtil() {
-        throw new UnsupportedOperationException("Util class.");
+        // Hidden on purpose
     }
 
     /**
@@ -57,8 +56,8 @@ public final class PostDataTransactionUtil {
      *             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
@@ -66,12 +65,12 @@ public final class PostDataTransactionUtil {
      * @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,
@@ -104,118 +103,104 @@ public final class PostDataTransactionUtil {
         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);
         }
     }
 
@@ -325,23 +310,29 @@ public final class PostDataTransactionUtil {
      *             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,