Author: carnold
Date: Thu Oct  8 05:24:09 2009
New Revision: 823021

URL: http://svn.apache.org/viewvc?rev=823021&view=rev
Log:
Bug 38061: PropertyConfigurator does not support ErrorHandler

Modified:
    logging/log4j/trunk/src/changes/changes.xml
    logging/log4j/trunk/src/main/java/org/apache/log4j/PropertyConfigurator.java
    
logging/log4j/trunk/src/main/java/org/apache/log4j/config/PropertySetter.java
    
logging/log4j/trunk/src/main/java/org/apache/log4j/helpers/OptionConverter.java
    
logging/log4j/trunk/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java

Modified: logging/log4j/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/changes/changes.xml?rev=823021&r1=823020&r2=823021&view=diff
==============================================================================
--- logging/log4j/trunk/src/changes/changes.xml (original)
+++ logging/log4j/trunk/src/changes/changes.xml Thu Oct  8 05:24:09 2009
@@ -81,6 +81,7 @@
        <action action="add" issue="47142">Add SMTPAppender.formatBody to 
simplify extension.</action>
        <action action="fix" issue="46404">Failure when toString() of throwable 
performs logging in SocketAppender, SocketHubAppender and JDBCAppender.</action>
        <action action="fix" issue="47465">Reading configuration files from a 
JAR locks the JAR file</action>
+       <action action="add" issue="38061">PropertyConfigurator does not 
support configuring ErrorHandler.</action>
     </release>
 
   

Modified: 
logging/log4j/trunk/src/main/java/org/apache/log4j/PropertyConfigurator.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/PropertyConfigurator.java?rev=823021&r1=823020&r2=823021&view=diff
==============================================================================
--- 
logging/log4j/trunk/src/main/java/org/apache/log4j/PropertyConfigurator.java 
(original)
+++ 
logging/log4j/trunk/src/main/java/org/apache/log4j/PropertyConfigurator.java 
Thu Oct  8 05:24:09 2009
@@ -32,6 +32,9 @@
 import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.Vector;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
 
 import org.apache.log4j.config.PropertySetter;
 import org.apache.log4j.helpers.FileWatchdog;
@@ -46,6 +49,7 @@
 import org.apache.log4j.spi.RendererSupport;
 import org.apache.log4j.spi.ThrowableRenderer;
 import org.apache.log4j.spi.ThrowableRendererSupport;
+import org.apache.log4j.spi.ErrorHandler;
 
 /**
    Allows the configuration of log4j from an external file.  See
@@ -92,7 +96,8 @@
   /**
      Used internally to keep track of configured appenders.
    */
-  protected Hashtable registry = new Hashtable(11);
+  protected Hashtable registry = new Hashtable(11);  
+  private LoggerRepository repository;
   protected LoggerFactory loggerFactory = new DefaultCategoryFactory();
 
   static final String      CATEGORY_PREFIX = "log4j.category.";
@@ -105,6 +110,10 @@
   static final String      RENDERER_PREFIX = "log4j.renderer.";
   static final String      THRESHOLD_PREFIX = "log4j.threshold";
   private static final String      THROWABLE_RENDERER_PREFIX = 
"log4j.throwableRenderer";
+  private static final String LOGGER_REF       = "logger-ref";
+  private static final String ROOT_REF         = "root-ref";
+  private static final String APPENDER_REF_TAG         = "appender-ref";  
+  
 
   /** Key for specifying the {...@link org.apache.log4j.spi.LoggerFactory
       LoggerFactory}.  Currently set to "<code>log4j.loggerFactory</code>".  */
@@ -180,6 +189,17 @@
     paris. Multiple filters are added to the appender in the lexicographic
     order of IDs.
 
+    The syntax for adding an {...@link ErrorHandler} to an appender is:
+    <pre>
+    
log4j.appender.appenderName.errorhandler=fully.qualified.name.of.filter.class
+    log4j.appender.appenderName.errorhandler.root-ref={true|false}
+    log4j.appender.appenderName.errorhandler.logger-ref=loggerName
+    log4j.appender.appenderName.errorhandler.appender-ref=appenderName
+    log4j.appender.appenderName.errorhandler.option1=value1
+    ...
+    log4j.appender.appenderName.errorhandler.optionN=valueN
+    </pre>
+
     <h3>Configuring loggers</h3>
 
     <p>The syntax for configuring the root logger is:
@@ -452,6 +472,7 @@
   */
   public
   void doConfigure(Properties properties, LoggerRepository hierarchy) {
+       repository = hierarchy;
     String value = properties.getProperty(LogLog.DEBUG_KEY);
     if(value == null) {
       value = properties.getProperty("log4j.configDebug");
@@ -478,7 +499,7 @@
                                                     (Level) Level.ALL));
       LogLog.debug("Hierarchy threshold set to 
["+hierarchy.getThreshold()+"].");
     }
-
+    
     configureRootCategory(properties, hierarchy);
     configureLoggerFactory(properties);
     parseCatsAndRenderers(properties, hierarchy);
@@ -753,6 +774,26 @@
          LogLog.debug("End of parsing for \"" + appenderName +"\".");
        }
       }
+      final String errorHandlerPrefix = prefix + ".errorhandler";
+      String errorHandlerClass = 
OptionConverter.findAndSubst(errorHandlerPrefix, props);
+      if (errorHandlerClass != null) {
+               ErrorHandler eh = (ErrorHandler) 
OptionConverter.instantiateByKey(props,
+                                         errorHandlerPrefix,
+                                         ErrorHandler.class,
+                                         null);
+               if (eh != null) {
+                         appender.setErrorHandler(eh);
+                         LogLog.debug("Parsing errorhandler options for \"" + 
appenderName +"\".");
+                         parseErrorHandler(eh, errorHandlerPrefix, props, 
repository);
+                         Properties edited = new Properties(props);
+                         edited.remove(errorHandlerPrefix + "." + ROOT_REF);
+                         edited.remove(errorHandlerPrefix + "." + LOGGER_REF);
+                         edited.remove(errorHandlerPrefix + "." + 
APPENDER_REF_TAG);
+                     PropertySetter.setProperties(eh, edited, 
errorHandlerPrefix + ".");
+                         LogLog.debug("End of errorhandler parsing for \"" + 
appenderName +"\".");
+               }
+         
+      }
       //configureOptionHandler((OptionHandler) appender, prefix + ".", props);
       PropertySetter.setProperties(appender, props, prefix + ".");
       LogLog.debug("Parsed \"" + appenderName +"\" options.");
@@ -761,7 +802,33 @@
     registryPut(appender);
     return appender;
   }
-
+  
+  private void parseErrorHandler(
+                 final ErrorHandler eh,
+                 final String errorHandlerPrefix,
+                 final Properties props, 
+                 final LoggerRepository hierarchy) {
+               boolean rootRef = OptionConverter.toBoolean(
+                                         
OptionConverter.findAndSubst(errorHandlerPrefix + ROOT_REF, props), false);
+               if (rootRef) {
+                                 eh.setLogger(hierarchy.getRootLogger());
+           }
+               String loggerName = 
OptionConverter.findAndSubst(errorHandlerPrefix + LOGGER_REF , props);
+               if (loggerName != null) {
+                       Logger logger = (loggerFactory == null) ? 
hierarchy.getLogger(loggerName)
+                                       : hierarchy.getLogger(loggerName, 
loggerFactory);
+                       eh.setLogger(logger);
+               }
+               String appenderName = 
OptionConverter.findAndSubst(errorHandlerPrefix + APPENDER_REF_TAG, props);
+               if (appenderName != null) {
+                       Appender backup = parseAppender(props, appenderName);
+                       if (backup != null) {
+                               eh.setBackupAppender(backup);
+                       }
+               }
+  }
+                               
+  
   void parseAppenderFilters(Properties props, String appenderName, Appender 
appender) {
     // extract filters and filter options from props into a hashtable mapping
     // the property name defining the filter class to a list of pre-parsed

Modified: 
logging/log4j/trunk/src/main/java/org/apache/log4j/config/PropertySetter.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/config/PropertySetter.java?rev=823021&r1=823020&r2=823021&view=diff
==============================================================================
--- 
logging/log4j/trunk/src/main/java/org/apache/log4j/config/PropertySetter.java 
(original)
+++ 
logging/log4j/trunk/src/main/java/org/apache/log4j/config/PropertySetter.java 
Thu Oct  8 05:24:09 2009
@@ -25,6 +25,7 @@
 import org.apache.log4j.helpers.LogLog;
 import org.apache.log4j.helpers.OptionConverter;
 import org.apache.log4j.spi.OptionHandler;
+import org.apache.log4j.spi.ErrorHandler;
 
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
@@ -130,7 +131,7 @@
         
        String value = OptionConverter.findAndSubst(key, properties);
         key = key.substring(len);
-        if ("layout".equals(key) && obj instanceof Appender) {
+        if (("layout".equals(key) || "errorhandler".equals(key)) && obj 
instanceof Appender) {
           continue;
         }
         //
@@ -280,6 +281,9 @@
       }
     } else if (Priority.class.isAssignableFrom(type)) {
       return OptionConverter.toLevel(v, (Level) Level.DEBUG);
+    } else if (ErrorHandler.class.isAssignableFrom(type)) {
+      return OptionConverter.instantiateByClassName(v, 
+         ErrorHandler.class, null);
     }
     return null;
   }

Modified: 
logging/log4j/trunk/src/main/java/org/apache/log4j/helpers/OptionConverter.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/helpers/OptionConverter.java?rev=823021&r1=823020&r2=823021&view=diff
==============================================================================
--- 
logging/log4j/trunk/src/main/java/org/apache/log4j/helpers/OptionConverter.java 
(original)
+++ 
logging/log4j/trunk/src/main/java/org/apache/log4j/helpers/OptionConverter.java 
Thu Oct  8 05:24:09 2009
@@ -20,7 +20,6 @@
 import java.util.Properties;
 import java.net.URL;
 import java.io.InterruptedIOException;
-import java.lang.reflect.InvocationTargetException;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.spi.Configurator;

Modified: 
logging/log4j/trunk/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/trunk/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java?rev=823021&r1=823020&r2=823021&view=diff
==============================================================================
--- 
logging/log4j/trunk/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java
 (original)
+++ 
logging/log4j/trunk/tests/src/java/org/apache/log4j/varia/ErrorHandlerTestCase.java
 Thu Oct  8 05:24:09 2009
@@ -29,6 +29,7 @@
 import org.apache.log4j.util.LineNumberFilter;
 import org.apache.log4j.util.ControlFilter;
 import org.apache.log4j.xml.DOMConfigurator;
+import org.apache.log4j.PropertyConfigurator;
 
 public class ErrorHandlerTestCase extends TestCase {
 
@@ -78,6 +79,25 @@
 
     assertTrue(Compare.compare(FILTERED, "witness/fallback1"));
   }
+  
+  public void test2() throws Exception {
+    PropertyConfigurator.configure("input/fallback1.properties");
+    Appender primary = root.getAppender("PRIMARY");
+    ErrorHandler eh = primary.getErrorHandler();
+    assertNotNull(eh);
+
+    common();
+
+    ControlFilter cf = new ControlFilter(new String[]{TEST1_PAT,
+                                              EXCEPTION1, EXCEPTION2, 
EXCEPTION3});
+
+    Transformer.transform(TEMP, FILTERED, new Filter[] {cf,
+                                                       new LineNumberFilter(),
+                            new JunitTestRunnerFilter()});
+
+
+    assertTrue(Compare.compare(FILTERED, "witness/fallback1"));
+  }
 
   void common() {
     int i = -1;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to