src/share/classes/java/util/logging/Logger.java

Print this page

        

*** 216,231 **** * @since 1.4 */ public class Logger { private static final Handler emptyHandlers[] = new Handler[0]; private static final int offValue = Level.OFF.intValue(); ! private LogManager manager; private String name; private final CopyOnWriteArrayList<Handler> handlers = new CopyOnWriteArrayList<>(); ! private String resourceBundleName; // Base name of the bundle. ! private ResourceBundle userBundle; // Bundle set through setResourceBundle. private volatile boolean useParentHandlers = true; private volatile Filter filter; private boolean anonymous; // Cache to speed up behavior of findResourceBundle: --- 216,265 ---- * @since 1.4 */ public class Logger { private static final Handler emptyHandlers[] = new Handler[0]; private static final int offValue = Level.OFF.intValue(); ! ! static final String SYSTEM_LOGGER_RB_NAME = "sun.util.logging.resources.logging"; ! ! // This class is immutable and it is important that it remains so. ! private static final class LoggerBundle { ! final String resourceBundleName; // Base name of the bundle. ! final ResourceBundle userBundle; // Bundle set through setResourceBundle. ! private LoggerBundle(String resourceBundleName, ResourceBundle bundle) { ! this.resourceBundleName = resourceBundleName; ! this.userBundle = bundle; ! } ! boolean isSystemBundle() { ! return SYSTEM_LOGGER_RB_NAME.equals(resourceBundleName); ! } ! static LoggerBundle get(String name, ResourceBundle bundle) { ! if (name == null && bundle == null) { ! return NO_RESOURCE_BUNDLE; ! } else if (SYSTEM_LOGGER_RB_NAME.equals(name) && bundle == null) { ! return SYSTEM_BUNDLE; ! } else { ! return new LoggerBundle(name, bundle); ! } ! } ! } ! ! // This instance will be shared by all loggers created by the system ! // code ! private static final LoggerBundle SYSTEM_BUNDLE = ! new LoggerBundle(SYSTEM_LOGGER_RB_NAME, null); ! ! // This instance indicates that no resource bundle has been specified yet, ! // and it will be shared by all loggers which have no resource bundle. ! private static final LoggerBundle NO_RESOURCE_BUNDLE = ! new LoggerBundle(null, null); ! ! private volatile LogManager manager; private String name; private final CopyOnWriteArrayList<Handler> handlers = new CopyOnWriteArrayList<>(); ! private volatile LoggerBundle loggerBundle = NO_RESOURCE_BUNDLE; private volatile boolean useParentHandlers = true; private volatile Filter filter; private boolean anonymous; // Cache to speed up behavior of findResourceBundle:
*** 339,348 **** --- 373,383 ---- this(name, resourceBundleName, null, LogManager.getLogManager()); } Logger(String name, String resourceBundleName, Class<?> caller, LogManager manager) { this.manager = manager; + assert this.loggerBundle == NO_RESOURCE_BUNDLE; setupResourceInfo(resourceBundleName, caller); this.name = name; levelValue = Level.INFO.intValue(); }
*** 364,373 **** --- 399,409 ---- // This constructor is used only to create the global Logger. // It is needed to break a cyclic dependence between the LogManager // and Logger static initializers causing deadlocks. private Logger(String name) { // The manager field is not initialized here. + assert this.loggerBundle == NO_RESOURCE_BUNDLE; this.name = name; levelValue = Level.INFO.intValue(); } // It is called from LoggerContext.addLocalLogger() when the logger
*** 639,649 **** * bundle or resource bundle name inherited from its parent. * * @return localization bundle name (may be {@code null}) */ public String getResourceBundleName() { ! return resourceBundleName; } /** * Set a filter to control output on this Logger. * <P> --- 675,685 ---- * bundle or resource bundle name inherited from its parent. * * @return localization bundle name (may be {@code null}) */ public String getResourceBundleName() { ! return loggerBundle.resourceBundleName; } /** * Set a filter to control output on this Logger. * <P>
*** 708,719 **** // private support method for logging. // We fill in the logger name, resource bundle name, and // resource bundle and then call "void log(LogRecord)". private void doLog(LogRecord lr) { lr.setLoggerName(name); ! final ResourceBundle bundle = getEffectiveResourceBundle(); ! final String ebname = getEffectiveResourceBundleName(); if (ebname != null && bundle != null) { lr.setResourceBundleName(ebname); lr.setResourceBundle(bundle); } log(lr); --- 744,756 ---- // private support method for logging. // We fill in the logger name, resource bundle name, and // resource bundle and then call "void log(LogRecord)". private void doLog(LogRecord lr) { lr.setLoggerName(name); ! final LoggerBundle lb = getEffectiveLoggerBundle(); ! final ResourceBundle bundle = lb.userBundle; ! final String ebname = lb.resourceBundleName; if (ebname != null && bundle != null) { lr.setResourceBundleName(ebname); lr.setResourceBundle(bundle); } log(lr);
*** 1755,1766 **** */ public boolean getUseParentHandlers() { return useParentHandlers; } - static final String SYSTEM_LOGGER_RB_NAME = "sun.util.logging.resources.logging"; - private static ResourceBundle findSystemResourceBundle(final Locale locale) { // the resource bundle is in a restricted package return AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() { @Override public ResourceBundle run() { --- 1792,1801 ----
*** 1799,1813 **** if (name == null) { return null; } Locale currentLocale = Locale.getDefault(); // Normally we should hit on our simple one entry cache. ! if (userBundle != null && ! name.equals(resourceBundleName)) { ! return userBundle; } else if (catalog != null && currentLocale.equals(catalogLocale) && name.equals(catalogName)) { return catalog; } --- 1834,1849 ---- if (name == null) { return null; } Locale currentLocale = Locale.getDefault(); + final LoggerBundle lb = loggerBundle; // Normally we should hit on our simple one entry cache. ! if (lb.userBundle != null && ! name.equals(lb.resourceBundleName)) { ! return lb.userBundle; } else if (catalog != null && currentLocale.equals(catalogLocale) && name.equals(catalogName)) { return catalog; }
*** 1862,1882 **** // that a suitable ResourceBundle exists before setting the // resourceBundleName field. // Synchronized to prevent races in setting the fields. private synchronized void setupResourceInfo(String name, Class<?> callersClass) { ! if (resourceBundleName != null) { // this Logger already has a ResourceBundle ! if (resourceBundleName.equals(name)) { // the names match so there is nothing more to do return; } // cannot change ResourceBundles once they are set throw new IllegalArgumentException( ! resourceBundleName + " != " + name); } if (name == null) { return; } --- 1898,1919 ---- // that a suitable ResourceBundle exists before setting the // resourceBundleName field. // Synchronized to prevent races in setting the fields. private synchronized void setupResourceInfo(String name, Class<?> callersClass) { ! final LoggerBundle lb = loggerBundle; ! if (lb.resourceBundleName != null) { // this Logger already has a ResourceBundle ! if (lb.resourceBundleName.equals(name)) { // the names match so there is nothing more to do return; } // cannot change ResourceBundles once they are set throw new IllegalArgumentException( ! lb.resourceBundleName + " != " + name); } if (name == null) { return; }
*** 1888,1898 **** // the bundle using it this.callersClassLoaderRef = null; throw new MissingResourceException("Can't find " + name + " bundle", name, ""); } ! resourceBundleName = name; } /** * Sets a resource bundle on this logger. * All messages will be logged using the given resource bundle for its --- 1925,1935 ---- // the bundle using it this.callersClassLoaderRef = null; throw new MissingResourceException("Can't find " + name + " bundle", name, ""); } ! loggerBundle = LoggerBundle.get(name, lb.userBundle); } /** * Sets a resource bundle on this logger. * All messages will be logged using the given resource bundle for its
*** 1918,1937 **** if (baseName == null || baseName.isEmpty()) { throw new IllegalArgumentException("resource bundle must have a name"); } synchronized (this) { ! final boolean canReplaceResourceBundle = resourceBundleName == null ! || resourceBundleName.equals(baseName); if (!canReplaceResourceBundle) { throw new IllegalArgumentException("can't replace resource bundle"); } ! userBundle = bundle; ! resourceBundleName = baseName; } } /** * Return the parent for this Logger. --- 1955,1974 ---- if (baseName == null || baseName.isEmpty()) { throw new IllegalArgumentException("resource bundle must have a name"); } synchronized (this) { ! LoggerBundle lb = loggerBundle; ! final boolean canReplaceResourceBundle = lb.resourceBundleName == null ! || lb.resourceBundleName.equals(baseName); if (!canReplaceResourceBundle) { throw new IllegalArgumentException("can't replace resource bundle"); } ! loggerBundle = LoggerBundle.get(baseName, bundle); } } /** * Return the parent for this Logger.
*** 2080,2126 **** } } // Private method to get the potentially inherited ! // resource bundle name for this Logger. ! // May return null ! private String getEffectiveResourceBundleName() { ! Logger target = this; ! while (target != null) { ! String rbn = target.getResourceBundleName(); ! if (rbn != null) { ! return rbn; ! } ! target = target.getParent(); ! } ! return null; } - - - private ResourceBundle getEffectiveResourceBundle() { - Logger target = this; - if (SYSTEM_LOGGER_RB_NAME.equals(resourceBundleName)) return null; - ResourceBundle localRB = getResourceBundle(); - if (localRB != null) { - return localRB; } while (target != null) { ! final ResourceBundle rb = target.userBundle; ! if (rb != null) { ! return rb; ! } ! final String rbn = target.getResourceBundleName(); ! if (rbn != null) { ! if (!SYSTEM_LOGGER_RB_NAME.equals(rbn)) { ! return findResourceBundle(rbn, true); } else { ! return null; } } target = target.getParent(); } ! return null; } } --- 2117,2171 ---- } } // Private method to get the potentially inherited ! // resource bundle and resource bundle name for this Logger. ! // This method never returns null. ! private LoggerBundle getEffectiveLoggerBundle() { ! final LoggerBundle lb = loggerBundle; ! if (lb.isSystemBundle()) { ! return SYSTEM_BUNDLE; ! } ! ! // first take care of this logger ! final ResourceBundle b = getResourceBundle(); ! if (b != null && b == lb.userBundle) { ! return lb; ! } else if (b != null) { ! // either lb.userBundle is null or getResourceBundle() is ! // overriden ! final String rbName = getResourceBundleName(); ! if (!SYSTEM_LOGGER_RB_NAME.equals(rbName) ! && !SYSTEM_LOGGER_RB_NAME.equals(b.getBaseBundleName())) { ! return LoggerBundle.get(rbName, b); ! } else { ! return SYSTEM_BUNDLE; } } + // no resource bundle was specified on this logger, look up the + // parent stack. + Logger target = this.parent; while (target != null) { ! final LoggerBundle trb = target.loggerBundle; ! if (trb.isSystemBundle()) { ! return SYSTEM_BUNDLE; ! } ! if (trb.userBundle != null) { ! return trb; ! } ! final String rbName = target.getResourceBundleName(); ! if (rbName != null) { ! if (!SYSTEM_LOGGER_RB_NAME.equals(rbName)) { ! return LoggerBundle.get(rbName, ! findResourceBundle(rbName, true)); } else { ! return SYSTEM_BUNDLE; } } target = target.getParent(); } ! return NO_RESOURCE_BUNDLE; } }