import java.util.List; import java.util.Set; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; public class Dependency { private ImmutableMap<String, List<String>> dependencies; private Set<String> popped = Sets.newHashSet() ; public Dependency(ImmutableMap<String, List<String>> dependencies) { this.dependencies = dependencies; } public Set<String> compute(String source) { Set<String> result = resolveDependencies(source); result.remove(source) ; return result ; } private Set<String> resolveDependencies(String source) { Set<String> result = Sets.newHashSet(); if(!popped.contains(source)) { popped.add(source) ; if (dependencies.get(source) != null) { for (String dependency : dependencies.get(source)) { result.add(dependency); result.addAll(resolveDependencies(dependency)); } } return result; } return result; } }