There are two situations in which custom Priority classes cannot be specified: (a) in PropertyConfigurator input files (b) in <param> tags passed to filters This patch adds a "toPriority" method to the OptionsConverter class which allows priority strings of format "classname#level". Example (see the PriorityMin and PriorityMax attributes): <appender name="UDPVENUS" class="org.apache.log4j.net.DatagramStringAppender"> <param name="DatagramHost" value="Venus" /> <param name="DatagramPort" value="8300" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p#%d#%c#%m"/> </layout> <filter class="org.apache.log4j.filters.PriorityRangeFilter"> <param name="PriorityMin" value="ch.orange.log.Priority#DEBUG0" /> <param name="PriorityMax" value="ch.orange.log.Priority#WARN" /> </filter> </appender> Any code currently calling Priority p = Priority.toPriority(value) need only be changed to call Priority p = OptionConverter.toPriority(value, null) to allow the extended priority ability. Patch: Index: OptionConverter.java =================================================================== RCS file: /home/cvspublic/jakarta-log4j/org/apache/log4j/helpers/OptionConverter.java, v retrieving revision 1.10 diff -u -r1.10 OptionConverter.java --- OptionConverter.java 2001/01/17 13:02:24 1.10 +++ OptionConverter.java 2001/02/06 13:36:07 @@ -10,6 +10,8 @@ import java.util.Properties; import java.net.URL; + +import org.apache.log4j.Priority; import org.apache.log4j.Category; import org.apache.log4j.Hierarchy; import org.apache.log4j.spi.Configurator; @@ -18,6 +20,7 @@ // Contributors: Avy Sharell ([EMAIL PROTECTED]) // Anders Kristensen +// Simon Kitching /** A convenience class to convert property values to specific types. @@ -181,6 +184,89 @@ } } return dEfault; + } + + /** + Converts a standard or custom priority level to a Priority object. + <p> + If <code>value</code> is of form "classname#priority", then the + specified class' toPriority method is called to process the specified + priority string; if no '#' character is present, then the default + org.log4j.Priority class is used to process the priority value. + <p> + If any error occurs while converting the value to a priority, the + dflt value (which may be null) is returned. + <p> + Case of value is unimportant for the priority level, but is significant + for any class name part present. + */ + public + static + Priority toPriority(String value, Priority dflt) { + if(value == null) + return dflt; + + int hashIndex = value.indexOf('#'); + if (hashIndex == -1) { + // no class name specified : use standard Priority class + return Priority.toPriority(value, dflt); + } + + Priority result = dflt; + + String clazz = value.substring(0, hashIndex); + String priorityName = value.substring(hashIndex+1); + + LogLog.debug( + "toPriority" + + ":class=[" + clazz + "]" + + ":pri=[" + priorityName + "]"); + + try { + Class customPriority = Class.forName(clazz); + + // get a ref to the specified class' static method + // toPriority(String, org.apache.log4j.Priority) + Class[] paramTypes = new Class[] { + String.class, + org.apache.log4j.Priority.class + }; + java.lang.reflect.Method toPriorityMethod = + customPriority.getMethod("toPriority", paramTypes); + + // now call the toPriority method, passing priority string + default + Object[] params = new Object[] {priorityName, dflt}; + Object o = toPriorityMethod.invoke(null, params); + + result = (Priority) o; + } + catch(ClassNotFoundException e) { + LogLog.error("custom priority class [" + clazz + "] could not be loaded"); + } + catch(NoSuchMethodException nsme) { + LogLog.error( + "custom priority class [" + clazz + "]" + + " does not have a constructor which takes one string parameter", nsme); + } + catch(java.lang.reflect.InvocationTargetException ite) { + LogLog.error( + "custom priority class [" + clazz + "]" + + " could not be instantiated", ite); + } + catch(ClassCastException cce) { + LogLog.error( + "class [" + + clazz + + "] is not a subclass of org.apache.log4j.Priority", cce); + } + catch(IllegalAccessException iae) { + LogLog.error( + "class [" + + clazz + + "] cannot be instantiated due to access restrictions", iae); + } + + return result; } /** --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]