// Obtain some shared objects
// final JARCache jarCache = this.pluginManager.getJARCache();
final ClassPathManager classPathManager = this.pluginManager.getClassPathManager();
final PluginRegistry pluginRegistry = this.pluginManager.getPluginRegistry();
final PluginConfigurationUtil pcu = new PluginConfigurationUtil(this.pluginManager.getPluginConfiguration());
final Spawner spawner = this.pluginManager.getSpawner();
// Obtain information
// final JARInformation jarInformation = jarCache.getJARInformation(name);
// final String file = jarCache.classTofile(name);
try {
// Get class of the candidate
final Class<?> possiblePlugin = classPathManager.loadClass(location, name);
// Don't load plugins already spawned.
if (name.startsWith("net.xeoh.plugins.base") ||
name.startsWith("net.xeoh.plugins.diagnosis.") ||
name.startsWith("net.xeoh.plugins.informationbroker.")) return;
// Get the plugin's annotation
final PluginImplementation annotation = possiblePlugin.getAnnotation(PluginImplementation.class);
// Nothing to load here if no annotation is present
if (annotation == null) { return; }
// Don't load classes already loaded from this location
final PluginClassMetaInformation preexistingMeta = pluginRegistry.getMetaInformationFor((Class<? extends Plugin>) possiblePlugin);
if (preexistingMeta != null) {
this.logger.info("Skipping plugin " + possiblePlugin + " because we already have it ");
return;
}
// Register class at registry
final PluginClassMetaInformation metaInformation = new PluginClassMetaInformation();
metaInformation.pluginClassStatus = PluginClassStatus.ACCEPTED;
if (location != null) {
metaInformation.pluginOrigin = location.getToplevelLocation();
} else {
metaInformation.pluginOrigin = new URI("classpath://UNDEFINED");
}
pluginRegistry.registerPluginClass((Class<? extends Plugin>) possiblePlugin, metaInformation);
// Update the class information of the corresponding cache entry
this.logger.finer("Updating cache information");
// Avoid loading if annotation request it.
if (pcu.getBoolean(possiblePlugin, "plugin.disabled", false) || possiblePlugin.getAnnotation(IsDisabled.class) != null) {
metaInformation.pluginClassStatus = PluginClassStatus.DISABLED;
this.logger.fine("Ignoring " + name + " due to request.");
return;
}
// Up from here we know we will (eventually) use the plugin. So load its
// configuration.
final String properties = (possiblePlugin.getAnnotation(ConfigurationFile.class) != null) ? possiblePlugin.getAnnotation(ConfigurationFile.class).file() : null;
if (properties != null && properties.length() > 0) {
final String resourcePath = name.replaceAll("\\.", "/").replaceAll(possiblePlugin.getSimpleName(), "") + properties;
this.logger.fine("Adding configuration from " + resourcePath + " for plugin " + name);
final Properties p = new Properties();
// Try to load resource by special classloader
try {
p.load(classPathManager.getResourceAsStream(location, resourcePath));
final Set<Object> keys = p.keySet();
// Add every string that is not already in the configuration.
for (final Object object : keys) {
if (pcu.getString(null, (String) object) != null) {
this.pluginManager.getPluginConfiguration().setConfiguration(null, (String) object, p.getProperty((String) object));
}
}
} catch (final IOException e) {
this.logger.warning("Unable to load properties " + resourcePath + " although requested");
} catch (final NullPointerException e) {
this.logger.warning("Unable to load properties " + resourcePath + " although requested. Probably not in package.");
}
}
// Obtain dependencies
metaInformation.dependencies = spawner.getDependencies((Class<? extends Plugin>) possiblePlugin);
// If the class has unfulfilled dependencies, add it to our list.
if (metaInformation.dependencies.size() == 0) {
metaInformation.pluginClassStatus = PluginClassStatus.SPAWNABLE;
} else {