com.softicar.platform.common.code.classpath.metadata.TransitivelyRelatedClassesFinder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of platform-common Show documentation
Show all versions of platform-common Show documentation
The SoftiCAR Platform is a lightweight, Java-based library to create interactive business web applications.
package com.softicar.platform.common.code.classpath.metadata;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
class TransitivelyRelatedClassesFinder {
private final Function, Collection>> directlyRelatedClassesGetter;
public TransitivelyRelatedClassesFinder(Function, Collection>> directlyRelatedClassesGetter) {
this.directlyRelatedClassesGetter = directlyRelatedClassesGetter;
}
public Set> findAll(Collection> inputClasses) {
Set> result = new HashSet<>();
Set> done = new HashSet<>();
Deque> stack = new ArrayDeque<>(inputClasses);
while (!stack.isEmpty()) {
Class inputClass = stack.pop();
if (done.add(inputClass)) {
Collection> relatedClasses = directlyRelatedClassesGetter.apply(inputClass);
result.addAll(relatedClasses);
stack.addAll(relatedClasses);
}
}
result.removeAll(inputClasses);
return result;
}
}