com.jgoodies.common.base.SystemUtils Maven / Gradle / Ivy
Show all versions of jgoodies-common Show documentation
/*
* Copyright (c) 2009-2014 JGoodies Software GmbH. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o 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.
*
* o Neither the name of JGoodies Software GmbH nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 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 OWNER 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.jgoodies.common.base;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.util.logging.Logger;
import javax.swing.UIManager;
/**
* Provides convenience behavior to determine the operating system
* and Java version.
*
* @author Karsten Lentzsch
*/
public class SystemUtils {
// Internal Constants *****************************************************
/**
* The {@code os.name} System Property. Operating system name.
*
* Defaults to {@code null}, if the runtime does not have security
* access to read this property or the property does not exist.
*/
protected static final String OS_NAME = getSystemProperty("os.name");
/**
* The {@code os.version} System Property. Operating system version.
*
* Defaults to {@code null}, if the runtime does not have security
* access to read this property or the property does not exist.
*/
protected static final String OS_VERSION = getSystemProperty("os.version");
/**
* The {@code os.name} System Property. Operating system name.
*
* Defaults to {@code null}, if the runtime does not have security
* access to read this property or the property does not exist.
*/
protected static final String JAVA_VERSION = getSystemProperty("java.version");
// Requesting the OS and OS Version ***************************************
/**
* Is true if this is Linux.
*/
public static final boolean IS_OS_LINUX =
startsWith(OS_NAME, "Linux") || startsWith(OS_NAME, "LINUX");
/**
* True if this is the Mac OS.
*/
public static final boolean IS_OS_MAC =
startsWith(OS_NAME, "Mac OS");
/**
* True if this is Solaris.
*/
public static final boolean IS_OS_SOLARIS =
startsWith(OS_NAME, "Solaris");
/**
* True if this is Windows.
*/
public static final boolean IS_OS_WINDOWS =
startsWith(OS_NAME, "Windows");
/**
* True if this is Windows 98.
*/
public static final boolean IS_OS_WINDOWS_98 =
startsWith(OS_NAME, "Windows 9") && startsWith(OS_VERSION, "4.1");
/**
* True if this is Windows ME.
*/
public static final boolean IS_OS_WINDOWS_ME =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "4.9");
/**
* True if this is Windows 2000.
*/
public static final boolean IS_OS_WINDOWS_2000 =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "5.0");
/**
* True if this is Windows XP.
*/
public static final boolean IS_OS_WINDOWS_XP =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "5.1");
/**
* True if this is Windows XP 64-Bit edition or Windows Server 2003
* or Windows Server 2003 R2.
*
* @since 1.8
*/
public static final boolean IS_OS_WINDOWS_XP_64_BIT_OR_SERVER_2003 =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "5.2");
/**
* True if this is Windows Vista or Server 2008.
*/
public static final boolean IS_OS_WINDOWS_VISTA =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "6.0");
/**
* True if this is Windows 7.
*/
public static final boolean IS_OS_WINDOWS_7 =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "6.1");
/**
* True if this is Windows 8 or Windows Server 2012.
*/
public static final boolean IS_OS_WINDOWS_8 =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "6.2");
/**
* True if this is one of:
* Windows Vista,
* Windows Server 2008,
* Windows Server 2008 R2,
* Windows 7,
* Windows Server 2012,
* Windows 8,
* Windows Server 2012 R2,
* Windows 8.1
*/
public static final boolean IS_OS_WINDOWS_6_OR_LATER =
startsWith(OS_NAME, "Windows") && startsWith(OS_VERSION, "6.");
// Requesting the Java Version ********************************************
/**
* True if this is Java 6. We check for a prefix of 1.6.
*/
public static final boolean IS_JAVA_6 =
startsWith(JAVA_VERSION, "1.6");
/**
* True if this is Java 7. We check for a prefix of 1.7.
*/
public static final boolean IS_JAVA_7 =
startsWith(JAVA_VERSION, "1.7");
/**
* True if this is Java 7.x or later. We check that it's not 1.6.
*/
public static final boolean IS_JAVA_7_OR_LATER =
!IS_JAVA_6;
/**
* True if this is Java 7. We check for a prefix of 1.7.
*
* @since 1.6
*/
public static final boolean IS_JAVA_8 =
startsWith(JAVA_VERSION, "1.8");
/**
* True if this is Java 8.x or later.
* We check that it's neither 1.6 nor 1.7.
*
* @since 1.6
*/
public static final boolean IS_JAVA_8_OR_LATER =
!IS_JAVA_6 && !IS_JAVA_7;
// Visual Properties ******************************************************
/**
* True since Java 6 update 10.
*
* @since 1.2
*/
public static final boolean HAS_MODERN_RASTERIZER = hasModernRasterizer();
/**
* True if the Windows XP Look&Feel is enabled.
*
* @since 1.2
*/
public static final boolean IS_LAF_WINDOWS_XP_ENABLED = isWindowsXPLafEnabled();
/**
* Is true if this environment's default toolkit reports a screen resolution
* below 120 dpi.
*
* @since 1.2
*/
public static final boolean IS_LOW_RESOLUTION = isLowResolution();
/**
* Checks and answers whether an Aqua look&feel is active.
* This may be Apple's Aqua L&f, or a sub-L&f that
* uses the same ID, because it doesn't substantially change the look.
*
* @return {@code true} if the current look&feel is Aqua-like
*
* @since 1.8
*/
public static boolean isLafAqua() {
return UIManager.getLookAndFeel().getID().equals("Aqua");
}
// Internal ***************************************************************
private static final String AWT_UTILITIES_CLASS_NAME =
"com.sun.awt.AWTUtilities";
protected SystemUtils() {
// Override default constructor; prevents instantiation.
}
/**
* Tries to look up the System property for the given key.
* In untrusted environments this may throw a SecurityException.
* In this case we catch the exception and answer an empty string.
*
* @param key the name of the system property
* @return the system property's String value, or {@code null} if there's
* no such value, or an empty String when
* a SecurityException has been caught
*/
protected static String getSystemProperty(String key) {
try {
return System.getProperty(key);
} catch (SecurityException e) {
Logger.getLogger(SystemUtils.class.getName()).warning(
"Can't access the System property " + key + ".");
return "";
}
}
protected static boolean startsWith(String str, String prefix) {
return str != null && str.startsWith(prefix);
}
/**
* Checks and answers whether this Java runtime has a modern rasterizer
* or not. More precisely this method aims to understand whether a good
* or poor rasterizer is used. Sun's Java runtime has improved its
* rasterizer in the 1.6 N series after build 12.
*
* @return {@code true} if the AWTUtilities class is available,
* {@code false} if this class is not in the class path.
*/
private static boolean hasModernRasterizer() {
try {
Class.forName(AWT_UTILITIES_CLASS_NAME);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
/**
* Checks and answers whether the Windows XP style is enabled.
* This method is intended to be called only if a Windows look&feel
* is about to be installed or already active in the UIManager.
* The XP style of the Windows look&feel is enabled by default on
* Windows XP platforms since the J2SE 1.4.2; it can be disabled either
* in the Windows desktop as well as in the Java runtime by setting
* a System property.
*
* First checks the platform, platform version and Java version. Then
* checks whether the desktop property win.xpstyle.themeActive
* is set or not.
*
* @return true if the Windows XP style is enabled
*/
private static boolean isWindowsXPLafEnabled() {
return IS_OS_WINDOWS
&& Boolean.TRUE.equals(Toolkit.getDefaultToolkit().
getDesktopProperty("win.xpstyle.themeActive"))
&& getSystemProperty("swing.noxp") == null;
}
private static boolean isLowResolution() {
try {
return Toolkit.getDefaultToolkit().getScreenResolution() < 120;
} catch (HeadlessException e) {
return true;
}
}
}