package knorxx.framework.generator.dependency; import com.google.common.base.Optional; import java.util.Set; import knorxx.framework.generator.JavaFile; import knorxx.framework.generator.JavaFileOnClasspath; import knorxx.framework.generator.JavaFileWithSource; import static knorxx.framework.generator.util.JavaIdentifierUtils.removeInnerClassesAndInvalidClassNames; /** * Chainable abstract super class for all dependecy collectors. * * @author sj */ public abstract class DependencyCollector { private Optional<DependencyCollector> nextCollector = Optional.absent(); public DependencyCollector() { } public DependencyCollector(DependencyCollector nextCollector) { this.nextCollector = Optional.of(nextCollector); } public Set<String> collect(JavaFileOnClasspath<?> javaFile, ClassLoader classLoader) { return genericCollect(javaFile, classLoader); } public Set<String> collect(JavaFileWithSource<?> javaFile, ClassLoader classLoader) { return genericCollect(javaFile, classLoader); } private Set<String> genericCollect(JavaFile<?> javaFile, ClassLoader classLoader) { Set<String> result = collectInternal(javaFile, classLoader); if (nextCollector.isPresent()) { result.addAll(nextCollector.get().genericCollect(javaFile, classLoader)); } result.remove(javaFile.getJavaClassName()); return removeInnerClassesAndInvalidClassNames(result); } protected abstract Set<String> collectInternal(JavaFile<?> javaFile, ClassLoader classLoader); }