private static List<String> computeStartingOrder(Map<String, ComponentDependencies> componentsToStartWithDependencies) {
Map<String, ComponentMetadata> commands = new HashMap<>();
componentsToStartWithDependencies.entrySet().stream().forEach(entry -> {
try {
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> componentClass = currentThreadClassLoader.loadClass(hadoopUnitConfiguration.getString(entry.getKey() + ".metadataClass"));
ComponentMetadata componentInstance = (ComponentMetadata) componentClass.getConstructor().newInstance();
commands.put(componentInstance.getName(), componentInstance);
} catch (Exception e) {
LOGGER.error("unable to instantiate {}", entry.getValue().getName(), e);
}
});
Graph<String, DefaultEdge> dependenciesGraph = generateGraph(commands);
Map<String, List<String>> dependenciesMapByComponent = commands.values().stream().collect(Collectors.toMap(ComponentMetadata::getName, c -> DependenciesCalculator.calculateParents(dependenciesGraph, c.getName())));
Map<String, List<String>> transitiveDependenciesMapByComponent = DependenciesCalculator.findTransitiveDependenciesByComponent(dependenciesMapByComponent);
return DependenciesCalculator.dryRunToDefineCorrectOrder(transitiveDependenciesMapByComponent);
}