From 3d18355fbc28e8d55b97ae05193b4adb27fff250 Mon Sep 17 00:00:00 2001
From: tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 19 Sep 2006 16:23:34 +0000
Subject: [PATCH] 2006-09-19  Mark Wielaard  <mark@klomp.org>

	Fixes bug #29137
	* java/util/logging/LogManager.java (addLogger): Always check for
	existing children of a new Logger.

2006-09-19  Tom Tromey  <tromey@redhat.com>

	* java/util/logging/LogManager.java: Re-merged with Classpath.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117058 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libjava/ChangeLog                         |  10 ++
 libjava/java/util/logging/LogManager.java | 113 +++++++++++++++++-----
 2 files changed, 101 insertions(+), 22 deletions(-)

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 92cbfb7cbad3..27f582db7333 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2006-09-19  Mark Wielaard  <mark@klomp.org>
+
+	Fixes bug #29137
+	* java/util/logging/LogManager.java (addLogger): Always check for
+	existing children of a new Logger.
+
+2006-09-19  Tom Tromey  <tromey@redhat.com>
+
+	* java/util/logging/LogManager.java: Re-merged with Classpath.
+
 2006-09-18  Tom Tromey  <tromey@redhat.com>
 
 	* configure: Rebuilt.
diff --git a/libjava/java/util/logging/LogManager.java b/libjava/java/util/logging/LogManager.java
index 1c420692e1b3..b8b31c43cb6f 100644
--- a/libjava/java/util/logging/LogManager.java
+++ b/libjava/java/util/logging/LogManager.java
@@ -39,6 +39,8 @@ exception statement from your version. */
 
 package java.util.logging;
 
+import gnu.classpath.SystemProperties;
+
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.io.ByteArrayInputStream;
@@ -50,12 +52,11 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.StringTokenizer;
 
-import gnu.classpath.SystemProperties;
-
 /**
  * The <code>LogManager</code> maintains a hierarchical namespace
  * of Logger objects and manages properties for configuring the logging
@@ -107,11 +108,23 @@ import gnu.classpath.SystemProperties;
  */
 public class LogManager
 {
+  /**
+   * The object name for the logging management bean.
+   * @since 1.5
+   */
+  public static final String LOGGING_MXBEAN_NAME
+    = "java.util.logging:type=Logging";
+
   /**
    * The singleton LogManager instance.
    */
   private static LogManager logManager;
 
+  /**
+   * The singleton logging bean.
+   */
+  private static LoggingMXBean loggingBean;
+
   /**
    * The registered named loggers; maps the name of a Logger to
    * a WeakReference to it.
@@ -305,24 +318,21 @@ public class LogManager
      * When adding "foo.bar", the logger "foo.bar.baz" should change
      * its parent to "foo.bar".
      */
-    if (parent != Logger.root)
+    for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
       {
-	for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
-	  {
-	    Logger possChild = (Logger) ((WeakReference) loggers.get(iter.next()))
-              .get();
-	    if ((possChild == null) || (possChild == logger)
-	        || (possChild.getParent() != parent))
-	      continue;
-
-	    if (! possChild.getName().startsWith(name))
-	      continue;
-
-	    if (possChild.getName().charAt(name.length()) != '.')
-	      continue;
-
-	    possChild.setParent(logger);
-	  }
+	Logger possChild = (Logger) ((WeakReference) loggers.get(iter.next()))
+	  .get();
+	if ((possChild == null) || (possChild == logger)
+	    || (possChild.getParent() != parent))
+	  continue;
+	
+	if (! possChild.getName().startsWith(name))
+	  continue;
+	
+	if (possChild.getName().charAt(name.length()) != '.')
+	  continue;
+	
+	possChild.setParent(logger);
       }
 
     return true;
@@ -836,11 +846,11 @@ public class LogManager
       }
     catch (ClassNotFoundException e)
       {
-        warn(property, className, "class not found");
+        warn(property, className, "class not found", e);
       }
     catch (IllegalAccessException e)
       {
-        warn(property, className, "illegal access");
+        warn(property, className, "illegal access", e);
       }
     catch (InstantiationException e)
       {
@@ -848,7 +858,7 @@ public class LogManager
       }
     catch (java.lang.LinkageError e)
       {
-        warn(property, className, "linkage error");
+        warn(property, className, "linkage error", e);
       }
 
     return null;
@@ -909,4 +919,63 @@ public class LogManager
       }
   }
 
+  /**
+   * Return the logging bean.  There is a single logging bean per
+   * VM instance.
+   * @since 1.5
+   */
+  public static synchronized LoggingMXBean getLoggingMXBean()
+  {
+    if (loggingBean == null)
+      {
+        loggingBean = new LoggingMXBean()
+        {
+          public String getLoggerLevel(String logger)
+          {
+            LogManager mgr = getLogManager();
+            Logger l = mgr.getLogger(logger);
+            if (l == null)
+              return null;
+            Level lev = l.getLevel();
+            if (lev == null)
+              return "";
+            return lev.getName();
+          }
+
+          public List getLoggerNames()
+          {
+            LogManager mgr = getLogManager();
+            // This is inefficient, but perhaps better for maintenance.
+            return Collections.list(mgr.getLoggerNames());
+          }
+
+          public String getParentLoggerName(String logger)
+          {
+            LogManager mgr = getLogManager();
+            Logger l = mgr.getLogger(logger);
+            if (l == null)
+              return null;
+            l = l.getParent();
+            if (l == null)
+              return "";
+            return l.getName();
+          }
+
+          public void setLoggerLevel(String logger, String level)
+          {
+            LogManager mgr = getLogManager();
+            Logger l = mgr.getLogger(logger);
+            if (l == null)
+              throw new IllegalArgumentException("no logger named " + logger);
+            Level newLevel;
+            if (level == null)
+              newLevel = null;
+            else
+              newLevel = Level.parse(level);
+            l.setLevel(newLevel);
+          }
+        };
+      }
+    return loggingBean;
+  }
 }
-- 
GitLab