
ren.yale.java.tools.PackageScanner Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of summer Show documentation
Show all versions of summer Show documentation
Summer is a web server which connect JAX-RS and Vertx
package ren.yale.java.tools;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public abstract class PackageScanner {
private static final String FILE_PROTOCL = "file";
private static final String JAR_PROTOCL = "jar";
private static final String CLASS_SUFFIX = ".class";
public List> scan(String packagename) throws IOException, ClassNotFoundException {
if (!StringUtils.isEmpty(packagename)) {
Enumeration urls = Thread.currentThread().getContextClassLoader()
.getResources(packagename.replaceAll("\\.", "/"));
List> classList = new ArrayList>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
String protocl = url.getProtocol();
if (FILE_PROTOCL.equals(protocl)) {
String packagePath = url.getPath().replaceAll("%20", " ");
addClass(classList, packagePath, packagename);
} else if (JAR_PROTOCL.equals(protocl)) {
JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = jarURLConnection.getJarFile();
Enumeration jarEntrys = jarFile.entries();
while (jarEntrys.hasMoreElements()) {
JarEntry jarEntry = jarEntrys.nextElement();
String jarEntryName = jarEntry.getName();
if (jarEntryName.equals(CLASS_SUFFIX)) {
String className = jarEntryName.substring(0, jarEntryName.indexOf(".")).replaceAll("/",
".");
Class> cls = Class.forName(className, true,
Thread.currentThread().getContextClassLoader());
if (checkAdd(cls)) {
classList.add(cls);
}
}
}
}
}
return classList;
}
return null;
}
private void addClass(List> classList, String packagePath, String packageName)
throws ClassNotFoundException {
File[] files = new File(packagePath).listFiles(new FileFilter() {
public boolean accept(File file) {
return (file.isFile() && file.getName().endsWith(CLASS_SUFFIX)) || file.isDirectory();
}
});
for (File file : files) {
String fileName = file.getName();
if (file.isFile()) {
//get class name
String className = fileName.substring(0, fileName.lastIndexOf("."));
if (!StringUtils.isEmpty(packageName)) {
className = packageName + "." + className;
}
Class> cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
//judge whether class to loader
if (checkAdd(cls)) {
classList.add(cls);
}
} else {
String currentPackagePath = fileName;
if (!StringUtils.isEmpty(packagePath)) {
currentPackagePath = packagePath + "/" + currentPackagePath;
}
String currentPackageName = fileName;
if (!StringUtils.isEmpty(packageName)) {
currentPackageName = packageName + "." + currentPackageName;
}
addClass(classList, currentPackagePath, currentPackageName);
}
}
}
public abstract boolean checkAdd(Class> clzz);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy