From 00b0c9de5a18f78e2cc069730ff0dcf4a8261400 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Tue, 5 Jun 2007 21:18:14 +0200 Subject: [PATCH] Apply all handlers by default For registered behaviors, by default, all handlers are called. For message handlers, only the first is applied. darcs-hash:20070605191814-86b55-57a0b315eacd179e9024d97838db5a6fcda2af15.gz --- src/jcl/jabber/component.py | 13 ++++++---- src/jcl/jabber/tests/component.py | 40 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index f82c330..eea2a96 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -259,7 +259,7 @@ class JCLComponent(Component, object): self.send_stanzas(result) return result - def apply_registered_behavior(self, handlers, stanza, apply_all=False): + def apply_registered_behavior(self, handlers, stanza, apply_all=True): """Execute handler if their filter method does not return None""" result = [] self.db_connect() @@ -269,9 +269,14 @@ class JCLComponent(Component, object): accounts = handler.filter(stanza, lang) if accounts is not None: result += handler.handle(stanza, lang, accounts) + if not apply_all: + break except Exception, e: - self.__logger.error("Error with handler " + str(handler) + - " with " + str(stanza)) + type, value, stack = sys.exc_info() + self.__logger.error("Error with handler " + str(handler) + + " with " + str(stanza) + "\n%s\n%s" + % (e, "".join(traceback.format_exception + (type, value, stack, 5)))) result += [Message(from_jid=stanza.get_to(), to_jid=stanza.get_from(), stanza_type="error", @@ -497,7 +502,7 @@ class JCLComponent(Component, object): Handle password response message """ self.__logger.debug("MESSAGE: " + message.get_body()) - self.apply_registered_behavior(self.msg_handlers, message) + self.apply_registered_behavior(self.msg_handlers, message, False) return 1 ########################################################################### diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index a53d877..9e17c9c 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -148,6 +148,17 @@ class TestUnsubscribeHandler(DefaultUnsubscribeHandler): else: return None +class HandlerMock(object): + def __init__(self): + self.handled = [] + + def filter(self, message, lang_class): + return [] + + def handle(self, stanza, lang_class, accounts): + self.handled.append((stanza, lang_class, accounts)) + return [(stanza, lang_class, accounts)] + class JCLComponent_TestCase(unittest.TestCase): ########################################################################### # Utility methods @@ -200,6 +211,35 @@ class JCLComponent_TestCase(unittest.TestCase): self.assertEquals(result[0].get_type(), "error") self.assertEquals(len(self.comp.stream.sent), 1) self.assertEquals(result[0], self.comp.stream.sent[0]) + + def test_apply_all_registered_behavior(self): + self.comp.stream = MockStreamNoConnect() + self.comp.stream_class = MockStreamNoConnect + message = Message(from_jid="user1@test.com", + to_jid="account11@jcl.test.com") + handler1 = HandlerMock() + handler2 = HandlerMock() + result = self.comp.apply_registered_behavior([handler1, handler2], + message) + self.assertEquals(len(result), 2) + self.assertEquals(result[0][0], message) + self.assertEquals(result[1][0], message) + + def test_apply_one_registered_behavior(self): + self.comp.stream = MockStreamNoConnect() + self.comp.stream_class = MockStreamNoConnect + message = Message(from_jid="user1@test.com", + to_jid="account11@jcl.test.com") + handler1 = HandlerMock() + handler2 = HandlerMock() + result = self.comp.apply_registered_behavior([handler1, handler2], + message, + apply_all=False) + self.assertEquals(len(result), 1) + self.assertEquals(result[0][0], message) + self.assertEquals(len(handler1.handled), 1) + self.assertEquals(len(handler2.handled), 0) + ########################################################################### # 'run' tests ###########################################################################