Author: rgrabowski
Date: Wed Dec 20 17:28:51 2006
New Revision: 489241

URL: http://svn.apache.org/viewvc?view=rev&rev=489241
Log:
Fix for LOG4NET-107. Added ExceptionEvaluator that triggers a 
BufferingAppenderSkeleton to flush its buffer when a certain Exception is 
detected.

Added:
    logging/log4net/trunk/src/Core/ExceptionEvaluator.cs
Modified:
    logging/log4net/trunk/src/log4net.csproj
    logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs

Added: logging/log4net/trunk/src/Core/ExceptionEvaluator.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/ExceptionEvaluator.cs?view=auto&rev=489241
==============================================================================
--- logging/log4net/trunk/src/Core/ExceptionEvaluator.cs (added)
+++ logging/log4net/trunk/src/Core/ExceptionEvaluator.cs Wed Dec 20 17:28:51 
2006
@@ -0,0 +1,129 @@
+#region Copyright & License
+//
+// Copyright 2001-2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#endregion
+
+using System;
+
+namespace log4net.Core
+{
+       /// <summary>
+       /// An evaluator that triggers on an Exception type
+       /// </summary>
+       /// <remarks>
+       /// <para>
+       /// This evaluator will trigger if the type of the Exception
+       /// passed to <see cref="IsTriggeringEvent(LoggingEvent)"/>
+       /// is equal to a Type in <see cref="ExceptionType"/>.    /// 
+       /// </para>
+       /// </remarks>
+       /// <author>Drew Schaeffer</author>
+       public class ExceptionEvaluator : ITriggeringEventEvaluator
+       {
+               /// <summary>
+               /// The type that causes the trigger to fire.
+               /// </summary>
+               private Type m_type;
+
+               /// <summary>
+               /// Causes subclasses of <see cref="ExceptionType"/> to cause 
the trigger to fire.
+               /// </summary>
+               private bool m_triggerOnSubclass;
+
+               /// <summary>
+               /// Default ctor to allow dynamic creation through a 
configurator.
+               /// </summary>
+               public ExceptionEvaluator()
+               {
+                       // empty
+               }
+
+               /// <summary>
+               /// Constructs an evaluator and initializes to trigger on 
<paramref name="exType"/>
+               /// </summary>
+               /// <param name="exType">the type that triggers this 
evaluator.</param>
+               /// <param name="triggerOnSubClass">If true, this evaluator 
will trigger on subclasses of <see cref="ExceptionType"/>.</param>
+               public ExceptionEvaluator(Type exType, bool triggerOnSubClass)
+               {
+                       if (exType == null)
+                       {
+                               throw new ArgumentNullException("exType");
+                       }
+
+                       m_type = exType;
+                       m_triggerOnSubclass = triggerOnSubClass;
+               }
+
+               /// <summary>
+               /// The type that triggers this evaluator.
+               /// </summary>
+               public Type ExceptionType
+               {
+                       get { return m_type; }
+                       set { m_type = value; }
+               }
+
+               /// <summary>
+               /// If true, this evaluator will trigger on subclasses of <see 
cref="ExceptionType"/>.
+               /// </summary>
+               public bool TriggerOnSubclass
+               {
+                       get { return m_triggerOnSubclass; }
+                       set { m_triggerOnSubclass = value; }
+               }
+
+               #region ITriggeringEventEvaluator Members
+
+               /// <summary>
+               /// Is this <paramref name="loggingEvent"/> the triggering 
event?
+               /// </summary>
+               /// <param name="loggingEvent">The event to check</param>
+               /// <returns>This method returns <c>true</c>, if the logging 
event Exception 
+               /// Type is <see cref="ExceptionType"/>. 
+               /// Otherwise it returns <c>false</c></returns>
+               /// <remarks>
+               /// <para>
+               /// This evaluator will trigger if the Exception Type of the 
event
+               /// passed to <see cref="IsTriggeringEvent(LoggingEvent)"/>
+               /// is <see cref="ExceptionType"/>.
+               /// </para>
+               /// </remarks>
+               public bool IsTriggeringEvent(LoggingEvent loggingEvent)
+               {
+                       if (loggingEvent == null)
+                       {
+                               throw new ArgumentNullException("loggingEvent");
+                       }
+
+                       if (m_triggerOnSubclass && loggingEvent.ExceptionObject 
!= null)
+                       {
+                               // check if loggingEvent.ExceptionObject is of 
type ExceptionType or subclass of ExceptionType
+                               Type exceptionObjectType = 
loggingEvent.ExceptionObject.GetType();
+                               return exceptionObjectType == m_type || 
exceptionObjectType.IsSubclassOf(m_type);
+                       }
+                       else if (!m_triggerOnSubclass && 
loggingEvent.ExceptionObject != null)
+                       {   // check if loggingEvent.ExceptionObject is of type 
ExceptionType
+                               return loggingEvent.ExceptionObject.GetType() 
== m_type;
+                       }
+                       else
+                       {   // loggingEvent.ExceptionObject is null
+                               return false;
+                       }
+               }
+
+               #endregion
+       }
+}

Modified: logging/log4net/trunk/src/log4net.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.csproj?view=diff&rev=489241&r1=489240&r2=489241
==============================================================================
--- logging/log4net/trunk/src/log4net.csproj (original)
+++ logging/log4net/trunk/src/log4net.csproj Wed Dec 20 17:28:51 2006
@@ -343,6 +343,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "Core\ExceptionEvaluator.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "Core\IAppenderAttachable.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs?view=diff&rev=489241&r1=489240&r2=489241
==============================================================================
--- logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs (original)
+++ logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs Wed Dec 20 17:28:51 
2006
@@ -49,11 +49,10 @@
                        Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 
events flushed on Info message.");
                }
 
-               /*
                [Test]
                public void TestExceptionEvaluator()
                {
-                       m_bufferingForwardingAppender.Evaluator = new 
ExceptionEvaluator(typeof(ApplicationException));
+                       m_bufferingForwardingAppender.Evaluator = new 
ExceptionEvaluator(typeof(ApplicationException), true);
                        m_bufferingForwardingAppender.ActivateOptions();
                        log4net.Config.BasicConfigurator.Configure(m_hierarchy, 
m_bufferingForwardingAppender);
 
@@ -105,7 +104,7 @@
                public void TestInvalidExceptionEvaluator()
                {
                        // warning: String is not a subclass of Exception
-                       m_bufferingForwardingAppender.Evaluator = new 
ExceptionEvaluator(typeof(String));
+                       m_bufferingForwardingAppender.Evaluator = new 
ExceptionEvaluator(typeof(String), false);
                        m_bufferingForwardingAppender.ActivateOptions();
                        log4net.Config.BasicConfigurator.Configure(m_hierarchy, 
m_bufferingForwardingAppender);
 
@@ -118,6 +117,5 @@
                        logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn 
message logged", new ApplicationException());
                        Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 
events buffered");
                }
-               */
        }
 }


Reply via email to