Author: carnold
Date: Wed Aug 22 18:55:46 2007
New Revision: 568802

URL: http://svn.apache.org/viewvc?rev=568802&view=rev
Log:
Bug 37736: HierarchyEventListener.removeAppendEvent never called

Modified:
    logging/log4j/trunk/src/changes/changes.xml
    logging/log4j/trunk/src/main/java/org/apache/log4j/Category.java
    logging/log4j/trunk/tests/src/java/org/apache/log4j/LoggerTestCase.java

Modified: logging/log4j/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/changes/changes.xml?rev=568802&r1=568801&r2=568802&view=diff
==============================================================================
--- logging/log4j/trunk/src/changes/changes.xml (original)
+++ logging/log4j/trunk/src/changes/changes.xml Wed Aug 22 18:55:46 2007
@@ -22,6 +22,7 @@
   <body>
   
     <release version="1.2.15" date="2007-06-27" description="SyslogAppender 
enhancements, NTEventLogAppender and Maven build.">
+        <action action="fix" 
issue="37736">HierarchyEventListener.removeAppendEvent never called.</action>
         <action action="fix" issue="37560">XMLLayout does not escape CDATA 
sections within NDC or throwables.</action>
        <action action="add" issue="33502">Added test to confirm that 
DOMConfigurator.configureAndWatch does configure.</action>
         <action action="fix" issue="32527">Default initialization with XML 
file halts program if JAXP not available.</action>

Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/Category.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/Category.java?rev=568802&r1=568801&r2=568802&view=diff
==============================================================================
--- logging/log4j/trunk/src/main/java/org/apache/log4j/Category.java (original)
+++ logging/log4j/trunk/src/main/java/org/apache/log4j/Category.java Wed Aug 22 
18:55:46 2007
@@ -34,12 +34,14 @@
 import org.apache.log4j.spi.AppenderAttachable;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.LoggerRepository;
+import org.apache.log4j.spi.HierarchyEventListener;
 import org.apache.log4j.helpers.NullEnumeration;
 import org.apache.log4j.helpers.AppenderAttachableImpl;
 
 import java.util.Enumeration;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
+import java.util.Vector;
 
 
 /**
@@ -855,6 +857,22 @@
     }
   }
 
+    /**
+      *  LoggerRepository forgot the fireRemoveAppenderEvent method,
+      *     if using the stock Hierarchy implementation, then call its 
fireRemove.
+      *     Custom repositories can implement HierarchyEventListener if they
+      *     want remove notifications.
+     * @param appender appender, may be null.
+     */
+   private void fireRemoveAppenderEvent(final Appender appender) {
+       if (appender != null) {
+         if (repository instanceof Hierarchy) {
+           ((Hierarchy) repository).fireRemoveAppenderEvent(this, appender);
+         } else if (repository instanceof HierarchyEventListener) {
+             ((HierarchyEventListener) repository).removeAppenderEvent(this, 
appender);
+         }
+       }
+   }
 
   /**
      Remove all previously added appenders from this Category
@@ -866,11 +884,19 @@
   public
   void removeAllAppenders() {
     if(aai != null) {
+      Vector appenders = new Vector();
+      for (Enumeration iter = aai.getAllAppenders(); iter.hasMoreElements();) {
+          appenders.add(iter.nextElement());
+      }
       aai.removeAllAppenders();
+      for(Enumeration iter = appenders.elements(); iter.hasMoreElements();) {
+          fireRemoveAppenderEvent((Appender) iter.nextElement());
+      }
       aai = null;
     }
   }
 
+
   /**
      Remove the appender passed as parameter form the list of appenders.
 
@@ -881,7 +907,11 @@
   void removeAppender(Appender appender) {
     if(appender == null || aai == null)
       return;
+    boolean wasAttached = aai.isAttached(appender);
     aai.removeAppender(appender);
+    if (wasAttached) {
+        fireRemoveAppenderEvent(appender);
+    }
   }
 
   /**
@@ -893,7 +923,11 @@
   public
   void removeAppender(String name) {
     if(name == null || aai == null) return;
+    Appender appender = aai.getAppender(name);
     aai.removeAppender(name);
+    if (appender != null) {
+        fireRemoveAppenderEvent(appender);
+    }
   }
 
   /**

Modified: 
logging/log4j/trunk/tests/src/java/org/apache/log4j/LoggerTestCase.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/tests/src/java/org/apache/log4j/LoggerTestCase.java?rev=568802&r1=568801&r2=568802&view=diff
==============================================================================
--- logging/log4j/trunk/tests/src/java/org/apache/log4j/LoggerTestCase.java 
(original)
+++ logging/log4j/trunk/tests/src/java/org/apache/log4j/LoggerTestCase.java Wed 
Aug 22 18:55:46 2007
@@ -21,6 +21,7 @@
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.RootLogger;
 import org.apache.log4j.spi.LoggerRepository;
+import org.apache.log4j.spi.HierarchyEventListener;
 
 import java.util.Enumeration;
 import java.util.Locale;
@@ -397,6 +398,84 @@
         assertTrue(tracer.isTraceEnabled());
         assertFalse(root.isTraceEnabled());
     }
+
+  private static final class CountingHierarchyEventListener implements 
HierarchyEventListener {
+      private int addEventCount;
+      private int removeEventCount;
+
+      public CountingHierarchyEventListener() {
+          addEventCount = removeEventCount = 0;
+      }
+      public void addAppenderEvent(Category cat, Appender appender) {
+          addEventCount++;
+      }
+
+      public void removeAppenderEvent(Category cat, Appender appender) {
+          removeEventCount++;
+      }
+
+      public int getAddEventCount() {
+          return addEventCount;
+      }
+      public int getRemoveEventCount() {
+          return removeEventCount;
+      }
+  }
+
+
+  public void testAppenderEvent1() {
+      CountingHierarchyEventListener listener = new 
CountingHierarchyEventListener();
+      LogManager.getLoggerRepository().addHierarchyEventListener(listener);
+      CountingAppender appender = new CountingAppender();
+      Logger root =  Logger.getRootLogger();
+      root.addAppender(appender);
+      assertEquals(1, listener.getAddEventCount());
+      assertEquals(0, listener.getRemoveEventCount());
+      root.removeAppender(appender);
+      assertEquals(1, listener.getAddEventCount());
+      assertEquals(1, listener.getRemoveEventCount());
+  }
+
+  public void testAppenderEvent2() {
+        CountingHierarchyEventListener listener = new 
CountingHierarchyEventListener();
+        LogManager.getLoggerRepository().addHierarchyEventListener(listener);
+        CountingAppender appender = new CountingAppender();
+        appender.setName("A1");
+        Logger root =  Logger.getRootLogger();
+        root.addAppender(appender);
+        assertEquals(1, listener.getAddEventCount());
+        assertEquals(0, listener.getRemoveEventCount());
+        root.removeAppender(appender.getName());
+        assertEquals(1, listener.getAddEventCount());
+        assertEquals(1, listener.getRemoveEventCount());
+  }
+
+  public void testAppenderEvent3() {
+          CountingHierarchyEventListener listener = new 
CountingHierarchyEventListener();
+          LogManager.getLoggerRepository().addHierarchyEventListener(listener);
+          CountingAppender appender = new CountingAppender();
+          Logger root =  Logger.getRootLogger();
+          root.addAppender(appender);
+          assertEquals(1, listener.getAddEventCount());
+          assertEquals(0, listener.getRemoveEventCount());
+          root.removeAllAppenders();
+          assertEquals(1, listener.getAddEventCount());
+          assertEquals(1, listener.getRemoveEventCount());
+    }
+
+
+    public void testAppenderEvent4() {
+            CountingHierarchyEventListener listener = new 
CountingHierarchyEventListener();
+            
LogManager.getLoggerRepository().addHierarchyEventListener(listener);
+            CountingAppender appender = new CountingAppender();
+            Logger root =  Logger.getRootLogger();
+            root.addAppender(appender);
+            assertEquals(1, listener.getAddEventCount());
+            assertEquals(0, listener.getRemoveEventCount());
+            LogManager.resetConfiguration();
+            assertEquals(1, listener.getAddEventCount());
+            assertEquals(1, listener.getRemoveEventCount());
+      }
 
   static private class CountingAppender extends AppenderSkeleton {
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to