package org.zaproxy.zap.utils;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
// Based on code from http://twit88.com/blog/2007/10/04/java-dynamic-loading-of-class-and-jar-file/
public class ClassLoaderUtil {
// Log object
private static Logger log = Logger.getLogger(ClassLoaderUtil.class);
// Parameters
private static final Class<?>[] parameters = new Class<?>[]{URL.class};
/**
* Add file to CLASSPATH
* @param s File name
* @throws IOException IOException
*/
public static void addFile(String s) throws IOException {
File f = new File(s);
addFile(f);
}
/**
* Add file to CLASSPATH
* @param f File object
* @throws IOException IOException
*/
public static void addFile(File f) throws IOException {
addURL(f.toURI().toURL());
}
/**
* Add URL to CLASSPATH
* @param u URL
* @throws IOException IOException
*/
public static void addURL(URL u) throws IOException {
if (!(ClassLoader.getSystemClassLoader() instanceof URLClassLoader)) {
return;
}
URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL[] urls = sysLoader.getURLs();
for (int i = 0; i < urls.length; i++) {
if (StringUtils.equalsIgnoreCase(urls[i].toString(), u.toString())) {
if (log.isDebugEnabled()) {
log.debug("URL " + u + " is already in the CLASSPATH");
}
return;
}
}
Class<URLClassLoader> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysLoader, new Object[]{u});
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
}
}