All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.hasor.cobble.SystemUtils Maven / Gradle / Ivy

/*
 * 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 net.hasor.cobble;
import java.util.Locale;

/**
 * 

* Helpers for {@code java.lang.System}. *

*

* If a system property cannot be read due to security restrictions, the corresponding field in this class will be set * to {@code null} and a message will be written to {@code System.err}. *

*

* #ThreadSafe# *

* * 2021-11-01 reduction based on Apache Commons lang3, org.apache.commons.lang3.StringUtils * * @since 1.0 * @author 赵永春 ([email protected]) * @version $Id: SystemUtils.java 1671043 2015-04-03 12:09:07Z britter $ */ public final class SystemUtils { private static final boolean IS_WINDOWS = isWindows0(); private static final boolean IS_ANDROID = isAndroid0(); private static final boolean IS_OSX = isOsx0(); private static final boolean IS_J9_JVM = isJ9Jvm0(); private static final boolean IS_IVKVM_DOT_NET = isIkvmDotNet0(); private static final boolean IS_SUPER_USER = maybeSuperUser0(); //-------------------------------------------------------------------- /** *

NumberUtils instances should NOT be constructed in standard programming. * Instead, the class should be used as NumberUtils.stringToInt("6");.

* *

This constructor is public to permit tools that require a JavaBean instance to operate.

*/ public SystemUtils() { super(); } //-------------------------------------------------------------------- /** * Returns the value of the Java system property with the specified * {@code key}, while falling back to {@code null} if the property access fails. * * @return the property value or {@code null} */ public static String getSystemProperty(String key) { return getSystemProperty(key, null); } /** * Returns the value of the Java system property with the specified {@code key}, * while falling back to the specified default value if the property access fails. * * @return the property value. {@code def} if there's no such property or if an access to the specified property is not allowed. */ public static String getSystemProperty(final String key, String defaultValue) { ObjectUtils.checkNotNull(key, "key"); if (key.isEmpty()) { throw new IllegalArgumentException("key must not be empty."); } String value = System.getProperty(key); if (value == null) { return defaultValue; } return value; } //-------------------------------------------------------------------- /** Return {@code true} if the JVM is running on Windows */ public static boolean isWindows() { return IS_WINDOWS; } public static boolean isAndroid() { return IS_ANDROID; } /** Return {@code true} if the JVM is running on OSX / MacOS */ public static boolean isOsx() { return IS_OSX; } /** * Returns {@code true} if the running JVM is either * IBM J9 or * Eclipse OpenJ9, {@code false} otherwise. */ public static boolean isJ9Jvm() { return IS_J9_JVM; } /** Returns {@code true} if the running JVM is IKVM.NET, {@code false} otherwise. */ public static boolean isIkvmDotNet() { return IS_IVKVM_DOT_NET; } public static boolean isSupperUser() { return IS_SUPER_USER; } private static boolean isWindows0() { return getSystemProperty("os.name", "").toLowerCase(Locale.US).contains("win"); } private static boolean isAndroid0() { // Idea: Sometimes java binaries include Android classes on the classpath, even if it isn't actually Android. // Rather than check if certain classes are present, just check the VM, which is tied to the JDK. // Optional improvement: check if `android.os.Build.VERSION` is >= 24. On later versions of Android, the // OpenJDK is used, which means `Unsafe` will actually work as expected. // Android sets this property to Dalvik, regardless of whether it actually is. String vmName = getSystemProperty("java.vm.name"); return "Dalvik".equals(vmName); } private static boolean isOsx0() { String osname = getSystemProperty("os.name", "").toLowerCase(Locale.US).replaceAll("[^a-z0-9]+", ""); return osname.startsWith("macosx") || osname.startsWith("osx"); } private static boolean isJ9Jvm0() { String vmName = getSystemProperty("java.vm.name", "").toLowerCase(); return vmName.startsWith("ibm j9") || vmName.startsWith("eclipse openj9"); } private static boolean isIkvmDotNet0() { String vmName = getSystemProperty("java.vm.name", "").toUpperCase(Locale.US); return vmName.equals("IKVM.NET"); } private static boolean maybeSuperUser0() { String username = getSystemProperty("user.name"); if (isWindows()) { return "Administrator".equals(username); } // Check for root and toor as some BSDs have a toor user that is basically the same as root. return "root".equals(username) || "toor".equals(username); } //-------------------------------------------------------------------- private static final int JAVA_VERSION = javaVersion0(); public static int getJavaVersion() { return JAVA_VERSION; } private static int javaVersion0() { if (isAndroid0()) { return 6; } String javaSpecVersion = getSystemProperty("java.specification.version", "1.6"); final String[] components = javaSpecVersion.split("\\."); final int[] version = new int[components.length]; for (int i = 0; i < components.length; i++) { version[i] = Integer.parseInt(components[i]); } if (version[0] == 1) { assert version[1] >= 6; return version[1]; } else { return version[0]; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy