8187073: The java.util.logging.Level.findLevel() will not correctly find a Level by it's int value

Reviewed-by: rriggs
This commit is contained in:
Daniel Fuchs 2017-12-08 17:40:57 +00:00
parent 82bf0799c6
commit eb62b5e51e
2 changed files with 35 additions and 9 deletions
src/java.logging/share/classes/java/util/logging
test/jdk/java/util/logging/Level

@ -389,14 +389,15 @@ public class Level implements java.io.Serializable {
try {
int x = Integer.parseInt(name);
level = KnownLevel.findByValue(x, KnownLevel::mirrored);
if (!level.isPresent()) {
// add new Level
Level levelObject = new Level(name, x);
// There's no need to use a reachability fence here because
// KnownLevel keeps a strong reference on the level when
// level.getClass() == Level.class.
return KnownLevel.findByValue(x, KnownLevel::mirrored).get();
if (level.isPresent()) {
return level.get();
}
// add new Level
Level levelObject = new Level(name, x);
// There's no need to use a reachability fence here because
// KnownLevel keeps a strong reference on the level when
// level.getClass() == Level.class.
return KnownLevel.findByValue(x, KnownLevel::mirrored).get();
} catch (NumberFormatException ex) {
// Not an integer.
// Drop through.

@ -22,6 +22,8 @@
*/
import java.io.*;
import java.lang.management.ManagementFactory;
import java.lang.management.PlatformLoggingMXBean;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
@ -35,9 +37,11 @@ import java.util.logging.*;
/*
* @test
* @bug 8026027 6543126
* @bug 8026027 6543126 8187073
* @modules java.logging
* java.management
* @summary Test Level.parse to look up custom levels by name and its
* localized name
* localized name, as well as severity.
*
* @run main/othervm CustomLevel
*/
@ -73,6 +77,8 @@ public class CustomLevel extends Level {
public static void main(String[] args) throws Exception {
setupCustomLevels();
setUpCustomLevelsOtherLoader();
PlatformLoggingMXBean mxbean = ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class);
Logger logger = Logger.getLogger("foo.bar");
// Level.parse will return the custom Level instance
for (Level level : levels) {
@ -96,8 +102,27 @@ public class CustomLevel extends Level {
+ l.getClass() + " for " + localizedName
+ " in " + rb.getBaseBundleName());
}
l = Level.parse(String.valueOf(level.intValue()));
System.out.println("Level.parse(" + level.intValue() + ") returns " + l);
if (l != level) {
if (l == null || l.intValue() != level.intValue()) {
throw new RuntimeException("Unexpected level " + l
+ (l == null ? "" : (" " + l.getClass()))
+ " for " + level.intValue());
}
}
mxbean.setLoggerLevel(logger.getName(), String.valueOf(level.intValue()));
Level l2 = logger.getLevel();
if (l2 != level) {
if (l2 == null || l2.intValue() != level.intValue()) {
throw new RuntimeException("Unexpected level " + l2
+ (l2 == null ? "" : (" " + l2.getClass()))
+ " for " + level.intValue());
}
}
}
final long otherLevelCount = levels.stream()
.filter(CustomLevel::isCustomLoader)
.count();