Index: src/java/org/apache/nutch/plugin/PluginClassLoader.java
===================================================================
--- src/java/org/apache/nutch/plugin/PluginClassLoader.java (revision 550027)
+++ src/java/org/apache/nutch/plugin/PluginClassLoader.java (working copy)
@@ -18,6 +18,7 @@
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.Arrays;
/**
* The PluginClassLoader
contains only classes of the runtime
@@ -30,6 +31,10 @@
* @author joa23
*/
public class PluginClassLoader extends URLClassLoader {
+
+ private URL[] urls;
+ private ClassLoader parent;
+
/**
* Construtor
*
@@ -40,5 +45,35 @@
*/
public PluginClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
+ this.urls = urls;
+ this.parent = parent;
}
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((parent == null) ? 0 : parent.hashCode());
+ result = PRIME * result + Arrays.hashCode(urls);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final PluginClassLoader other = (PluginClassLoader) obj;
+ if (parent == null) {
+ if (other.parent != null)
+ return false;
+ } else if (!parent.equals(other.parent))
+ return false;
+ if (!Arrays.equals(urls, other.urls))
+ return false;
+ return true;
+ }
}
Index: src/java/org/apache/nutch/plugin/Extension.java
===================================================================
--- src/java/org/apache/nutch/plugin/Extension.java (revision 550027)
+++ src/java/org/apache/nutch/plugin/Extension.java (working copy)
@@ -35,7 +35,6 @@
private String fClazz;
private HashMap fAttributes;
private Configuration conf;
- private PluginRepository pluginRepository;
/**
* @param pDescriptor
@@ -54,7 +53,6 @@
setId(pId);
setClazz(pExtensionClass);
this.conf = conf;
- this.pluginRepository = pluginRepository;
}
/**
@@ -152,11 +150,12 @@
// Suggested by Stefan Groschupf
synchronized (getId()) {
try {
- PluginClassLoader loader = fDescriptor.getClassLoader();
- Class extensionClazz = loader.loadClass(getClazz());
+ PluginRepository pluginRepository = PluginRepository.get(conf);
+ Class extensionClazz =
+ pluginRepository.getCachedClass(fDescriptor, getClazz());
// lazy loading of Plugin in case there is no instance of the plugin
// already.
- this.pluginRepository.getPluginInstance(getDescriptor());
+ pluginRepository.getPluginInstance(getDescriptor());
Object object = extensionClazz.newInstance();
if (object instanceof Configurable) {
((Configurable) object).setConf(this.conf);
Index: src/java/org/apache/nutch/plugin/PluginRepository.java
===================================================================
--- src/java/org/apache/nutch/plugin/PluginRepository.java (revision 550027)
+++ src/java/org/apache/nutch/plugin/PluginRepository.java (working copy)
@@ -53,6 +53,9 @@
private HashMap fActivatedPlugins;
+ private static final Map> CLASS_CACHE =
+ new HashMap>();
+
private Configuration conf;
public static final Log LOG = LogFactory.getLog(PluginRepository.class);
@@ -64,10 +67,10 @@
public PluginRepository(Configuration conf) throws RuntimeException {
fActivatedPlugins = new HashMap();
fExtensionPoints = new HashMap();
- this.conf = conf;
+ this.conf = new Configuration(conf);
this.auto = conf.getBoolean("plugin.auto-activation", true);
String[] pluginFolders = conf.getStrings("plugin.folders");
- PluginManifestParser manifestParser = new PluginManifestParser(conf, this);
+ PluginManifestParser manifestParser = new PluginManifestParser(this.conf, this);
Map allPlugins = manifestParser
.parsePluginFolder(pluginFolders);
Pattern excludes = Pattern.compile(conf.get("plugin.excludes", ""));
@@ -262,8 +265,7 @@
// The same is in Extension.getExtensionInstance().
// Suggested by Stefan Groschupf
synchronized (pDescriptor) {
- PluginClassLoader loader = pDescriptor.getClassLoader();
- Class pluginClass = loader.loadClass(pDescriptor.getPluginClass());
+ Class pluginClass = getCachedClass(pDescriptor, pDescriptor.getPluginClass());
Constructor constructor = pluginClass.getConstructor(new Class[] {
PluginDescriptor.class, Configuration.class });
Plugin plugin = (Plugin) constructor.newInstance(new Object[] {
@@ -291,7 +293,7 @@
* @see java.lang.Object#finalize()
*/
public void finalize() throws Throwable {
- shotDownActivatedPlugins();
+ shutDownActivatedPlugins();
}
/**
@@ -299,12 +301,28 @@
*
* @throws PluginRuntimeException
*/
- private void shotDownActivatedPlugins() throws PluginRuntimeException {
+ private void shutDownActivatedPlugins() throws PluginRuntimeException {
for (Plugin plugin : fActivatedPlugins.values()) {
plugin.shutDown();
}
}
+ public Class getCachedClass(PluginDescriptor pDescriptor, String className)
+ throws ClassNotFoundException {
+ Map descMap = CLASS_CACHE.get(className);
+ if (descMap == null) {
+ descMap = new HashMap();
+ CLASS_CACHE.put(className, descMap);
+ }
+ PluginClassLoader loader = pDescriptor.getClassLoader();
+ Class clazz = descMap.get(loader);
+ if (clazz == null) {
+ clazz = loader.loadClass(className);
+ descMap.put(loader, clazz);
+ }
+ return clazz;
+ }
+
private void displayStatus() {
LOG.info("Plugin Auto-activation mode: [" + this.auto + "]");
LOG.info("Registered Plugins:");