// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.start; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JavaVersion { private static final Pattern PRE_JDK9 = Pattern.compile("1\\.(\\d)(\\.(\\d+)(_(\\d+))?)?(-.+)?"); // Regexp from JEP 223 (http://openjdk.java.net/jeps/223). private static final Pattern JDK9 = Pattern.compile("(\\d+)(\\.(\\d+))?(\\.(\\d+))?((-.+)?(\\+(\\d+)?(-.+)?)?)"); public static JavaVersion parse(String version) { if (version.startsWith("1.")) return parsePreJDK9(version); return parseJDK9(version); } private static JavaVersion parsePreJDK9(String version) { Matcher matcher = PRE_JDK9.matcher(version); if (!matcher.matches()) throw new IllegalArgumentException("Invalid Java version " + version); int major = 1; int minor = Integer.parseInt(matcher.group(1)); String microGroup = matcher.group(3); int micro = microGroup == null || microGroup.isEmpty() ? 0 : Integer.parseInt(microGroup); String updateGroup = matcher.group(5); int update = updateGroup == null || updateGroup.isEmpty() ? 0 : Integer.parseInt(updateGroup); String suffix = matcher.group(6); return new JavaVersion(version, minor, major, minor, micro, update, suffix); } private static JavaVersion parseJDK9(String version) { Matcher matcher = JDK9.matcher(version); if (!matcher.matches()) throw new IllegalArgumentException("Invalid Java version " + version); int major = Integer.parseInt(matcher.group(1)); String minorGroup = matcher.group(3); int minor = minorGroup == null || minorGroup.isEmpty() ? 0 : Integer.parseInt(minorGroup); String microGroup = matcher.group(5); int micro = microGroup == null || microGroup.isEmpty() ? 0 : Integer.parseInt(microGroup); String suffix = matcher.group(6); return new JavaVersion(version, major, major, minor, micro, 0, suffix); } private final String version; private final int platform; private final int major; private final int minor; private final int micro; private final int update; private final String suffix; private JavaVersion(String version, int platform, int major, int minor, int micro, int update, String suffix) { this.version = version; this.platform = platform; this.major = major; this.minor = minor; this.micro = micro; this.update = update; this.suffix = suffix; } /** * @return the string from which this JavaVersion was created */ public String getVersion() { return version; } /** * <p>Returns the Java Platform version, such as {@code 8} for JDK 1.8.0_92 and {@code 9} for JDK 9.2.4.</p> * * @return the Java Platform version */ public int getPlatform() { return platform; } /** * <p>Returns the major number version, such as {@code 1} for JDK 1.8.0_92 and {@code 9} for JDK 9.2.4.</p> * * @return the major number version */ public int getMajor() { return major; } /** * <p>Returns the minor number version, such as {@code 8} for JDK 1.8.0_92 and {@code 2} for JDK 9.2.4.</p> * * @return the minor number version */ public int getMinor() { return minor; } /** * <p>Returns the micro number version, such as {@code 0} for JDK 1.8.0_92 and {@code 4} for JDK 9.2.4.</p> * * @return the micro number version */ public int getMicro() { return micro; } /** * <p>Returns the update number version, such as {@code 92} for JDK 1.8.0_92 and {@code 0} for JDK 9.2.4.</p> * * @return the update number version */ public int getUpdate() { return update; } /** * <p>Returns the remaining string after the version numbers, such as {@code -internal} for * JDK 1.8.0_92-internal and {@code -ea} for JDK 9-ea, or {@code +13} for JDK 9.2.4+13.</p> * * @return the remaining string after the version numbers */ public String getSuffix() { return suffix; } }