diff --git a/force_bdss/base_core_driver.py b/force_bdss/base_core_driver.py index cd78b3d809219ca7dba41b2e7bf2a06e4a91f869..cb96c5a1e4fb4db0b86229de09b6a94db5c6a487 100644 --- a/force_bdss/base_core_driver.py +++ b/force_bdss/base_core_driver.py @@ -3,7 +3,7 @@ from traits.trait_types import Instance from .core.workflow import Workflow from .factory_registry_plugin import ( - FactoryRegistryPlugin, + IFactoryRegistryPlugin, FACTORY_REGISTRY_PLUGIN_ID ) from .io.workflow_reader import WorkflowReader @@ -15,7 +15,7 @@ class BaseCoreDriver(Plugin): """ #: The registry of the factories - factory_registry = Instance(FactoryRegistryPlugin) + factory_registry = Instance(IFactoryRegistryPlugin) #: Deserialized content of the workflow file. workflow = Instance(Workflow) diff --git a/force_bdss/factory_registry_plugin.py b/force_bdss/factory_registry_plugin.py index 64f41c24d13575789140a86220f04b1675259277..e588792e65ca752a1048f5544b032dacf23e86c5 100644 --- a/force_bdss/factory_registry_plugin.py +++ b/force_bdss/factory_registry_plugin.py @@ -1,6 +1,6 @@ from envisage.extension_point import ExtensionPoint from envisage.plugin import Plugin -from traits.api import List +from traits.api import List, Interface, provides from force_bdss.ids import ExtensionPointID from force_bdss.notification_listeners.i_notification_listener_factory import \ @@ -15,6 +15,24 @@ from .ui_hooks.i_ui_hooks_factory import IUIHooksFactory FACTORY_REGISTRY_PLUGIN_ID = "force.bdss.plugins.factory_registry" +class IFactoryRegistryPlugin(Interface): + def data_source_factory_by_id(self, id): + pass + + def kpi_calculator_factory_by_id(self, id): + pass + + def mco_factory_by_id(self, id): + pass + + def mco_parameter_factory_by_id(self, mco_id, parameter_id): + pass + + def notification_listener_factory_by_id(self, id): + pass + + +@provides(IFactoryRegistryPlugin) class FactoryRegistryPlugin(Plugin): """Main plugin that handles the execution of the MCO or the evaluation. diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py index 2227de1558a7085d207229b1fae20558dc72085d..19d4ecbb9b06309cc1169d7cd465da32558543f2 100644 --- a/force_bdss/io/workflow_reader.py +++ b/force_bdss/io/workflow_reader.py @@ -5,7 +5,7 @@ from traits.api import HasStrictTraits, Instance from force_bdss.core.input_slot_map import InputSlotMap from force_bdss.core.workflow import Workflow -from ..factory_registry_plugin import FactoryRegistryPlugin +from ..factory_registry_plugin import IFactoryRegistryPlugin SUPPORTED_FILE_VERSIONS = ["1"] @@ -25,7 +25,7 @@ class WorkflowReader(HasStrictTraits): """ #: The Factory registry. The reader needs it to create the #: specific model objects. - factory_registry = Instance(FactoryRegistryPlugin) + factory_registry = Instance(IFactoryRegistryPlugin) def __init__(self, factory_registry, diff --git a/force_bdss/tests/probe_classes/factory_registry_plugin.py b/force_bdss/tests/probe_classes/factory_registry_plugin.py index ddf39c96e7d643b197466db80baaee2fc294ec78..67f9351fb34c05920c14376ce5a84497dcbd58fb 100644 --- a/force_bdss/tests/probe_classes/factory_registry_plugin.py +++ b/force_bdss/tests/probe_classes/factory_registry_plugin.py @@ -1,6 +1,6 @@ -from traits.api import List +from traits.api import List, HasStrictTraits, provides -from force_bdss.factory_registry_plugin import FactoryRegistryPlugin +from force_bdss.factory_registry_plugin import IFactoryRegistryPlugin from .mco import ProbeMCOFactory from .kpi_calculator import ProbeKPICalculatorFactory @@ -8,20 +8,58 @@ from .data_source import ProbeDataSourceFactory from .notification_listener import ProbeNotificationListenerFactory -class ProbeFactoryRegistryPlugin(FactoryRegistryPlugin): +@provides(IFactoryRegistryPlugin) +class ProbeFactoryRegistryPlugin(HasStrictTraits): mco_factories = List() kpi_calculator_factories = List() data_source_factories = List() notification_listener_factories = List() def _mco_factories_default(self): - return [ProbeMCOFactory(self)] + return [ProbeMCOFactory(None)] def _kpi_calculator_factories_default(self): - return [ProbeKPICalculatorFactory(self)] + return [ProbeKPICalculatorFactory(None)] def _data_source_factories_default(self): - return [ProbeDataSourceFactory(self)] + return [ProbeDataSourceFactory(None)] def _notification_listener_factories_default(self): - return [ProbeNotificationListenerFactory(self)] + return [ProbeNotificationListenerFactory(None)] + + def data_source_factory_by_id(self, id): + for ds in self.data_source_factories: + if ds.id == id: + return ds + + raise KeyError(id) + + def kpi_calculator_factory_by_id(self, id): + for kpic in self.kpi_calculator_factories: + if kpic.id == id: + return kpic + + raise KeyError(id) + + def mco_factory_by_id(self, id): + for mco in self.mco_factories: + if mco.id == id: + return mco + + raise KeyError(id) + + def mco_parameter_factory_by_id(self, mco_id, parameter_id): + mco_factory = self.mco_factory_by_id(mco_id) + + for factory in mco_factory.parameter_factories(): + if factory.id == parameter_id: + return factory + + raise KeyError(parameter_id) + + def notification_listener_factory_by_id(self, id): + for nl in self.notification_listener_factories: + if nl.id == id: + return nl + + raise KeyError(id)