private void computeDependencies(List<GraphNode<T>> nodes) { List<GraphNode<T>> nextNodesToDisplay = null; for (GraphNode<T> node : nodes) { if (!isAlreadyEvaluated(node)) { List<GraphNode<T>> comingInNodes = node.getComingInNodes(); if (areAlreadyEvaluated(comingInNodes)) { listener.evaluating(node.value); evaluatedNodes.add(node); List<GraphNode<T>> goingOutNodes = node.getGoingOutNodes(); if (goingOutNodes != null) { if (nextNodesToDisplay == null) nextNodesToDisplay = new ArrayList<GraphNode<T>>(); // add these too, so they get a chance to be displayed // as well nextNodesToDisplay.addAll(goingOutNodes); } } else { if (nextNodesToDisplay == null) nextNodesToDisplay = new ArrayList<GraphNode<T>>(); // the checked node should be carried nextNodesToDisplay.add(node); } } } if (nextNodesToDisplay != null) { computeDependencies(nextNodesToDisplay); } // here the recursive call ends }
private List<GraphNode<T>> getOrphanNodes() { List<GraphNode<T>> orphanNodes = null; Set<T> keys = nodes.keySet(); for (T key : keys) { GraphNode<T> node = nodes.get(key); if (node.getComingInNodes() == null) { if (orphanNodes == null) orphanNodes = new ArrayList<GraphNode<T>>(); orphanNodes.add(node); } } return orphanNodes; }