From cfb39de8d69dd0f3be78e4a4349c035b062438f8 Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Thu, 10 Aug 2017 14:23:46 +0100
Subject: [PATCH] Added notification listeners to workflow, and associated IO

---
 force_bdss/core/workflow.py      |  5 +++++
 force_bdss/io/workflow_reader.py | 13 +++++++++++++
 force_bdss/io/workflow_writer.py | 10 ++++++----
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/force_bdss/core/workflow.py b/force_bdss/core/workflow.py
index d7cfb50..8cdb20c 100644
--- a/force_bdss/core/workflow.py
+++ b/force_bdss/core/workflow.py
@@ -3,6 +3,8 @@ from traits.api import HasStrictTraits, Instance, List
 from force_bdss.data_sources.base_data_source_model import BaseDataSourceModel
 from force_bdss.kpi.base_kpi_calculator_model import BaseKPICalculatorModel
 from force_bdss.mco.base_mco_model import BaseMCOModel
+from force_bdss.notification_listeners.base_notification_listener_model \
+    import BaseNotificationListenerModel
 
 
 class Workflow(HasStrictTraits):
@@ -18,3 +20,6 @@ class Workflow(HasStrictTraits):
     #: Contains the factory-specific KPI Calculator Model objects.
     #: The list can be empty
     kpi_calculators = List(BaseKPICalculatorModel)
+
+    #: Contains information about the listeners to be setup
+    notification_listeners = List(BaseNotificationListenerModel)
diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py
index df20c76..f5dc86a 100644
--- a/force_bdss/io/workflow_reader.py
+++ b/force_bdss/io/workflow_reader.py
@@ -89,6 +89,7 @@ class WorkflowReader(HasStrictTraits):
             wf.mco = self._extract_mco(wf_data)
             wf.data_sources[:] = self._extract_data_sources(wf_data)
             wf.kpi_calculators[:] = self._extract_kpi_calculators(wf_data)
+            wf.notification_listeners[:] = self._extract_listeners(wf_data)
         except KeyError as e:
             logging.exception("Could not read file")
             raise InvalidFileException("Could not read file. "
@@ -211,3 +212,15 @@ class WorkflowReader(HasStrictTraits):
 
     def _extract_input_slot_maps(self, maps_data):
         return [InputSlotMap(**d) for d in maps_data]
+
+    def _extract_notification_listeners(self, wf_data):
+        registry = self.factory_registry
+        listeners = []
+        for nl_entry in wf_data["notification_listeners"]:
+            nl_id = nl_entry["id"]
+            nl_factory = registry.notification_listener_factory_by_id(nl_id)
+            model_data = nl_entry["model_data"]
+            listeners.append(nl_factory.create_model(model_data))
+
+        return listeners
+
diff --git a/force_bdss/io/workflow_writer.py b/force_bdss/io/workflow_writer.py
index 8335d5b..1e5abca 100644
--- a/force_bdss/io/workflow_writer.py
+++ b/force_bdss/io/workflow_writer.py
@@ -17,9 +17,7 @@ class WorkflowWriter(HasStrictTraits):
             A file object on which to write the workflow, properly serialized
             into JSON.
         """
-        data = {
-            "version": "1",
-        }
+        data = dict(version=1)
 
         data["workflow"] = self._workflow_data(workflow)
         json.dump(data, f)
@@ -32,7 +30,11 @@ class WorkflowWriter(HasStrictTraits):
                 for kpic in workflow.kpi_calculators],
             "data_sources": [
                 self._model_data(ds)
-                for ds in workflow.data_sources]
+                for ds in workflow.data_sources],
+            "notification_listeners": [
+                self._model_data(nl)
+                for nl in workflow.notification_listeners
+            ]
         }
 
         return workflow_data
-- 
GitLab