private List<String> computeStartingOrder() { Graph<String, DefaultEdge> dependenciesGraph = generateGraph(commands); Map<String, List<String>> dependenciesMapByComponent = commands.values().stream().collect(Collectors.toMap(Bootstrap::getName, c -> DependenciesCalculator.calculateParents(dependenciesGraph, c.getName()))); Map<String, List<String>> transitiveDependenciesMapByComponent = DependenciesCalculator.findTransitiveDependenciesByComponent(dependenciesMapByComponent); return DependenciesCalculator.dryRunToDefineCorrectOrder(transitiveDependenciesMapByComponent); }
static void buildDependencies(List<String> accumulator, Map<String, List<String>> dependenciesMap, String currentComponent) { if (dependenciesMap.containsKey(currentComponent)) { for (String dep : dependenciesMap.get(currentComponent)) { if (!accumulator.contains(dep)) { buildDependencies(accumulator, dependenciesMap, dep); accumulator.add(dep); } } } } }
private List<String> computeStartingOrder() { Graph<String, DefaultEdge> dependenciesGraph = generateGraph(commands); Map<String, List<String>> dependenciesMapByComponent = commands.values().stream().collect(Collectors.toMap(Bootstrap::getName, c -> DependenciesCalculator.calculateParents(dependenciesGraph, c.getName()))); Map<String, List<String>> transitiveDependenciesMapByComponent = DependenciesCalculator.findTransitiveDependenciesByComponent(dependenciesMapByComponent); return DependenciesCalculator.dryRunToDefineCorrectOrder(transitiveDependenciesMapByComponent); }
static void buildDependencies(List<String> accumulator, Map<String, List<String>> dependenciesMap, String currentComponent) { if (dependenciesMap.containsKey(currentComponent)) { for (String dep : dependenciesMap.get(currentComponent)) { if (!accumulator.contains(dep)) { buildDependencies(accumulator, dependenciesMap, dep); accumulator.add(dep); } } } } }
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); }
public static Map<String, List<String>> findTransitiveDependenciesByComponent(Map<String, List<String>> dependenciesMapByComponent) { Map<String, List<String>> result = new HashMap<>(); dependenciesMapByComponent.entrySet().stream().forEach(entry -> { List<String> dependencies = new ArrayList<>(); buildDependencies(dependencies, dependenciesMapByComponent, entry.getKey()); result.put(entry.getKey(), dependencies); }); return result; }
public static Map<String, List<String>> findTransitiveDependenciesByComponent(Map<String, List<String>> dependenciesMapByComponent) { Map<String, List<String>> result = new HashMap<>(); dependenciesMapByComponent.entrySet().stream().forEach(entry -> { List<String> dependencies = new ArrayList<>(); buildDependencies(dependencies, dependenciesMapByComponent, entry.getKey()); result.put(entry.getKey(), dependencies); }); return result; }