private static List<String> scanClasses(ScanParams params) {
String[] pkgs = params.in();
String rootPackage = ClasspathUtil.getRootPackage();
if (U.isEmpty(pkgs)) {
pkgs = rootPackage != null ? new String[]{rootPackage} : new String[]{""};
}
long startingAt = U.time();
String regex = params.matching();
Pattern pattern = U.notEmpty(regex) ? Pattern.compile(regex) : null;
if (regex != null) {
Log.info("Scanning classpath", "!annotated", Msc.annotations(params.annotated()), "!packages", Arrays.toString(pkgs), "!matching", regex);
} else {
Log.info("Scanning classpath", "!annotated", Msc.annotations(params.annotated()), "!packages", Arrays.toString(pkgs));
}
Set<String> classpath = U.notEmpty(params.classpath()) ? U.set(params.classpath()) : ClasspathUtil.getClasspath();
AtomicInteger searched = new AtomicInteger();
Set<String> classes = U.set();
for (String pkg : pkgs) {
classes.addAll(retrieveClasses(classpath, pkg, params.annotated(), params.bytecodeFilter(), pattern, params.classLoader(), searched));
}
List<String> classList = U.list(classes);
long timeMs = U.time() - startingAt;
Log.info("Finished classpath scan", "time", Msc.maybeMasked(timeMs) + "ms", "searched", searched.get(), "!found", Msc.classNames(classList));
return classList;
}