almahmoud 7 лет назад
Родитель
Сommit
514e069cdb
1 измененных файлов с 29 добавлено и 12 удалено
  1. 29 12
      cloudbridge/cloud/base/provider.py

+ 29 - 12
cloudbridge/cloud/base/provider.py

@@ -138,18 +138,15 @@ class EventDispatcher(object):
                 format(event_name)
             raise NoHandlerException(message)
 
-        result = None
+        prev_handler = None
+        first_handler = None
         for (priority, handler) in priority_sort(self.__events[event_name]):
-            if handler.handler_type == HandlerType.RESULT_SUBSCRIPTION:
-                kwargs['callback_result'] = result
-                new_result = handler.invoke(kwargs)
-                if new_result:
-                    result = new_result
-            else:
-                new_result = handler.invoke(kwargs)
-                if new_result:
-                    result = new_result
-        return result
+            if not first_handler:
+                first_handler = handler
+            if prev_handler:
+                prev_handler.next_handler = handler
+            prev_handler = handler
+        return first_handler.invoke(kwargs)
 
 
 class EventHandler(object):
@@ -159,11 +156,31 @@ class EventHandler(object):
         self.result_callback = result_callback
         self._next_handler = None
 
+    @property
+    def next_handler(self):
+        return self._next_handler
+
+    @next_handler.setter
+    def next_handler(self, new_handler):
+        self._next_handler = new_handler
+
     def invoke(self, args):
         if self.handler_type in [HandlerType.SUBSCRIPTION,
                                  HandlerType.RESULT_SUBSCRIPTION]:
-            return self.callback(**args)
+            result = self.callback(**args)
 
+        next = self.next_handler
+        if next:
+            if next.handler_type == HandlerType.RESULT_SUBSCRIPTION:
+                args['callback_result'] = result
+                new_result = next.invoke(args)
+                if new_result:
+                    result = new_result
+            elif next.handler_type == HandlerType.SUBSCRIPTION:
+                new_result = next.invoke(args)
+                if new_result:
+                    result = new_result
+        return result
 
 
 class BaseCloudProvider(CloudProvider):