From 39a07b9ce452cd615d5454a04a852660ec6d9f69 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 14 Jan 2022 16:42:33 +0100 Subject: [PATCH] make VersionUtil more robust Signed-off-by: Ceki Gulcu --- .../java/org/slf4j/log4j12/VersionUtil.java | 57 ++++++++++++++----- .../org/slf4j/log4j12/UtilVersionTest.java | 24 -------- .../org/slf4j/log4j12/VersionUtilTest.java | 57 +++++++++++++++++++ 3 files changed, 101 insertions(+), 37 deletions(-) delete mode 100755 slf4j-log4j12/src/test/java/org/slf4j/log4j12/UtilVersionTest.java create mode 100755 slf4j-log4j12/src/test/java/org/slf4j/log4j12/VersionUtilTest.java diff --git a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/VersionUtil.java b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/VersionUtil.java index 17b276e0..38ceb143 100755 --- a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/VersionUtil.java +++ b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/VersionUtil.java @@ -1,34 +1,65 @@ +/** + * Copyright (c) 2004-2022 QOS.ch Sarl (Switzerland) + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ package org.slf4j.log4j12; -import java.lang.reflect.Method; - import org.slf4j.helpers.Util; public class VersionUtil { // code was compiled under Java 8 or later - static final int MINIMAL_VERSION = 8; + static final int DEFAULT_GUESS = 8; static public int getJavaMajorVersion() { String javaVersionString = Util.safeGetSystemProperty("java.version"); - return getJavaMajorVersion(javaVersionString); + int result = getJavaMajorVersion(javaVersionString); + return result; } static public int getJavaMajorVersion(String versionString) { if (versionString == null) - return MINIMAL_VERSION; + return DEFAULT_GUESS; if (versionString.startsWith("1.")) { return versionString.charAt(2) - '0'; } else { - // we running under Java 9 or later + String firstDigits = extractFirstDigits(versionString); try { - Method versionMethod = Runtime.class.getMethod("version"); - Object versionObj = versionMethod.invoke(null); - Method majorMethod = versionObj.getClass().getMethod("major"); - Integer resultInteger = (Integer) majorMethod.invoke(versionObj); - return resultInteger.intValue(); - } catch (Exception e) { - return MINIMAL_VERSION; + return Integer.parseInt(firstDigits); + } catch(NumberFormatException e) { + return DEFAULT_GUESS; } } } + + private static String extractFirstDigits(String versionString) { + StringBuffer buf = new StringBuffer(); + for (char c : versionString.toCharArray()) { + if (Character.isDigit(c)) + buf.append(c); + else + break; + } + return buf.toString(); + + } } diff --git a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/UtilVersionTest.java b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/UtilVersionTest.java deleted file mode 100755 index 601ab331..00000000 --- a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/UtilVersionTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.slf4j.log4j12; - -import static org.junit.Assert.*; - -import org.junit.Ignore; -import org.junit.Test; - -public class UtilVersionTest { - - @Test - public void test() { - System.out.println(System.getProperty("java.version")); - assertEquals(6, VersionUtil.getJavaMajorVersion("1.6")); - assertEquals(7, VersionUtil.getJavaMajorVersion("1.7.0_21-b11")); - assertEquals(8, VersionUtil.getJavaMajorVersion("1.8.0_25")); - } - - @Ignore - @Test // requires Java 9 to pass - public void testJava9() { - assertEquals(9, VersionUtil.getJavaMajorVersion("9ea")); - } - -} diff --git a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/VersionUtilTest.java b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/VersionUtilTest.java new file mode 100755 index 00000000..004ceece --- /dev/null +++ b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/VersionUtilTest.java @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2004-2022 QOS.ch Sarl (Switzerland) + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package org.slf4j.log4j12; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class VersionUtilTest { + + + @Test + public void test() { + System.out.println(System.getProperty("java.version")); + assertEquals(6, VersionUtil.getJavaMajorVersion("1.6")); + assertEquals(7, VersionUtil.getJavaMajorVersion("1.7.0_21-b11")); + assertEquals(8, VersionUtil.getJavaMajorVersion("1.8.0_25")); + } + + @Test + public void testJava9() { + assertEquals(9, VersionUtil.getJavaMajorVersion("9")); + assertEquals(9, VersionUtil.getJavaMajorVersion("9.12")); + assertEquals(9, VersionUtil.getJavaMajorVersion("9ea")); + + } + + @Test + public void testJava11() { + assertEquals(11, VersionUtil.getJavaMajorVersion("11")); + assertEquals(11, VersionUtil.getJavaMajorVersion("11.612")); + + } + +}