2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
10 import com.google.common.base.Preconditions;
11 import java.util.Collection;
12 import java.util.Iterator;
14 abstract class AbstractReadyIterator {
15 final Iterator<ModifiedNode> children;
16 final ModifiedNode node;
18 private AbstractReadyIterator(final ModifiedNode node, final Iterator<ModifiedNode> children) {
19 this.children = Preconditions.checkNotNull(children);
20 this.node = Preconditions.checkNotNull(node);
23 static AbstractReadyIterator create(final ModifiedNode root) {
24 return new RootReadyIterator(root, root.getChildren().iterator());
27 final AbstractReadyIterator process() {
28 // Walk all child nodes and remove any children which have not
29 // been modified. If a child
30 while (children.hasNext()) {
31 final ModifiedNode child = children.next();
32 final Collection<ModifiedNode> grandChildren = child.getChildren();
33 if (grandChildren.isEmpty()) {
35 if (child.getOperation() == LogicalOperation.NONE) {
39 return new NestedReadyIterator(this, child, grandChildren.iterator());
45 // Remove from parent if we have one and this is a no-op
46 if (node.getOperation() == LogicalOperation.NONE) {
52 abstract AbstractReadyIterator getParent();
53 abstract void removeFromParent();
55 private static final class NestedReadyIterator extends AbstractReadyIterator {
56 private final AbstractReadyIterator parent;
58 private NestedReadyIterator(final AbstractReadyIterator parent, final ModifiedNode node, final Iterator<ModifiedNode> children) {
59 super(node, children);
60 this.parent = Preconditions.checkNotNull(parent);
64 AbstractReadyIterator getParent() {
69 void removeFromParent() {
70 parent.children.remove();
74 private static final class RootReadyIterator extends AbstractReadyIterator {
75 private RootReadyIterator(final ModifiedNode node, final Iterator<ModifiedNode> children) {
76 super(node, children);
80 AbstractReadyIterator getParent() {
85 void removeFromParent() {
86 // No-op, since root node cannot be removed