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:
@@ -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
|
||||
|
||||
###########################################################################
|
||||
|
||||
@@ -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
|
||||
###########################################################################
|
||||
|
||||
Reference in New Issue
Block a user