private static void scanDirectory(File directory, ClassLoader classloader, String packagePrefix, Set<File> ancestors, Visitor visitor) throws IOException {
File canonical = directory.getCanonicalFile();
if (ancestors.contains(canonical)) {
return;
}
File[] files = directory.listFiles();
if (files == null) {
return;
}
Set<File> newAncestors = new HashSet<>();
newAncestors.addAll(ancestors);
newAncestors.add(canonical);
for (File f : files) {
String name = f.getName();
if (f.isDirectory()) {
scanDirectory(f, classloader, packagePrefix + name + "/", newAncestors, visitor);
} else {
String resourceName = packagePrefix + name;
if (!resourceName.equals(JarFile.MANIFEST_NAME))
visitor.visit(resourceName, f.toURI().toURL(), classloader);
}
}
}