package eu.stratosphere.util.dag; import java.util.Iterator; import java.util.List; import eu.stratosphere.util.dag.GraphLevelPartitioner.Level; /** * Traverses a directed acyclic graph guaranteeing that all nodes with outgoing edges to a nodes are visited before that * node. Additionally, every node is visited exactly once. * * @author Arvid Heise */ public class DependencyAwareGraphTraverser extends AbstractGraphTraverser implements GraphTraverser { /** * The default instance of the {@link DependencyAwareGraphTraverser}. */ public final static DependencyAwareGraphTraverser INSTANCE = new DependencyAwareGraphTraverser(); @Override public <Node> void traverse(final Iterator<? extends Node> startNodes, final ConnectionNavigator<Node> navigator, final GraphTraverseListener<Node> listener) { final List<Level<Node>> levels = GraphLevelPartitioner.getLevels(startNodes, navigator); for (final Level<Node> level : levels) for (final Node node : level.getLevelNodes()) listener.nodeTraversed(node); } }