49 import java.lang.System.LoggerFinder; |
49 import java.lang.System.LoggerFinder; |
50 import java.lang.System.Logger; |
50 import java.lang.System.Logger; |
51 import java.lang.System.Logger.Level; |
51 import java.lang.System.Logger.Level; |
52 import java.util.stream.Stream; |
52 import java.util.stream.Stream; |
53 import sun.util.logging.PlatformLogger; |
53 import sun.util.logging.PlatformLogger; |
|
54 import java.lang.reflect.Module; |
54 |
55 |
55 /** |
56 /** |
56 * @test |
57 * @test |
57 * @bug 8140364 |
58 * @bug 8140364 |
58 * @summary JDK implementation specific unit test for JDK internal artifacts. |
59 * @summary JDK implementation specific unit test for JDK internal artifacts. |
162 String key, Throwable thrown, Object... params) { |
163 String key, Throwable thrown, Object... params) { |
163 return LogEvent.of(sequenceNumber, isLoggable, name, |
164 return LogEvent.of(sequenceNumber, isLoggable, name, |
164 null, null, level, bundle, key, |
165 null, null, level, bundle, key, |
165 thrown, params); |
166 thrown, params); |
166 } |
167 } |
|
168 |
167 public static LogEvent of(long sequenceNumber, |
169 public static LogEvent of(long sequenceNumber, |
168 boolean isLoggable, String name, |
170 boolean isLoggable, String name, |
169 sun.util.logging.PlatformLogger.Level level, ResourceBundle bundle, |
171 sun.util.logging.PlatformLogger.Level level, ResourceBundle bundle, |
170 Supplier<String> supplier, Throwable thrown, Object... params) { |
172 Supplier<String> supplier, Throwable thrown, Object... params) { |
171 return LogEvent.of(sequenceNumber, isLoggable, name, |
173 return LogEvent.of(sequenceNumber, isLoggable, name, |
229 static final Class<?> providerClass; |
231 static final Class<?> providerClass; |
230 static { |
232 static { |
231 try { |
233 try { |
232 // Preload classes before the security manager is on. |
234 // Preload classes before the security manager is on. |
233 providerClass = ClassLoader.getSystemClassLoader().loadClass("LoggerBridgeTest$LogProducerFinder"); |
235 providerClass = ClassLoader.getSystemClassLoader().loadClass("LoggerBridgeTest$LogProducerFinder"); |
234 ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass); |
236 ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass.getModule()); |
235 } catch (Exception ex) { |
237 } catch (Exception ex) { |
236 throw new ExceptionInInitializerError(ex); |
238 throw new ExceptionInInitializerError(ex); |
237 } |
239 } |
238 } |
240 } |
239 |
241 |
413 } |
415 } |
414 |
416 |
415 } |
417 } |
416 |
418 |
417 @Override |
419 @Override |
418 public Logger getLogger(String name, Class<?> caller) { |
420 public Logger getLogger(String name, Module caller) { |
419 SecurityManager sm = System.getSecurityManager(); |
421 SecurityManager sm = System.getSecurityManager(); |
420 if (sm != null) { |
422 if (sm != null) { |
421 sm.checkPermission(LOGGERFINDER_PERMISSION); |
423 sm.checkPermission(LOGGERFINDER_PERMISSION); |
422 } |
424 } |
423 PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader(); |
425 PrivilegedAction<ClassLoader> pa = () -> caller.getClassLoader(); |
425 if (callerLoader == null) { |
427 if (callerLoader == null) { |
426 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n)); |
428 return system.computeIfAbsent(name, (n) -> new LoggerImpl(n)); |
427 } else { |
429 } else { |
428 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n)); |
430 return user.computeIfAbsent(name, (n) -> new LoggerImpl(n)); |
429 } |
431 } |
|
432 } |
|
433 } |
|
434 |
|
435 static ClassLoader getClassLoader(Module m) { |
|
436 final boolean before = allowAll.get().getAndSet(true); |
|
437 try { |
|
438 return m.getClassLoader(); |
|
439 } finally { |
|
440 allowAll.get().set(before); |
430 } |
441 } |
431 } |
442 } |
432 |
443 |
433 static final sun.util.logging.PlatformLogger.Level[] julLevels = { |
444 static final sun.util.logging.PlatformLogger.Level[] julLevels = { |
434 sun.util.logging.PlatformLogger.Level.ALL, |
445 sun.util.logging.PlatformLogger.Level.ALL, |
495 static { |
506 static { |
496 // jdk.internal.logging.LoggerBridge.getLogger(name, caller) |
507 // jdk.internal.logging.LoggerBridge.getLogger(name, caller) |
497 try { |
508 try { |
498 Class<?> bridgeClass = Class.forName("jdk.internal.logger.LazyLoggers"); |
509 Class<?> bridgeClass = Class.forName("jdk.internal.logger.LazyLoggers"); |
499 lazyGetLogger = bridgeClass.getDeclaredMethod("getLogger", |
510 lazyGetLogger = bridgeClass.getDeclaredMethod("getLogger", |
500 String.class, Class.class); |
511 String.class, Module.class); |
501 lazyGetLogger.setAccessible(true); |
512 lazyGetLogger.setAccessible(true); |
502 } catch (Throwable ex) { |
513 } catch (Throwable ex) { |
503 throw new ExceptionInInitializerError(ex); |
514 throw new ExceptionInInitializerError(ex); |
504 } |
515 } |
505 } |
516 } |
506 |
517 |
507 static Logger getLogger(LoggerFinder provider, String name, Class<?> caller) { |
518 static Logger getLogger(LoggerFinder provider, String name, Module caller) { |
508 Logger logger; |
519 Logger logger; |
509 try { |
520 try { |
510 logger = Logger.class.cast(lazyGetLogger.invoke(null, name, caller)); |
521 logger = Logger.class.cast(lazyGetLogger.invoke(null, name, caller)); |
511 } catch (Throwable x) { |
522 } catch (Throwable x) { |
512 Throwable t = (x instanceof InvocationTargetException) ? |
523 Throwable t = (x instanceof InvocationTargetException) ? |
520 } |
531 } |
521 } |
532 } |
522 // The method above does not throw exception... |
533 // The method above does not throw exception... |
523 // call the provider here to verify that an exception would have |
534 // call the provider here to verify that an exception would have |
524 // been thrown by the provider. |
535 // been thrown by the provider. |
525 if (logger != null && caller == Thread.class) { |
536 if (logger != null && caller == Thread.class.getModule()) { |
526 Logger log = provider.getLogger(name, caller); |
537 Logger log = provider.getLogger(name, caller); |
527 } |
538 } |
528 return logger; |
539 return logger; |
529 } |
540 } |
530 |
541 |
531 static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Class<?> caller) { |
542 static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Module caller) { |
532 if (caller.getClassLoader() != null) { |
543 if (getClassLoader(caller) != null) { |
533 return System.getLogger(name,bundle); |
544 return System.getLogger(name,bundle); |
534 } else { |
545 } else { |
535 return provider.getLocalizedLogger(name, bundle, caller); |
546 return provider.getLocalizedLogger(name, bundle, caller); |
536 } |
547 } |
537 } |
548 } |
612 ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName()); |
623 ResourceBundle loggerBundle = ResourceBundle.getBundle(MyLoggerBundle.class.getName()); |
613 final Map<Object, String> loggerDescMap = new HashMap<>(); |
624 final Map<Object, String> loggerDescMap = new HashMap<>(); |
614 |
625 |
615 |
626 |
616 Logger appLogger1 = System.getLogger("foo"); |
627 Logger appLogger1 = System.getLogger("foo"); |
617 loggerDescMap.put(appLogger1, "LogProducer.getApplicationLogger(\"foo\")"); |
628 loggerDescMap.put(appLogger1, "System.getLogger(\"foo\")"); |
618 |
629 |
619 Logger sysLogger1 = null; |
630 Logger sysLogger1 = null; |
620 try { |
631 try { |
621 sysLogger1 = getLogger(provider, "foo", Thread.class); |
632 sysLogger1 = getLogger(provider, "foo", Thread.class.getModule()); |
622 loggerDescMap.put(sysLogger1, "LogProducer.getSystemLogger(\"foo\")"); |
633 loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); |
623 if (!hasRequiredPermissions) { |
634 if (!hasRequiredPermissions) { |
624 throw new RuntimeException("Managed to obtain a system logger without permission"); |
635 throw new RuntimeException("Managed to obtain a system logger without permission"); |
625 } |
636 } |
626 } catch (AccessControlException acx) { |
637 } catch (AccessControlException acx) { |
627 if (hasRequiredPermissions) { |
638 if (hasRequiredPermissions) { |
634 } |
645 } |
635 |
646 |
636 |
647 |
637 Logger appLogger2 = |
648 Logger appLogger2 = |
638 System.getLogger("foo", loggerBundle); |
649 System.getLogger("foo", loggerBundle); |
639 loggerDescMap.put(appLogger2, "LogProducer.getApplicationLogger(\"foo\", loggerBundle)"); |
650 loggerDescMap.put(appLogger2, "System.getLogger(\"foo\", loggerBundle)"); |
640 |
651 |
641 Logger sysLogger2 = null; |
652 Logger sysLogger2 = null; |
642 try { |
653 try { |
643 sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class); |
654 sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class.getModule()); |
644 loggerDescMap.put(sysLogger2, "provider.getSystemLogger(\"foo\", loggerBundle)"); |
655 loggerDescMap.put(sysLogger2, "provider.getLogger(\"foo\", loggerBundle, Thread.class.getModule())"); |
645 if (!hasRequiredPermissions) { |
656 if (!hasRequiredPermissions) { |
646 throw new RuntimeException("Managed to obtain a system logger without permission"); |
657 throw new RuntimeException("Managed to obtain a system logger without permission"); |
647 } |
658 } |
648 } catch (AccessControlException acx) { |
659 } catch (AccessControlException acx) { |
649 if (hasRequiredPermissions) { |
660 if (hasRequiredPermissions) { |
669 final LogProducerFinder.LoggerImpl sysSink; |
680 final LogProducerFinder.LoggerImpl sysSink; |
670 boolean old = allowControl.get().get(); |
681 boolean old = allowControl.get().get(); |
671 allowControl.get().set(true); |
682 allowControl.get().set(true); |
672 try { |
683 try { |
673 appSink = LogProducerFinder.LoggerImpl.class.cast( |
684 appSink = LogProducerFinder.LoggerImpl.class.cast( |
674 provider.getLogger("foo", LoggerBridgeTest.class)); |
685 provider.getLogger("foo", LoggerBridgeTest.class.getModule())); |
675 sysSink = LogProducerFinder.LoggerImpl.class.cast( |
686 sysSink = LogProducerFinder.LoggerImpl.class.cast( |
676 provider.getLogger("foo", Thread.class)); |
687 provider.getLogger("foo", Thread.class.getModule())); |
677 } finally { |
688 } finally { |
678 allowControl.get().set(old); |
689 allowControl.get().set(old); |
679 } |
690 } |
680 |
691 |
681 testLogger(provider, loggerDescMap, "foo", null, convert(appLogger1), appSink); |
692 testLogger(provider, loggerDescMap, "foo", null, convert(appLogger1), appSink); |