7 from utils import logging
10 class _MessageBus(object):
12 Application message bus singleton. This class is intented to be used by
13 the Mediator class only.
18 #self.__mediators = []
22 def add_mediator(self, mediator):
24 #self.__mediators.append(mediator)
25 self.__inspect_mediator(mediator)
28 def __inspect_mediator(self, mediator):
30 supported_events = [ ev[7:] for ev in dir(mediator)
31 if ev.startswith("handle_") ]
32 for ev in supported_events:
33 ev_id = msgs._name_to_id(ev)
36 while (len(self.__handlers) <= ev_id):
37 self.__handlers.append([])
39 handler = getattr(mediator, "handle_" + ev)
40 self.__handlers[ev_id].append(handler)
45 def send_event(self, src, event, *args):
47 if (logging.is_level(logging.DEBUG)):
48 logging.debug("*** %s%s ***", msgs._id_to_name(event), `args`[:30])
51 handlers = self.__handlers[event]
55 for handler in handlers:
59 logging.error("error during event call: %s\n%s",
60 msgs._id_to_name(event), logging.stacktrace())
64 handler_name = "handle_" + msgs._id_to_name(event)
65 for mediator in self.__mediators:
66 if (mediator == src): continue
68 # TODO: the pass type was never really used and should go away
69 mediator.set_pass_type(mediator.PASS_TYPE_PASS_ON)
71 if (hasattr(mediator, handler_name)):
72 getattr(mediator, handler_name)(*args)
74 mediator.handle_message(event, *args)
76 import traceback; traceback.print_exc()
81 ptype = mediator.get_pass_type()
82 if (ptype == mediator.PASS_TYPE_DROP):
84 elif (ptype == mediator.PASS_TYPE_PASS_ON):
87 raise SyntaxError("mediator '%s' must specify pass type" \
93 def call_service(self, svc, *args):
95 if (logging.is_level(logging.DEBUG)):
96 logging.debug("*** %s%s ***", msgs._id_to_name(svc), `args`[:30])
99 handlers = self.__handlers[svc]
103 for handler in handlers:
105 return handler(*args)
107 logging.error("error during service call: %s\n%s",
108 msgs._id_to_name(svc), logging.stacktrace())
113 handler_name = "handle_" + msgs._id_to_name(svc)
114 handler = self.__services.get(svc)
117 for mediator in self.__mediators:
119 if (hasattr(mediator, handler_name)):
120 ret = getattr(mediator, handler_name)(*args)
122 ret = mediator.handle_message(svc, *args)
124 import traceback; traceback.print_exc()
128 self.__services[svc] = mediator
132 raise ServiceNotAvailableError(msgs._id_to_name(svc))
135 if (hasattr(handler, handler_name)):
136 ret = getattr(handler, handler_name)(*args)
138 ret = handler.handle_message(svc, *args)
143 _singleton = _MessageBus()
144 def MessageBus(): return _singleton