package org.wildfly.swarm.bootstrap.env; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * Each direct dependency (parent) keeps a bucket of transient dependencies (children) * so we can infer the origin (parent) for each transient dependency. * * @author Heiko Braun * @author Ken Finnigan * @since 05/12/2016 */ public class DependencyTree<T> { /** * A transient dependencies linked ot a parent (origin) * * @param parent */ public void add(T parent, T child) { final Set<T> children = depTree.computeIfAbsent(parent, p -> new HashSet<>()); if (!child.equals(parent)) { children.add(child); } } /** * Direct dep without any transient dependencies * * @param parent */ public void add(T parent) { depTree.computeIfAbsent(parent, p -> new HashSet<>()); } public Collection<T> getDirectDeps() { return depTree .keySet() .stream() .sorted(this::comparator) .collect(Collectors.toList()); } protected int comparator(T first, T second) { return 0; } public Collection<T> getTransientDeps(T parent) { Set<T> deps = depTree.get(parent); if (null == deps) { throw new IllegalArgumentException("Unknown dependency " + parent); } return deps; } protected Map<T, Set<T>> depTree = new HashMap<>(); }