/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.plugin; import Sirius.navigator.connection.SessionManager; import Sirius.navigator.exception.ExceptionManager; import Sirius.navigator.method.*; import Sirius.navigator.plugin.interfaces.*; import Sirius.navigator.plugin.ui.*; import Sirius.navigator.resource.*; import Sirius.navigator.ui.*; import Sirius.server.newuser.User; import Sirius.server.newuser.UserGroup; import org.apache.log4j.Logger; import java.util.*; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class PluginRegistry { //~ Static fields/initializers --------------------------------------------- private static final Logger logger = Logger.getLogger(PluginRegistry.class); private static PluginRegistry registry = null; private static final Object blocker = new Object(); //~ Instance fields -------------------------------------------------------- private final PluginFactory pluginFactory; private final Hashtable plugins; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of PluginPool. */ private PluginRegistry() { pluginFactory = new PluginFactory(); plugins = new Hashtable(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static final PluginRegistry getRegistry() { synchronized (blocker) { if (registry == null) { registry = new PluginRegistry(); } return registry; } } /** * DOCUMENT ME! */ public static final void destroy() { synchronized (blocker) { logger.warn("destroying singelton PluginRegistry instance"); // NOI18N try { PluginRegistry.getRegistry().deactivatePlugins(); } catch (Throwable t) { logger.error("could not deactivate plugins", t); // NOI18N } registry = null; } } /** * DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void preloadPlugins() throws Exception { final Iterator iterator = PropertyManager.getManager().getPluginList(); if (iterator != null) { while (iterator.hasNext()) { final PluginDescriptor pluginDescriptor = new PluginDescriptor((String)iterator.next()); if (logger.isDebugEnabled()) { logger.debug("preloading new plugin"); // NOI18N } try { pluginFactory.preloadPlugin(pluginDescriptor, true); this.registerPlugin(pluginDescriptor); if (logger.isInfoEnabled()) { logger.info("plugin' " + pluginDescriptor.getMetaInfo().getName() + " (" + pluginDescriptor.getName() + ")' successfully registred"); // NOI18N } } catch (Throwable t) { logger.error("could not load plugin '" + pluginDescriptor.getName() + "'", t); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.ERROR, org.openide.util.NbBundle.getMessage( PluginRegistry.class, "PluginRegistry.preloadPlugins().ExceptionManager_anon.name"), // NOI18N org.openide.util.NbBundle.getMessage( PluginRegistry.class, "PluginRegistry.preloadPlugins().ExceptionManager_anon.message"), // NOI18N t); pluginDescriptor.setLoaded(false); } /*try * { PluginDescriptor descriptor = new PluginDescriptor((String)iterator.next()); * if(logger.isDebugEnabled())logger.debug("preloading new plugin"); * pluginFactory.preloadPlugin(descriptor, true); this.registerPlugin(descriptor); logger.info("plugin' * " + descriptor.getMetaInfo().getName() + " (" + descriptor.getName() + ")' successfully registred"); * } catch(Exception exp) { logger.fatal("could not load plugin", exp); System.exit(1);}*/ } } else { if (logger.isInfoEnabled()) { logger.info("no plugins found"); // NOI18N } } } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void loadPlugin(final String id) throws Exception { final PluginDescriptor descriptor = this.getPluginDescriptor(id); if (descriptor != null) { this.loadPlugin(descriptor); } else { logger.error("plugin '" + id + "' not found"); // NOI18N } } /** * DOCUMENT ME! */ public void loadPlugins() // throws Exception { final Iterator iterator = this.getPluginDescriptors(); if ((iterator != null) && iterator.hasNext()) { while (iterator.hasNext()) { final PluginDescriptor pluginDescriptor = (PluginDescriptor)iterator.next(); if (logger.isInfoEnabled()) { logger.info("users: " + pluginDescriptor.getUsers().size()); // NOI18N } final Iterator uIterator = pluginDescriptor.getUsers().iterator(); while (uIterator.hasNext()) { if (logger.isInfoEnabled()) { logger.info("user: '" + uIterator.next() + "'"); // NOI18N } } final User user = SessionManager.getSession().getUser(); if (pluginDescriptor.getUsers().isEmpty() || pluginDescriptor.getUsers().contains(user.getName())) { final UserGroup userGroup = user.getUserGroup(); boolean containsUserGroup = false; if (userGroup != null) { containsUserGroup = pluginDescriptor.getUsergroups().contains(userGroup.toString()); } else { for (final UserGroup potentialUserGroup : user.getPotentialUserGroups()) { if (pluginDescriptor.getUsergroups().contains(potentialUserGroup.toString())) { containsUserGroup = true; break; } } } if (pluginDescriptor.getUsergroups().isEmpty() || containsUserGroup) { try { this.loadPlugin(pluginDescriptor); } catch (Throwable t) { logger.error("could not load plugin '" + pluginDescriptor.getName() + "'", t); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.ERROR, org.openide.util.NbBundle.getMessage( PluginRegistry.class, "PluginRegistry.loadPlugins().ExceptionManager_anon.name"), // NOI18N org.openide.util.NbBundle.getMessage( PluginRegistry.class, "PluginRegistry.loadPlugins().ExceptionManager_anon.message"), // NOI18N t); pluginDescriptor.setLoaded(false); } } else { logger.warn("plugin '" + pluginDescriptor.getName() + "' not loaded: no usergroup '" + userGroup + "'"); // NOI18N } } else { logger.warn("plugin '" + pluginDescriptor.getName() + "' not loaded: no user '" + SessionManager.getSession().getUser().getName() + "'"); // NOI18N } } } else { if (logger.isInfoEnabled()) { logger.info("could not load any plugins: no plugins found or preloaded"); // NOI18N } } } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void activatePlugin(final String id) throws Exception { final PluginDescriptor descriptor = this.getPluginDescriptor(id); if (descriptor != null) { this.activatePlugin(descriptor); } else { logger.error("plugin '" + id + "' not found"); // NOI18N } } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void deactivatePlugin(final String id) throws Exception { final PluginDescriptor descriptor = this.getPluginDescriptor(id); if (descriptor != null) { this.deactivatePlugin(descriptor); } else { logger.error("plugin '" + id + "' not found"); // NOI18N } } /** * DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void activatePlugins() throws Exception { final Iterator iterator = this.getPluginDescriptors(); if ((iterator != null) && iterator.hasNext()) { while (iterator.hasNext()) { this.activatePlugin((PluginDescriptor)iterator.next()); } } else { if (logger.isInfoEnabled()) { logger.info("could not activate any plugins: no plugins found or preloaded"); // NOI18N } } } /** * DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void deactivatePlugins() throws Exception { final Iterator iterator = this.getPluginDescriptors(); if ((iterator != null) && iterator.hasNext()) { while (iterator.hasNext()) { this.deactivatePlugin((PluginDescriptor)iterator.next()); } } else { if (logger.isInfoEnabled()) { logger.info("could not deactivate any plugins: no plugins found or preloaded"); // NOI18N } } } /** * DOCUMENT ME! * * @param visible DOCUMENT ME! */ public void setPluginsVisible(final boolean visible) { final Iterator iterator = this.getPluginDescriptors(); if ((iterator != null) && iterator.hasNext()) { while (iterator.hasNext()) { this.setPluginVisible((PluginDescriptor)iterator.next(), visible); } } else { if (logger.isInfoEnabled()) { logger.info("could not activate any plugins: no plugins found or preloaded"); // NOI18N } } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Iterator getPluginDescriptors() { return plugins.values().iterator(); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @return DOCUMENT ME! */ public PluginSupport getPlugin(final String id) { final Object object = plugins.get(id); if (object != null) { return ((PluginDescriptor)object).getPlugin(); } else { return null; } } /** * DOCUMENT ME! * * @param id DOCUMENT ME! * * @return DOCUMENT ME! */ public PluginDescriptor getPluginDescriptor(final String id) { final Object object = plugins.get(id); if (object != null) { return (PluginDescriptor)object; } else { return null; } } /** * helper methods ########################################################## * * @param descriptor DOCUMENT ME! */ private void registerPlugin(final PluginDescriptor descriptor) { if (logger.isDebugEnabled()) { logger.debug("register new plugin: name='" + descriptor.getName() + "', id='" + descriptor.getId() + "'"); // NOI18N } if (plugins.containsKey(descriptor.getId())) { logger.fatal("duplicate plugin id '" + descriptor.getId() + "' detected in plugin '" + descriptor.getMetaInfo().getName() + " (" + descriptor.getName() + ")'"); // NOI18N } else { plugins.put(descriptor.getId(), descriptor); } } /** * DOCUMENT ME! * * @param descriptor DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ private void loadPlugin(final PluginDescriptor descriptor) throws Exception { if (!descriptor.isLoaded()) { if (logger.isDebugEnabled()) { logger.debug("loading plugin '" + descriptor.getName() + "'"); // NOI18N } pluginFactory.loadPlugin(descriptor); descriptor.setLoaded(true); } else if (logger.isDebugEnabled()) { logger.debug("plugin '" + descriptor.getName() + "' already loaded"); // NOI18N } } /** * DOCUMENT ME! * * @param descriptor DOCUMENT ME! */ private void activatePlugin(final PluginDescriptor descriptor) // throws Exception { if (descriptor.isLoaded() && !descriptor.isActivated()) { if (logger.isDebugEnabled()) { logger.debug("activating plugin '" + descriptor.getName() + "'"); // NOI18N } // activate ui(s) .................................................. if (descriptor.isPluginToolBarAvailable()) { if (logger.isDebugEnabled()) { logger.debug("activating plugin '" + descriptor.getName() + "' toolbar"); // NOI18N } ComponentRegistry.getRegistry().getMutableToolBar().addPluginToolBar(descriptor.getPluginToolBar()); } if (descriptor.isPluginMenuAvailable()) { if (logger.isDebugEnabled()) { logger.debug("activating plugin '" + descriptor.getName() + "' menu"); // NOI18N } ComponentRegistry.getRegistry().getMutableMenuBar().addPluginMenu(descriptor.getPluginMenu()); } if (descriptor.isPluginPopupMenuAvailable()) { if (logger.isDebugEnabled()) { logger.debug("activating plugin '" + descriptor.getName() + "' popup menu"); // NOI18N } ComponentRegistry.getRegistry().getMutablePopupMenu().addPluginMenu(descriptor.getPluginPopupMenu()); } if (descriptor.isPluginUIDescriptorsAvailable()) { if (logger.isDebugEnabled()) { logger.debug("activating plugin '" + descriptor.getName() + "' user interface"); // NOI18N } final Iterator iterator = descriptor.getPluginUIDescriptors(); while (iterator.hasNext()) { ComponentRegistry.getRegistry().getGUIContainer().add((MutableConstraints)iterator.next()); } } descriptor.getPlugin().setActive(true); descriptor.setActivated(true); } else { if (!descriptor.isLoaded()) { logger.warn("plugin '" + descriptor.getName() + "' could not be activated (not loaded)"); // NOI18N } else if (logger.isDebugEnabled()) { logger.debug("plugin '" + descriptor.getName() + "' could not be activated (already activated)"); // NOI18N } } } /** * DOCUMENT ME! * * @param descriptor DOCUMENT ME! */ private void deactivatePlugin(final PluginDescriptor descriptor) // throws Exception { if (descriptor.isDeactivateable() && descriptor.isLoaded() && descriptor.isActivated()) { if (logger.isDebugEnabled()) { logger.debug("deactivating plugin '" + descriptor.getName() + "'"); // NOI18N } // activate ui(s) .................................................. if (descriptor.isPluginToolBarAvailable()) { if (logger.isDebugEnabled()) { logger.debug("deactivating plugin '" + descriptor.getName() + "' toolbar"); // NOI18N } ComponentRegistry.getRegistry().getMutableToolBar().removePluginToolBar(descriptor.getId()); } if (descriptor.isPluginMenuAvailable()) { if (logger.isDebugEnabled()) { logger.debug("deactivating plugin '" + descriptor.getName() + "' menu"); // NOI18N } ComponentRegistry.getRegistry().getMutableMenuBar().removePluginMenu(descriptor.getId()); } if (descriptor.isPluginPopupMenuAvailable()) { if (logger.isDebugEnabled()) { logger.debug("deactivating plugin '" + descriptor.getName() + "' popup menu"); // NOI18N } ComponentRegistry.getRegistry().getMutablePopupMenu().removePluginMenu(descriptor.getId()); } if (descriptor.isPluginUIDescriptorsAvailable()) { if (logger.isDebugEnabled()) { logger.debug("deactivating plugin '" + descriptor.getName() + "' user interface"); // NOI18N } final Iterator iterator = descriptor.getPluginUIDescriptors(); while (iterator.hasNext()) { ComponentRegistry.getRegistry() .getGUIContainer() .remove(((MutableConstraints)iterator.next()).getId()); } } descriptor.getPlugin().setActive(false); descriptor.setActivated(false); System.gc(); } else { if (!descriptor.isLoaded()) { logger.warn("plugin '" + descriptor.getName() + "' could not be deactivated (not loaded)"); // NOI18N } else if (logger.isDebugEnabled()) { logger.debug("plugin '" + descriptor.getName() + "' could not be deactivated (already deactivated or not deactivateable)"); // NOI18N } } } /** * DOCUMENT ME! * * @param descriptor DOCUMENT ME! * @param visible DOCUMENT ME! */ private void setPluginVisible(final PluginDescriptor descriptor, final boolean visible) { if (descriptor.isActivated()) { if (logger.isDebugEnabled()) { logger.debug("setting plugin '" + descriptor.getName() + "' visible"); // NOI18N } descriptor.getPlugin().setVisible(visible); } else if (logger.isDebugEnabled()) { logger.debug("plugin '" + descriptor.getName() + "' is not activated"); // NOI18N } } }