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]