/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.plugin;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.wiki.core.plugin.metamodel.Plugin;
import org.jboss.seam.wiki.core.plugin.metamodel.MacroPluginModule;
import org.jboss.seam.wiki.core.plugin.metamodel.ProfilePluginModule;
import org.jboss.seam.wiki.core.plugin.binding.PluginBinder;
import org.jboss.seam.wiki.core.exception.InvalidWikiConfigurationException;
import org.jboss.seam.wiki.core.model.WikiTextMacro;
import java.util.*;
/**
* @author Christian Bauer
*/
@Name("pluginRegistry")
@Scope(ScopeType.APPLICATION)
@Startup(depends = "preferenceRegistry")
@BypassInterceptors
public class PluginRegistry {
public static final Class[] PLUGIN_BINDERS = {
org.jboss.seam.wiki.core.plugin.binding.lacewiki.PluginBinder.class
};
private static final LogProvider log = Logging.getLogProvider(PluginRegistry.class);
private SortedMap<String, Plugin> plugins = new TreeMap<String, Plugin>();
private SortedMap<String, MacroPluginModule> macroPluginModulesByKey = new TreeMap<String, MacroPluginModule>();
private SortedMap<String, MacroPluginModule> macroPluginModulesByMacroName = new TreeMap<String, MacroPluginModule>();
private SortedSet<ProfilePluginModule> profilePluginModulesByPriority = new TreeSet<ProfilePluginModule>();
public void addPlugin(String key, Plugin p) {
if (plugins.containsKey(key)) {
throw new InvalidWikiConfigurationException("Duplicate plugin key: " + key);
}
plugins.put(key, p);
}
public Plugin removePlugin(String key) {
return plugins.remove(key);
}
public Plugin getPlugin(String key) {
return plugins.get(key);
}
public List<Plugin> getPlugins() {
return Collections.unmodifiableList(new ArrayList(plugins.values()));
}
public SortedMap<String, Plugin> getPluginsByKey() {
return Collections.unmodifiableSortedMap(plugins);
}
// TODO: This should be unmodifiable and additions only allowed through a new registry method
public SortedMap<String, MacroPluginModule> getMacroPluginModulesByKey() {
return macroPluginModulesByKey;
}
// TODO: This should be unmodifiable and additions only allowed through a new registry method
public SortedMap<String, MacroPluginModule> getMacroPluginModulesByMacroName() {
return macroPluginModulesByMacroName;
}
// TODO: This should be unmodifiable and additions only allowed through a new registry method
public SortedSet<ProfilePluginModule> getProfilePluginModulesByPriority() {
return profilePluginModulesByPriority;
}
public List<ProfilePluginModule> getProfilePluginModulesAsList() {
return new ArrayList<ProfilePluginModule>(profilePluginModulesByPriority);
}
public WikiPluginMacro createWikiPluginMacro(WikiTextMacro wikiTextMacro) {
if (getMacroPluginModulesByMacroName().containsKey(wikiTextMacro.getName())) {
log.debug("binding WikiTextMacro metadata to create WikiPluginMacro instance: " + wikiTextMacro);
return new WikiPluginMacro( getMacroPluginModulesByMacroName().get(wikiTextMacro.getName()), wikiTextMacro );
} else {
return null;
}
}
@Create
public void startup() {
log.info("initializing plugin registry");
for (Class pluginBinderClass : PLUGIN_BINDERS) {
log.debug("calling plugin binder: " + pluginBinderClass.getName());
PluginBinder pluginBinder = (PluginBinder)Component.getInstance(pluginBinderClass);
pluginBinder.installPlugins(this);
}
log.info("registered plugins: " + plugins.size());
}
public static PluginRegistry instance() {
return (PluginRegistry) Component.getInstance(PluginRegistry.class);
}
}