jdk/src/share/classes/java/util/logging/LogManager.java
changeset 16111 5c5fc1d5bb38
parent 16105 fe7392acb767
child 16112 fc9eb3e70734
equal deleted inserted replaced
16110:2ce1c415475b 16111:5c5fc1d5bb38
   453         }
   453         }
   454         return result;
   454         return result;
   455     }
   455     }
   456 
   456 
   457     Logger demandSystemLogger(String name, String resourceBundleName) {
   457     Logger demandSystemLogger(String name, String resourceBundleName) {
   458         return systemContext.demandLogger(name, resourceBundleName);
   458         // Add a system logger in the system context's namespace
       
   459         final Logger sysLogger = systemContext.demandLogger(name, resourceBundleName);
       
   460 
       
   461         // Add the system logger to the LogManager's namespace if not exist
       
   462         // so that there is only one single logger of the given name.
       
   463         // System loggers are visible to applications unless a logger of
       
   464         // the same name has been added.
       
   465         Logger logger;
       
   466         do {
       
   467             // First attempt to call addLogger instead of getLogger
       
   468             // This would avoid potential bug in custom LogManager.getLogger
       
   469             // implementation that adds a logger if does not exist
       
   470             if (addLogger(sysLogger)) {
       
   471                 // successfully added the new system logger
       
   472                 logger = sysLogger;
       
   473             } else {
       
   474                 logger = getLogger(name);
       
   475             }
       
   476         } while (logger == null);
       
   477 
       
   478         // LogManager will set the sysLogger's handlers via LogManager.addLogger method.
       
   479         if (logger != sysLogger && sysLogger.getHandlers().length == 0) {
       
   480             // if logger already exists but handlers not set
       
   481             final Logger l = logger;
       
   482             AccessController.doPrivileged(new PrivilegedAction<Void>() {
       
   483                 public Void run() {
       
   484                     for (Handler hdl : l.getHandlers()) {
       
   485                         sysLogger.addHandler(hdl);
       
   486                     }
       
   487                     return null;
       
   488                 }
       
   489             });
       
   490         }
       
   491         return sysLogger;
   459     }
   492     }
   460 
   493 
   461     // LoggerContext maintains the logger namespace per context.
   494     // LoggerContext maintains the logger namespace per context.
   462     // The default LogManager implementation has one system context and user
   495     // The default LogManager implementation has one system context and user
   463     // context.  The system context is used to maintain the namespace for
   496     // context.  The system context is used to maintain the namespace for
   660                         // before we can refetch it. If it has been GC'ed then
   693                         // before we can refetch it. If it has been GC'ed then
   661                         // we'll just loop around and try again.
   694                         // we'll just loop around and try again.
   662                         result = findLogger(name);
   695                         result = findLogger(name);
   663                     }
   696                     }
   664                 } while (result == null);
   697                 } while (result == null);
   665             }
       
   666             // Add the system logger to the LogManager's namespace if not exists
       
   667             // The LogManager will set its handlers via the LogManager.addLogger method.
       
   668             if (!manager.addLogger(result) && result.getHandlers().length == 0) {
       
   669                 // if logger already exists but handlers not set
       
   670                 final Logger l = manager.getLogger(name);
       
   671                 final Logger logger = result;
       
   672                 AccessController.doPrivileged(new PrivilegedAction<Void>() {
       
   673                     public Void run() {
       
   674                         for (Handler hdl : l.getHandlers()) {
       
   675                             logger.addHandler(hdl);
       
   676                         }
       
   677                         return null;
       
   678                     }
       
   679                 });
       
   680             }
   698             }
   681             return result;
   699             return result;
   682         }
   700         }
   683     }
   701     }
   684 
   702