< prev index next >
src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java
Print this page
*** 31,40 ****
--- 31,43 ----
import java.util.Map;
import java.util.function.Function;
import java.lang.System.LoggerFinder;
import java.lang.System.Logger;
import java.lang.ref.ReferenceQueue;
+ import java.lang.reflect.Module;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.ResourceBundle;
/**
* Internal Service Provider Interface (SPI) that makes it possible to use
*** 127,171 ****
values.remove(ref);
}
return w;
}
-
final static SharedLoggers system = new SharedLoggers();
final static SharedLoggers application = new SharedLoggers();
}
@Override
! public final Logger getLogger(String name, /* Module */ Class<?> caller) {
checkPermission();
! return demandLoggerFor(name, caller);
}
@Override
public final Logger getLocalizedLogger(String name, ResourceBundle bundle,
! /* Module */ Class<?> caller) {
! return super.getLocalizedLogger(name, bundle, caller);
}
-
-
/**
! * Returns a {@link Logger logger} suitable for the caller usage.
*
* @implSpec The default implementation for this method is to return a
* simple logger that will print all messages of INFO level and above
* to the console. That simple logger is not configurable.
*
* @param name The name of the logger.
! * @param caller The class on behalf of which the logger is created.
* @return A {@link Logger logger} suitable for the application usage.
* @throws SecurityException if the calling code does not have the
* {@code RuntimePermission("loggerFinder")}.
*/
! protected Logger demandLoggerFor(String name, /* Module */ Class<?> caller) {
checkPermission();
! if (caller.getClassLoader() == null) {
return SharedLoggers.system.get(SimpleConsoleLogger::makeSimpleLogger, name);
} else {
return SharedLoggers.application.get(SimpleConsoleLogger::makeSimpleLogger, name);
}
}
--- 130,182 ----
values.remove(ref);
}
return w;
}
final static SharedLoggers system = new SharedLoggers();
final static SharedLoggers application = new SharedLoggers();
}
+ public static boolean isSystem(Module m) {
+ ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<>() {
@Override
! public ClassLoader run() {
! return m.getClassLoader();
! }
! });
! return cl == null;
! }
!
! @Override
! public final Logger getLogger(String name, Module module) {
checkPermission();
! return demandLoggerFor(name, module);
}
@Override
public final Logger getLocalizedLogger(String name, ResourceBundle bundle,
! Module module) {
! return super.getLocalizedLogger(name, bundle, module);
}
/**
! * Returns a {@link Logger logger} suitable for use within the
! * given {@code module}.
*
* @implSpec The default implementation for this method is to return a
* simple logger that will print all messages of INFO level and above
* to the console. That simple logger is not configurable.
*
* @param name The name of the logger.
! * @param module The module on behalf of which the logger is created.
* @return A {@link Logger logger} suitable for the application usage.
* @throws SecurityException if the calling code does not have the
* {@code RuntimePermission("loggerFinder")}.
*/
! protected Logger demandLoggerFor(String name, Module module) {
checkPermission();
! if (isSystem(module)) {
return SharedLoggers.system.get(SimpleConsoleLogger::makeSimpleLogger, name);
} else {
return SharedLoggers.application.get(SimpleConsoleLogger::makeSimpleLogger, name);
}
}
< prev index next >