@Override public boolean matches(Class<?> type) { for (PackageScanFilter filter : filters) { if (!filter.matches(type)) { return false; } } return true; } }
private PackageScanFilter getCompositeFilter(PackageScanFilter filter) { if (scanFilters != null) { CompositePackageScanFilter composite = new CompositePackageScanFilter(scanFilters); composite.addFilter(filter); return composite; } return filter; }
@Bean public PackageScanClassResolver packageScanClassResolver(ApplicationContext applicationContext) { return new PackageScanClassResolver(applicationContext); } }
public Set<Class<?>> findImplementations(Class parent, String... packageNames) { if (packageNames == null) { return Collections.emptySet(); } log.debug("Searching for implementations of " + parent.getName() + " in packages: " + Arrays .asList(packageNames)); PackageScanFilter test = getCompositeFilter(new AssignableToPackageScanFilter(parent)); Set<Class<?>> classes = new LinkedHashSet<>(); for (String pkg : packageNames) { find(test, pkg, classes); } log.debug("Found: " + classes); return classes; }
public Set<Class<?>> findImplementations(Class parent, String... packageNames) { if (packageNames == null) { return Collections.emptySet(); } log.debug("Searching for implementations of " + parent.getName() + " in packages: " + Arrays .asList(packageNames)); PackageScanFilter test = getCompositeFilter(new AssignableToPackageScanFilter(parent)); return findByFilter(test, packageNames); }
protected void find(PackageScanFilter test, String packageName, Set<Class<?>> classes) { packageName = packageName.replace('.', '/'); Set<ClassLoader> set = getClassLoaders(); if (!loadedPackages.contains(packageName)) { for (ClassLoader classLoader : set) { this.findAllClasses(packageName, classLoader); } loadedPackages.add(packageName); } findInAllClasses(test, packageName, classes); }
protected void findInAllClasses(PackageScanFilter test, String packageName, Set<Class<?>> classes) { log.debug("Searching for: " + test + " in package: " + packageName); Set<Class> packageClasses = getFoundClasses(packageName); if (packageClasses == null) { log.debug("No classes found in package: " + packageName); return; } for (Class type : packageClasses) { if (test.matches(type)) { classes.add(type); } } }
@Bean public Repositories repositories(PackageScanClassResolver packageScanClassResolver) { Set<String> packages = packageScanClassResolver.detectPackagesToScan(basePackages); Set<Class<?>> allSubClasses = packageScanClassResolver .findImplementations(EntityPathWrapper.class, packages.toArray(new String[0])); return new Repositories(mapperFactoryBeans, allSubClasses); }
protected void find(PackageScanFilter test, String packageName, Set<Class<?>> classes) { packageName = packageName.replace('.', '/'); if (!loadedPackages.contains(packageName)) { this.findAllClasses(packageName); loadedPackages.add(packageName); } findInAllClasses(test, packageName, classes); }
private void loadClass(String className, ClassLoader classLoader) { try { if (className.startsWith(SPRING_BOOT_PREFIX)) { className = className.substring(SPRING_BOOT_PREFIX.length()); } String externalName = className.substring(0, className.indexOf('.')).replace('/', '.'); Class<?> type = classLoader.loadClass(externalName); log.debug("Loaded the class: " + type + " in classloader: " + classLoader); addFoundClass(type); } catch (ClassNotFoundException e) { log.debug( "Cannot find class '" + className + "' in classloader: " + classLoader + ". Reason: " + e, e); } catch (LinkageError e) { log.debug( "Cannot find the class definition '" + className + "' in classloader: " + classLoader + ". Reason: " + e, e); } catch (Throwable e) { log.error( "Cannot load class '" + className + "' in classloader: " + classLoader + ". Reason: " + e, e); } }
public Set<Class<?>> findByFilter(PackageScanFilter filter, String... packageNames) { if (packageNames == null) { return Collections.emptySet(); } Set<Class<?>> classes = new LinkedHashSet<>(); for (String pkg : packageNames) { find(filter, pkg, classes); } log.debug("Found: " + classes); return classes; }
public void addClassLoader(ClassLoader classLoader) { try { getClassLoaders().add(classLoader); } catch (UnsupportedOperationException ex) { // Ignore this exception as the PackageScanClassResolver // don't want use any other classloader } }
private PackageScanFilter getCompositeFilter(PackageScanFilter filter) { if (scanFilters != null) { CompositePackageScanFilter composite = new CompositePackageScanFilter(scanFilters); composite.addFilter(filter); return composite; } return filter; }
protected void findInAllClasses(PackageScanFilter test, String packageName, Set<Class<?>> classes) { log.debug("Searching for: " + test + " in package: " + packageName); Set<Class> packageClasses = getFoundClasses(packageName); if (packageClasses == null) { log.debug("No classes found in package: " + packageName); return; } for (Class type : packageClasses) { if (test.matches(type)) { classes.add(type); } } }
@Bean public Module module(PackageScanClassResolver packageScanClassResolver) { SimpleModule module = new SimpleModule(); Set<String> packages = packageScanClassResolver.detectPackagesToScan(basePackages); packages.add("cn.bestwu.simpleframework"); Set<Class<?>> allSubClasses = packageScanClassResolver .findImplementations(MixIn.class, packages.toArray(new String[0])); for (Class<?> aClass : allSubClasses) { ParameterizedType object = (ParameterizedType) aClass.getGenericInterfaces()[0]; Class targetType = (Class) object.getActualTypeArguments()[0]; if (log.isDebugEnabled()) { log.debug("Detected MixInAnnotation:{}=>{}", targetType, aClass); } module.setMixInAnnotation(targetType, aClass); } return module; }
protected void addFoundClass(Class<?> type) { if (type.getPackage() != null) { String packageName = type.getPackage().getName(); List<String> packageNameParts = Arrays.asList(packageName.split("\\.")); for (int i = 0; i < packageNameParts.size(); i++) { String thisPackage = StringUtils.join(packageNameParts.subList(0, i + 1), '/'); addFoundClass(thisPackage, type); } } }
@Override public boolean matches(Class<?> type) { for (PackageScanFilter filter : filters) { if (!filter.matches(type)) { return false; } } return true; } }
@Bean public PackageScanClassResolver packageScanClassResolver(ApplicationContext applicationContext) { return new PackageScanClassResolver(applicationContext.getClassLoader()); } }
public Set<Class<?>> findByFilter(PackageScanFilter filter, String... packageNames) { if (packageNames == null) { return Collections.emptySet(); } Set<Class<?>> classes = new LinkedHashSet<>(); for (String pkg : packageNames) { find(filter, pkg, classes); } log.debug("Found: " + classes); return classes; }
protected void addFoundClass(Class<?> type) { if (type.getPackage() != null) { String packageName = type.getPackage().getName(); List<String> packageNameParts = Arrays.asList(packageName.split("\\.")); for (int i = 0; i < packageNameParts.size(); i++) { String thisPackage = StringUtils.join(packageNameParts.subList(0, i + 1), '/'); addFoundClass(thisPackage, type); } } }