diff --git a/src/Spring/Spring.Core/Util/CollectionUtils.cs b/src/Spring/Spring.Core/Util/CollectionUtils.cs index 64ae4364..757e842f 100644 --- a/src/Spring/Spring.Core/Util/CollectionUtils.cs +++ b/src/Spring/Spring.Core/Util/CollectionUtils.cs @@ -199,7 +199,86 @@ namespace Spring.Util throw new ArgumentNullException("Collection cannot be null."); } return new ArrayList(inputCollection); - } + } + + /// + /// Finds a value of the given type in the given collection. + /// + /// The collection to search. + /// The type to look for. + /// a value of the given type found, or null if none. + /// If more than one value of the given type is found + public static object FindValueOfType(ICollection collection, Type type) + { + if (IsEmpty(collection)) + { + return null; + } + Type typeToUse = (type != null ? type : typeof (object)); + object val = null; + foreach (object obj in collection) + { + if (typeToUse.IsAssignableFrom(obj.GetType())) + { + if (val != null) + { + throw new ArgumentException("More than one value of type[" + typeToUse.Name + "] found."); + } + val = obj; + } + } + return val; + } + + /// + /// Find a value of one of the given types in the given Collection, + /// searching the Collection for a value of the first type, then + /// searching for a value of the second type, etc. + /// + /// The collection to search. + /// The types to look for, in prioritized order. + /// a value of the given types found, or null if none + /// If more than one value of the given type is found + public static object FindValueOfType(ICollection collection, Type[] types) + { + if (IsEmpty(collection) || ObjectUtils.IsEmpty(types)) + { + return null; + } + foreach (Type type in types) + { + object val = FindValueOfType(collection, type); + if (val != null) + { + return val; + } + } + return null; + } + + /// + /// Determines whether the specified collection is null or empty. + /// + /// The collection to check. + /// + /// true if the specified collection is empty or null; otherwise, false. + /// + public static bool IsEmpty(ICollection collection) + { + return (collection == null || collection.Count == 0); + } + + /// + /// Determines whether the specified dictionary is null empty. + /// + /// The dictionary to check. + /// + /// true if the specified dictionary is empty or null; otherwise, false. + /// + public static bool IsEmpty(IDictionary dictionary) + { + return (dictionary == null || dictionary.Count == 0); + } #endregion } diff --git a/src/Spring/Spring.Core/Util/ObjectUtils.cs b/src/Spring/Spring.Core/Util/ObjectUtils.cs index bdd86390..1ee6992f 100644 --- a/src/Spring/Spring.Core/Util/ObjectUtils.cs +++ b/src/Spring/Spring.Core/Util/ObjectUtils.cs @@ -355,6 +355,18 @@ namespace Spring.Util || typeof(double[]).Equals(type); } + + /// + /// Determines whether the specified array is null or empty. + /// + /// The array to check. + /// + /// true if the specified array is null empty; otherwise, false. + /// + public static bool IsEmpty(object[] array) + { + return (array == null || array.Length == 0); + } /// /// Determine if the given objects are equal, returning /// if both are respectively diff --git a/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs b/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs index 49374a53..2026d9f4 100644 --- a/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs +++ b/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs @@ -451,18 +451,18 @@ namespace Spring.Transaction.Support /// . /// /// - ///

+ /// /// Called after /// and /// /// execution on any outcome. - ///

- ///

+ /// + /// /// Should not throw any exceptions but just issue warnings on errors. - ///

- ///

+ /// + /// /// Default implementation does nothing. - ///

+ /// ///
protected virtual void DoCleanupAfterCompletion(object transaction) { diff --git a/src/Spring/Spring.Messaging/Messaging/Listener/MessageListenerAdapter.cs b/src/Spring/Spring.Messaging/Messaging/Listener/MessageListenerAdapter.cs index fe4ec74e..e0357ff7 100644 --- a/src/Spring/Spring.Messaging/Messaging/Listener/MessageListenerAdapter.cs +++ b/src/Spring/Spring.Messaging/Messaging/Listener/MessageListenerAdapter.cs @@ -251,7 +251,7 @@ namespace Spring.Messaging.Listener } - protected virtual string GetListenerMethodName(Message originalMessage, object extractedMessage) + protected virtual string GetHandlerMethodName(Message originalMessage, object extractedMessage) { return DefaultHandlerMethod; } diff --git a/src/Spring/Spring.Messaging/Messaging/Support/MessageQueueFactoryObject.cs b/src/Spring/Spring.Messaging/Messaging/Support/MessageQueueFactoryObject.cs index ab0f3ae7..10e7c149 100644 --- a/src/Spring/Spring.Messaging/Messaging/Support/MessageQueueFactoryObject.cs +++ b/src/Spring/Spring.Messaging/Messaging/Support/MessageQueueFactoryObject.cs @@ -133,6 +133,10 @@ namespace Spring.Messaging.Support #region IFactoryObject Members + /// + /// Retrun a configured MessageQueue object. + /// + /// A newly configured MessageQueue object public object GetObject() { MessageQueue.EnableConnectionCache = enableConnectionCache; diff --git a/test/Spring/Spring.Core.Tests/Util/CollectionUtilsTests.cs b/test/Spring/Spring.Core.Tests/Util/CollectionUtilsTests.cs index ca211426..13c29c00 100644 --- a/test/Spring/Spring.Core.Tests/Util/CollectionUtilsTests.cs +++ b/test/Spring/Spring.Core.Tests/Util/CollectionUtilsTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using NUnit.Framework; +using Spring.Objects; namespace Spring.Util { @@ -301,5 +302,58 @@ namespace Spring.Util CollectionUtils.RemoveAll(target, source); Assert.IsTrue(0 == target.Count); } + + [Test] + public void IsCollectionEmptyOrNull() + { + ArrayList list = new ArrayList(); + Assert.IsTrue(CollectionUtils.IsEmpty(list)); + list.Add("foo"); + Assert.IsFalse(CollectionUtils.IsEmpty(list)); + list = null; + Assert.IsTrue(CollectionUtils.IsEmpty(list)); + } + + [Test] + public void IsDictionaryEmptyOrNull() + { + Hashtable t = new Hashtable(); + Assert.IsTrue(CollectionUtils.IsEmpty(t)); + t["foo"] = "bar"; + Assert.IsFalse(CollectionUtils.IsEmpty(t)); + t = null; + Assert.IsTrue(CollectionUtils.IsEmpty(t)); + } + + [Test] + public void FindValueOfType() + { + ArrayList list = new ArrayList(); + Assert.IsNull(CollectionUtils.FindValueOfType(list, typeof(String))); + list.Add("foo"); + object obj = CollectionUtils.FindValueOfType(list, typeof (String)); + Assert.IsNotNull(obj); + Assert.IsNotNull(obj as string); + string val = obj as string; + Assert.AreEqual("foo", val); + + list.Add(new TestObject("Joe", 34)); + obj = CollectionUtils.FindValueOfType(list, typeof (TestObject)); + Assert.IsNotNull(obj); + TestObject to = obj as TestObject; + Assert.IsNotNull(to); + Assert.AreEqual("Joe", to.Name); + + list.Add(new TestObject("Mary", 33)); + try + { + obj = CollectionUtils.FindValueOfType(list, typeof(TestObject)); + Assert.Fail("Should have thrown exception"); + } catch (ArgumentException) + { + //ok + } + + } } } diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/CachingConnectionFactoryTests.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/CachingConnectionFactoryTests.cs index 3d1d65cb..56b87b1b 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/CachingConnectionFactoryTests.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/CachingConnectionFactoryTests.cs @@ -26,7 +26,7 @@ using Rhino.Mocks; #endregion -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { /// /// This class contains tests for diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/NmsTransactionManagerTests.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/NmsTransactionManagerTests.cs index 026f1683..aa56a9bb 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/NmsTransactionManagerTests.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/NmsTransactionManagerTests.cs @@ -24,13 +24,13 @@ using System; using Apache.NMS; using NUnit.Framework; using Rhino.Mocks; -using Spring.Messaging.Nms.Connection; +using Spring.Messaging.Nms.Connections; using Spring.Transaction; using Spring.Transaction.Support; #endregion -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { /// /// This class contains tests for diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/SingleConnectionFactoryTests.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/SingleConnectionFactoryTests.cs index e2da9214..299743a5 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/SingleConnectionFactoryTests.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/SingleConnectionFactoryTests.cs @@ -24,11 +24,11 @@ using System; using Apache.NMS; using NUnit.Framework; using Rhino.Mocks; -using Spring.Messaging.Nms.Connection; +using Spring.Messaging.Nms.Connections; #endregion -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { /// /// This class contains tests for the SingleConnectionFactory diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestConnection.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestConnection.cs index db1b79bf..f58653d8 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestConnection.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestConnection.cs @@ -1,7 +1,7 @@ using System; using Apache.NMS; -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { public class TestConnection : IConnection { diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestExceptionListener.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestExceptionListener.cs index 52ae92e1..75794c7a 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestExceptionListener.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestExceptionListener.cs @@ -20,7 +20,7 @@ using System; -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { public class TestExceptionListener : IExceptionListener { diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestMessageProducer.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestMessageProducer.cs index be9a97f0..b1a5d755 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestMessageProducer.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestMessageProducer.cs @@ -21,7 +21,7 @@ using System; using Apache.NMS; -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { public class TestMessageProducer : IMessageProducer diff --git a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestSession.cs b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestSession.cs index 3d6eeb7b..c056b019 100644 --- a/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestSession.cs +++ b/test/Spring/Spring.Messaging.Nms.Tests/Messaging/Nms/Connections/TestSession.cs @@ -21,7 +21,7 @@ using System; using Apache.NMS; -namespace Spring.Messaging.Nms.Connection +namespace Spring.Messaging.Nms.Connections { public class TestSession : ISession