/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.lang;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;
/**
* The SystemUtils class is an abstract utility class for working with, invoking methods and
* accessing properties of the Java System class.
*
* @see java.lang.System
* @since GemFire 6.8
*/
@SuppressWarnings("unused")
public class SystemUtils {
public static final String CURRENT_DIRECTORY = System.getProperty("user.dir");
// Java Virtual Machine (JVM) Names
public static final String IBM_J9_JVM_NAME = "J9";
public static final String JAVA_HOTSPOT_JVM_NAME = "HotSpot";
public static final String ORACLE_JROCKIT_JVM_NAME = "JRockit";
// Java Virtual Machine (JVM) Vendor Names
public static final String APPLE_JVM_VENDOR_NAME = "Apple";
public static final String IBM_JVM_NAME = "IBM";
public static final String ORACLE_JVM_VENDOR_NAME = "Oracle";
public static final String AZUL_JVM_VENDOR_NAME = "Azul";
// Operating System Names
public static final String LINUX_OS_NAME = "Linux";
public static final String MAC_OSX_NAME = "Mac";
public static final String WINDOWS_OS_NAME = "Windows";
public static final String SOLARIS_OS_NAME = "SunOS";
/**
* Utility method to determine whether the installed Java Runtime Environment (JRE) is minimally
* at the specified, expected version. Typically, Java versions are of the form "1.6.0_31"... In
* the Azul JVM java.version does not have the "_NN" suffix. Instead it has the azul product
* version as the suffix like so "-zing_NN.NN.N.N". So on azul we instead use the
* "java.specification.version" sys prop and only compare the major and minor version numbers. All
* the stuff after the second "." in expectedVersion is ignored.
*
* @param expectedVersion an string value specifying the minimum expected version of the Java
* Runtime.
* @return a boolean value indicating if the Java Runtime meets the expected version requirement.
* @see java.lang.System#getProperty(String) with "java.version".
*/
public static boolean isJavaVersionAtLeast(String expectedVersion) {
String actualVersionDigits;
if (isAzulJVM()) {
actualVersionDigits =
StringUtils.getDigitsOnly(System.getProperty("java.specification.version"));
int dotIdx = expectedVersion.indexOf('.');
if (dotIdx != -1) {
dotIdx = expectedVersion.indexOf('.', dotIdx + 1);
if (dotIdx != -1) {
// strip off everything after the second dot.
expectedVersion = expectedVersion.substring(0, dotIdx);
}
}
} else {
actualVersionDigits = StringUtils.getDigitsOnly(System.getProperty("java.version"));
}
String expectedVersionDigits = StringUtils.padEnding(StringUtils.getDigitsOnly(expectedVersion),
'0', actualVersionDigits.length());
try {
return (Long.parseLong(actualVersionDigits) >= Long.parseLong(expectedVersionDigits));
} catch (NumberFormatException ignore) {
return false;
}
}
/**
* Utility method to determine whether the Java application process is executing on the Apple JVM.
*
* @return a boolean value indicating whether the Java application process is executing and
* running on the Apple JVM.
* @see #isJvmVendor(String)
*/
public static boolean isAppleJVM() {
return isJvmVendor(APPLE_JVM_VENDOR_NAME);
}
/**
* Utility method to determine whether the Java application process is executing on the Oracle
* JVM.
*
* @return a boolean value indicating whether the Java application process is executing and
* running on the Oracle JVM.
* @see #isJvmVendor(String)
*/
public static boolean isOracleJVM() {
return isJvmVendor(ORACLE_JVM_VENDOR_NAME);
}
/**
* Utility method to determine whether the Java application process is executing on the Azul JVM.
*
* @return a boolean value indicating whether the Java application process is executing and
* running on the Azul JVM.
* @see #isJvmVendor(String)
*/
public static boolean isAzulJVM() {
return isJvmVendor(AZUL_JVM_VENDOR_NAME);
}
// @see java.lang.System#getProperty(String) with 'java.vm.vendor'.
private static boolean isJvmVendor(final String expectedJvmVendorName) {
String jvmVendor = System.getProperty("java.vm.vendor");
return (jvmVendor != null && jvmVendor.contains(expectedJvmVendorName));
}
/**
* Utility method to determine whether the Java application process is executing on the Java
* HotSpot VM. Client or Server VM does not matter.
*
* @return a boolean value indicating whether the Java application process is executing on the
* Java HotSpot VM.
* @see #isJVM(String)
*/
public static boolean isHotSpotVM() {
return isJVM(JAVA_HOTSPOT_JVM_NAME);
}
/**
* Utility method to determine whether the Java application process is executing on the IBM J9 VM.
*
* @return a boolean value indicating whether the Java application process is executing on the IBM
* J9 VM.
* @see #isJVM(String)
*/
public static boolean isJ9VM() {
return isJVM(IBM_J9_JVM_NAME);
}
/**
* Utility method to determine whether the Java application process is executing on the Oracle
* JRockit VM. Client or Server VM does not matter.
*
* @return a boolean value indicating whether the Java application process is executing on the
* Oracle JRockit VM.
* @see #isJVM(String)
*/
public static boolean isJRockitVM() {
return isJVM(ORACLE_JROCKIT_JVM_NAME);
}
// @see java.lang.System#getProperty(String) with "java.vm.name".
private static boolean isJVM(final String expectedJvmName) {
String jvmName = System.getProperty("java.vm.name");
return (jvmName != null && jvmName.contains(expectedJvmName));
}
/**
* Utility method that determines whether the Java application process is executing in a Linux
* operating system environment.
*
* @return a boolean value indicating whether the Java application process is executing in Linux.
* @see #isOS(String)
*/
public static boolean isLinux() {
return isOS(LINUX_OS_NAME);
}
/**
* Utility method that determines whether the Java application process is executing in a Apple Mac
* OSX operating system environment.
*
* @return a boolean value indicating whether the Java application process is executing in Mac
* OSX.
* @see #isOS(String)
*/
public static boolean isMacOSX() {
return isOS(MAC_OSX_NAME);
}
/**
* Utility method that determines whether the Java application process is executing in a Microsoft
* Windows-based operating system environment.
*
* @return a boolean value indicating whether the Java application process is executing in
* Windows.
* @see #isOS(String)
*/
public static boolean isWindows() {
return isOS(WINDOWS_OS_NAME);
}
/**
* Utility method that determines whether the Java application process is executing in a Sun
* Solaris operating system environment.
*
* @return a boolean value indicating whether the Java application process is executing in
* Solaris.
* @see #isOS(String)
*/
public static boolean isSolaris() {
return isOS(SOLARIS_OS_NAME);
}
/**
* Returns true if the specified location is in the JVM classpath. This may ignore additions to
* the classpath that are not reflected by the value in
* <code>System.getProperty("java.class.path")</code>.
*
* @param location the directory or jar name to test for
* @return true if location is in the JVM classpath
* @throws MalformedURLException
*/
public static boolean isInClassPath(String location) throws MalformedURLException {
return isInClassPath(new File(location).toURI().toURL());
}
/**
* Returns true if the specified location is in the JVM classpath. This may ignore additions to
* the classpath that are not reflected by the value in
* <code>System.getProperty("java.class.path")</code>.
*
* @param location the directory or jar URL to test for
* @return true if location is in the JVM classpath
* @throws MalformedURLException
*/
public static boolean isInClassPath(URL location) throws MalformedURLException {
String classPath = System.getProperty("java.class.path");
StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator);
while (st.hasMoreTokens()) {
String path = st.nextToken();
if (location.equals(new File(path).toURI().toURL())) {
return true;
}
}
return false;
}
// @see java.lang.System#getProperty(String) with "os.name".
private static boolean isOS(final String expectedOsName) {
String osName = System.getProperty("os.name");
return (osName != null && osName.contains(expectedOsName));
}
}