* SystemVersion: New util, to consolidate duplicate code,

and determine Java version on Android
This commit is contained in:
zzz
2012-09-09 15:40:14 +00:00
parent 9bc54f27cf
commit 74e753934c
24 changed files with 148 additions and 47 deletions

View File

@ -19,6 +19,7 @@ import java.util.Locale;
import net.i2p.I2PAppContext;
import net.i2p.util.FileUtil;
import net.i2p.util.SystemVersion;
/**
@ -50,15 +51,15 @@ public class CPUID {
private static final boolean isX86 = System.getProperty("os.arch").contains("86") ||
System.getProperty("os.arch").equals("amd64");
private static final String libPrefix = (System.getProperty("os.name").startsWith("Win") ? "" : "lib");
private static final String libSuffix = (System.getProperty("os.name").startsWith("Win") ? ".dll" : ".so");
private static final boolean isWindows = System.getProperty("os.name").toLowerCase(Locale.US).contains("windows");
private static final boolean isWindows = SystemVersion.isWindows();
private static final String libPrefix = isWindows ? "" : "lib";
private static final String libSuffix = isWindows ? ".dll" : ".so";
private static final boolean isLinux = System.getProperty("os.name").toLowerCase(Locale.US).contains("linux");
private static final boolean isFreebsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("freebsd");
private static final boolean isNetbsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("netbsd");
private static final boolean isOpenbsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("openbsd");
private static final boolean isSunos = System.getProperty("os.name").toLowerCase(Locale.US).contains("sunos");
private static final boolean isMac = System.getProperty("os.name").startsWith("Mac");
private static final boolean isMac = SystemVersion.isMac();
/**
@ -71,8 +72,7 @@ public class CPUID {
* sun.arch.data.model == 32 => A 32 bit JVM but could be either 32 or 64 bit processor or libs
* os.arch contains "64" could be 32 or 64 bit libs
*/
private static final boolean is64 = "64".equals(System.getProperty("sun.arch.data.model")) ||
System.getProperty("os.arch").contains("64");
private static final boolean is64 = SystemVersion.is64Bit();
static
{

View File

@ -15,8 +15,7 @@ import java.io.PipedInputStream;
*/
public class BigPipedInputStream extends PipedInputStream {
private static final boolean oneDotSix =
(new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0;
private static final boolean oneDotSix = SystemVersion.isJava6();
private static final int PIPE_SIZE = 64*1024;

View File

@ -452,7 +452,7 @@ public class FileUtil {
if (!from.exists())
return false;
boolean success = false;
boolean isWindows = System.getProperty("os.name").startsWith("Win");
boolean isWindows = SystemVersion.isWindows();
// overwrite fails on windows
if (!isWindows)
success = from.renameTo(to);

View File

@ -158,15 +158,15 @@ public class NativeBigInteger extends BigInteger {
/**
* Operating systems
*/
private static final boolean _isWin = System.getProperty("os.name").startsWith("Win");
private static final boolean _isWin = SystemVersion.isWindows();
private static final boolean _isOS2 = System.getProperty("os.name").startsWith("OS/2");
private static final boolean _isMac = System.getProperty("os.name").startsWith("Mac");
private static final boolean _isMac = SystemVersion.isMac();
private static final boolean _isLinux = System.getProperty("os.name").toLowerCase(Locale.US).contains("linux");
private static final boolean _isFreebsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("freebsd");
private static final boolean _isNetbsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("netbsd");
private static final boolean _isOpenbsd = System.getProperty("os.name").toLowerCase(Locale.US).contains("openbsd");
private static final boolean _isSunos = System.getProperty("os.name").toLowerCase(Locale.US).contains("sunos");
private static final boolean _isAndroid = System.getProperty("java.vendor").contains("Android");
private static final boolean _isAndroid = SystemVersion.isAndroid();
/*
* This isn't always correct.
@ -178,8 +178,7 @@ public class NativeBigInteger extends BigInteger {
* sun.arch.data.model == 32 => A 32 bit JVM but could be either 32 or 64 bit processor or libs
* os.arch contains "64" could be 32 or 64 bit libs
*/
private static final boolean _is64 = "64".equals(System.getProperty("sun.arch.data.model")) ||
System.getProperty("os.arch").contains("64");
private static final boolean _is64 = SystemVersion.is64Bit();
private static final boolean _isX86 = System.getProperty("os.arch").contains("86") ||
System.getProperty("os.arch").equals("amd64");

View File

@ -10,7 +10,7 @@ public class ReusableGZIPInputStream extends ResettableGZIPInputStream {
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
// Neither does Android
private static final boolean ENABLE_CACHING = !(System.getProperty("java.vendor").startsWith("Apache") ||
System.getProperty("java.vendor").contains("Android"));
SystemVersion.isAndroid());
private static final LinkedBlockingQueue<ReusableGZIPInputStream> _available;
static {
if (ENABLE_CACHING)

View File

@ -21,7 +21,7 @@ public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream {
// Apache Harmony 5.0M13 Deflater doesn't work after reset()
// Neither does Android
private static final boolean ENABLE_CACHING = !(System.getProperty("java.vendor").startsWith("Apache") ||
System.getProperty("java.vendor").contains("Android"));
SystemVersion.isAndroid());
private static final LinkedBlockingQueue<ReusableGZIPOutputStream> _available;
static {
if (ENABLE_CACHING)

View File

@ -91,7 +91,7 @@ public class SSLEepGet extends EepGet {
/** may be null if init failed */
private SavingTrustManager _stm;
private static final boolean _isAndroid = System.getProperty("java.vendor").contains("Android");
private static final boolean _isAndroid = SystemVersion.isAndroid();
/**
* A new SSLEepGet with a new SSLState

View File

@ -12,7 +12,7 @@ import java.io.File;
*/
public class SecureDirectory extends File {
protected static final boolean isNotWindows = !System.getProperty("os.name").startsWith("Win");
protected static final boolean isNotWindows = !SystemVersion.isWindows();
public SecureDirectory(String pathname) {
super(pathname);

View File

@ -15,8 +15,7 @@ import net.i2p.I2PAppContext;
*/
public class SecureFileOutputStream extends FileOutputStream {
private static final boolean oneDotSix =
(new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0;
private static final boolean oneDotSix = SystemVersion.isJava6();
/**
* Sets output file to mode 600

View File

@ -0,0 +1,87 @@
package net.i2p.util;
/*
* public domain
*/
import java.lang.reflect.Field;
/**
* Methods to find out what system we are running on
*
* @since 0.9.3 consolidated from various places
*/
public abstract class SystemVersion {
private static final boolean _isWin = System.getProperty("os.name").startsWith("Win");
private static final boolean _isMac = System.getProperty("os.name").startsWith("Mac");
private static final boolean _isAndroid = System.getProperty("java.vendor").contains("Android");
private static final boolean _is64 = "64".equals(System.getProperty("sun.arch.data.model")) ||
System.getProperty("os.arch").contains("64");
private static final boolean _oneDotSix;
private static final int _androidSDK;
static {
int sdk = 0;
if (_isAndroid) {
try {
Class ver = Class.forName("android.os.Build.VERSION", true, ClassLoader.getSystemClassLoader());
Field field = ver.getField("SDK_INT");
sdk = field.getInt(null);
} catch (Exception e) {}
}
_androidSDK = sdk;
if (_isAndroid) {
_oneDotSix = _androidSDK >= 9;
} else {
_oneDotSix = (new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0;
}
}
public static boolean isWindows() {
return _isWin;
}
public static boolean isMac() {
return _isMac;
}
public static boolean isAndroid() {
return _isAndroid;
}
/**
* Better than (new VersionComparator()).compare(System.getProperty("java.version"), "1.6") >= 0
* as it handles Android also, where java.version = "0".
*
* @return true if Java 1.6 or higher, or Android API 9 or higher
*/
public static boolean isJava6() {
return _oneDotSix;
}
/**
* This isn't always correct.
* http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit
* http://mark.koli.ch/2009/10/javas-osarch-system-property-is-the-bitness-of-the-jre-not-the-operating-system.html
* http://mark.koli.ch/2009/10/reliably-checking-os-bitness-32-or-64-bit-on-windows-with-a-tiny-c-app.html
* sun.arch.data.model not on all JVMs
* sun.arch.data.model == 64 => 64 bit processor
* sun.arch.data.model == 32 => A 32 bit JVM but could be either 32 or 64 bit processor or libs
* os.arch contains "64" could be 32 or 64 bit libs
*/
public static boolean is64Bit() {
return _is64;
}
/**
* Identical to android.os.Build.VERSION.SDK_INT.
* For use outside of Android code.
* @return The SDK (API) version, e.g. 8 for Froyo, 0 if unknown
*/
public static int getAndroidVersion() {
return _androidSDK;
}
}