package org.osbl.plugin;
import org.apache.commons.logging.LogFactory;
import java.util.*;
public class PluginManager
{
private static org.apache.commons.logging.Log LOG = LogFactory.getLog(PluginManager.class);
String name;
Map<String,Plugin> plugins = new HashMap<String,Plugin>();
Map<String,Extension> extensions = new HashMap<String,Extension>();
Map<String,List<Extension>> extensionsByType = new HashMap<String,List<Extension>>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void registerPlugin(Plugin plugin) {
plugins.put(plugin.getName(), plugin);
}
public void registerExtension(Extension extension) {
LOG.info(name + ": Register Extension: " + extension.getName());
extensions.put(extension.getName(), extension);
List<Extension> list = extensionsByType.get(extension.getType());
if (list == null) {
list = new ArrayList<Extension>();
extensionsByType.put(extension.getType(), list);
}
list.add(extension);
}
public List<Extension> getExtensions(ExtensionPoint extensionPoint) {
List<Extension> list = extensionsByType.get(extensionPoint.getType());
if (list == null) {
LOG.debug(name + ": No extensions for " + extensionPoint);
return Collections.EMPTY_LIST;
}
for (Extension extension : list) {
if (!(extensionPoint.getFace().isAssignableFrom(extension.getImplementation())))
throw new ClassCastException(name + ": extension implementation '" + extension.getImplementation()
+ "' does not match interface of extension point '" + extensionPoint.getFace() + "'");
}
return list;
}
}
|