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