/**
* Copyright 2011 Marin Solutions
*/
package dependency_injection_with_annotations.loaders;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Code snippet demonstrating how to list the classes found in a package
*
*
* If a package within a JAR file is specified then the resource name is (single
* line):
*
* jar:file:/Users/RogerHughes/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.
* jar!/org/apache/log4j
*
* @author Roger
*
*/
public class FileSystemClassLoader {
private final List<File> directories;
private final String packageName;
private final List<Class<?>> classes;
public FileSystemClassLoader(List<File> directories, String packageName) throws ClassNotFoundException {
this.directories = directories;
this.packageName = packageName;
classes = findAllClasses();
}
public static final FileSystemClassLoader getInstance(List<File> directories, String packageName)
throws ClassNotFoundException {
return new FileSystemClassLoader(directories, packageName);
}
public static final FileSystemClassLoader getInstance(File directory, String packageName) throws ClassNotFoundException {
List<File> list = new ArrayList<File>();
list.add(directory);
return getInstance(list, packageName);
}
private List<Class<?>> findAllClasses() throws ClassNotFoundException {
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
for (File directory : directories) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
if (directory.exists()) {
File[] files = directory.listFiles();
for (File file : files) {
String fileName = file.getName();
if (file.isDirectory()) {
classes.addAll(findClasses(file, getClassName(packageName, fileName)));
} else if (isValidClassName(fileName)) {
classes.add(createClass(packageName, fileName));
}
}
}
return classes;
}
private String getClassName(String packageName, String fileName) {
String retVal;
if (packageName.length() == 0) {
retVal = fileName; // This is the default package
} else {
retVal = packageName + "." + fileName;
}
return retVal;
}
private boolean isValidClassName(String fileName) {
return fileName.endsWith(".class") && !fileName.contains("$");
}
private Class<?> createClass(String packageName, String fileName) throws ClassNotFoundException {
String className = getClassName(packageName, fileName.substring(0, fileName.length() - 6));
return Class.forName(className);
}
public List<Class<?>> getClasses() {
return Collections.unmodifiableList(classes);
}
public String getPackageName() {
return packageName;
}
}