package org.reldb.rel.v0.storage.relvars.external.jdbc;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// Based on https://stevenatkinson.wordpress.com/2011/07/15/dynamic-url-class-loaders-a-simple-use-case/
public class JDBCDriverLoader extends URLClassLoader {
public JDBCDriverLoader(File file, ClassLoader parent) throws MalformedURLException {
super(makeUrls(file), parent);
}
private static URL[] makeUrls(File file) throws MalformedURLException {
List<URL> urls = new ArrayList<URL>();
urls.add(file.toURI().toURL());
File[] jarFilesAndDirs = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return dir.isDirectory() || name.endsWith(".jar");
}
});
if (jarFilesAndDirs != null) {
for (File jarOrDir : jarFilesAndDirs) {
if (jarOrDir.isDirectory()) {
urls.addAll(Arrays.asList(makeUrls(jarOrDir)));
} else {
urls.add(jarOrDir.toURI().toURL());
}
}
}
return urls.toArray(new URL[urls.size()]);
}
public JDBCDriverLoader(File file) throws MalformedURLException {
super(makeUrls(file));
}
public JDBCDriverLoader(File file, ClassLoader parent, URLStreamHandlerFactory factory) throws MalformedURLException {
super(makeUrls(file), parent, factory);
}
}