jdk/src/share/classes/java/util/logging/Logger.java
changeset 16105 fe7392acb767
parent 16100 379f48d34516
child 16483 443a7e5f9b91
equal deleted inserted replaced
16104:234ab73a1830 16105:fe7392acb767
    29 import java.util.*;
    29 import java.util.*;
    30 import java.util.concurrent.CopyOnWriteArrayList;
    30 import java.util.concurrent.CopyOnWriteArrayList;
    31 import java.security.*;
    31 import java.security.*;
    32 import java.lang.ref.WeakReference;
    32 import java.lang.ref.WeakReference;
    33 import java.util.function.Supplier;
    33 import java.util.function.Supplier;
    34 import java.util.logging.LogManager.LoggerContext;
       
    35 
    34 
    36 /**
    35 /**
    37  * A Logger object is used to log messages for a specific
    36  * A Logger object is used to log messages for a specific
    38  * system or application component.  Loggers are normally named,
    37  * system or application component.  Loggers are normally named,
    39  * using a hierarchical dot-separated namespace.  Logger names
    38  * using a hierarchical dot-separated namespace.  Logger names
   319     // (see 7054233), we need to determine if Logger.getLogger is to add
   318     // (see 7054233), we need to determine if Logger.getLogger is to add
   320     // a system logger or user logger.
   319     // a system logger or user logger.
   321     //
   320     //
   322     // As an interim solution, if the immediate caller whose caller loader is
   321     // As an interim solution, if the immediate caller whose caller loader is
   323     // null, we assume it's a system logger and add it to the system context.
   322     // null, we assume it's a system logger and add it to the system context.
   324     private static LoggerContext getLoggerContext() {
   323     // These system loggers only set the resource bundle to the given
       
   324     // resource bundle name (rather than the default system resource bundle).
       
   325     private static class SystemLoggerHelper {
       
   326         static boolean disableCallerCheck = getBooleanProperty("sun.util.logging.disableCallerCheck");
       
   327         private static boolean getBooleanProperty(final String key) {
       
   328             String s = AccessController.doPrivileged(new PrivilegedAction<String>() {
       
   329                 public String run() {
       
   330                     return System.getProperty(key);
       
   331                 }
       
   332             });
       
   333             return Boolean.valueOf(s);
       
   334         }
       
   335     }
       
   336 
       
   337     private static Logger demandLogger(String name, String resourceBundleName) {
   325         LogManager manager = LogManager.getLogManager();
   338         LogManager manager = LogManager.getLogManager();
   326         SecurityManager sm = System.getSecurityManager();
   339         SecurityManager sm = System.getSecurityManager();
   327         if (sm != null) {
   340         if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
   328             // 0: Reflection 1: Logger.getLoggerContext 2: Logger.getLogger 3: caller
   341             // 0: Reflection 1: Logger.demandLogger 2: Logger.getLogger 3: caller
   329             final int SKIP_FRAMES = 3;
   342             final int SKIP_FRAMES = 3;
   330             Class<?> caller = sun.reflect.Reflection.getCallerClass(SKIP_FRAMES);
   343             Class<?> caller = sun.reflect.Reflection.getCallerClass(SKIP_FRAMES);
   331             if (caller.getClassLoader() == null) {
   344             if (caller.getClassLoader() == null) {
   332                 return manager.getSystemContext();
   345                 return manager.demandSystemLogger(name, resourceBundleName);
   333             }
   346             }
   334         }
   347         }
   335         return manager.getUserContext();
   348         return manager.demandLogger(name, resourceBundleName);
   336     }
   349     }
   337 
   350 
   338     /**
   351     /**
   339      * Find or create a logger for a named subsystem.  If a logger has
   352      * Find or create a logger for a named subsystem.  If a logger has
   340      * already been created with the given name it is returned.  Otherwise
   353      * already been created with the given name it is returned.  Otherwise
   374         //     getLogger("Foo");
   387         //     getLogger("Foo");
   375         //
   388         //
   376         // would throw an IllegalArgumentException in the second call
   389         // would throw an IllegalArgumentException in the second call
   377         // because the wrapper would result in an attempt to replace
   390         // because the wrapper would result in an attempt to replace
   378         // the existing "resourceBundleForFoo" with null.
   391         // the existing "resourceBundleForFoo" with null.
   379         LoggerContext context = getLoggerContext();
   392         return demandLogger(name, null);
   380         return context.demandLogger(name);
       
   381     }
   393     }
   382 
   394 
   383     /**
   395     /**
   384      * Find or create a logger for a named subsystem.  If a logger has
   396      * Find or create a logger for a named subsystem.  If a logger has
   385      * already been created with the given name it is returned.  Otherwise
   397      * already been created with the given name it is returned.  Otherwise
   422      */
   434      */
   423 
   435 
   424     // Synchronization is not required here. All synchronization for
   436     // Synchronization is not required here. All synchronization for
   425     // adding a new Logger object is handled by LogManager.addLogger().
   437     // adding a new Logger object is handled by LogManager.addLogger().
   426     public static Logger getLogger(String name, String resourceBundleName) {
   438     public static Logger getLogger(String name, String resourceBundleName) {
   427         LoggerContext context = getLoggerContext();
   439         Logger result = demandLogger(name, resourceBundleName);
   428         Logger result = context.demandLogger(name, resourceBundleName);
       
   429 
   440 
   430         // MissingResourceException or IllegalArgumentException can be
   441         // MissingResourceException or IllegalArgumentException can be
   431         // thrown by setupResourceInfo().
   442         // thrown by setupResourceInfo().
   432         result.setupResourceInfo(resourceBundleName);
   443         result.setupResourceInfo(resourceBundleName);
   433         return result;
   444         return result;
   436     // package-private
   447     // package-private
   437     // Add a platform logger to the system context.
   448     // Add a platform logger to the system context.
   438     // i.e. caller of sun.util.logging.PlatformLogger.getLogger
   449     // i.e. caller of sun.util.logging.PlatformLogger.getLogger
   439     static Logger getPlatformLogger(String name) {
   450     static Logger getPlatformLogger(String name) {
   440         LogManager manager = LogManager.getLogManager();
   451         LogManager manager = LogManager.getLogManager();
   441         LoggerContext context = manager.getSystemContext();
       
   442 
   452 
   443         // all loggers in the system context will default to
   453         // all loggers in the system context will default to
   444         // the system logger's resource bundle
   454         // the system logger's resource bundle
   445         Logger result = context.demandLogger(name);
   455         Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME);
   446         return result;
   456         return result;
   447     }
   457     }
   448 
   458 
   449     /**
   459     /**
   450      * Create an anonymous Logger.  The newly created Logger is not
   460      * Create an anonymous Logger.  The newly created Logger is not
  1586         // the resource bundle is in a restricted package
  1596         // the resource bundle is in a restricted package
  1587         return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
  1597         return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() {
  1588             public ResourceBundle run() {
  1598             public ResourceBundle run() {
  1589                 try {
  1599                 try {
  1590                     return ResourceBundle.getBundle(SYSTEM_LOGGER_RB_NAME,
  1600                     return ResourceBundle.getBundle(SYSTEM_LOGGER_RB_NAME,
  1591                                                     locale);
  1601                                                     locale,
       
  1602                                                     ClassLoader.getSystemClassLoader());
  1592                 } catch (MissingResourceException e) {
  1603                 } catch (MissingResourceException e) {
  1593                     throw new InternalError(e.toString());
  1604                     throw new InternalError(e.toString());
  1594                 }
  1605                 }
  1595             }
  1606             }
  1596         });
  1607         });