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]