You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by dp...@apache.org on 2017/05/25 21:28:01 UTC

[3/4] logging-log4net git commit: Support for types of non-parameterless constructors in XmlConfigurator.

Support for types of non-parameterless constructors in XmlConfigurator.

The constructor parameters are taken from the corresponding values of
the child nodes.

You can add for instance

<standardunit type="Amazon.CloudWatch.StandardUnit">
<value value="Kilobytes"/>
</standardunit>

where StandardUnit has only one constructor that has a string parameter
named "value".


Project: http://git-wip-us.apache.org/repos/asf/logging-log4net/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4net/commit/b4bc43ee
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4net/tree/b4bc43ee
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4net/diff/b4bc43ee

Branch: refs/heads/pr/old/10
Commit: b4bc43eed24d1152772141652d68002f396c615d
Parents: 610157a
Author: Martin Camitz <ma...@gmail.com>
Authored: Tue Apr 22 15:36:29 2014 +0200
Committer: Dominik Psenner <dp...@apache.org>
Committed: Thu May 25 00:06:48 2017 +0200

----------------------------------------------------------------------
 .../Hierarchy/XmlHierarchyConfigurator.cs       | 54 ++++++++++++++++++--
 1 file changed, 50 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/b4bc43ee/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
----------------------------------------------------------------------
diff --git a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
index ae415d7..a251b47 100644
--- a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
+++ b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
@@ -19,7 +19,9 @@
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Globalization;
+using System.Linq;
 using System.Reflection;
 using System.Xml;
 
@@ -986,13 +988,57 @@ namespace log4net.Repository.Hierarchy
 
 			// Create using the default constructor
 			object createdObject = null;
-			try
+
+			//Try parameterless constructor
+			if (objectType.GetConstructor(Type.EmptyTypes) != null)
 			{
-				createdObject = Activator.CreateInstance(objectType);
+				try
+				{
+					createdObject = Activator.CreateInstance(objectType);
+				}
+				catch (Exception createInstanceEx)
+				{
+					LogLog.Error(declaringType,
+						"XmlHierarchyConfigurator: Failed to construct object of type [" + objectType.FullName +
+						"] Exception: " + createInstanceEx.ToString());
+				}
+
 			}
-			catch(Exception createInstanceEx)
+			else
 			{
-				LogLog.Error(declaringType, "XmlHierarchyConfigurator: Failed to construct object of type [" + objectType.FullName + "] Exception: "+createInstanceEx.ToString());
+				//See if there is a constructor matching supplied values, most specific first.
+				Exception lastException = null;
+				foreach (var constructorInfo in objectType.GetConstructors().OrderByDescending(x => x.GetParameters().Count()))
+				{
+
+					try
+					{
+						var nodes = new List<XmlNode>(element.ChildNodes.Cast<XmlNode>());
+						var parameterInfos = constructorInfo.GetParameters();
+						LogLog.Debug(declaringType, "Trying constructor with parameters: " + string.Join(",", parameterInfos.Select(p => p.Name)));
+
+						var args = parameterInfos.Select(p => nodes.SingleOrDefault(n => n.Name == p.Name));
+						LogLog.Debug(declaringType, "Matching args from config: " + string.Join(",", args.Select(n => n.Name)));
+						LogLog.Debug(declaringType, "Matching arg values from config: " + string.Join(",", args.Select(a => a.Attributes["value"].Value)));
+						if (args.All(a => a != null))
+						{
+							createdObject = constructorInfo.Invoke(args.Select(a => a.Attributes["value"].Value).ToArray());
+							break;
+						}
+					}
+					catch (Exception e)
+					{
+						lastException = e;
+					}
+				}
+
+				if (createdObject == null)
+				{
+					LogLog.Error(declaringType,
+					   "XmlHierarchyConfigurator: Failed to construct object of type [" + objectType.FullName +
+					   "] No matching constructor found. LastException: " +
+					   (lastException != null ? lastException.ToString() : "None caught."));
+				}
 			}
 
 			// Set any params on object