| /* |
| * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package java.lang; |
| |
| import java.io.PrintStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Optional; |
| |
| class VersionProps { |
| |
| |
| private static final String launcher_name = |
| "@@LAUNCHER_NAME@@"; |
| |
| private static final String java_version = |
| "@@VERSION_SHORT@@"; |
| |
| private static final String java_runtime_name = |
| "@@RUNTIME_NAME@@"; |
| |
| private static final String java_runtime_version = |
| "@@VERSION_STRING@@"; |
| |
| private static final String VERSION_NUMBER = |
| "@@VERSION_NUMBER@@"; |
| |
| private static final String VERSION_BUILD = |
| "@@VERSION_BUILD@@"; |
| |
| private static final String VERSION_PRE = |
| "@@VERSION_PRE@@"; |
| |
| private static final String VERSION_OPT = |
| "@@VERSION_OPT@@"; |
| |
| static { |
| init(); |
| } |
| |
| public static void init() { |
| System.setProperty("java.version", java_version); |
| System.setProperty("java.runtime.version", java_runtime_version); |
| System.setProperty("java.runtime.name", java_runtime_name); |
| } |
| |
| private static int parseVersionNumber(String version, int prevIndex, int index) { |
| if (index - prevIndex > 1 && |
| Character.digit(version.charAt(prevIndex), 10) <= 0) |
| throw new IllegalArgumentException("Leading zeros not supported (" + |
| version.substring(prevIndex, index) + ")"); |
| return Integer.parseInt(version, prevIndex, index, 10); |
| } |
| |
| // This method is reflectively used by regression tests. |
| static List<Integer> parseVersionNumbers(String version) { |
| List<Integer> verNumbers = new ArrayList<>(4); |
| int prevIndex = 0; |
| int index = version.indexOf('.'); |
| while (index > 0) { |
| verNumbers.add(parseVersionNumber(version, prevIndex, index)); |
| prevIndex = index + 1; // Skip the period |
| index = version.indexOf('.', prevIndex); |
| } |
| verNumbers.add(parseVersionNumber(version, prevIndex, version.length())); |
| |
| if (verNumbers.get(0) == 0 || verNumbers.get(verNumbers.size() - 1) == 0) |
| throw new IllegalArgumentException("Leading/trailing zeros not supported (" + |
| verNumbers + ")"); |
| |
| return verNumbers; |
| } |
| |
| static List<Integer> versionNumbers() { |
| return parseVersionNumbers(VERSION_NUMBER); |
| } |
| |
| static Optional<String> pre() { |
| return optionalOf(VERSION_PRE); |
| } |
| |
| static Optional<Integer> build() { |
| return VERSION_BUILD.isEmpty() ? |
| Optional.empty() : |
| Optional.of(Integer.parseInt(VERSION_BUILD)); |
| } |
| |
| static Optional<String> optional() { |
| return optionalOf(VERSION_OPT); |
| } |
| |
| // Treat empty strings as value not being present |
| private static Optional<String> optionalOf(String value) { |
| if (!value.isEmpty()) { |
| return Optional.of(value); |
| } else { |
| return Optional.empty(); |
| } |
| } |
| |
| /** |
| * In case you were wondering this method is called by java -version. |
| */ |
| public static void print(boolean err) { |
| print(err, false); |
| } |
| |
| /** |
| * This is the same as print except that it adds an extra line-feed |
| * at the end, typically used by the -showversion in the launcher |
| */ |
| public static void println(boolean err) { |
| print(err, true); |
| } |
| |
| /** |
| * Print version info. |
| */ |
| private static void print(boolean err, boolean newln) { |
| boolean isHeadless = false; |
| PrintStream ps = err ? System.err : System.out; |
| |
| /* Report that we're running headless if the property is true */ |
| String headless = System.getProperty("java.awt.headless"); |
| if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) { |
| isHeadless = true; |
| } |
| |
| /* First line: platform version. */ |
| if (err) { |
| ps.println(launcher_name + " version \"" + java_version + "\""); |
| } else { |
| /* Use a format more in line with GNU conventions */ |
| ps.println(launcher_name + " " + java_version); |
| } |
| |
| /* Second line: runtime version (ie, libraries). */ |
| String jdk_debug_level = System.getProperty("jdk.debug", "release"); |
| /* Debug level is not printed for "release" builds */ |
| if ("release".equals(jdk_debug_level)) { |
| jdk_debug_level = ""; |
| } else { |
| jdk_debug_level = jdk_debug_level + " "; |
| } |
| |
| ps.print(java_runtime_name + " (" + jdk_debug_level + "build " + java_runtime_version); |
| |
| ps.println(')'); |
| |
| /* Third line: JVM information. */ |
| String java_vm_name = System.getProperty("java.vm.name"); |
| String java_vm_version = System.getProperty("java.vm.version"); |
| String java_vm_info = System.getProperty("java.vm.info"); |
| ps.println(java_vm_name + " (" + jdk_debug_level + "build " + java_vm_version + ", " + |
| java_vm_info + ")"); |
| } |
| |
| } |