From 1b931729e07daeeff04ecc8f5feb363d55353be5 Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Fri, 25 Aug 2017 13:06:38 +0100
Subject: [PATCH] Fixes problem with incorrect ProbeFactory plugin handling

---
 force_bdss/base_core_driver.py                |  4 +-
 force_bdss/factory_registry_plugin.py         | 20 ++++++-
 force_bdss/io/workflow_reader.py              |  4 +-
 .../probe_classes/factory_registry_plugin.py  | 52 ++++++++++++++++---
 4 files changed, 68 insertions(+), 12 deletions(-)

diff --git a/force_bdss/base_core_driver.py b/force_bdss/base_core_driver.py
index cd78b3d..cb96c5a 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 64f41c2..e588792 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 2227de1..19d4ecb 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 ddf39c9..67f9351 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)
-- 
GitLab