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]