in processor/src/main/java/org/apache/commons/weaver/utils/Providers.java [83:106]
private void tsort(final Class<? extends P> root,
final Map<Class<? extends P>, Set<Class<? extends P>>> dependencyMap,
final Map<Class<? extends P>, State> stateMap, final Deque<Class<? extends P>> visiting,
final Collection<Class<? extends P>> target) {
stateMap.put(root, State.VISITING);
visiting.push(root);
for (final Class<? extends P> dependency : dependencyMap.get(root)) {
final State state = stateMap.get(dependency);
if (state == State.VISITED) {
continue;
}
Validate.validState(state == null, "Circular dependency: %s of %s", dependency.getName(),
root.getName());
tsort(dependency, dependencyMap, stateMap, visiting, target);
}
final Class<? extends P> top = visiting.pop();
Validate.validState(top == root, "Stack out of balance: expected %s, found %s", root.getName(),
top.getName());
stateMap.put(root, State.VISITED);
target.add(root);
}