/* * Copyright 2000-2017 JetBrains s.r.o. * * Licensed 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 com.intellij.openapi.util; import com.intellij.openapi.util.io.PathExecLazyValue; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.SystemProperties; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.List; @SuppressWarnings({"HardCodedStringLiteral", "UtilityClassWithoutPrivateConstructor", "UnusedDeclaration"}) public class SystemInfo extends SystemInfoRt { public static final String OS_NAME = SystemInfoRt.OS_NAME; public static final String OS_VERSION = SystemInfoRt.OS_VERSION; public static final String OS_ARCH = System.getProperty("os.arch"); public static final String JAVA_VERSION = System.getProperty("java.version"); public static final String JAVA_RUNTIME_VERSION = System.getProperty("java.runtime.version"); public static final String ARCH_DATA_MODEL = System.getProperty("sun.arch.data.model"); public static final String SUN_DESKTOP = System.getProperty("sun.desktop", ""); public static final boolean isWindows = SystemInfoRt.isWindows; public static final boolean isMac = SystemInfoRt.isMac; public static final boolean isLinux = SystemInfoRt.isLinux; public static final boolean isFreeBSD = SystemInfoRt.isFreeBSD; public static final boolean isSolaris = SystemInfoRt.isSolaris; public static final boolean isUnix = SystemInfoRt.isUnix; public static final boolean isAppleJvm = vendorContains("Apple"); public static final boolean isOracleJvm = vendorContains("Oracle"); public static final boolean isSunJvm = vendorContains("Sun") && vendorContains("Microsystems"); public static final boolean isIbmJvm = vendorContains("IBM"); public static final boolean isJetBrainsJvm = vendorContains("JetBrains"); /** @deprecated use {@link #isJetBrainsJvm} (to be removed in IDEA 2018)*/ public static final boolean isJetbrainsJvm = isJetBrainsJvm; public static final boolean IS_AT_LEAST_JAVA9 = isJavaVersionAtLeast("9"); public static boolean isOsVersionAtLeast(@NotNull String version) { return StringUtil.compareVersionNumbers(OS_VERSION, version) >= 0; } /* version numbers from http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832.aspx */ public static final boolean isWin2kOrNewer = isWindows && isOsVersionAtLeast("5.0"); public static final boolean isWinXpOrNewer = isWindows && isOsVersionAtLeast("5.1"); public static final boolean isWinVistaOrNewer = isWindows && isOsVersionAtLeast("6.0"); public static final boolean isWin7OrNewer = isWindows && isOsVersionAtLeast("6.1"); public static final boolean isWin8OrNewer = isWindows && isOsVersionAtLeast("6.2"); public static final boolean isWin10OrNewer = isWindows && isOsVersionAtLeast("10.0"); /* https://msdn.microsoft.com/en-us/commandline/wsl/about */ private static final AtomicNullableLazyValue<File> ourWSLBashFile = new AtomicNullableLazyValue<File>() { @Nullable @Override protected File compute() { if (isWin10OrNewer) { String windir = System.getenv().get("windir"); if (!StringUtil.isEmpty(windir)) { File bashFile = new File(windir + "\\System32\\bash.exe"); if (bashFile.exists()) { return bashFile; } } } return null; } }; @Nullable public static File getWSLBashFile() { return ourWSLBashFile.getValue(); } public static boolean hasWSL() { return getWSLBashFile() != null; } public static final boolean isXWindow = isUnix && !isMac; public static final boolean isWayland = isXWindow && !StringUtil.isEmpty(System.getenv("WAYLAND_DISPLAY")); /* http://askubuntu.com/questions/72549/how-to-determine-which-window-manager-is-running/227669#227669 */ public static final boolean isGNOME = isXWindow && ObjectUtils.notNull(System.getenv("GDMSESSION"), "").startsWith("gnome"); /* https://userbase.kde.org/KDE_System_Administration/Environment_Variables#KDE_FULL_SESSION */ public static final boolean isKDE = isXWindow && !StringUtil.isEmpty(System.getenv("KDE_FULL_SESSION")); public static final boolean isMacSystemMenu = isMac && "true".equals(System.getProperty("apple.laf.useScreenMenuBar")); public static final boolean isFileSystemCaseSensitive = SystemInfoRt.isFileSystemCaseSensitive; public static final boolean areSymLinksSupported = isUnix || isWinVistaOrNewer; public static final boolean is32Bit = ARCH_DATA_MODEL == null || ARCH_DATA_MODEL.equals("32"); public static final boolean is64Bit = !is32Bit; public static final boolean isMacIntel64 = isMac && "x86_64".equals(OS_ARCH); private static final NotNullLazyValue<Boolean> ourHasXdgOpen = new PathExecLazyValue("xdg-open"); public static boolean hasXdgOpen() { return isXWindow && ourHasXdgOpen.getValue(); } private static final NotNullLazyValue<Boolean> ourHasXdgMime = new PathExecLazyValue("xdg-mime"); public static boolean hasXdgMime() { return isXWindow && ourHasXdgMime.getValue(); } public static final boolean isMacOSTiger = isMac && isOsVersionAtLeast("10.4"); public static final boolean isMacOSLeopard = isMac && isOsVersionAtLeast("10.5"); public static final boolean isMacOSSnowLeopard = isMac && isOsVersionAtLeast("10.6"); public static final boolean isMacOSLion = isMac && isOsVersionAtLeast("10.7"); public static final boolean isMacOSMountainLion = isMac && isOsVersionAtLeast("10.8"); public static final boolean isMacOSMavericks = isMac && isOsVersionAtLeast("10.9"); public static final boolean isMacOSYosemite = isMac && isOsVersionAtLeast("10.10"); public static final boolean isMacOSElCapitan = isMac && isOsVersionAtLeast("10.11"); public static final boolean isMacOSSierra = isMac && isOsVersionAtLeast("10.12"); @NotNull public static String getMacOSMajorVersion() { return getMacOSMajorVersion(OS_VERSION); } public static String getMacOSMajorVersion(String version) { int[] parts = getMacOSVersionParts(version); return String.format("%d.%d", parts[0], parts[1]); } @NotNull public static String getMacOSVersionCode() { return getMacOSVersionCode(OS_VERSION); } @NotNull public static String getMacOSMajorVersionCode() { return getMacOSMajorVersionCode(OS_VERSION); } @NotNull public static String getMacOSMinorVersionCode() { return getMacOSMinorVersionCode(OS_VERSION); } @NotNull public static String getMacOSVersionCode(@NotNull String version) { int[] parts = getMacOSVersionParts(version); return String.format("%02d%d%d", parts[0], normalize(parts[1]), normalize(parts[2])); } @NotNull public static String getMacOSMajorVersionCode(@NotNull String version) { int[] parts = getMacOSVersionParts(version); return String.format("%02d%d%d", parts[0], normalize(parts[1]), 0); } @NotNull public static String getMacOSMinorVersionCode(@NotNull String version) { int[] parts = getMacOSVersionParts(version); return String.format("%02d%02d", parts[1], parts[2]); } private static int[] getMacOSVersionParts(@NotNull String version) { List<String> parts = StringUtil.split(version, "."); while (parts.size() < 3) { parts.add("0"); } return new int[]{toInt(parts.get(0)), toInt(parts.get(1)), toInt(parts.get(2))}; } public static String getOsNameAndVersion() { return System.getProperty("os.name") + " " + System.getProperty("os.version"); } private static int normalize(int number) { return number > 9 ? 9 : number; } private static int toInt(String string) { try { return Integer.valueOf(string); } catch (NumberFormatException e) { return 0; } } public static boolean isJavaVersionAtLeast(String v) { return StringUtil.compareVersionNumbers(JAVA_RUNTIME_VERSION, v) >= 0; } private static boolean vendorContains(String s) { final String vendor = SystemProperties.getJavaVmVendor(); return vendor != null && StringUtil.containsIgnoreCase(vendor, s); } //<editor-fold desc="Deprecated stuff."> /** @deprecated use {@link #isWinXpOrNewer} (to be removed in IDEA 2018) */ public static final boolean isWindowsXP = isWindows && (OS_VERSION.equals("5.1") || OS_VERSION.equals("5.2")); /** @deprecated use {@link #is32Bit} or {@link #is64Bit} (to be removed in IDEA 2018) */ public static final boolean isAMD64 = "amd64".equals(OS_ARCH); /** @deprecated not for generic use (to be removed in IDEA 2018) */ public static String getUnixReleaseName() { return null; } /** @deprecated not for generic use (to be removed in IDEA 2018) */ public static String getUnixReleaseVersion() { return null; } /** @deprecated outdated (to be removed in IDEA 2018) */ public static final boolean isOS2 = SystemInfoRt.isOS2; //</editor-fold> }