1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
""" The default plugin manager implementation. """
# Standard library imports.
import logging
# Enthought library imports.
from enthought.traits.api import Event, HasTraits, Instance, List, implements
# Local imports.
from i_application import IApplication
from i_plugin import IPlugin
from i_plugin_manager import IPluginManager
from plugin_event import PluginEvent
# Logging.
logger = logging.getLogger(__name__)
class PluginManager(HasTraits):
""" The default plugin manager implementation. """
implements(IPluginManager)
#### 'IPluginManager' interface ###########################################
#### Events ####
# Fired when a plugin has been added to the manager.
plugin_added = Event(PluginEvent)
# Fired when a plugin has been removed from the manager.
plugin_removed = Event(PluginEvent)
#### 'PluginManager' interface ############################################
# The application that the plugin manager is part of.
application = Instance(IApplication)
#### Private interface ####################################################
# The plugins that the manager manages!
_plugins = List(IPlugin)
###########################################################################
# 'object' interface.
###########################################################################
def __init__(self, plugins=None, **traits):
""" Constructor. """
super(PluginManager, self).__init__(**traits)
# We allow the caller to specify an initial list of plugins, but the
# list itself is not part of the public API. To add and remove plugins
# after construction, use the 'add_plugin' and 'remove_plugin' methods
# respectively. The manager is also iterable, so to iterate over the
# plugins use 'for plugin in plugin_manager'.
if plugins is not None:
self._plugins = plugins
return
def __iter__(self):
""" Return an iterator over the manager's plugins. """
return iter(self._plugins)
###########################################################################
# 'IPluginManager' interface.
###########################################################################
def add_plugin(self, plugin):
""" Add a plugin to the manager. """
self._plugins.append(plugin)
self.plugin_added = PluginEvent(plugin=plugin)
return
def get_plugin(self, plugin_id):
""" Return the plugin with the specified Id. """
for plugin in self._plugins:
if plugin_id == plugin.id:
break
else:
plugin = None
return plugin
def remove_plugin(self, plugin):
""" Remove a plugin from the manager. """
self._plugins.remove(plugin)
self.plugin_removed = PluginEvent(plugin=plugin)
return
def start(self):
""" Start the plugin manager. """
map(lambda plugin: self.start_plugin(plugin), self._plugins)
return
def start_plugin(self, plugin=None, plugin_id=None):
""" Start the specified plugin. """
plugin = plugin or self.get_plugin(plugin_id)
if plugin is not None:
logger.debug('plugin %s starting', plugin.id)
plugin.activator.start_plugin(plugin)
logger.debug('plugin %s started', plugin.id)
else:
raise SystemError('no such plugin %s' % plugin_id)
return
def stop(self):
""" Stop the plugin manager. """
# We stop the plugins in the reverse order that they were started.
stop_order = self._plugins[:]
stop_order.reverse()
map(lambda plugin: self.stop_plugin(plugin), stop_order)
return
def stop_plugin(self, plugin=None, plugin_id=None):
""" Stop the specified plugin. """
plugin = plugin or self.get_plugin(plugin_id)
if plugin is not None:
logger.debug('plugin %s stopping', plugin.id)
plugin.activator.stop_plugin(plugin)
logger.debug('plugin %s stopped', plugin.id)
else:
raise SystemError('no such plugin %s' % plugin_id)
return
###########################################################################
# 'PluginManager' interface.
###########################################################################
def _application_changed(self, trait_name, old, new):
""" Static trait change handler. """
self._update_plugin_application([], self._plugins)
return
###########################################################################
# Private interface.
###########################################################################
#### Trait change handlers ################################################
def __plugins_changed(self, trait_name, old, new):
""" Static trait change handler. """
self._update_plugin_application(old, new)
return
def __plugins_items_changed(self, trait_name, old, new):
""" Static trait change handler. """
self._update_plugin_application(new.removed, new.added)
return
#### Methods ##############################################################
def _update_plugin_application(self, removed, added):
""" Update the 'application' trait of plugins added/removed. """
for plugin in removed:
plugin.application = None
for plugin in added:
plugin.application = self.application
return
#### EOF ######################################################################
|