1) Find all of the files matching "./lib/*.jar" and create a URLClassLoader on them.
2) Iterate through every "*.class" file in each JAR; transform the path to a FQ Java class name, and pass off to checkClass(String)
3) Create a <Class<?>>, and iterate through its super-classes; for each super-class:
A) If the class is a Look and Feel, register the LaF with the UIManager
B) Iterate through the classes interfaces; for each interface:
I) If the interface is a java.sql.Driver, create an instance of the class. If instance.jdbcCompliant(), register the Driver with the DriverManager
II) If the interface is a plugin for my bot, (TODO: register it with the (TODO: create a plugin management system))
http://bnubot.googlecode.com/svn/trunk/BNUBot/src/net/bnubot/JARLoader.java/**
* This file is distributed under the GPL
* $Id: JARLoader.java 987 2007-12-08 21:27:30Z scotta $
*/
package net.bnubot;
import ...;
/**
* A class for loading classes from JARs in the lib folder
* @author scotta
*/
public class JARLoader {
private static final URLClassLoader loader;
static {
String folder = "lib";
File f = new File(folder);
if(!f.exists())
f.mkdir();
if(!f.exists() || !f.isDirectory())
Out.fatalException(new FileNotFoundException(f.getName()));
FilenameFilter fnf = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".jar");
}};
String[] files = f.list(fnf);
URL[] urls = new URL[files.length];
for(int i = 0; i < files.length; i++)
try {
Out.debug(JARLoader.class, "Loading " + files[i]);
urls[i] = new URL("file:" + folder + "/" + files[i]);
} catch (MalformedURLException e) {
Out.exception(e);
}
loader = new URLClassLoader(urls);
// Look at each JAR
for(URL url : urls) {
try {
File file = new File(url.toExternalForm().substring(5));
JarFile jf = new JarFile(file);
// Look at each class inside the jar
Enumeration<JarEntry> en = jf.entries();
while(en.hasMoreElements()) {
try {
JarEntry je = en.nextElement();
String name = je.getName();
if(name.endsWith(".class")) {
// Convert the filename to an FQ class name
name = name.substring(0, name.length() - 6);
name = name.replace('/', '.');
checkClass(name);
}
} catch(NoClassDefFoundError e) {
} catch(ClassNotFoundException e) {
} catch(InstantiationException e) {
}
}
} catch (Exception e) {
Out.exception(e);
}
}
}
/**
* Check if a class is a JDBC driver, a Look and Feel, or a plugin
* @param name The fully qualified class name
*/
private static void checkClass(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
// Get a Class for it
Class<?> clazz = JARLoader.forName(name);
for(Class<?> superClazz = clazz; superClazz != null; superClazz = superClazz.getSuperclass()) {
// Check if it's a look and feel
if(GlobalSettings.enableGUI && superClazz.equals(LookAndFeel.class)) {
LookAndFeel laf = (LookAndFeel)clazz.newInstance();
UIManager.installLookAndFeel(laf.getName(), name);
break;
}
// Check the interfaces
for(Class<?> cif : superClazz.getInterfaces()) {
// Check if it's a JDBC driver
if(cif.equals(Driver.class)) {
Driver d = (Driver)clazz.newInstance();
if(d.jdbcCompliant())
DriverManager.registerDriver(new DriverShim(d));
break;
}
// Check if it's a plugin
if(cif.equals(EventHandler.class)) {
// TODO: Enable use of this plugin
}
}
}
}
public static Class<?> forName(String name) throws ClassNotFoundException {
try {
return loader.loadClass(name);
} catch(ClassNotFoundException e) {
Out.error(JARLoader.class, "Failed to load " + name);
throw e;
} catch(UnsupportedClassVersionError e) {
String msg = "Unsupported class version " + name;
Out.debug(JARLoader.class, msg);
throw new ClassNotFoundException(msg, e);
}
}
public static ClassLoader getClassLoader() {
return loader;
}
}