mwomack 2003/06/10 22:57:14 Modified: src/java/org/apache/log4j/helpers LoggerTraverse.java Log: Jalopy-ized, checkstyle'd version. Revision Changes Path 1.2 +119 -85 jakarta-log4j-sandbox/src/java/org/apache/log4j/helpers/LoggerTraverse.java Index: LoggerTraverse.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/helpers/LoggerTraverse.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LoggerTraverse.java 11 Jun 2003 05:39:16 -0000 1.1 +++ LoggerTraverse.java 11 Jun 2003 05:57:14 -0000 1.2 @@ -49,140 +49,151 @@ package org.apache.log4j.helpers; -import java.util.Map; -import java.util.TreeMap; -import java.util.List; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.LoggerRepository; + import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; -import org.apache.log4j.Logger; -import org.apache.log4j.LogManager; -import org.apache.log4j.Level; -import org.apache.log4j.spi.LoggerRepository; /** - This helper class can be used to extract/traverse logger information - for a given LoggerRepository. It is a work in progress and focus to + This helper class can be used to extract/traverse logger information + for a given LoggerRepository. It is a work in progress and focus to date has been functionality, not performance or efficiency. - + The set of loggers can be retrieved in one of two ways: - + 1) getLoggerNames() - A complete list of the loggers 2) getLoggerPackageNames() - A list of package names, starting at a given package name pattern. - + If the second retrieval method is used, the caller can iteratively call the LoggerTraverse to retrieve sub-packages and children. - + This class is dependent on logger names that match Java fully qualified class names. - + It also provides methods for querying the current level of a given - logger and - + logger and + NOTE: This class does not cause any side effects in the LoggerRepository. It does not inadvertantly create new Loggers in the process of parsing the package names or accessing information. - + NOTE: This class does not automatically keep track of changes in the given LoggerRepository. The caller must call the update() method to get the current set of loggers. - + @author Mark Womack <[EMAIL PROTECTED]> */ public class LoggerTraverse { + /** A map of all the loggers in the LoggerRepository. */ private Map loggerMap = new TreeMap(); - private Logger rootLogger; + /** A reference to the root logger of the LoggerRepository. */ + private Logger rootLogger; + + /** + Empty constructor. */ public LoggerTraverse() { } - + + /** + @param repository The LoggerRepository to traverse. */ public LoggerTraverse(LoggerRepository repository) { update(repository); } - + /** Updates the LoggerTraverse to the current information in the given LoggerRepository. - - @param respository LoggerRepository to use for Logger information. */ + + @param repository LoggerRepository to use for Logger information. */ public void update(LoggerRepository repository) { // clear any old information loggerMap.clear(); - + // set the root logger rootLogger = repository.getRootLogger(); - + // enumerate through the current set of loggers // the key is the logger name, the value is the logger Enumeration loggerEnum = repository.getCurrentLoggers(); + while (loggerEnum.hasMoreElements()) { - Logger logger = (Logger)loggerEnum.nextElement(); + Logger logger = (Logger) loggerEnum.nextElement(); loggerMap.put(logger.getName(), logger); } } - + /** - Returns the list of all loggers, sorted by name. - + Returns the list of all loggers, sorted by name. + @return List List of the current loggers. */ public List getLoggerNames() { List loggerList = new ArrayList(loggerMap.size()); Iterator loggerIter = loggerMap.keySet().iterator(); + while (loggerIter.hasNext()) { - loggerList.add((String)loggerIter.next()); + loggerList.add((String) loggerIter.next()); } + return loggerList; } - + /** Using a starting name pattern, returns the next level of package names that start with that pattern. Returns a list, as there can be more than one return value. Passing in an empty string for the starting pattern will return a list of the top level package names. - + For example, if the following logger names were defined: org.apache.log4j and org.apache.log4j-extensions, then passing in an empty string would return one item in the list with a value of "org". If the pattern "org.apache" were passed in, then the list would contain two items, "log4j" and "log4j-extensions". - - @param startPattern The name pattern to match for Logger name. + + @param startPattern The name pattern to match for Logger name. @return List List of matching Logger names that start with the pattern. */ public List getLoggerPackageNames(String startPattern) { String name = ""; List packageList = new ArrayList(1); - + // iterate through the loggerMap, checking the name of each logger // against the starting pattern. If name starts with pattern, then // add the next part of the package name to the return list. Iterator loggerIter = loggerMap.keySet().iterator(); + while (loggerIter.hasNext()) { - String loggerName = (String)loggerIter.next(); - + String loggerName = (String) loggerIter.next(); + // does the logger name start with the startPattern if (loggerName.startsWith(startPattern)) { loggerName = loggerName.substring(startPattern.length()); - + // is there part of the name left after the start pattern is removed? if (loggerName.length() > 0) { - // if the left over string starts with '.'. remove it if (loggerName.startsWith(".")) { loggerName = loggerName.substring(1); - } - else if (startPattern.length() > 0) { + } else if (startPattern.length() > 0) { break; } - + // find the next index of '.' and grab the part of the name before it int index = loggerName.indexOf('.'); + if (index != -1) { //System.out.println("found . at " + index); loggerName = loggerName.substring(0, index); } - + // if this is not a name we have previously encountered, // put it in the return list. if (!loggerName.equals(name)) { @@ -192,137 +203,160 @@ } } } - + return packageList; } - + /** Returns true if the given package name appears to have sub-package. - + @param startPattern The name pattern to match for Logger name. @return boolean True if there are existing loggers that match. */ public boolean loggerHasSubPackages(String startPattern) { int len = startPattern.length(); - + // iterate through logger names and first one that starts with // pattern and the length is greater, return true. Iterator loggerIter = loggerMap.keySet().iterator(); + while (loggerIter.hasNext()) { - String loggerName = (String)loggerIter.next(); - if (loggerName.startsWith(startPattern) && loggerName.length() > len) { + String loggerName = (String) loggerIter.next(); + + if (loggerName.startsWith(startPattern) && (loggerName.length() > len)) { return true; } } - + return false; } /** - Returns the level for the root logger. - + Returns the level for the root logger. + @return Level The current Level for the root logger. */ public Level getLevelForRootLogger() { return rootLogger.getEffectiveLevel(); } - + /** Returns the effective level for the given package name. If no level is set for the given package, then search back through the package names - until one is found that is set or return the level of the root logger. - + until one is found that is set or return the level of the root logger. + @param packageName The name of the logger to return the level for. @return Level The level of the logger. */ public Level getLevelForPackage(String packageName) { String name = packageName; - Logger logger = (Logger)loggerMap.get(packageName); - while (logger == null && name != null) { + Logger logger = (Logger) loggerMap.get(packageName); + + while ((logger == null) && (name != null)) { int index = name.lastIndexOf('.'); + if (index != -1) { - name = name.substring(0, index-1); - logger = (Logger)loggerMap.get(packageName); + name = name.substring(0, index - 1); + logger = (Logger) loggerMap.get(packageName); } else { name = null; } } - + if (logger != null) { return logger.getEffectiveLevel(); - } - else { + } else { return rootLogger.getEffectiveLevel(); } } /** Returns true of the package has had its level set directly or - false if the level is inherited. - + false if the level is inherited. + @param packageName The name of the logger to return the level for. @return boolean True if the level has been explicitly configured. */ public boolean getLevelIsSetForPackage(String packageName) { String name = packageName; - Logger logger = (Logger)loggerMap.get(packageName); - while (logger == null && name != null) { + Logger logger = (Logger) loggerMap.get(packageName); + + while ((logger == null) && (name != null)) { int index = name.lastIndexOf('.'); + if (index != -1) { - name = name.substring(0, index-1); - logger = (Logger)loggerMap.get(packageName); + name = name.substring(0, index - 1); + logger = (Logger) loggerMap.get(packageName); } else { name = null; } } - + if (logger != null) { - if (logger == rootLogger) + if (logger == rootLogger) { return true; - else + } else { return (logger.getLevel() != null); + } } else { return false; } } - - // here is an example of using the hierarchical version, iterating - // through all the package names, all the loggers. - public static void main(String[] args) { + + /** + here is an example of using the hierarchical version, iterating + through all the package names, all the loggers. + @param args Parameters for main execution. */ + public static void main(String[] args) { // set the root to level warn Logger.getRootLogger().setLevel(Level.ERROR); - + // create some loggers Logger.getLogger("org.womacknet.wgntool.Researcher"); Logger.getLogger("org.womacknet.wgntool.ResearcherList"); Logger.getLogger("org.womacknet.wgntool").setLevel(Level.WARN); Logger.getLogger("org.womacknet.util.NameUtil"); Logger.getLogger("com.widgets_r_us.util.StringUtil").setLevel(Level.DEBUG); - + LoggerTraverse info = new LoggerTraverse(LogManager.getLoggerRepository()); - System.out.println("NOTE: '*' indicates the level has not been explicitly configured for that logger"); + System.out.println("NOTE: '*' indicates the level has not been " + + "explicitly configured for that logger"); System.out.println("root - " + info.getLevelForRootLogger()); iteratePackages("", 1, info); } - - // starting with a package name, iterate through all subpackages and loggers. - static void iteratePackages(String startPackageName, int level, LoggerTraverse info) { + + /** + Starting with a package name, iterate through all subpackages and loggers. + + @param startPackageName The logger name to start iterating from. + @param level The indentation value for display of logger names. + @param info The TraverseInfo instance to iterate. */ + static void iteratePackages( + String startPackageName, int level, LoggerTraverse info) { List packageInfo = info.getLoggerPackageNames(startPackageName); Iterator iter = packageInfo.iterator(); + while (iter.hasNext()) { - String packageName = (String)iter.next(); + String packageName = (String) iter.next(); + for (int x = 0; x < level; x++) { System.out.print(" "); } + System.out.print(packageName); + String subpackageName; + if (startPackageName.length() > 0) { subpackageName = startPackageName + "." + packageName; } else { subpackageName = packageName; } + System.out.print(" - " + info.getLevelForPackage(subpackageName)); - System.out.println((info.getLevelIsSetForPackage(subpackageName) ? "" : "*")); + System.out.println( + (info.getLevelIsSetForPackage(subpackageName) ? "" : "*")); + if (info.loggerHasSubPackages(subpackageName)) { - iteratePackages(subpackageName, level+1, info); + iteratePackages(subpackageName, level + 1, info); } } } -} \ No newline at end of file +}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]