*/
package org.opendaylight.netconf.mdsal.connector.ops;
-import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
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.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;
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<DataTreeChange> changes) throws DocumentedException {
final DOMDataTreeReadWriteTransaction rwTx = transactionProvider.getOrCreateTransaction();
- final List<DataTreeChange> aa = changeTracker.getDataTreeChanges();
- final ListIterator<DataTreeChange> iterator = aa.listIterator(aa.size());
+ final ListIterator<DataTreeChange> iterator = changes.listIterator(changes.size());
while (iterator.hasPrevious()) {
final DataTreeChange dtc = iterator.previous();
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;
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);
}
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);
}
}
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.");