private static void getClassesFromDir(Collection<String> classes, File root, File dir, String pkg, Pattern regex, Class<? extends Annotation>[] annotated, Predicate<InputStream> bytecodeFilter, AtomicInteger searched) { U.must(dir.isDirectory()); Log.trace("Traversing directory", "root", root, "dir", dir); File[] files = dir.listFiles(); if (files == null) { Log.warn("Not a folder!", "dir", dir); return; } for (File file : files) { if (file.isDirectory()) { getClassesFromDir(classes, root, file, pkg, regex, annotated, bytecodeFilter, searched); } else { String rootPath = Str.trimr(root.getAbsolutePath(), File.separatorChar); int from = rootPath.length() + 1; String relName = file.getAbsolutePath().substring(from); if (!ignore(relName)) { scanFile(classes, regex, annotated, bytecodeFilter, relName, file, null, null, searched); } } } }
public static List<String> getClasses(ScanParams scanParams) { return ClasspathScanner.scan(scanParams); }
public static List<String> scan(ScanParams params) { return scanClasses(params); }
if (shouldScanDir(cpEntry.getAbsolutePath())) { Log.trace("Scanning directory", "root", cpEntry.getAbsolutePath()); getClassesFromDir(classes, cpEntry, startingDir, pkgName, regex, annotated, bytecodeFilter, searched); if (shouldScanJAR(jarName)) { Log.trace("Scanning JAR", "name", jarName); getClassesFromJAR(jarName, classes, packageName, regex, annotated, bytecodeFilter, classLoader, searched); } else { Log.trace("Skipping JAR", "name", jarName);
private static void resetAppStateBeforeRestart() { App.boot.reset(); App.status = AppStatus.NOT_STARTED; App.dirty = false; App.packages = null; Groups.reset(); Conf.reset(); Env.reset(); Res.reset(); JSON.reset(); Beany.reset(); for (RapidoidModule mod : RapidoidModules.getAllAvailable()) { mod.restartApp(); } AppStarter.reset(); ClasspathScanner.reset(); invoked.clear(); Setups.reloadAll(); Setups.initDefaults(); Conf.reset(); // reset the config again }
private static void scanFile(Collection<String> classes, Pattern regex, Class<? extends Annotation>[] annotated, Predicate<InputStream> bytecodeFilter, String relName, File file, ZipFile zip, ZipEntry entry, AtomicInteger searched) { Log.trace("scanned file", "file", relName); if (relName.endsWith(".class")) { searched.incrementAndGet(); String clsName = Str.sub(relName, 0, -6).replace('/', '.').replace('\\', '.'); if (U.isEmpty(regex) || regex.matcher(clsName).matches()) { try { InputStream input = file != null ? new FileInputStream(file) : zip.getInputStream(entry); boolean include; if (U.isEmpty(annotated)) { include = true; } else { ClassFile classFile = new ClassFile(new DataInputStream(input)); include = isAnnotated(classFile, annotated); } if (include && bytecodeFilter != null) { include = Lmbd.eval(bytecodeFilter, input); } if (include) { classes.add(clsName); } } catch (Throwable e) { Log.debug("Error while loading class", "name", clsName, "error", e); } } } }
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; }
private static void resetAppStateBeforeRestart() { App.path = null; App.boot = null; App.status = AppStatus.NOT_STARTED; App.dirty = false; Groups.reset(); Conf.reset(); Env.reset(); Res.reset(); Templates.reset(); JSON.reset(); Beany.reset(); AppStarter.reset(); AppBootstrap.reset(); ClasspathScanner.reset(); invoked.clear(); SetupUtil.reloadAll(); Conf.reset(); // reset the config again Setup.initDefaults(); // this changes the config Conf.reset(); // reset the config again }
public static List<Class<?>> loadClasses(ScanParams scanParams) { List<String> classNames = ClasspathScanner.scan(scanParams); List<Class<?>> classes = U.list(); ClassLoader classLoader = U.or(scanParams.classLoader(), defaultClassLoader); for (String clsName : classNames) { try { Log.trace("Loading class", "name", clsName); classes.add(classLoader != null ? Class.forName(clsName, true, classLoader) : Class.forName(clsName)); } catch (Throwable e) { Log.debug("Error while loading class", "name", clsName, "error", e); } } return classes; }