Skip to content

Commit eb62b5e

Browse files
committed
8187073: The java.util.logging.Level.findLevel() will not correctly find a Level by it's int value
Reviewed-by: rriggs
1 parent 82bf079 commit eb62b5e

2 files changed

Lines changed: 35 additions & 9 deletions

File tree

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -389,14 +389,15 @@ static Level findLevel(String name) {
389389
try {
390390
int x = Integer.parseInt(name);
391391
level = KnownLevel.findByValue(x, KnownLevel::mirrored);
392-
if (!level.isPresent()) {
393-
// add new Level
394-
Level levelObject = new Level(name, x);
395-
// There's no need to use a reachability fence here because
396-
// KnownLevel keeps a strong reference on the level when
397-
// level.getClass() == Level.class.
398-
return KnownLevel.findByValue(x, KnownLevel::mirrored).get();
392+
if (level.isPresent()) {
393+
return level.get();
399394
}
395+
// add new Level
396+
Level levelObject = new Level(name, x);
397+
// There's no need to use a reachability fence here because
398+
// KnownLevel keeps a strong reference on the level when
399+
// level.getClass() == Level.class.
400+
return KnownLevel.findByValue(x, KnownLevel::mirrored).get();
400401
} catch (NumberFormatException ex) {
401402
// Not an integer.
402403
// Drop through.

test/jdk/java/util/logging/Level/CustomLevel.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
*/
2323

2424
import java.io.*;
25+
import java.lang.management.ManagementFactory;
26+
import java.lang.management.PlatformLoggingMXBean;
2527
import java.lang.ref.Reference;
2628
import java.lang.ref.ReferenceQueue;
2729
import java.lang.ref.WeakReference;
@@ -35,9 +37,11 @@
3537

3638
/*
3739
* @test
38-
* @bug 8026027 6543126
40+
* @bug 8026027 6543126 8187073
41+
* @modules java.logging
42+
* java.management
3943
* @summary Test Level.parse to look up custom levels by name and its
40-
* localized name
44+
* localized name, as well as severity.
4145
*
4246
* @run main/othervm CustomLevel
4347
*/
@@ -73,6 +77,8 @@ public String toString() {
7377
public static void main(String[] args) throws Exception {
7478
setupCustomLevels();
7579
setUpCustomLevelsOtherLoader();
80+
PlatformLoggingMXBean mxbean = ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class);
81+
Logger logger = Logger.getLogger("foo.bar");
7682

7783
// Level.parse will return the custom Level instance
7884
for (Level level : levels) {
@@ -96,8 +102,27 @@ public static void main(String[] args) throws Exception {
96102
+ l.getClass() + " for " + localizedName
97103
+ " in " + rb.getBaseBundleName());
98104
}
105+
l = Level.parse(String.valueOf(level.intValue()));
106+
System.out.println("Level.parse(" + level.intValue() + ") returns " + l);
107+
if (l != level) {
108+
if (l == null || l.intValue() != level.intValue()) {
109+
throw new RuntimeException("Unexpected level " + l
110+
+ (l == null ? "" : (" " + l.getClass()))
111+
+ " for " + level.intValue());
112+
}
113+
}
114+
mxbean.setLoggerLevel(logger.getName(), String.valueOf(level.intValue()));
115+
Level l2 = logger.getLevel();
116+
if (l2 != level) {
117+
if (l2 == null || l2.intValue() != level.intValue()) {
118+
throw new RuntimeException("Unexpected level " + l2
119+
+ (l2 == null ? "" : (" " + l2.getClass()))
120+
+ " for " + level.intValue());
121+
}
122+
}
99123
}
100124

125+
101126
final long otherLevelCount = levels.stream()
102127
.filter(CustomLevel::isCustomLoader)
103128
.count();

0 commit comments

Comments
 (0)