You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jg...@apache.org on 2008/11/25 17:54:08 UTC

svn commit: r720537 - /activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs

Author: jgomes
Date: Tue Nov 25 08:54:08 2008
New Revision: 720537

URL: http://svn.apache.org/viewvc?rev=720537&view=rev
Log:
Contributed patch from David Keaveny.  Greatly improves the comments on the function for better IntelliSense, and improves the Tracer output when searching for provider implementations.  This aids in debugging connection factory problems.

Thanks, David!

Modified:
    activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs

Modified: activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs?rev=720537&r1=720536&r2=720537&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS/trunk/src/main/csharp/NMSConnectionFactory.cs Tue Nov 25 08:54:08 2008
@@ -22,6 +22,9 @@
 
 namespace Apache.NMS
 {
+	/// <summary>
+	/// Implementation of a factory for <see cref="IConnection" /> instances.
+	/// </summary>
 	public class NMSConnectionFactory : IConnectionFactory
 	{
 		protected readonly IConnectionFactory factory;
@@ -30,8 +33,8 @@
 		/// The ConnectionFactory object must define a constructor that takes as a minimum a Uri object.
 		/// Any additional parameters are optional, but will typically include a Client ID string.
 		/// </summary>
-		/// <param name="providerURI"></param>
-		/// <param name="constructorParams"></param>
+		/// <param name="providerURI">The URI for the ActiveMQ provider.</param>
+		/// <param name="constructorParams">Optional parameters to use when creating the ConnectionFactory.</param>
 		public NMSConnectionFactory(string providerURI, params object[] constructorParams)
 			: this(new Uri(providerURI), constructorParams)
 		{
@@ -41,8 +44,8 @@
 		/// The ConnectionFactory object must define a constructor that takes as a minimum a Uri object.
 		/// Any additional parameters are optional, but will typically include a Client ID string.
 		/// </summary>
-		/// <param name="uriProvider"></param>
-		/// <param name="constructorParams"></param>
+		/// <param name="uriProvider">The URI for the ActiveMQ provider.</param>
+		/// <param name="constructorParams">Optional parameters to use when creating the ConnectionFactory.</param>
 		public NMSConnectionFactory(Uri uriProvider, params object[] constructorParams)
 		{
 			this.factory = CreateConnectionFactory(uriProvider, constructorParams);
@@ -51,9 +54,9 @@
 		/// <summary>
 		/// Create a connection factory that can create connections for the given scheme in the URI.
 		/// </summary>
-		/// <param name="uriProvider"></param>
-		/// <param name="constructorParams"></param>
-		/// <returns></returns>
+		/// <param name="uriProvider">The URI for the ActiveMQ provider.</param>
+		/// <param name="constructorParams">Optional parameters to use when creating the ConnectionFactory.</param>
+		/// <returns>A <see cref="IConnectionFactory" /> implementation that will be used.</returns>
 		public static IConnectionFactory CreateConnectionFactory(Uri uriProvider, params object[] constructorParams)
 		{
 			IConnectionFactory connectionFactory = null;
@@ -65,12 +68,12 @@
 				// If an implementation was found, try to instantiate it.
 				if(factoryType != null)
 				{
-#if NETCF
+#if NETCF
 					connectionFactory = (IConnectionFactory) Activator.CreateInstance(factoryType);
 #else
-					object[] parameters = MakeParameterArray(uriProvider, constructorParams);
+					object[] parameters = MakeParameterArray(uriProvider, constructorParams);
 					connectionFactory = (IConnectionFactory) Activator.CreateInstance(factoryType, parameters);
-#endif
+#endif
 				}
 
 				if(null == connectionFactory)
@@ -91,10 +94,11 @@
 		}
 
 		/// <summary>
-		/// Finds the Type associated with the given scheme.
+		/// Finds the <see cref="System.Type" /> associated with the given scheme.
 		/// </summary>
-		/// <param name="scheme"></param>
-		/// <returns></returns>
+		/// <param name="scheme">The scheme (e.g. <c>tcp</c>, <c>activemq</c> or <c>stomp</c>).</param>
+		/// <returns>The <see cref="System.Type" /> of the ConnectionFactory that will be used
+		/// to create the connection for the specified <paramref name="scheme" />.</returns>
 		private static Type GetTypeForScheme(string scheme)
 		{
 			string[] paths = GetConfigSearchPaths();
@@ -102,16 +106,21 @@
 			string factoryClassName;
 			Type factoryType = null;
 
+			Tracer.Debug("Locating provider for scheme: " + scheme);
+
 			if(LookupConnectionFactoryInfo(paths, scheme, out assemblyFileName, out factoryClassName))
-			{
+			{
 				Assembly assembly = null;
 
+				Tracer.Debug("Attempting to locate provider assembly: " + assemblyFileName);
 				foreach(string path in paths)
 				{
 					string fullpath = Path.Combine(path, assemblyFileName);
+					Tracer.Debug("\tScanning folder: " + path);
 
 					if(File.Exists(fullpath))
 					{
+						Tracer.Debug("\tAssembly found!");
 						assembly = Assembly.LoadFrom(fullpath);
 						break;
 					}
@@ -123,7 +132,7 @@
 					factoryType = assembly.GetType(factoryClassName, true);
 #else
 					factoryType = assembly.GetType(factoryClassName, true, true);
-#endif
+#endif
 				}
 			}
 
@@ -137,21 +146,22 @@
 		/// Following is a sample configuration file named nmsprovider-jms.config.  Replace
 		/// the parenthesis with angle brackets for proper XML formatting.
 		///
-		///		(?xml version="1.0" encoding="utf-8" ?)
-		///		(configuration)
-		///			(provider assembly="MyCompany.NMS.JMSProvider.dll" classFactory="MyCompany.NMS.JMSProvider.ConnectionFactory"/)
-		///		(/configuration)
+		///     (?xml version="1.0" encoding="utf-8" ?)
+		///     (configuration)
+		///         (provider assembly="MyCompany.NMS.JMSProvider.dll" classFactory="MyCompany.NMS.JMSProvider.ConnectionFactory"/)
+		///     (/configuration)
 		///
 		/// This configuration file would be loaded and parsed when a connection uri with a scheme of 'jms'
 		/// is used for the provider.  In this example the connection string might look like:
-		///		jms://localhost:7222
+		///     jms://localhost:7222
 		///
 		/// </summary>
 		/// <param name="paths">Folder paths to look in.</param>
-		/// <param name="scheme"></param>
-		/// <param name="assemblyFileName"></param>
-		/// <param name="factoryClassName"></param>
-		/// <returns></returns>
+		/// <param name="scheme">The scheme.</param>
+		/// <param name="assemblyFileName">Name of the assembly file.</param>
+		/// <param name="factoryClassName">Name of the factory class.</param>
+		/// <returns><c>true</c> if the configuration file for the specified <paramref name="scheme" /> could
+		/// be found; otherwise, <c>false</c>.</returns>
 		private static bool LookupConnectionFactoryInfo(string[] paths, string scheme, out string assemblyFileName, out string factoryClassName)
 		{
 			string configFileName = String.Format("nmsprovider-{0}.config", scheme.ToLower());
@@ -160,14 +170,17 @@
 			assemblyFileName = String.Empty;
 			factoryClassName = String.Empty;
 
+			Tracer.Debug("Attempting to locate provider configuration: " + configFileName);
 			foreach(string path in paths)
 			{
 				string fullpath = Path.Combine(path, configFileName);
+				Tracer.Debug("\tScanning folder: " + path);
 
 				try
 				{
 					if(File.Exists(fullpath))
 					{
+						Tracer.Debug("\tConfiguration file found!");
 						XmlDocument configDoc = new XmlDocument();
 
 						configDoc.Load(fullpath);
@@ -196,6 +209,10 @@
 		/// <summary>
 		/// Get an array of search paths to look for config files.
 		/// </summary>
+		/// <returns>
+		/// A collection of search paths, including the current directory, the current AppDomain's
+		/// BaseDirectory and the current AppDomain's RelativeSearchPath.
+		/// </returns>
 		private static string[] GetConfigSearchPaths()
 		{
 			ArrayList pathList = new ArrayList();
@@ -222,11 +239,11 @@
 		}
 
 		/// <summary>
-		/// Create an object array containing the parameters to pass to the constructor.
+		/// Converts a <c>params object[]</c> collection into a plain <c>object[]</c>s, to pass to the constructor.
 		/// </summary>
-		/// <param name="firstParam"></param>
-		/// <param name="varParams"></param>
-		/// <returns></returns>
+		/// <param name="firstParam">The first parameter in the collection.</param>
+		/// <param name="varParams">The remaining parameters.</param>
+		/// <returns>An array of <see cref="Object" /> instances.</returns>
 		private static object[] MakeParameterArray(object firstParam, params object[] varParams)
 		{
 			ArrayList paramList = new ArrayList();
@@ -240,26 +257,27 @@
 		}
 
 		/// <summary>
-		/// Creates a new connection
+		/// Creates a new connection.
 		/// </summary>
+		/// <returns>An <see cref="IConnection" /> created by the requested ConnectionFactory.</returns>
 		public IConnection CreateConnection()
 		{
 			return this.factory.CreateConnection();
 		}
 
 		/// <summary>
-		/// Creates a new connection with the given user name and password
+		/// Creates a new connection with the given <paramref name="userName" /> and <paramref name="password" /> credentials.
 		/// </summary>
-		/// <param name="userName"></param>
-		/// <param name="password"></param>
-		/// <returns></returns>
+		/// <param name="userName">The username to use when establishing the connection.</param>
+		/// <param name="password">The password to use when establishing the connection.</param>
+		/// <returns>An <see cref="IConnection" /> created by the requested ConnectionFactory.</returns>
 		public IConnection CreateConnection(string userName, string password)
 		{
 			return this.factory.CreateConnection(userName, password);
 		}
 
 		/// <summary>
-		/// The actual IConnectionFactory implementation that is being used.  This implemenation
+		/// The actual IConnectionFactory implementation that is being used.  This implementation
 		/// depends on the scheme of the URI used when constructed.
 		/// </summary>
 		public IConnectionFactory ConnectionFactory