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
This commit is contained in:
David Rousselie
2007-06-05 21:18:14 +02:00
parent 940f8a83de
commit 00b0c9de5a
2 changed files with 49 additions and 4 deletions

View File

@@ -259,7 +259,7 @@ class JCLComponent(Component, object):
self.send_stanzas(result) self.send_stanzas(result)
return 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""" """Execute handler if their filter method does not return None"""
result = [] result = []
self.db_connect() self.db_connect()
@@ -269,9 +269,14 @@ class JCLComponent(Component, object):
accounts = handler.filter(stanza, lang) accounts = handler.filter(stanza, lang)
if accounts is not None: if accounts is not None:
result += handler.handle(stanza, lang, accounts) result += handler.handle(stanza, lang, accounts)
if not apply_all:
break
except Exception, e: except Exception, e:
type, value, stack = sys.exc_info()
self.__logger.error("Error with handler " + str(handler) + self.__logger.error("Error with handler " + str(handler) +
" with " + str(stanza)) " with " + str(stanza) + "\n%s\n%s"
% (e, "".join(traceback.format_exception
(type, value, stack, 5))))
result += [Message(from_jid=stanza.get_to(), result += [Message(from_jid=stanza.get_to(),
to_jid=stanza.get_from(), to_jid=stanza.get_from(),
stanza_type="error", stanza_type="error",
@@ -497,7 +502,7 @@ class JCLComponent(Component, object):
Handle password response message Handle password response message
""" """
self.__logger.debug("MESSAGE: " + message.get_body()) 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 return 1
########################################################################### ###########################################################################

View File

@@ -148,6 +148,17 @@ class TestUnsubscribeHandler(DefaultUnsubscribeHandler):
else: else:
return None 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): class JCLComponent_TestCase(unittest.TestCase):
########################################################################### ###########################################################################
# Utility methods # Utility methods
@@ -200,6 +211,35 @@ class JCLComponent_TestCase(unittest.TestCase):
self.assertEquals(result[0].get_type(), "error") self.assertEquals(result[0].get_type(), "error")
self.assertEquals(len(self.comp.stream.sent), 1) self.assertEquals(len(self.comp.stream.sent), 1)
self.assertEquals(result[0], self.comp.stream.sent[0]) 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 # 'run' tests
########################################################################### ###########################################################################