static void visit(final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap, final List<Class<? extends TraversalStrategy>> sortedStrategyClasses, final Set<Class<? extends TraversalStrategy>> seenStrategyClases, final List<Class<? extends TraversalStrategy>> unprocessedStrategyClasses, Class<? extends TraversalStrategy> strategyClass) { if (seenStrategyClases.contains(strategyClass)) { throw new IllegalStateException("Cyclic dependency between traversal strategies: [" + seenStrategyClases + ']'); } if (unprocessedStrategyClasses.contains(strategyClass)) { seenStrategyClases.add(strategyClass); for (Class<? extends TraversalStrategy> dependency : MultiMap.get(dependencyMap, strategyClass)) { visit(dependencyMap, sortedStrategyClasses, seenStrategyClases, unprocessedStrategyClasses, dependency); } seenStrategyClases.remove(strategyClass); unprocessedStrategyClasses.remove(strategyClass); sortedStrategyClasses.add(strategyClass); } }
visit(dependencyMap, sortedStrategyClasses, seenStrategyClasses, unprocessedStrategyClasses, strategy);
static void visit(final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap, final List<Class<? extends TraversalStrategy>> sortedStrategyClasses, final Set<Class<? extends TraversalStrategy>> seenStrategyClases, final List<Class<? extends TraversalStrategy>> unprocessedStrategyClasses, Class<? extends TraversalStrategy> strategyClass) { if (seenStrategyClases.contains(strategyClass)) { throw new IllegalStateException("Cyclic dependency between traversal strategies: [" + seenStrategyClases + ']'); } if (unprocessedStrategyClasses.contains(strategyClass)) { seenStrategyClases.add(strategyClass); for (Class<? extends TraversalStrategy> dependency : MultiMap.get(dependencyMap, strategyClass)) { visit(dependencyMap, sortedStrategyClasses, seenStrategyClases, unprocessedStrategyClasses, dependency); } seenStrategyClases.remove(strategyClass); unprocessedStrategyClasses.remove(strategyClass); sortedStrategyClasses.add(strategyClass); } }
visit(dependencyMap, sortedStrategyClasses, seenStrategyClasses, unprocessedStrategyClasses, strategy);