X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fmdsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fmdsal%2Fconnector%2Fops%2FEditConfig.java;h=66020c8dad9253a0f40f46b11c36f0197d38856d;hb=45ef57fef0b7a0951ac3ed4b0a249225071fcd2c;hp=7fcb1511059de0f3222b33e0386445815390ee66;hpb=1d91e1bbe29d0da6ea427a5d0837064c8a3d5134;p=netconf.git diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java index 7fcb151105..66020c8dad 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/ops/EditConfig.java @@ -7,36 +7,31 @@ */ package org.opendaylight.netconf.mdsal.connector.ops; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkState; + import java.util.List; import java.util.ListIterator; import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction; import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorSeverity; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; -import org.opendaylight.netconf.api.DocumentedException.ErrorType; +import org.opendaylight.netconf.api.ModifyAction; import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; -import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; -import org.opendaylight.netconf.mdsal.connector.ops.DataTreeChangeTracker.DataTreeChange; -import org.opendaylight.yangtools.yang.data.api.ModifyAction; +import org.opendaylight.yangtools.yang.common.ErrorSeverity; +import org.opendaylight.yangtools.yang.common.ErrorTag; +import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; +import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -64,9 +59,7 @@ public final class EditConfig extends AbstractEdit { final Datastore targetDatastore = Datastore.valueOf(targetElement.getName()); if (targetDatastore == Datastore.running) { throw new DocumentedException("edit-config on running datastore is not supported", - ErrorType.PROTOCOL, - ErrorTag.OPERATION_NOT_SUPPORTED, - ErrorSeverity.ERROR); + ErrorType.PROTOCOL, ErrorTag.OPERATION_NOT_SUPPORTED, ErrorSeverity.ERROR); } final ModifyAction defaultAction = getDefaultOperation(operationElement); @@ -76,19 +69,19 @@ public final class EditConfig extends AbstractEdit { for (final XmlElement element : configElement.getChildElements()) { final String ns = element.getNamespace(); final DataSchemaNode schemaNode = getSchemaNodeFromNamespace(ns, element); - final DataTreeChangeTracker changeTracker = new DataTreeChangeTracker(defaultAction); - parseIntoNormalizedNode(schemaNode, element, - new EditOperationNormalizedNodeStreamWriter(new NormalizedNodeResult(), changeTracker)); - executeOperations(changeTracker); + + final SplittingNormalizedNodeMetadataStreamWriter writer = new SplittingNormalizedNodeMetadataStreamWriter( + defaultAction); + parseIntoNormalizedNode(schemaNode, element, writer); + executeOperations(writer.getDataTreeChanges()); } - return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.absent()); + return document.createElement(XmlNetconfConstants.OK); } - private void executeOperations(final DataTreeChangeTracker changeTracker) throws DocumentedException { + private void executeOperations(final List changes) throws DocumentedException { final DOMDataTreeReadWriteTransaction rwTx = transactionProvider.getOrCreateTransaction(); - final List aa = changeTracker.getDataTreeChanges(); - final ListIterator iterator = aa.listIterator(aa.size()); + final ListIterator iterator = changes.listIterator(changes.size()); while (iterator.hasPrevious()) { final DataTreeChange dtc = iterator.previous(); @@ -98,8 +91,8 @@ public final class EditConfig extends AbstractEdit { private void executeChange(final DOMDataTreeReadWriteTransaction rwtx, final DataTreeChange change) throws DocumentedException { - final YangInstanceIdentifier path = YangInstanceIdentifier.create(change.getPath()); - final NormalizedNode changeData = change.getChangeRoot(); + final YangInstanceIdentifier path = change.getPath(); + final NormalizedNode changeData = change.getChangeRoot(); switch (change.getAction()) { case NONE: return; @@ -109,7 +102,7 @@ public final class EditConfig extends AbstractEdit { break; case CREATE: try { - if (rwtx.read(LogicalDatastoreType.CONFIGURATION, path).get().isPresent()) { + if (rwtx.exists(LogicalDatastoreType.CONFIGURATION, path).get()) { throw new DocumentedException("Data already exists, cannot execute CREATE operation", ErrorType.PROTOCOL, ErrorTag.DATA_EXISTS, ErrorSeverity.ERROR); } @@ -125,7 +118,7 @@ public final class EditConfig extends AbstractEdit { break; case DELETE: try { - if (!rwtx.read(LogicalDatastoreType.CONFIGURATION, path).get().isPresent()) { + if (!rwtx.exists(LogicalDatastoreType.CONFIGURATION, path).get()) { throw new DocumentedException("Data is missing, cannot execute DELETE operation", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, ErrorSeverity.ERROR); } @@ -143,19 +136,16 @@ public final class EditConfig extends AbstractEdit { } private void mergeParentMixin(final DOMDataTreeReadWriteTransaction rwtx, final YangInstanceIdentifier path, - final NormalizedNode change) { + final NormalizedNode change) { final YangInstanceIdentifier parentNodeYid = path.getParent(); if (change instanceof MapEntryNode) { - final SchemaNode schemaNode = SchemaContextUtil.findNodeInSchemaContext( - schemaContext.getCurrentContext(), - parentNodeYid.getPathArguments().stream() - // filter out identifiers not present in the schema tree - .filter(arg -> !(arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates)) - .filter(arg -> !(arg instanceof YangInstanceIdentifier.AugmentationIdentifier)) - .map(YangInstanceIdentifier.PathArgument::getNodeType).collect(Collectors.toList())); + final DataSchemaNode schemaNode = DataSchemaContextTree.from(schemaContext.getCurrentContext()) + .findChild(parentNodeYid) + .orElseThrow(() -> new IllegalStateException("Cannot find schema for " + parentNodeYid)) + .getDataSchemaNode(); // we should have the schema node that points to the parent list now, enforce it - Preconditions.checkState(schemaNode instanceof ListSchemaNode, "Schema node is not pointing to a list."); + checkState(schemaNode instanceof ListSchemaNode, "Schema node is not pointing to a list."); //merge empty ordered or unordered map if (((ListSchemaNode) schemaNode).isUserOrdered()) {