package com.dgrid.plugin; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.LinkedList; import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import com.dgrid.util.JarFileFilter; import com.dgrid.util.io.FileListener; public class JavaPluginsPlugin extends AbstractDynamicPlugin implements Plugin, FileListener { private static ClassLoader pluginClassLoader; public JavaPluginsPlugin() { super(new File("plugins/java"), 3000); } public String getDescription() { return "Loads plugins from external jars"; } @Override protected Plugin loadPluginFromFile(File file) throws Exception { log.trace("loadPluginFromFile()"); if (log.isDebugEnabled()) { log.debug(String.format("Loading plugin from file (%1$s)", file .getAbsolutePath())); } String className = extractPluginClassName(file); Class pluginClass = createPluginClass(className, file); Object obj = pluginClass.newInstance(); Plugin plugin = (Plugin) obj; return plugin; } @Override protected FileFilter getFileFilter() { return new JarFileFilter(); } private String extractPluginClassName(File jar) throws IOException { JarFile jarFile = new JarFile(jar); Manifest manifest = jarFile.getManifest(); Attributes attribs = manifest.getMainAttributes(); return attribs.getValue("Plugin-Class"); } private Class createPluginClass(String className, File jar) throws ClassNotFoundException, MalformedURLException { ClassLoader pluginClassLoader = getClassLoader(jar); Class pluginClass = pluginClassLoader.loadClass(className); if (log.isDebugEnabled()) { log.debug(String.format("Loaded plugin class %1$s", pluginClass)); log.debug(String.format("From class loader %1$s", pluginClass .getClassLoader())); } return pluginClass; } private ClassLoader getClassLoader(File jar) throws MalformedURLException { if (pluginClassLoader == null) { URL[] urls = getClassLoaderUrls(); pluginClassLoader = new URLClassLoader(urls, Thread.currentThread() .getContextClassLoader()); } return pluginClassLoader; } private URL[] getClassLoaderUrls() throws MalformedURLException { List<File> jars = new LinkedList<File>(); FileFilter filter = new JarFileFilter(); File[] pluginJars = super.dir.listFiles(filter); File[] extJars = new File("lib/ext").listFiles(filter); URL[] urls = new URL[pluginJars.length + extJars.length]; int i = 0; for (File file : pluginJars) { urls[i] = file.toURI().toURL(); ++i; } for (File file : extJars) { urls[i] = file.toURI().toURL(); ++i; } return urls; } }