You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
472 lines
12 KiB
472 lines
12 KiB
7 years ago
|
// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
// Redistribution and use in source and binary forms, with or without
|
||
|
// modification, are permitted provided that the following conditions are met:
|
||
|
//
|
||
|
// 1. Redistributions of source code must retain the above copyright notice,
|
||
|
// this list of conditions and the following disclaimer.
|
||
|
//
|
||
|
// 2. Redistributions in binary form must reproduce the above copyright
|
||
|
// notice, this list of conditions and the following disclaimer in the
|
||
|
// documentation and/or other materials provided with the distribution.
|
||
|
//
|
||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
||
|
package com.fr.third.jodd.util;
|
||
|
|
||
|
import java.io.File;
|
||
|
import java.security.AccessController;
|
||
|
import java.security.PrivilegedAction;
|
||
|
import java.util.ArrayList;
|
||
|
|
||
|
/**
|
||
|
* System utilities.
|
||
|
*/
|
||
|
public class SystemUtil {
|
||
|
|
||
|
// ---------------------------------------------------------------- properties
|
||
|
|
||
|
/**
|
||
|
* Get system property. If key is not available, returns the default value.
|
||
|
*/
|
||
|
public static String get(final String key, String def) {
|
||
|
if (key.isEmpty()) {
|
||
|
throw new IllegalArgumentException("key must not be empty.");
|
||
|
}
|
||
|
|
||
|
String value = null;
|
||
|
try {
|
||
|
if (System.getSecurityManager() == null) {
|
||
|
value = System.getProperty(key);
|
||
|
} else {
|
||
|
value = AccessController.doPrivileged(new PrivilegedAction<String>() {
|
||
|
@Override
|
||
|
public String run() {
|
||
|
return System.getProperty(key);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
} catch (Exception ignore) {
|
||
|
}
|
||
|
|
||
|
if (value == null) {
|
||
|
return def;
|
||
|
}
|
||
|
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
|
||
|
// ---------------------------------------------------------------- unsafe
|
||
|
|
||
|
// IMPORTANT - order of declaration here is important! we need to detect
|
||
|
// first the Android, and then to check for the unsafe field;
|
||
|
// because `hasUnsafe0` method relies on the `isHostAndroid` information.
|
||
|
|
||
|
private static final boolean IS_ANDROID = isAndroid0();
|
||
|
private static final boolean HAS_UNSAFE = hasUnsafe0();
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if system has the <code>Unsafe</code>.
|
||
|
*/
|
||
|
public static boolean hasUnsafe() {
|
||
|
return HAS_UNSAFE;
|
||
|
}
|
||
|
|
||
|
private static boolean hasUnsafe0() {
|
||
|
if (isHostAndroid()) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
return PlatformInternal.hasUnsafe();
|
||
|
}
|
||
|
catch (Throwable t) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------- android
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if system is android.
|
||
|
*/
|
||
|
public static boolean isHostAndroid() {
|
||
|
return IS_ANDROID;
|
||
|
}
|
||
|
|
||
|
private static boolean isAndroid0() {
|
||
|
try {
|
||
|
Class.forName("android.app.Application", false, ClassLoaderUtil.getSystemClassLoader());
|
||
|
return true;
|
||
|
}
|
||
|
catch (Exception e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------- properties
|
||
|
|
||
|
public static final String USER_DIR = "user.dir";
|
||
|
public static final String USER_NAME = "user.name";
|
||
|
public static final String USER_HOME = "user.home";
|
||
|
public static final String JAVA_HOME = "java.home";
|
||
|
public static final String TEMP_DIR = "java.io.tmpdir";
|
||
|
public static final String OS_NAME = "os.name";
|
||
|
public static final String OS_VERSION = "os.version";
|
||
|
public static final String JAVA_VERSION = "java.version";
|
||
|
public static final String JAVA_SPECIFICATION_VERSION = "java.specification.version";
|
||
|
public static final String JAVA_VENDOR = "java.vendor";
|
||
|
public static final String JAVA_CLASSPATH = "java.class.path";
|
||
|
public static final String PATH_SEPARATOR = "path.separator";
|
||
|
public static final String HTTP_PROXY_HOST = "http.proxyHost";
|
||
|
public static final String HTTP_PROXY_PORT = "http.proxyPort";
|
||
|
public static final String HTTP_PROXY_USER = "http.proxyUser";
|
||
|
public static final String HTTP_PROXY_PASSWORD = "http.proxyPassword";
|
||
|
public static final String FILE_ENCODING = "file.encoding";
|
||
|
public static final String SUN_BOOT_CLASS_PATH = "sun.boot.class.path";
|
||
|
|
||
|
private static int javaVersionNumber;
|
||
|
private static final String WORKING_FOLDER;
|
||
|
|
||
|
static {
|
||
|
|
||
|
// determine the Java version by looking at available classes.
|
||
|
|
||
|
try {
|
||
|
// 1.0
|
||
|
javaVersionNumber = 10;
|
||
|
|
||
|
Class.forName("java.lang.Void");
|
||
|
// 1.1
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.lang.ThreadLocal");
|
||
|
// 1.2
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.lang.StrictMath");
|
||
|
// 1.3
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.lang.CharSequence");
|
||
|
//1.4
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.net.Proxy");
|
||
|
// 1.5
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.net.CookieStore");
|
||
|
// 1.6
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.nio.file.FileSystem");
|
||
|
// 1.7
|
||
|
javaVersionNumber++;
|
||
|
|
||
|
Class.forName("java.lang.reflect.Executable");
|
||
|
// 1.8
|
||
|
javaVersionNumber++;
|
||
|
} catch (Throwable ignore) {
|
||
|
}
|
||
|
|
||
|
// working folder
|
||
|
|
||
|
File workingDir = new File(StringPool.EMPTY);
|
||
|
|
||
|
WORKING_FOLDER = workingDir.getAbsolutePath();
|
||
|
}
|
||
|
|
||
|
private static String[] jrePackages;
|
||
|
|
||
|
/**
|
||
|
* Returns list of packages, build into runtime jars.
|
||
|
*/
|
||
|
public static String[] jrePackages() {
|
||
|
if (jrePackages == null) {
|
||
|
buildJrePackages();
|
||
|
}
|
||
|
return jrePackages;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Builds a set of java core packages.
|
||
|
*/
|
||
|
private static void buildJrePackages() {
|
||
|
ArrayList<String> packages = new ArrayList<String>();
|
||
|
|
||
|
switch (javaVersionNumber) {
|
||
|
case 18:
|
||
|
case 17:
|
||
|
case 16:
|
||
|
case 15:
|
||
|
// in Java1.5, the apache stuff moved
|
||
|
packages.add("com.sun.org.apache");
|
||
|
// fall through...
|
||
|
case 14:
|
||
|
if (javaVersionNumber == 14) {
|
||
|
packages.add("org.apache.crimson");
|
||
|
packages.add("org.apache.xalan");
|
||
|
packages.add("org.apache.xml");
|
||
|
packages.add("org.apache.xpath");
|
||
|
}
|
||
|
packages.add("org.ietf.jgss");
|
||
|
packages.add("org.w3c.dom");
|
||
|
packages.add("org.xml.sax");
|
||
|
// fall through...
|
||
|
case 13:
|
||
|
packages.add("org.omg");
|
||
|
packages.add("com.sun.corba");
|
||
|
packages.add("com.sun.jndi");
|
||
|
packages.add("com.sun.media");
|
||
|
packages.add("com.sun.naming");
|
||
|
packages.add("com.sun.org.omg");
|
||
|
packages.add("com.sun.rmi");
|
||
|
packages.add("sunw.io");
|
||
|
packages.add("sunw.util");
|
||
|
// fall through...
|
||
|
case 12:
|
||
|
packages.add("com.sun.java");
|
||
|
packages.add("com.sun.image");
|
||
|
// fall through...
|
||
|
case 11:
|
||
|
default:
|
||
|
// core stuff
|
||
|
packages.add("sun");
|
||
|
packages.add("java");
|
||
|
packages.add("javax");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
jrePackages = packages.toArray(new String[packages.size()]);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns current working folder.
|
||
|
*/
|
||
|
public static String userDir() {
|
||
|
return System.getProperty(USER_DIR);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns current user.
|
||
|
*/
|
||
|
public static String userName() {
|
||
|
return System.getProperty(USER_NAME);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns user home folder.
|
||
|
*/
|
||
|
public static String userHome() {
|
||
|
return System.getProperty(USER_HOME);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns current working folder.
|
||
|
* This is <b>NOT</b> a user folder.
|
||
|
*/
|
||
|
public static String workingFolder() {
|
||
|
return WORKING_FOLDER;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns JRE home.
|
||
|
*/
|
||
|
public static String javaJreHome() {
|
||
|
return System.getProperty(JAVA_HOME);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns JAVA_HOME which is not equals to "java.home" property
|
||
|
* since it points to JAVA_HOME/jre folder.
|
||
|
*/
|
||
|
public static String javaHome() {
|
||
|
String home = System.getProperty(JAVA_HOME);
|
||
|
if (home == null) {
|
||
|
return null;
|
||
|
}
|
||
|
int i = home.lastIndexOf('\\');
|
||
|
int j = home.lastIndexOf('/');
|
||
|
if (j > i) {
|
||
|
i = j;
|
||
|
}
|
||
|
return home.substring(0, i);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns system temp dir.
|
||
|
*/
|
||
|
public static String tempDir() {
|
||
|
return System.getProperty(TEMP_DIR);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns OS name.
|
||
|
*/
|
||
|
public static String osName() {
|
||
|
return System.getProperty(OS_NAME);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns OS version.
|
||
|
*/
|
||
|
public static String osVersion() {
|
||
|
return System.getProperty(OS_VERSION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns Java version string, as specified in system property.
|
||
|
* Returned string contain major version, minor version and revision.
|
||
|
* @see #javaSpecificationVersion()
|
||
|
*/
|
||
|
public static String javaVersion() {
|
||
|
return System.getProperty(JAVA_VERSION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieves the version of the currently running JVM.
|
||
|
*/
|
||
|
public static String javaSpecificationVersion() {
|
||
|
return System.getProperty(JAVA_SPECIFICATION_VERSION);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns detected java version. Returned number is
|
||
|
* a number 10x the <code>major.minor</code>, e.g.
|
||
|
* Java1.5 returns <code>15</code>.
|
||
|
*/
|
||
|
public static int javaVersionNumber() {
|
||
|
return javaVersionNumber;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns Java vendor.
|
||
|
*/
|
||
|
public static String javaVendor() {
|
||
|
return System.getProperty(JAVA_VENDOR);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the currently running JVM is at least compliant
|
||
|
* with provided JDK version.
|
||
|
* @param version java version multiplied by 10, e.g. <code>1.5</code> is <code>15</code>
|
||
|
*/
|
||
|
public static boolean isAtLeastJavaVersion(int version) {
|
||
|
return javaVersionNumber >= version;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the currently running JVM is equal to provided version.
|
||
|
* @param version java version, multiplied by 10, e.g. <code>1.5</code> is <code>15</code>.
|
||
|
*/
|
||
|
public static boolean isJavaVersion(int version) {
|
||
|
return javaVersionNumber == version;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns system class path.
|
||
|
*/
|
||
|
public static String systemClassPath() {
|
||
|
return System.getProperty(JAVA_CLASSPATH);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns path separator.
|
||
|
*/
|
||
|
public static String pathSeparator() {
|
||
|
return System.getProperty(PATH_SEPARATOR);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns file encoding.
|
||
|
*/
|
||
|
public static String fileEncoding() {
|
||
|
return System.getProperty(FILE_ENCODING);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is Windows.
|
||
|
*/
|
||
|
public static boolean isHostWindows() {
|
||
|
return osName().toUpperCase().startsWith("WINDOWS");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is Linux.
|
||
|
*/
|
||
|
public static boolean isHostLinux() {
|
||
|
return osName().toUpperCase().startsWith("LINUX");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is a general unix.
|
||
|
*/
|
||
|
public static boolean isHostUnix() {
|
||
|
boolean unixVariant = isHostAix() | isHostLinux() | isHostMac() | isHostSolaris();
|
||
|
|
||
|
return (!unixVariant && File.pathSeparator.equals(StringPool.COLON));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is Mac.
|
||
|
*/
|
||
|
public static boolean isHostMac() {
|
||
|
return osName().toUpperCase().startsWith("MAC OS X");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is Solaris.
|
||
|
*/
|
||
|
public static boolean isHostSolaris() {
|
||
|
return osName().toUpperCase().startsWith("SUNOS");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if host is AIX.
|
||
|
*/
|
||
|
public static boolean isHostAix() {
|
||
|
return osName().equalsIgnoreCase("AIX");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns bootstrap class path.
|
||
|
*/
|
||
|
public static String getSunBoothClassPath() {
|
||
|
return System.getProperty(SUN_BOOT_CLASS_PATH);
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------- http proxy
|
||
|
|
||
|
/**
|
||
|
* Sets HTTP proxy settings.
|
||
|
*/
|
||
|
public static void setHttpProxy(String host, String port, String username, String password) {
|
||
|
System.getProperties().put(HTTP_PROXY_HOST, host);
|
||
|
System.getProperties().put(HTTP_PROXY_PORT, port);
|
||
|
System.getProperties().put(HTTP_PROXY_USER, username);
|
||
|
System.getProperties().put(HTTP_PROXY_PASSWORD, password);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets HTTP proxy settings.
|
||
|
*/
|
||
|
public static void setHttpProxy(String host, String port) {
|
||
|
System.getProperties().put(HTTP_PROXY_HOST, host);
|
||
|
System.getProperties().put(HTTP_PROXY_PORT, port);
|
||
|
}
|
||
|
|
||
|
}
|