package ij.io;
import ij.IJ;
import java.io.*;
import java.net.*;
/** ImageJ uses this class loader to load plugins and resources from the
* plugins directory and immediate subdirectories. This class loader will
* also load classes and resources from JAR files.
*
* <p> The class loader searches for classes and resources in the following order:
* <ol>
* <li> Plugins directory</li>
* <li> Subdirectories of the Plugins directory</li>
* <li> JAR and ZIP files in the plugins directory and subdirectories</li>
* </ol>
* <p> The class loader does not recurse into subdirectories beyond the first level.
*/
public class PluginClassLoader extends URLClassLoader {
protected String path;
/**
* Creates a new PluginClassLoader that searches in the directory path
* passed as a parameter. The constructor automatically finds all JAR and ZIP
* files in the path and first level of subdirectories. The JAR and ZIP files
* are stored in a Vector for future searches.
* @param path the path to the plugins directory.
*/
public PluginClassLoader(String path) {
super(new URL[0], IJ.class.getClassLoader());
init(path);
}
/** This version of the constructor is used when ImageJ is launched using Java WebStart. */
public PluginClassLoader(String path, boolean callSuper) {
super(new URL[0], Thread.currentThread().getContextClassLoader());
init(path);
}
void init(String path) {
this.path = path;
//find all JAR files on the path and subdirectories
File f = new File(path);
try {
// Add plugin directory to search path
addURL(f.toURI().toURL());
} catch (MalformedURLException e) {
ij.IJ.log("PluginClassLoader: "+e);
}
String[] list = f.list();
if (list==null)
return;
for (int i=0; i<list.length; i++) {
if (list[i].equals(".rsrc"))
continue;
f=new File(path, list[i]);
if (f.isDirectory()) {
try {
// Add first level subdirectories to search path
addURL(f.toURI().toURL());
} catch (MalformedURLException e) {
ij.IJ.log("PluginClassLoader: "+e);
}
String[] innerlist = f.list();
if (innerlist==null) continue;
for (int j=0; j<innerlist.length; j++) {
File g = new File(f,innerlist[j]);
if (g.isFile()) addJAR(g);
}
} else
addJAR(f);
}
}
private void addJAR(File f) {
if (f.getName().endsWith(".jar") || f.getName().endsWith(".zip")) {
try {
addURL(f.toURI().toURL());
} catch (MalformedURLException e) {
ij.IJ.log("PluginClassLoader: "+e);
}
}
}
}