X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fapi%2Fschema%2Ftree%2FDataTreeCandidateNodes.java;h=8145bfe711884fbe1a72fba28ee7c19eb8ef1469;hb=e837463d8a8fe20766fb21897cc8086fbdf201e4;hp=e1636ae77e8707baccc837e5f721ad78cbc30a55;hpb=6e8cb34ea33cbcbb2990af3247fd04b6a0af6846;p=yangtools.git diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidateNodes.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidateNodes.java index e1636ae77e..8145bfe711 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidateNodes.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeCandidateNodes.java @@ -11,6 +11,8 @@ import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import java.util.Collection; import java.util.Iterator; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @Beta @@ -29,8 +31,8 @@ public final class DataTreeCandidateNodes { cursor.delete(node.getIdentifier()); break; case SUBTREE_MODIFIED: - cursor.enter(node.getIdentifier()); - NodeIterator iterator = new NodeIterator(null, node.getChildNodes().iterator()); + cursor.enter(node.getIdentifier()); + AbstractNodeIterator iterator = new ExitingNodeIterator(null, node.getChildNodes().iterator()); do { iterator = iterator.next(cursor); } while (iterator != null); @@ -46,16 +48,33 @@ public final class DataTreeCandidateNodes { } } - private static final class NodeIterator { + public static void applyRootToCursor(final DataTreeModificationCursor cursor, final DataTreeCandidateNode node) { + switch (node.getModificationType()) { + case DELETE: + throw new IllegalArgumentException("Can not delete root."); + case WRITE: + case SUBTREE_MODIFIED: + AbstractNodeIterator iterator = new RootNonExitingIterator(node.getChildNodes().iterator()); + do { + iterator = iterator.next(cursor); + } while (iterator != null); + break; + case UNMODIFIED: + // No-op + break; + default: + throw new IllegalArgumentException("Unsupported modification " + node.getModificationType()); + } + } + + private abstract static class AbstractNodeIterator { private final Iterator iterator; - private final NodeIterator parent; - NodeIterator(final NodeIterator parent, final Iterator iterator) { - this.parent = Preconditions.checkNotNull(parent); + AbstractNodeIterator(final Iterator iterator) { this.iterator = Preconditions.checkNotNull(iterator); } - NodeIterator next(final DataTreeModificationCursor cursor) { + AbstractNodeIterator next(final DataTreeModificationCursor cursor) { while (iterator.hasNext()) { final DataTreeCandidateNode node = iterator.next(); switch (node.getModificationType()) { @@ -66,7 +85,7 @@ public final class DataTreeCandidateNodes { final Collection children = node.getChildNodes(); if (!children.isEmpty()) { cursor.enter(node.getIdentifier()); - return new NodeIterator(this, children.iterator()); + return new ExitingNodeIterator(this, children.iterator()); } break; case UNMODIFIED: @@ -79,9 +98,50 @@ public final class DataTreeCandidateNodes { throw new IllegalArgumentException("Unsupported modification " + node.getModificationType()); } } + exitNode(cursor); + return getParent(); + } - cursor.exit(); + protected abstract @Nullable AbstractNodeIterator getParent(); + + protected abstract void exitNode(DataTreeModificationCursor cursor); + } + + private static final class RootNonExitingIterator extends AbstractNodeIterator { + + protected RootNonExitingIterator(@Nonnull final Iterator iterator) { + super(iterator); + } + + @Override + protected void exitNode(final DataTreeModificationCursor cursor) { + // Intentional noop. + } + + @Override + protected AbstractNodeIterator getParent() { + return null; + } + } + + private static final class ExitingNodeIterator extends AbstractNodeIterator { + + private final AbstractNodeIterator parent; + + public ExitingNodeIterator(@Nullable final AbstractNodeIterator parent, + @Nonnull final Iterator iterator) { + super(iterator); + this.parent = parent; + } + + @Override + protected AbstractNodeIterator getParent() { return parent; } + + @Override + protected void exitNode(final DataTreeModificationCursor cursor) { + cursor.exit(); + } } }