From 74701225aafffddcbe27aedecd8898117a593078 Mon Sep 17 00:00:00 2001 From: Renaud Paquay Date: Sat, 4 Dec 2010 13:31:29 -0800 Subject: [PATCH] Add a "NotifyFailFast" method to the event bus This mode allows exceptions to be bubbled up when then caller cares, which is the case in the "ProcessingEngine", as the transaction scope may become invalid if a nhibernate exception is not bubbled up. --HG-- branch : dev --- .../State/DefaultProcessingEngine.cs | 2 +- src/Orchard/Events/DefaultOrchardEventBus.cs | 25 ++++++++++++------- src/Orchard/Events/IEventBus.cs | 1 + 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/Orchard/Environment/State/DefaultProcessingEngine.cs b/src/Orchard/Environment/State/DefaultProcessingEngine.cs index 9e6e82784..003718119 100644 --- a/src/Orchard/Environment/State/DefaultProcessingEngine.cs +++ b/src/Orchard/Environment/State/DefaultProcessingEngine.cs @@ -75,7 +75,7 @@ namespace Orchard.Environment.State { entry.MessageName, entry.ProcessId, entry.ShellSettings.Name); - eventBus.Notify(entry.MessageName, entry.EventData); + eventBus.NotifyFailFast(entry.MessageName, entry.EventData); } } } diff --git a/src/Orchard/Events/DefaultOrchardEventBus.cs b/src/Orchard/Events/DefaultOrchardEventBus.cs index 511f75c6c..87dc76cd1 100644 --- a/src/Orchard/Events/DefaultOrchardEventBus.cs +++ b/src/Orchard/Events/DefaultOrchardEventBus.cs @@ -22,13 +22,18 @@ namespace Orchard.Events { public IEnumerable Notify(string messageName, IDictionary eventData) { // call ToArray to ensure evaluation has taken place - return NotifyHandlers(messageName, eventData).ToArray(); + return NotifyHandlers(messageName, eventData, false/*failFast*/).ToArray(); } - private IEnumerable NotifyHandlers(string messageName, IDictionary eventData) { + public IEnumerable NotifyFailFast(string messageName, IDictionary eventData) { + // call ToArray to ensure evaluation has taken place + return NotifyHandlers(messageName, eventData, true/*failFast*/).ToArray(); + } + + private IEnumerable NotifyHandlers(string messageName, IDictionary eventData, bool failFast) { string[] parameters = messageName.Split('.'); if (parameters.Length != 2) { - throw new ArgumentException(messageName + T(" is not formatted correctly")); + throw new ArgumentException(T("{0} is not formatted correctly", messageName).Text); } string interfaceName = parameters[0]; string methodName = parameters[1]; @@ -36,7 +41,7 @@ namespace Orchard.Events { var eventHandlers = _eventHandlers(); foreach (var eventHandler in eventHandlers) { IEnumerable returnValue; - if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, out returnValue)) { + if (TryNotifyHandler(eventHandler, messageName, interfaceName, methodName, eventData, failFast, out returnValue)) { if (returnValue != null) { foreach (var value in returnValue) { yield return value; @@ -46,7 +51,7 @@ namespace Orchard.Events { } } - private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary eventData, out IEnumerable returnValue) { + private bool TryNotifyHandler(IEventHandler eventHandler, string messageName, string interfaceName, string methodName, IDictionary eventData, bool failFast, out IEnumerable returnValue) { try { return TryInvoke(eventHandler, interfaceName, methodName, eventData, out returnValue); } @@ -56,6 +61,9 @@ namespace Orchard.Events { eventHandler.GetType().FullName, ex.GetType().Name); + if (failFast) + throw; + returnValue = null; return false; } @@ -75,7 +83,7 @@ namespace Orchard.Events { private static bool TryInvokeMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments, out IEnumerable returnValue) { MethodInfo method = GetMatchingMethod(eventHandler, interfaceType, methodName, arguments); if (method != null) { - List parameters = new List(); + var parameters = new List(); foreach (var methodParameter in method.GetParameters()) { parameters.Add(arguments[methodParameter.Name]); } @@ -90,8 +98,8 @@ namespace Orchard.Events { } private static MethodInfo GetMatchingMethod(IEventHandler eventHandler, Type interfaceType, string methodName, IDictionary arguments) { - List allMethods = new List(interfaceType.GetMethods()); - List candidates = new List(allMethods); + var allMethods = new List(interfaceType.GetMethods()); + var candidates = new List(allMethods); foreach (var method in allMethods) { if (String.Equals(method.Name, methodName, StringComparison.OrdinalIgnoreCase)) { @@ -114,6 +122,5 @@ namespace Orchard.Events { return null; } - } } diff --git a/src/Orchard/Events/IEventBus.cs b/src/Orchard/Events/IEventBus.cs index c55515810..3c2e7393f 100644 --- a/src/Orchard/Events/IEventBus.cs +++ b/src/Orchard/Events/IEventBus.cs @@ -4,5 +4,6 @@ using System.Collections.Generic; namespace Orchard.Events { public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDictionary eventData); + IEnumerable NotifyFailFast(string messageName, IDictionary eventData); } }